I/O(输入/输出)指的是计算机与外部世界,或者一个程序与计算机的其余部分之间的接口,它对于任何计算机系统都非常关键。

流:可以理解为传送数据的管道,管道的一端是固定的,就是系统的内存;管道的另一端连的是不同的设备。流有两个最基本的特性,一个是流质,就是数据;一个是方向,就是读或写。

当程序需要读取数据的时侯,就会开启一个通向数据源设备的流,这个数据源设备可以是文件,内存或网络连接。

按照流的方向分数入流(从数据源读取数据到程序中)和数出流(将数据从程序写入数据目的地);

按照流处理数据的最小单位分字节流(以byte为最小单位进行数据传送)和字符流(以char为最小单位进行数据传送);

按照流的功能分节点流(也称低级流,可以直接从/向一个特定的数据源读/写数据)和处理流(也称高级流,不直接连接到设备,而是连接在已存在的流之上,通过对数据的处理为程序提供更强大的读写功能)。

I/O库中的类呈现出一种对称性,这种对称性体现在两个方面:一是输入流和输出流的对称;一是字节流和字符流的对称。

所有I/O类中的具体类都继承自四个抽象类InputStream、OutputStream、Reader、Writer。

java.io包中的File类提供了管理磁盘文件和目录的基本功能。File对象类似于一个字符串,只代表一个文件或者目录的路径名。

低级字节流,根据其输入和输出的设备或数据源,分为三类:

1.对二进制文件进行读写操作的FileInputStream和FileOutputStream类,其数据源是磁盘文件。

2.对内存缓冲区中的字节数组进行读写操作的ByteArrayInputStream和ByteArrayOutputStream类,其数据源是内存中的字节数组。

3.对线程管道进行读写操作的PipedInputStream和PipedOutputStream类,其数据源是线程管道。

高级字节流对低级字节流进行了封装,并有很多功能的扩展。根据其功能分为三大类:

过滤流类:缓冲流(BufferedInputStream和BufferedOutputStream,实现带缓冲的过滤流)、数据流(DataInputSream和DataOutputStream可用与计算机无关的格式读写Java的基本数据类型以及String对象)、计数(LineNumberInputSream允许在翻译行结束符的基础上,维护一个计数器,该计数器表明正在读取的是哪一行)、推回输入流(PushbackInputStream代表一个流允许从流中读取数据,然后在需要时推回该流)、打印输出流(PrintStream允许将基本数据类型数据打印输出到字符串流中);

对象流:ObjectInputStream和ObjectOutputStream允许直接对对象执行读写操作;

合并:SequenceInputStream类可以实现两个文件的合并操作,它从两个低级流中读取数据合并,当到达流的末尾时从一个流转到另一个流,从而实现合并操作。

低级字符流包括:

1.对内存数组进行操作的CharArrayWriter和CharArrayReader类,与ByteArrayInputStream和ByteArrayOutputStream类似,其数据源为内存中的字符数组。

2.对内存中的String对象进行操作的StringReader和StringWriter类,其数据源为内存中的String对象。

3.对线程管道进行操作的PipedReader和PipedWriter类,与PipedInputStream和PipedOutputStream类似,其数据源为线程管道。

4.对文本文件进行读写操作的FileReader和FileWriter类,与FileInputStream和FileOutputStream类似,其数据源为磁盘文件。是按照本地操作系统平台的默认字符编码,读写文件。

高级字符流:

缓冲流:BufferedReader和BufferedWriter类,利用缓冲区来提高读写数据的效率。

转换流:用于字节数据到字符数据之间的转换,包括InputStreamReader和OutputStreamWriter.

打印输出流:包括PrintWriter类,允许将基本类型数据打印输出到字符串流中,PrintWriter带有自动刷新功能。

对象流:序列化:保存内存中对象的“全景图”(所有的引用)。

序列化机制就是一套向流写入或读取对象数据的自动机制。

要实现序列化就要实现Serializable接口,使用ObjectInputStream类将对象拆成字节序列的过程,称为对象序列化;使用ObjectOutputStream类,将字节序列还原成对象的过程,称为对象反序列化。

加上了transient修饰符,该属性不会被序列化。

serialVersionUID是版本号,在实现序列化时会自动生成一个版本号,当实现反序列化时通过判断版本号是否一样来判断是否能实现反序列化。

posted on 2015-05-31 17:52  未来的自己丶  阅读(154)  评论(0)    收藏  举报