关键字:IO基础,JUnit生命周期,字节流,字符流,字符编码,对象流,序列化,反序列化
Java I/O流是一组有顺序的,有起点和终点的字节集合。是对设备文件间数据传输的总称和抽象。
在IO中涉及的设备文件包括文件、控制台、网络链接等,这其中又根据流的方向可以将两端的设备文件分为数据源对象和接收端对象
数据源对象:有能力产出数据
接收端对象:有能力接收数据
而IO流实际上屏蔽了在实际设备中的处理数据的细节,这些处理方式也叫通信方式可以包括顺序、随机存取、缓冲、二进制、按字符、按字节、按行等。
字节流和字符流。io默认都是直接操作字节的,多用于读取或书写二进制数据,这些类的基类为InputStream或OutputStream。而字符流操作的是为了支持Unicode编码,用于字符国际化,一个字符占用两个字节,这些类的基类为Reader或Writer。java的io在jdk1.1以后添加了字符流的支持,为我们直接操作字符流提供了方便。
关于字符类库和字节类库的选择
最明智的做法是尽量尝试使用Reader和Writer,一旦程序代码无法成功编译,我们就会发现自己不得不使用面向字节的类库。
根据数据的流向,流分为输入流和输出流,这里指的都是内存,内存输入为读,输出为写,I读O写。
Java提供了针对不同情况的处理流的类,以便于我们直观地进行数据操作,这些类就在java的io包之中。下面介绍java io包的类,整个io包大量应用了装饰模式。在实际使用过程中,涉及多层套用的构造函数必然都会有自己的一个装饰模式的架构,包括被装饰类(原构建基类),装饰超类,装饰具体类,用的过程中懂得去区分理解会让你更加灵活地使用它们。
节点流:文件(File),管道(Piped)和数组(Array)(他们每个类都分别包括输入输出和字节字符四种流)
处理流:其余的都是处理类,他们都是属于节点流的装饰类,下面我整理了一个关于处理流的表格。
处理流 who 个数 装饰功能缓冲区 Buffered开头的类 4((IO/BC四种) 可将流放在缓冲区内操作
转化流 InputStreamReader/OutputStreamWriter 2 可将字节流转化为字符流
基本类型 DataXXXStream 2(IO替换XXX) 可传输基本类型数据
对象流 ObjectXXXStream 2(IO替换XXX) 可传输对象类型数据(序列化)
打印流 PrintStream/PrintWriter 2 包含print和println的输出流
合并流 SequenceInputStream 1 可逻辑串联其他输入流
行号读入流 LineNumberReader 1 可得到一个携带行号的字符读入流
推回输入流 PushbackInputStream/PushbackReader 2 可将输入流push back或unread一个字节
字符串读写流 StringWriter/StringReader 2 可在缓冲区读写字符串
注意:
默认命名规则:字节流是输入输出(Input/Output),字符流是读写(Writer/Reader),当又有输入输出又有读写的时候,那一定是转化流(InputStreamReader/OutputStreamWriter)。
默认都是操作字节,所有操作字符的类都需要先经过转化流将字节流转为字符流再使用。
LineNumberInputStream已过时,因为它是基于字节输入流的,而错误假定字节能充分表示字符,现已被LineNumberReader取代。
StringBufferInputStream已过时,因为此类未能正确地将字符转换为字节,现已被StringReader取代。
这里面还有一个过滤流的概念,它也包括输入输出字节字符四种流,我在上面没有表示出来。它是一个抽象类,作为“装饰器”的接口,其中,“装饰器”为其他输入输出字符字节类提供有用功能。
java io 转化流的适配器模式
我们知道在字符流处理类加入java io类库之前,所有的类都是面向字节流的,在jdk1.1以后,添加了字符流的支持,根据“开闭原则”,所以在不改变原有类的基础上,有了转化流:InputStreamReader和OutputStreamWriter,这两个类正是所谓的“适配器类”,InputStreamReader可以吧InputStream转换为Reader,而OutputStreamWriter可以将OutputStream转换为Writer。字节流和字符流都有各自独立的一整套继承层次结构,而通过适配器类,可以在不改变原有类的前提下有效将他们结合起来。
java io 装饰器模式的研究: