IO流(Stream)
由于期末考学习一直没有更博今天有时间总结一下
流是一套API,提供了各种数据类型读写的API
同时流是一套可扩展的API
流是从两个抽象类扩展出来的
- InputStream输入流
-reader - OutputStream输出流
-writer
输入流与输出流的参照是Java处理程序
RandomAccessFile与IO流均可以实现文件的读取与写入,但是现实中更多的使用IO流来进行文件的操作
缓冲流必须依赖与节点流
bos的写出方法将数据写到缓冲区
当缓冲区满时写到文件中
bos流先检查缓冲区是否有数据,如果有数据,将数据写到文件中,再关闭流
flush方法作用,检查缓冲区中是否有文件,如果有数据,将数据强制写入到文件中
节点流
从特定的数据源开始读写数据,只提供最基本byte读写方法,功能简单
过滤流
必须依赖低级流(包含节点流),过、过滤流不能单独工作,在低级流的基础上扩展了丰富的数据类型的续写功能,功能复杂,读写简单
节点流:文件流是节点流,以文件为数据源读写数据,只提供简单的byte读写功能,很少直接使用
字节流:InputStream,OutputStream,FileInputStream,FileOutputStream
过滤流是高级流,不能单独工作,必须依赖于低级流(低级流作为构造参数),提供了自动化的缓冲区管理,是缓冲流可以提高软件的IO性能。不会改变原有的软件逻辑。在读写文件时,加入缓冲流提高性能。
代码:
FileInputStream fis = new FileInputStream("movis.flv");
FileOutputStream fos = new FileOUtputStream("copy.flv");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int b;
while((b = bis.read()) != -1){
bos.write(b);
}
bis.close();
bos.close();
fis.close();
fos.close();
对象流
对象流是高级流,不能单独工作,必须依赖低级流
低级流为构造器参数),对象流提供了对对象的序列化合反序列化功能
可以将对象序列化为byte数据,反之则将byte数据反序列化为对象
对象的序列化,只序列化对象的属性,并不对方法进行序列化,方法存储在方法区
transient
对象流要求:
- 被序列化的对象实现Serializable接口,这个接口并没有必须实现的方法,
- Java编译器讲对象序列化,讲内存上的对象存储到硬盘上,实现对象的持久化
- 对对象进行序列化之后,序列化后的是对象可以再网络上传输,
- 同时要想将硬盘中的对象进行使用必须对其进行反序列化
- java几乎所有的API都实现了序列化接口
对象输出流
- 对象输出流必须依赖低级流(FileOutputStream)
字符流(高级流)
字符流是高级流,必须依赖低级的byte流,
字符流封装了字符的编码和解码功能,能够将字符数据转换为byte数据进行传输
字符流可以极大地简化文件内容操作时文件的传输
Reader和Writer
是抽象类,定义了字符的读写方法,所有的字符流都继承自Reader和Writer
转换流
是高级流,必须依赖与低级的byte流,字符转换流继承于Reader和Writer
封装了字符编码的处理算法,简化字符数据的读写方法
InputStreamReader和OutputStreamWriter
- InputStreamReader
使用流可以设置字符集
- OutputStreamWriter
将文本输出到文件中
PrintWriter out = new PrintWriter(new
OutputStreamWriter(new FileOutputStream("test.txt")));
out.println();
out.close();
可以简化为:
PrintWriter out = new PrintWriter("test.txt");
注意:使用字符流的时候最好指定字符编码!
文件打开时最好套用缓冲流
利用BufferedReader读取文本文件
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamRead(fis);
BufferedReader br = new BufferedReader(isr);
String str;
//每次从文件中读取一行文本,如果返回null表示文件读取到了文件的末尾
while((str = br.readLine()) != null){
System.out.println(str);
}
- PrintWriter 用于写出文本文件
- BufferedReader 用于读取文本文件
这两个都是高级流,都必须依赖低级的byte流
提供按行读写文本文件的方法,使其极其方便的读写文件
若有遗漏希望大神指正