Java I/O 知识点(一)

来源:互联网 发布:海康威视有线连接网络 编辑:程序博客网 时间:2024/05/18 09:43

1、“流”屏蔽了实际I/O设备中处理数据的细节;Java类库中的I/O类分成了输入和输出两部分。任何自inputStream或Reader派生的而来的类都含有名为read()的基本方法,用于读取字节或字节数组。同样,任何来自outputStream或者Writer派生而来的类都含有名为write()的基本方法,用于写单个字节或者字节数组。但是,我们经常不会用到这些方法,它们之所以存在是因为别的类会使用它们,以便提供更加有用的接口。因此,我们很少使用单一的类来创建流对象,而是通过叠加多个对象来提供所期望的功能(这就是装饰者模式)。实际上,Java中“流”类库让人迷惑的主要原因是:创建单一的结果流,却需要创建多个对象。

2、Java I/O类库分类:输入有关的类均继承自InputStream,输出有关的类均继承OutputStream。

输入数据源:

---->字节数组、String对象、文件、“管道”、一个由其他种类的流组成的序列,以便我们可以将它们收集合并到一个流内、其他数据源(如网络);

每一种数据源都有与之对应的InputStream子类,另外,FilterInputStream也是InputStream的子类,为“装饰器”类提供基类,其中“装饰器”类可以把属性或者有用的接口与输入流连接到一起。

《ByteArrayInputStream 允许将内存的缓冲区当做InputStream 》、《StringBufferInputStream 将String作为InputStream》、《FileInputStream 用于从文件中读取信息》、《PipedInputStream 产生用于写入相关PipedOutputStream的数据。实现“管道化”概念》、《SequenceInputStream 将两个或者多个InputStream对象转换成单一的InputStream》、《FilterInputStream 抽象类,作为“装饰器”的接口。其中,“装饰器”为其他的InputStream类提供了有用的功能》

输出:字节数组、文件或者管道。另外,FilterOutputStream也是OutputStream的子类,为“装饰器”类提供基类,其中“装饰器”类可以把属性或者有用的接口与输出流连接到一起。

---->ByteArrayOutputStream 、FileOutputStream 、PipedOutputStream、FilterOutputStream

3、Java I/O类库需要多种不同功能的组合,这正是使用装饰器模式的原因。这也是Java I/O类库存在filter类的原因。抽象类filter是所有装饰器类的基类。装饰器必须具有和它所装饰的对象的相同的接口,但它可以扩展接口,而这种情况只发生在个别filter类中。FilterInputStream 、FilterOutputStream是用来提供装饰器类的接口以控制特定输入流和输出流的两个类,这两个类是装饰器的必要条件。

FilterInputStream 的类型:

FilterInputStream能够完成两件完全不同的事情。其中,DataInputStream允许我们读取不同的基本数据类型及String对象,其他的FilterInputStream类则在内部修改InputStream的行为方式:是否缓冲、是否保留它所读过的行等等。最后两个类看起来更像是创建编译器,因此一般使用的较少。

《DataInputStream 与DataOutputStream搭配使用,我们可以按照可移植的方式从流读取基本数据类型(int、char等)》

《BufferInputStream 防止每次读取时都得进行实际写操作。代表“使用缓冲区”》

《LineNumberInputStream 跟踪输入流中的行号》

《pushbackInputStream 具有“能弹出一个字节的缓冲区”。因此可以将读取的最后一个字符回退》

FilterOutputStream的类型:

《DataOutputStream 与DataInputStream配合,按照可移植(DataOutputStream 将数据格式化输出到“流”中,这样任何机器上的DataInputStream都能够读取它。即如果我们使用DataoutputStream写入数据,Java保证我们可以使用DataInputStream准确的读入数据---无论平台多么的不同)的方式向流中写入基本类型、String对象的数据》

《PrintStream 产生格式化的输出,DataOutputStream处理存储,PrintStream 处理显示 》

《BufferOutputStream 避免每次发送数据时都要进行实际的写操作。代表“使用缓冲区”。可以调用flush清空缓冲区》

4、面向字符及兼容Unicode的Java I/O  ----  Reader和Writer。

InputStream和OutputStream是面向字节的形式的I/O,而Java1.1对基本的I/O流做出了重大的修改,Reader和Writer是面向字符及兼容Unicode的Java I/O 。但是需要说明的是InputStream和OutputStream仍然可以提供极有价值的功能,是不可取代的。而且有的时候,我们必须把来自于“字节”层次结构中的类和“字符”层次结构中的类结合使用起来。为了实现这个目的,要用到“适配器”类:InputStreamReader可以把InputStream转换成Reader,而OutputStreamWriter可以把OutputStream转换成Writer。

设计Reader和Writer继承层次结构主要是为了国际化。老的I/O流继承层次结构仅支持8位字节流,不能很好的处理16位的Unicode字符。另外,新类库的设计使得它的操作比之前的旧类库更快。

使用准则:尽量尝试使用Reader和Writer,一旦程序代码无法成功编译,我们就会发现自己不得不使用面向字节的类库,比如Zip


5、更改流的行为

对于InputStream和OutPutStream来说,我们会使用FilterInputStream和FilterOutputStream的装饰器子类来修改“流”以满足特殊需要。Reader和Writer的类的继承结构层次沿用相同的思想--但并不完全相同。注意:FilterWriter是抽象类,没有任何的子类。


这里介绍一下PrintWriter,它是文件输出的快捷方式,Printriter使得你不必在每次希望创建文件的时候都去执行所有的装饰工作。遗憾的是,其他的常见的写入任务并没有快捷方式。

PrintWriter out = new PrintWriter(file);

6、自我独立的类:RandomAccessFile

RandomAccessFile派生自Object,与上述两个继承层次结构的I/O类库没有任何关系。支持搜寻方法,并且只适用于文件,不支持装饰。在JDK1.4中。RandomAccessFile的大多数功能都被nio存储映射文件所取代了。

原创粉丝点击