IO体系结构
Java将输入输出抽象为流,与之相关的类都在java.io包中。
流按方向分为输入流InputStream和输出流OutputStream.程序使用输入流对象从数据源读取数据,使用输出流对象向目的地写出数据。
常用的流有:
基础字节流(原始流):
InputStream,OutputStream(都是抽象类)是java中可以按最小数据单位读取
的流,即每次读写一个字节,基础流是直接连接到输入源的流。
过滤流(节点流):
过滤流是用来包装基础流以提供更好的特性,如提供缓冲功能的
BufferedInputStream和BufferedOutputStream,它并不直接连接到数据源。
基于具体数据类型的流:
要从流中读取指定数据类型的数据时,用到DataInputStream,DataOutputStream
基于对象读写:
对象的输入输出流ObjectInput,ObjectOutput.对象流的读取又叫java对象序
列化技术。
一、
InputStream中的重要方法:
int available() 流中可以读取的有效字节长度(多少个byte)
void close() 流对象使用完后要关闭,就像水龙头,用完要关,否则会占用系统资源
int read() 这个方法调用会返回流中的下一个字节作为一个byte值,如果已经读到末尾
则返回-1,表示流中数据已经读完。次方法返回虽为int,但读取的是
一个byte,如果要读取一个int型,那么要用到DataInput对象的
readInt()方法
int read(byte[] b) 用从流中读到的byte
OutputStream中的重要方法:
void close() 关闭流
void flush() 将输出流有可能还保存在JVM内存中的数据强制输出到目标中
void write(byte[] b) 将byte数组中的内容输出到流中
void write(byte[] b,int off,int len) 将数组中的一部分写到流中
void write(int b) 向流中写入一个byte值!如果要写入一个int型,则要使用
DataOutput对象的writeInt()fangfa
读取文件举例:
/**
* 读取文件的方法
* @throws IOException
*/
public String readFile(String path) throws IOException{
FileInputStream is = new FileInputStream(path);
int length = is.available();
byte[] array = new byte[length];
for(int i=0;i<length;i++){
array[i] = (byte) is.read();
}
//把byte类型的数组转换成String类型
String str = new String(array);
System.out.println("读取文件:"+str);
is.close();
return str;
}
二、
缓冲流是一种过滤流。常用的是BufferedInputStream,BufferedOutputStream
之前的流读写文件是如下过程:
输入文件->操作系统内存->JVM内存->代码变量->JVM内存->操作系统内存->输出文件。
经历这样的一个过程才传输了一个字节,这样就造成了效率低下速度缓慢;
而缓冲流机制是在JVM开辟一定大小的缓冲区(目前8M),当输入缓冲区的数据达到一定值时就一次性输出到文件中。这样很大程度上节省了时间。
使用缓冲流时注意:
缓冲区不满时是不会自动输出到文件中的,需要添加关闭命令,如果文件很大,缓冲区满了则会自动输出并清空缓冲区继续读取!所以为保证完整输出,需要关闭Buffered流。
构造器:
BufferedInputStream(InputStream in)
使用一个InputStream的输入流对象创建一个默认缓冲区大小(8M)的缓冲输入流对象
BufferedInputStream(InputStream in,int size)指定缓冲区大小
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out,int size)
/**
* BufferedInputStream和BufferedOutputStream完成文件的复制
* @author 客
*
*/
public class BufferedStream {
/**
* 主方法
* @param
* @throws IOException
*/
public static void main(String[] args) throws IOException{
BufferedStream bs = new BufferedStream();
//创建两个路径分别表示被复制文件路径和新文件路径
String path = "src\\lwq\\java\\File_MyExercise0712\\BufferedStream.java";
String newPath = "src\\lwq\\java\\File_MyExercise0712\\BufferedStream.java.bak";
bs.copyFile(path,newPath);
}
/**
* 完成复制的方法
* @throws IOException
*/
public void copyFile(String path,String newPath) throws IOException{
FileInputStream is = new FileInputStream(path);
BufferedInputStream bis = new BufferedInputStream(is);
FileOutputStream os = new FileOutputStream(newPath);
BufferedOutputStream bos = new BufferedOutputStream(os);
int length = is.available();
byte[] array = new byte[length];
for(int i=0;i<length;i++){
array[i] = (byte)bis.read();
}
bos.write(array);
bos.close();
}
}
三、
串行化又叫做对象序列化,是可以通过流对象保存java对象的一种方法。在java中要事项序列化的对象的类,必须事项java.io.serializable接口,未实现此接口的类将无法使其任何状态序列化或反序列化。序列化接口没有方法或字段,仅用于标识可序列化的语义。
对象类所表示的数据在不断改变,所以他们不会被串行化,如java.io.FileInputStream,
java.io.FileOutputStream和java.lang.Thread等流。
有时候为了保密需要,类不允许自己对象的某个属性被序列化,则可以再属性前加transient关键字,那么该属性在对象的保存时不会生效,读取时也不会得到数据。
对象读写,一般使用java.io.ObjectInputStream类的void writeObject(Object o)方法向流中写入一个对象和java.io.ObjectOutputStream类的Object readObject()读取一个对象。
四、
DataInputStream和DataOutputStream主要用来读写指定的数据类型。
五、画图板文件的保存打开
电脑中存储的不同信息有不同的存储格式。每一种文件格式通常有一种或多种扩展名,但也可以没有扩展名,扩展名对文件本身不会有影响,只是标示打开的优先方式。。
文件由两部分组成:
1、文件头信息:包括存储类型等文件的整体信息;
2、文件内容:具体的。
以画图板为例,头部信息包括图片的存储类型,图片的宽和高,起始位置;
文件内容记录每一个像素点的颜色值。
在文件保存时首先要对画板图片部分进行截屏操作,并保存图片头信息和内容
/**
* 截取画板上图片的类
* @author 客
*
*/
public class ScreenCapture {
public int[][] createScreenCapture(JPanel drawPanel) throws AWTException{
//得到画图面板的高度
int height = drawPanel.getHeight();
//得到画图面板的宽度
int width = drawPanel.getWidth();
System.out.println("height="+height+" width="+width);
//获取画图面板在屏幕的位置
Point point = drawPanel.getLocationOnScreen();
System.out.println("x="+point.getX()+" y="+point.getY());
//实例化一个矩形对象
Rectangle rect = new Rectangle((int)point.getX(),(int)point.getY(),width,height);
//实例化一个机器人类的对象
Robot robot = new Robot();
//开始截取屏幕上的图片
BufferedImage image = robot.createScreenCapture(rect);
//实例化一个二维数组对象,用来存储图片每个像素点的值
int[][] array = new int[width][height];
//遍历图片,将每个像素点的颜色取出,存入到数组中
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
array[i][j] = image.getRGB(i, j);
}
}
return array;
}
}
在点击保存和打开时,对于截屏时的内容进行写入文件和读取操作。
/**
* 画图程序的保存和打开操作
* @author 客
*
*/
public class OpenSave {
/**
* 文件保存的方法
* @param path,传入的保存路径
* @param array,将图片内容保存到数组中
* @return
*/
public boolean save(String path,int[][] array){
boolean b = false;
try {
FileOutputStream os = new FileOutputStream(path);
BufferedOutputStream bos = new BufferedOutputStream(os);
DataOutputStream dos = new DataOutputStream(bos);
/**
* 文件的格式:1、文件头:文件类型,图片宽度,图片高度
* 2、文件内容:每个像素点的颜色值
*/
//图片宽度
dos.writeInt(array.length);
//图片高度
dos.writeInt(array[0].length);
//写文件内容
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
dos.writeInt(array[i][j]);
}
}
b = true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return b;
}
/**
* 打开文件的方法
* @param path
* @return
*/
public int[][] open(String path){
int[][] array = null;
try {
FileInputStream is = new FileInputStream(path);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
//读图片的宽度,高度
int width = dis.readInt();
int height = dis.readInt();
System.out.println("width="+width+" height="+height);
array = new int[width][height];
//写文件内容
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
array[i][j] = dis.readInt();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return array;
}
}
如有不足欢迎指正!
分享到:
相关推荐
聊天应用一个基于客户端的简单聊天应用程序-使用socket.io,Node,Express和许多其他东西的服务器体系结构。 用户可以加入不同的房间并彼此聊天。 它具有响应式设计和自动滚动功能,使其看上去更加整洁。
Netty是一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络...体系结构图在线Javadoc:http://netty.io/wiki/all-documents.html 标签:Netty
随着通讯系统的数据处理量日益增大,过去总线形式的体系结构逐渐成为约束处理能力进一步提升的瓶颈。本文首先简单介绍了嵌入式设计中总线结构的演化过程,从而引出新一代点对点串行交换结构RapidIO。 在密集型...
绝对清晰,绝对完整,适合初学者 内容包含linux 基础 ,基本指令,vi gcc makefile等开发环境的使用,文件IO,驱动,网络,QT编程等 另付 arm体系结构描述的简单介绍
我自己开发了一些代码,而不是按照Fernando的步骤进行开发,因为我对如何提高应用程序代码和体系结构的想法,或者因为我自己在尝试正式解决方案之前进行了简单尝试。 链接到费尔南多·埃雷拉的课程: : 致谢
此体系结构包含三个主要组件: 使用Flask APP Builder(FAB)构建的CMS Animefox Web用户界面Animefox Github回购CMS- 用户名:访客密码:访客具有查看特权的来宾用户。 CMS(内容管理系统)使用FAB构建,数据库...
借助简单的待办事项列表应用程序,即可了解BaaS- 的惊人未来。 介绍 自从有趣地发展以来,我的目标是与Firebase一起玩以见证其潜力和局限性。 这个项目无非是一种玩弄我所学知识的方法。 我也很好奇它如何与我通常...
随着通讯系统的数据处理量日益增大,过去总线形式的体系结构逐渐成为约束处理能力进一步提升的瓶颈。本文首先简单介绍了嵌入式设计中总线结构的演化过程,从而引出新一代点对点串行交换结构RapidIO。 在密集型...
2.1 android体系结构 2.1.1 各种库和android运行环境 2.1.2 应用程序框架 2.1.3 操作系统层 2.1.4 应用程序 2.2 android应用程序组成 2.2.1 activity 2.2.2 intent和intent filter 2.2.3 service介绍 2.2.4 ...
您可以在我的中级文章上阅读有关体系结构的更多信息。 该应用程序通过连接到Socket.IO聊天室。 欢迎进一步改进的建议。截屏问题陈述我们大多数Android开发人员都使用MVP架构创建了应用。 常规的android应用程序涉及...
此应用程序体系结构的目标之一是非常轻松,无需管理或更新。 使用创建所有应用程序资源,将基础架构完全定义为代码。 使用CI / CD Pipeline,因此您只需推送到Github,它将自动部署。 使用自动化Docker容器构建 ...
详细介绍了软硬件概念、指令、总线、存储器和IO设备的原理知识,在操作系统部分,讲解了程序运行的过程、并行和并发的区别,进程和线程的执行逻辑等内容,在计算机网络中,从网络的定义到TCP/IP五层体系结构,从物理...
它不旨在作为功能全面的体系结构或复杂软件设计的完整示例。 典型用途是部署到Kubernetes,Docker演示,CI / CD(提供构建管道),部署到云(Azure)监控,自动扩展截屏地位 实时实例:在本地构建和运行先决条件...
基于C ++ 14/17的HTTP应用程序框架drogon,Drogon可用于使用C ++...*支持ARM体系结构; *提供方便的轻量级ORM实现,支持常规的对象到数据库双向映射; *支持可在加载时由配置文件安装的插件; *通过内置连接点支持AOP。
在这本书中,她不仅首次为后台开发工程师勾勒出了完整的知识能力体系结构图,而且还对后台开发工程师所需要掌握的大量复杂的技术知识进行了提炼、剥离和整合,专注于成为一名后台开发工程师所需掌握的核心技术、开发...
翻盖式Clamshell-Cli是用于在Java中构建基于...]特征易于上手API占用空间小,学习曲线低能够使用插件体系结构构建复杂的CLI工具,例如REPL 简单的组件模型,对您的设计几乎没有约束插件体系结构旨在实现可扩展性和
本书深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、JavaGUI编程、JDBC数据库编程、Java注释、Java的IO流体系、Java多线程编程、...
本书深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、Java注释、Java的IO流体系、Java多线程编程、...
《疯狂Java讲义》深入介绍了Java编程的相关方面,全书内容覆盖了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java GUI编程、JDBC数据库编程、Java注释、Java的IO流体系、Java多...
定期及时更新应用程序 简单的用户映射(PGID,PUID) 具有s6覆盖的自定义基本图像 每周进行一次基本操作系统更新,包括整个LinuxServer.io生态系统中的公共层,以最大程度地减少空间使用,停机时间和带宽 定期的...