欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IO流学习(Java)(三)

程序员文章站 2024-03-05 14:56:24
...

组合流过滤器
FileInputStream和FileOutputStream可以提供附着在一个磁盘文件上的输入流和输出流,而你只需要向其构造器提供文件名或文件的完整路径名。例如:

FileInputStream fis=new FileInputStream("a.txt");

这行代码可以查看在用户目录下名为“a.txt”的文件

与抽象类InputStream和OutputStream一样,这些类支持在字节级别上的读写。也就是说,我们只能从fis对象中读入字节和字节数组。
byte b=(byte)fis.read();
意思是读取“a.txt”文件里的一个字节将其存放在b中,

如果我们只有DataInputStream,那么我们就只能读入数字类型;

DataInputStream dis=..;
double s=dis.readDouble();

但是正如FileInputStream没有任何读入数字类型的方法一样,DataInputStream也没有任何从文件中获取数据的方法。
Java使用了一种灵巧的机制来分离这两种职责。某些流(例如FileInputStream和由URL类的openStream方法返回的输入流)可以从文件和其他更外部的位置获取字节,而其他的流(例如DataInputStream和PrintWriter)可以将字节组装到更有用的数据类型中。Java程序员必须对二者进行组合。例如,为了从文件中读入数字,首相需要创建一个FileInputStream,然后将其传递给DataInputStream的构造器:

FileInputStream fis=new FileInputStream("a.txt");
DataInputStream dis=new DataInputStream(fis);
double s=dis.readDouble();

例如FilterInputStream和FiterOutputStream类,这些文件的子类用于添加原生字节流

你可以通过嵌套过滤器来添加多重功能。
过滤器:
IO流学习(Java)(三)
IO流学习(Java)(三)
例如,流在默认情况下是不被缓冲区缓存的,也就是说,每个对read的调用都会请求操作系统再分发一个字节。相比之下,请求一个数据块并将其置于缓冲区中会显得更加高效。如果我们想用缓冲机制,以及文件的数据输入方法,那么久需要使用下面这种相当恐怖的构造器序列:

DataInputStream dis=new DataInputStream(new BufferedInputStream(new FileInputStream("a.txt")));

注意,我们把DataInputStream置于构造器链的最后,这是因为我们希望使用DataInputStream的方法,并且希望它们能够使用带缓冲机制的read方法。

有事当多个流链接在一起时,你需要跟踪各个中介流。例如,当读入输入时,你经常需要浏览下一个字节,以了解它是否是你想要的值。Java提供了用于此目的的PushbackInputStream:

PushBackInputStream pbis=new PushbackInputStream(new BufferedInputStream(new FileInputStream("a.txt")));

现在你可以预读下一个字节:

int b=pbis.read();

并且在它并非你所期望的值时将其抛回。

if(b!='<')pbis.unread(b);

但是读入和不读入都只是应用于可回推(pushback)输入流的方法,如果你希望能够预先浏览并且还可以读入数字,那么你就需要一个既是可回推输入流,又是一个数据输入流的引用。

DataInputStream dis=new DataInputStream(pbis=new PushbackInputStream(new BufferedInputStream(new FileInputStream("a.txt"))));

当然,在其他编程语言的流类库中,诸如缓冲机制和预览等细节都是自动处理的。因此相比较而言,Java就有一点麻烦,在这些情况下,它必须诉诸于将多个流过滤器组合起来。但是这种混合和匹配过滤器类以构建真正有用的流序列的能力,将带来极大的灵活性,例如,你可以从一个ZIP压缩文件中通过使用下面的流序列来读入数字:

ZipInputStream zis=new ZipInputStream(new FileInputStream("a.txt"));
DataInputStream dis =new DataInputStream(zis);

过滤器流序列
IO流学习(Java)(三)

内容来自《Java核心技术》