一、
I/O流分类
1.输入流(Input Stream) 和输出流(Output Stream) 2.节点流(Node Stream) 和处理流(Processing Stream)
3.字符流(Character Stream)和字节流(Byte Stream)
二、
输入流和输出流
按照数据流动的方向,Java流可分为输入流(Input Stream)和输出流(Output Stream)
1.输入流只能从中读取数据,而不能向其写出数据
2.输出流则只能向其写出数据,而不能从中读取数据
3.特例:java.io.RandomAccessFile类。---(可以在文件的任何位置存取操作)
(一般人是站在程序的角度,比如数据从外界传递到程序中,那么我们称为数据的输入,比如我们可以读取从
键盘输入的数据,或者说从键盘输入数据到程序中)
三、
节点流和处理流
根据数据流所关联的是数据源还是其他数据流,可分为节点流(Node Stream)和处理流(Processing Stream)
1.节点流直接连接到数据源(FileReader)
2.处理流是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现增强的数据读/写功能,处理流并不直接连到数据源(BufferedReader)
四、
字符流和字节流
a.按传输数据的“颗粒大小”划分,可分为字符流(Character Stream)和字节流(Byte Stream)
1.字符流以字符为单位进行数据传输,每次传送一个或多个字符
2.字节流以字节为单位进行数据传输,每次传送一个或多个字节
b.Java命名惯例:
凡是以InputStream或OutputStream结尾的类型均为字节流
凡是以Reader或Writer结尾的均为字符流
五、
常用I/O流类型(1)
a.FileInputStream/FileOutputStream
FileInputStream用于读取本地文件中字节数据,
FileOutputStream用于将字节数据写出到文件 -------------------即可以复制文本文件,也可以复制二进制文件(图片,视频等)(因为他们操作的是字节)
b.FileReader/FileWriter
FileReader用于以字符为单位读取文本文件,
FileWriter类用于将字符数据写出到文本文件中
c.BufferedReader/BufferedWriter
BufferedReader用于缓冲读取字符,
BufferedWriter则提供字符的缓冲写出功能
六、
常用I/O流类型(2)
a.InputStreamReader(是字节流通向字符流的桥梁)
1.InputStreamReader可封装字节输入流并从中读取字节数据,然后将之转换为字符
2.转换时所使用的字符编码可以在构造方法中显式指定,也可以使用平台的默认字符编码
b.OutputStreamWriter(是字符流通向字节流的桥梁)
1.OutputStreamWriter把字符转化为字节并写出到它所封装的字节输出流
2.转换时所使用的字符编码可以在构造方法中显式指定,也可以使用平台的默认字符编码
七、
常用I/O流类型(3)
a.PrintStream
PrintStream在OutputStream基础之上提供了增强的功能,即可以方便地输出各种类型数据(而不仅限于byte型)的格式化表示形式。PrintStream的方法从不抛出IOExecption。
b.PrintWriter
1.PrintWriter提供了PrintStream的所有打印方法,其方法也从不抛出IOExecption
2.与PrintStream的区别:作为处理流使用时,PrintStream只能封装OutputStreamWriter类型的字节流而PrintWriter既可以封装OutputStreamWriter,还能够封装Writer类型字符输出流并增强其功能
八、
常用I/O流类型(4)
DataInputStream/DataOutputStream
1.二者分别实现了DataInput/DataOutput接口
2.DataInputStream能够以一种与机器无关的方式,直接从底层字节输入流读取Java基本类型和String类型的数据
3.DataOutputStream则能够直接将Java基本类型和String类型数据写出到其他的字节输出流
九、
常用I/O流类型(5)
a.CharArrayReader实现了一个可用作字符输入流的字符缓冲区
b.CharArrayWriter实现了一个可当作Writer使用的字符输出缓冲区
十、
实现对象序列化
a.要序列化一个对象,其所属的类必须实现以下两种接口之一:
java.io.Serializable java.io.Externalizable
b.java.io.ObjectOutputStream/ObjectInputStream类分别提供了对象的序列化和反序列化功能
注意:一般在实现Serializable接口的类中添加空的构造方法
十一、
对象序列化过程中的数据保护
a.标记性接口Serializable(标记性接口没有实际的功能,主要用于区分)
b.在对象序列化过程中,其所属类的static属性的方法代码不会被序列化处理
c.对于个别不希望被序列化的非static属性,可以在属性声明时使用transient关键字进行表明
补充知识点:
通道(Channel)是NIO中的另一种重要对象,通过它可以实现数据的读入和写出操作,与先前的“流”相比,
其不同之处在通道是双向的(类似于RandomAccessFile流),而普通的I/O流只能单向地传输数据,
这使得通道可以比流更好地反映底层操作系统的真实情况(底层操作系统中数据的传输通道都是双向的)。