Java IO

IO中的输入字节流

   下面是IO中输入字节流的继承图。

o InputStream
o ByteArrayInputStream
o FileInputStream
o FilterInputStream
o BufferedInputStream
o DataInputStream
o LineNumberInputStream
o PushbackInputStream
o ObjectInputStream
o PipedInputStream
o SequenceInputStream
o StringBufferInputStream

在上面的关系图中可以看出:

1、InputStream是所有的输入字节流的父类,它是一个抽象类。

2、ByteArrayInputStream、StringBufferInputStream、FileInputStream是三种基本的介质流,它们分别将Byte数组、StringBuffer、和本地文件中读取数据。PipedInputStream是从与其它线程共用的管道中读取数据,与Piped相关的知识会用专门的一小节讲解。

3、 ObjectInputStream和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。下表列出了这些流的功能及如何使用它们(具体使用在讲解完装饰器模式后会举几个例子)。

基本输入字节流:

ByteArrayInputStream
将内存中的Byte数组适配为一个InputStream。
从内存中的Byte数组创建该对象(2种方法)
一般作为数据源,会使用其它装饰流提供额外的功能,一般都建议加个缓冲功能。

StringBufferInputStream
将内存中的字符串适配为一个InputStream。
从一个String对象创建该对象。底层的实现使用StringBuffer。该类被Deprecated。主要原因是StringBuffer不应该属于字节流,所以推荐使用StringReader。
一般作为数据源,同样会使用其它装饰器提供额外的功能。

FileInputStream
最基本的文件输入流。主要用于从文件中读取信息。
通过一个代表文件路径的 String、File对象或者 FileDescriptor对象创建。
一般作为数据源,同样会使用其它装饰器提供额外的功能。

PipedInputStream
读取从对应PipedOutputStream写入的数据。在流中实现了管道的概念。
利用对应的PipedOutputStream创建。
在多线程程序中作为数据源,同样会使用其它装饰器提供额外的功能。

SequenceInputStream
将2个或者多个InputStream 对象转变为一个InputStream.
使用两个InputStream 或者内部对象为InputStream 的Enumeration对象创建该对象。
一般作为数据源,同样会使用其它装饰器提供额外的功能。

FilterInputStream
给其它被装饰对象提供额外功能的抽象类 主要子类见下表

DataInputStream
一般和DataOutputStream配对使用,完成基本数据类型的读写。
利用一个InputStream构造。
提供了大量的读取基本数据类新的读取方法。

BufferedInputStream
使用该对象阻止每次读取一个字节都会频繁操作IO。将字节读取一个缓存区,从缓存区读取。
利用一个InputStream、或者带上一个自定义的缓存区的大小构造。
使用InputStream的方法读取,只是背后多一个缓存的功能。设计模式中透明装饰器的应用。

LineNumberInputStream
跟踪输入流中的行号。可以调用getLineNumber( )和 setLineNumber(int)方法得到和设置行号。
利用一个InputStream构造。
紧紧增加一个行号。可以象使用其它InputStream一样使用。

PushbackInputStream
可以在读取最后一个byte 后将其放回到缓存中。
利用一个InputStream构造。
一般仅仅会在设计compiler的scanner 时会用到这个类。在我们的java语言的编译器中使用它。很多程序员可能一辈子都不需要。

**

IO中的输出字节流

**
下面是IO中输出字节流的继承图。

OutputStream
ByteArrayOutputStream
FileOutputStream
FilterOutputStream
BufferedOutputStream
DataOutputStream
PrintStream
ObjectOutputStream
PipedOutputStream

在上面的关系图中可以看出:
1、OutputStream是所有的输出字节流的父类,它是一个抽象类。
2、ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte数组、和本地文件中写入数据。PipedOutputStream是向与其它线程共用的管道中写入数据,
3、ObjectOutputStream和所有FilterOutputStream的子类都是装饰流。下表列出了输出字节流的功能及如何使用它们。

ByteArrayOutputStream
在内存中创建一个buffer。所有写入此流中的数据都被放入到此buffer中。
无参或者使用一个可选的初始化buffer的大小的参数构造。
一般将其和FilterOutputStream套接得到额外的功能。建议首先和BufferedOutputStream套接实现缓冲功能。通过toByteArray方法可以得到流中的数据。(不通明装饰器的用法)

FileOutputStream
将信息写入文件中。
使用代表文件路径的String、File对象或者 FileDescriptor对象创建。还可以加一个代表写入的方式是否为append的标记。
一般将其和FilterOutputStream套接得到额外的功能。

PipedOutputStream
任何写入此对象的信息都被放入对应PipedInputStream 对象的缓存中,从而完成线程的通信,实现了“管道”的概念。具体在后面详细讲解。
利用PipedInputStream构造
在多线程程序中数据的目的地的。一般将其和FilterOutputStream套接得到额外的功能。

FilterOutputStream
实现装饰器功能的抽象类。为其它OutputStream对象增加额外的功能。

DataOutputStream
通常和DataInputStream配合使用,使用它可以写入基本数据类新。
使用OutputStream构造
包含大量的写入基本数据类型的方法。

PrintStream
产生具有格式的输出信息。(一般地在java程序中DataOutputStream用于数据的存储,即J2EE中持久层完成的功能,PrintStream完成显示的功能,类似于J2EE中表现层的功能)
使用OutputStream和一个可选的表示缓存是否在每次换行时是否flush的标记构造。还提供很多和文件相关的构造方法。
一般是一个终极(“final”)的包装器,很多时候我们都使用它!

BufferedOutputStream
使用它可以避免频繁地向IO写入数据,数据一般都写入一个缓存区,在调用flush方法后会清空缓存、一次完成数据的写入。
从一个OutputStream或者和一个代表缓存区大小的可选参数构造。
提供和其它OutputStream一致的接口,只是内部提供一个缓存的功能。

**

字节流的输入与输出的对应

**
字节流的输入与输出的对应

**

IO中的输入字符流

**
下面是IO中输入字符流的继承图。

Reader
BufferedReader
LineNumberReader
CharArrayReader
FilterReader
PushbackReader
InputStreamReader
FileReader
PipedReader
StringReader

在上面的关系图中可以看出:
1、Reader是所有的输入字符流的父类,它是一个抽象类。
2、CharReader、StringReader是两种基本的介质流,它们分别将Char数组、String中读取数据。PipedReader是从与其它线程共用的管道中读取数据。
3、BufferedReader很明显就是一个装饰器,它和其子类负责装饰其它Reader对象。
4、FilterReader是所有自定义具体装饰流的父类,其子类PushbackReader对Reader对象进行装饰,会增加一个行号。
5、InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream转变为Reader的方法。我们可以从这个类中得到一定的技巧。

**

IO中的输出字符流

**
下面是IO中输出字符流的继承图。

Writer
BufferedWriter
CharArrayWriter
FilterWriter
OutputStreamWriter
FileWriter
PipedWriter
PrintWriter
StringWriter
在上面的关系图中可以看出:
1、Writer是所有的输出字符流的父类,它是一个抽象类。
2、CharArrayWriter、StringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据。PipedWriter是向与其它线程共用的管道中写入数据,
3、BufferedWriter是一个装饰器为Writer提供缓冲功能。
4、PrintWriter和PrintStream极其类似,功能和使用也非常相似。
5、OutputStreamWriter是OutputStream到Writer转换的桥梁,它的子类FileWriter其实就是一个实现此功能的具体类(具体可以研究一下Source Code)。功能和使用和OutputStream极其类似,后面会有它们的对应图。

**

字符流的输入与输出的对应

**

字符流的输入与输出的对应

字节流和字符流的对应
Java的IO中存在输入、输出的对应和字节流和字符流的对应,下面就看看字节流和字符流的对应吧!

输入的对应
下图是IO中字节输入流与字符输入流的对应图:
IO中字节输入流与字符输入流的对应图

输出的对应
下图是IO中字节输出流与字符输出流的对应图:

IO中字节输出流与字符输出流的对应图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值