Java的IO基于装饰器模式设计。根接口是InputStream/OutputStream,根据来源不同充当数据源的有FileInputStream/FileOutputStream, ByteArrayInputStream/ByteArrayOutputStream等,充当装饰功能的IO类有 BufferedInputStream/BufferedOutputStream, DataInputStream/DataOutputStream,CheckedInputStream/CheckedOutputStream等,他们都继承于装饰类 FilterInputStream/FilterOutputStream。
[color=red]1.表示数据源的流[/color]
[color=red]以字节为导向InputStream/OutputStream[/color]
ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用,内部通过byte[]实现。
StringBufferInputStream:把一个String对象作为InputStream,已过时,此类未能正确地将字符转换为字节,从一个串创建一个流的最佳方法是采用StringReader类。
FileInputStream:把一个文件作为InputStream,实现对文件的读取操作。
PipedInputStream:实现了pipe的概念,主要在线程中使用。管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,
这样可实现两个线程间的通讯。
SequenceInputStream:把多个InputStream合并为一个InputStream。允许应用程序把几个输入流连续地合并起来,并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾,然后关闭这个流并自动地切换到下一个输入流。
ByteArrayOutputStream:把信息存入内存中的一个缓冲区中.该类以byte[]写入数据的输出流,当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。
FileOutputStream:文件输出流是向 File或FileDescriptor输出数据的一个输出流
PipedOutputStream:管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯.
SequenceOutputStream:把多个OutStream合并为一个OutStream.
[color=red]以Unicode字符为导向InputStream/OutputStream[/color]
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。包括下面几种类型:
CharArrayReader:与ByteArrayInputStream对应
StringReader:与StringBufferInputStream对应
FileReader:与FileInputStream对应
PipedReader:与PipedInputStream对应
CharArrayWrite:与ByteArrayOutputStream对应
StringWrite:无与之对应的以字节为导向的stream
FileWrite:与FileOutputStream对应
PipedWrite:与PipedOutputStream对应
[color=red]两者之间的区别和转换[/color]
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
InputStreamReader:是从字节流到字符流的桥梁。它读入字节,并根据指定的编码方式,将之转换为字符流。使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。
OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。每个OutputStreamWriter会合并它自己的CharToByteConverter。
[color=red]2.用于属性包装方面的装饰流[/color]
[color=red]用于封装以字节为导向的InputStream/OutputStream[/color]
DataInputStream:从stream中读取基本类型(int、char、double、long等)。
BufferedInputStream:使用缓冲区,缓冲区其实也是byte[]实现的,可指定缓冲大小。默认4K。
LineNumberInputStream:已过时,此类错误假定字节能充分表示字符,由LineNumberReader替代。它提供跟踪当前行号的附加功能,会记录input stream内的行数。
PushbackInputStream:添加“取消读取 (unread)”一个字节的功能。方法是将其复制到推回缓冲区前面。
DataOutputStream:往stream中输出基本类型(int、char、double、long等)。
BufferedOutStream:使用缓冲区,缓冲区其实也是byte[]实现的.可指定缓冲大小。默认4K。
PrintStream:产生格式化输出。它还提供其他两项功能。与其他输出流不同,PrintStream 不会抛出 IOException;异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream,这意味着可在写入字节数组之后自动调用 flush 方法。
[color=red]用于封装以字符为导向的InputStream/OutputStream[/color]
BufferedReader:与BufferedInputStream对应。
LineNumberReader:与LineNumberInputStream对应。
PushBackReader:与PushbackInputStream对应。
BufferedWrite:与BufferedOutStream对应。
PrintWrite:与PrintStream对应。
PS:没有与DataInputStream/DataOutputStream对应的类。需要使用readLine()时改用BufferedReader,否则使用DataInputStream。对于write同样。
[color=red]3.DataInput/DataOutput,ObjectInput/ObjectOutput等[/color]
DataInput/DataOutput是用于从流内读取/写入 Java基本类型,直接实现子类就是DataInputStream/DataOutputStream.
ObjectInput/ObjectOutput在上面的基础上扩展了对象、数组和String的读写方法,直接的实现子类就是ObjectInputStream和ObjectOutputStream。只有支持 java.io.Serializable或java.io.Externalizable接口的对象才能被正确的读取和写入。如果要做特殊的处理就需要重写writeObject(ObjectOutputStream stream),readObject(ObjectInputStream stream),readObjectNoData()等方法。
ImageInputStream/ImageOutputStream是在DataInput/DataOutput的基础上针对Image的操作做了扩展。
[color=red]4.RandowmAccessFile,FileChannel[/color]
RandowmAccessFile是实现了DataInput和DataOutput的类,以文件作为数据源。随机存取文件的行为类似存储在文件系统中的一个大型字节数组。存在指向该隐含数组的光标或索引,称为文件指针.该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置.它可以做到随机存取;设定读写权限;预先设置文件大小,防止写操作文件碎片的产生。
FileChannel可以从RandowmAccessFile、FileInputStream、FileOutputStream得到,它的好处在于:
对文件中绝对位置的字节进行读取或写入;
将文件中的某个区域直接映射到内存中,对于较大的文件,这通常比调用普通的 read 或 write 方法更为高效;
强制对基础存储设备进行文件的更新,确保在系统崩溃时不丢失数据;
可以锁定某个文件区域,以阻止其他程序对其进行访问;
以一种可被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到某个其他通道中。
google出来的一个IO框架图
[img]/upload/attachment/104332/162a687b-ec5e-344c-8d8a-dcbff3f204d2.gif[/img]
[color=red]1.表示数据源的流[/color]
[color=red]以字节为导向InputStream/OutputStream[/color]
ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用,内部通过byte[]实现。
StringBufferInputStream:把一个String对象作为InputStream,已过时,此类未能正确地将字符转换为字节,从一个串创建一个流的最佳方法是采用StringReader类。
FileInputStream:把一个文件作为InputStream,实现对文件的读取操作。
PipedInputStream:实现了pipe的概念,主要在线程中使用。管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,
这样可实现两个线程间的通讯。
SequenceInputStream:把多个InputStream合并为一个InputStream。允许应用程序把几个输入流连续地合并起来,并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾,然后关闭这个流并自动地切换到下一个输入流。
ByteArrayOutputStream:把信息存入内存中的一个缓冲区中.该类以byte[]写入数据的输出流,当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。
FileOutputStream:文件输出流是向 File或FileDescriptor输出数据的一个输出流
PipedOutputStream:管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯.
SequenceOutputStream:把多个OutStream合并为一个OutStream.
[color=red]以Unicode字符为导向InputStream/OutputStream[/color]
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。包括下面几种类型:
CharArrayReader:与ByteArrayInputStream对应
StringReader:与StringBufferInputStream对应
FileReader:与FileInputStream对应
PipedReader:与PipedInputStream对应
CharArrayWrite:与ByteArrayOutputStream对应
StringWrite:无与之对应的以字节为导向的stream
FileWrite:与FileOutputStream对应
PipedWrite:与PipedOutputStream对应
[color=red]两者之间的区别和转换[/color]
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
InputStreamReader:是从字节流到字符流的桥梁。它读入字节,并根据指定的编码方式,将之转换为字符流。使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。
OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。每个OutputStreamWriter会合并它自己的CharToByteConverter。
[color=red]2.用于属性包装方面的装饰流[/color]
[color=red]用于封装以字节为导向的InputStream/OutputStream[/color]
DataInputStream:从stream中读取基本类型(int、char、double、long等)。
BufferedInputStream:使用缓冲区,缓冲区其实也是byte[]实现的,可指定缓冲大小。默认4K。
LineNumberInputStream:已过时,此类错误假定字节能充分表示字符,由LineNumberReader替代。它提供跟踪当前行号的附加功能,会记录input stream内的行数。
PushbackInputStream:添加“取消读取 (unread)”一个字节的功能。方法是将其复制到推回缓冲区前面。
DataOutputStream:往stream中输出基本类型(int、char、double、long等)。
BufferedOutStream:使用缓冲区,缓冲区其实也是byte[]实现的.可指定缓冲大小。默认4K。
PrintStream:产生格式化输出。它还提供其他两项功能。与其他输出流不同,PrintStream 不会抛出 IOException;异常情况仅设置可通过 checkError 方法测试的内部标志。另外,为了自动刷新,可以创建一个 PrintStream,这意味着可在写入字节数组之后自动调用 flush 方法。
[color=red]用于封装以字符为导向的InputStream/OutputStream[/color]
BufferedReader:与BufferedInputStream对应。
LineNumberReader:与LineNumberInputStream对应。
PushBackReader:与PushbackInputStream对应。
BufferedWrite:与BufferedOutStream对应。
PrintWrite:与PrintStream对应。
PS:没有与DataInputStream/DataOutputStream对应的类。需要使用readLine()时改用BufferedReader,否则使用DataInputStream。对于write同样。
[color=red]3.DataInput/DataOutput,ObjectInput/ObjectOutput等[/color]
DataInput/DataOutput是用于从流内读取/写入 Java基本类型,直接实现子类就是DataInputStream/DataOutputStream.
ObjectInput/ObjectOutput在上面的基础上扩展了对象、数组和String的读写方法,直接的实现子类就是ObjectInputStream和ObjectOutputStream。只有支持 java.io.Serializable或java.io.Externalizable接口的对象才能被正确的读取和写入。如果要做特殊的处理就需要重写writeObject(ObjectOutputStream stream),readObject(ObjectInputStream stream),readObjectNoData()等方法。
ImageInputStream/ImageOutputStream是在DataInput/DataOutput的基础上针对Image的操作做了扩展。
[color=red]4.RandowmAccessFile,FileChannel[/color]
RandowmAccessFile是实现了DataInput和DataOutput的类,以文件作为数据源。随机存取文件的行为类似存储在文件系统中的一个大型字节数组。存在指向该隐含数组的光标或索引,称为文件指针.该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置.它可以做到随机存取;设定读写权限;预先设置文件大小,防止写操作文件碎片的产生。
FileChannel可以从RandowmAccessFile、FileInputStream、FileOutputStream得到,它的好处在于:
对文件中绝对位置的字节进行读取或写入;
将文件中的某个区域直接映射到内存中,对于较大的文件,这通常比调用普通的 read 或 write 方法更为高效;
强制对基础存储设备进行文件的更新,确保在系统崩溃时不丢失数据;
可以锁定某个文件区域,以阻止其他程序对其进行访问;
以一种可被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到某个其他通道中。
google出来的一个IO框架图
[img]/upload/attachment/104332/162a687b-ec5e-344c-8d8a-dcbff3f204d2.gif[/img]