java io笔记_java IO的读书笔记

Java 库的IO 类分割为输入与输出两个部分。通过继承,从InputStream衍生的所有类都拥有名为read()的基本方法,用于读取单个字节或者字节数组。类似地,从OutputStream衍生的所有类都拥有基本方法write(),用于写入单个字节或者字节数组。库的设计者首先决定与输入有关的所有类都从InputStream继承,而与输出有关的所有类都从OutputStream继承。

InputStream的类型

InputStream的作用是标志那些从不同起源地产生输入的类。这些起源地包括(每个都有一个相关的InputStream子类):

(1) 字节数组

(2) String对象

(3) 文件

(4) “管道”:将一些东西置入一端,它们在另一端出来

(5) 一系列其它流,以便将属性或者有用的接口同输入流连接到一起

(6) FilterInputStream

ByteArrayInputStream允许内存中的一个缓冲区作为InputStream使用,从中提取字节的缓冲区/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口

StringBufferInputSrtream将一个String转换为InputStream一个String(字符串)。基础的实施方案实际采用一个StringBuffer(字符缓冲)/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口

FileInputStream用于从文件读取信息代表文件名的一个String,或者一个File或FileDescriptor对象/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口

PipedInputString产生为相关的PipedOutputStream写的数据。实现了“管道化”的概念PipedOutputStream/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口

OutputStream的类型

这一类别包括的类决定了我们的输入往何处去:一个字节数组;一个文件;或者一个“管道”

ByteArrayOutputStream在内存中创建一个缓冲区。我们发送给流的所有数据置入这个缓冲区。可选缓冲区的初始大小/用于指出数据的目的地。若将其同FilterOutputStream对象连接到一起,可提供一个有用的接口

FileOutputStream将信息发送给一个文件,用一个String代表文件名,或选用一个File或FileDescriptor对象/用于指出数据的目的地。若将其同FilterOutputStream对象连接到一起,可提供一个有用的接口

PipedOutputStream写给它的任何信息都会自动成为相关的PipedInputStream的输出。实现了“管道化”的概念 PipedInputStream/为多线程处理指出自己数据的目的地/将其同FilterOutputStream对象连接到一起,可提供一个有用的接口

Java中,利用层次化对象动态和透明地添加单个对象的能力的做法叫做“装饰器”(Decorator)方案。装饰器方案规定封装于初始化对象中的所有对象都拥有相同的接口,以便利用装饰器的“透明”性质——我们将相同的消息发给一个对象,无论它是否已被“装饰”。这正是在java IO 库里存在“过滤器”(Filter)类的原因;抽象的“过滤器”类是所有装饰器的基础类。

子类处理要求大量子类对每种可能的组合提供支持时,便经常会用到装饰器——由于组合形式太多,造成子类处理变得不切实际。Java IO 库要求许多不同的特性组合方案,这正是装饰器方案显得特别有用的原因。但是,装饰器方案也有自己的一个缺点。在我们写一个程序的时候,装饰器为我们提供大得多的灵活性,但它们也使自己的代码变得更加复杂。原因在于Java IO 库操作不便,我们必须创建许多类——“核心”IO类型加上所有装饰器——才能得到自己希望的单个IO对象。

通过FilterInputStream从InputStream里读入数据

FilterInputStream类要完成两件全然不同的事情。其中,DataInputStream允许我们读取不同的基本类型数据以及String对象(所有方法都以“read”开头,比如readByyte(),readFloat()等等)。伴随对应的DataOutputStream,我们可通过数据“流”将基本类型的数据从一个地方搬到另一个地方。若读取块内的数据,并自己进行分析,就不需要用到DataInputStream。但在其它许多情况下,我们一般都想用它对自己读入的数据进行自动跟石化。

剩下的类用于修改InputStream的内部行为方式:是否进行缓冲,是否跟踪自己读入的数据行,以及是否推回一个字符等等。后两种类看起来特别像提供对构建一个编译器的支持。

也许几乎每次都要缓冲自己的输入,无论连接的是哪个IO设备。所以IO库最明智的做法就是将未输入作为一个特殊情况处理,同时将缓冲输入接纳为标准做法。

DataInputStream与DataOutputStream联合使用,使自己能以机动方式读取一个流中的基本数据类型,InputStream/包含一个完成的接口,以便读取基本数据类型

BufferedInputStream避免每次想要更多数据时都进行物理性的读取,告诉它“请先在缓冲区里找”InputStream,没有可选的缓冲区大小/本省并不是提供一个接口,只是发出使用缓冲区的要求。要求同一个接口对象连接到一起;

LineNumberInputStream跟踪输入流中的行号;可以调用getLineNumber()以及setLineNumber只是添加对数据行编号的能力,所以可能需要同一个真正的接口对象连接

PushbackInputStream有一个字节的后推缓冲区,以便推读入的上一个字符InputStream/通常由编译器在扫描中使用,因为Java编译器需要它。一般不会在自己的代码中使用

RandomAssessFile

用于包含了已知长度记录的文件,以便我们能用seek()从一条记录移至另一条;然后读取或修改那些记录。各记录的长度并一定相同;只要知道它们有多大以及置于文件何处即可。

File类(它既代表一个特定文件的名字,也代表目录内一系列文件的名字)

若File代表一个文件集,便可用list()方法查询这个集,返回一个字符串数组。之所以要返回一个数组,而非某个灵活的集合类,是因为元素的数量是固定的。若想得到一个不同的目录列表,只需要创建一个不同的File对象即可。

目录列表器

建立一个目录列表,可用两种方式列出File对象。若在不含自变量(参数)的情况下调用list(),会获得File对象包含的一个完整列表。然而,若想对这个列表进行某些限制,就需要使用一个“目录过滤器”,该类的作用是指出应如何选择File对象来完成显示。

FilernameFilter提供了一个名为accept()的方法。然后使用创建其它类实现FilernameFilter这个接口,目的就是要把accept()方法提供给File的list()方法,使list()能够“回调”accept(),从而判断应将哪些文件名包括到列表中。由于list()采用一个FilenameFilter对象作为自己的自变量使用,所以我们能传递实现了FilenameFilter的任何类的一个对象,用它来决定(甚至在运行期)list()方法的行为方式。回调的目的是在代码行为上提供更大的灵活性。Accept()方法必须接纳一个File对象,用它指示用于寻找一个特定文件的目录;并接纳一个String,其中包含了要寻找文件的名字。可决定使用或忽略这两个参数之一,但有时至少要使用文件名。List()方法准备为目录对象中的每个文件名调用accept(),核实哪个应包含在内——具体由accept()返回的“布尔”结果决定

IO流的典型应用

尽管java库内存在大量的IO流库,可通过多种不同的方式组合到一起,但实际上只有几种方式才会经常用到。然而,必须非常小心才能得到正确的组合。

1. 缓冲的输入文件

2. 从内存输入

3. 格式化内存输入

4. 行的编号与文件输出

5. 保存和恢复数据

6. 读写随机访问文件

7. 快速文件输入

8. 快速输出格式化文件

9. 快速输出数据文件

缓冲的输入文件

为打开一个文件以便输入,需要使用一个FileInputStream,同时将一个String或File对象作为文件名使用。为提高速度,最好先对文件进行缓冲处理,从而获得用于一个BufferedInputStream的构建器的结果句柄。为了以格式化的形式读取输入数据,我们将哪个结果句柄赋给用于一个DataInputStream的构建器。DataInputStream是我们的最终(final)对象,并是我们进行读取操作的接口。

Java 1.1压缩类 功能

CheckedInputStream GetCheckSum()为任何InputStream产生校验和(不仅是解压)

CheckedOutputStream GetCheckSum()为人任何OutputStream缠上校验和(不仅是解压)

DeflaterInputStream 用于压缩类的基础类

ZipOutputStream 一个DeflaterInputStream,将数据压缩成Zip文件格式

GZIPOutputStream 一个DeflaterInputStream,将数据压缩成GZIP文件格式

InflaterInputStream 用于解压类的基础类

ZipInputStream 一个InflaterInputStream,解压用Zip文件格式保存的数据

GZIPInputStream 一个InflaterInputStream ,解压用GZIP文件格式保存的数据

压缩类的用法比较直观——只需将输出流封装到一个GZIPOutputStream或者ZipOutputStream内,并将输入流封装到GZIPInputStream或者ZipInputStream内即可。剩余的全部操作就是标准的IO读写。

用Zip进行多文件保存。

对于要加入压缩档的每一个文件,都必须调用putNextEntry(),并将其传递给一个ZipEntry对象。ZipEntry对象包含了一个功能全面的借口,利用它可以获取和设置Zip文件内那个特定的Entry(入口)上能够接受的所有的数据:名字、压缩后和压缩前的长度、日期、CRC校验和、额外字段的数据、注释、压缩方法以及它是否一个目录入口等等。然而,虽然Zip格式提供了设置密码的方法,但Java的Zip库没有提供这方面的支持。而且尽管CheckedInputStream和CheckedOutStream同时提供了对Adler32和CRC32教研的支持,但是ZipEntry只支持CRC的接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值