Java中的流与文件:流

来源:互联网 发布:无锡激光编程招聘信息 编辑:程序博客网 时间:2024/06/03 09:13

一、流

       Java API中,可以从其中读入一个字节序列的对象称为输入流,而可以向其中写入一个字节序列的对象称为输出流。这些字节序列的来源地和目的地可以是文件,而且通常都是文件,但是也可以是网络连接,甚至是内存块。抽象类InputStream和OutputStream构成了输入/输出类层次结构的基础。

       因为面向字节的流不便于处理以Unicode形式存储的信息,所以从抽象类Reader和Writer中继承出来了一个专门用于处理Unicode字符的单独的类层次结构。这些类拥有的读入和写出操作都是基于两字节的Unicode码元的,而不是基于单字节的字符。

( 1 )读写字节

       InputStream类有一个抽象方法: abstract int read();

       与此类似,OutputStream类定义了下面的抽象方法:abstract void write(int b);

       read和write方法在执行时都将阻塞,直至字节确实被读入或写出。这就意味着如果流不能被立即访问,那么当前的线程将被阻塞。这使得在这两个方法等待指定的流变为可用的这段时间里,其他的线程就有机会去执行有用的工作。

       当你完成对流的读写时,应该通过调用close方法来关闭它,这个调用会释放掉十分有限的操作系统资源。如果一个应用程序打开了过多的流而没有关闭,那么系统资源将会被耗尽。关闭一个输出流的同时还会冲刷用于该输出流的缓冲区:所有被临时置于缓冲区中,以便用更大的包的形式传递的字符在关闭输出流时都将被送出。特别是,如果不关闭文件,那么写出字节的最后一个包可能将永远得不到传递。当然,我们还可以用flush方法来人为地冲刷这些输出。

       Java提供了众多从基本的InputStream和OutputStream类导出的类,这些类使我们可以处理那些常用格式表示的数据,而不只是字节。

常用方法:

java.io.InputStream 1.0

abstract int read() 从数据中读入一个字节,并返回该字节。这个read方法在碰到流的结束时返回-1.

void close() 关闭输入流

java.io.OutputStream 1.0

abstract void write(int n) 写出一个字节的数据

void close() 冲刷并关闭输出流

void flush() 冲刷输出流,也就是将所有缓存的数据发送到目的地

(2)完整的流家族

       按照使用方法来划分:处理字节和字符两个单独的层次结构。正如所见,InputStream和OutputStream类可以读写单个字节或字节数组。如果想要读写字符串和数字,就需要功能更强大的子类,例如DataInputStream和DataOutputStream可以以二进制读写所有的基本Java类型。

       另一方面,对于Unicode文本,可以使用抽象类Reader和Writer的子类。

总结:对于字节的读取操作使用InputStream和OutputStream类,Unicode字符的读取操作使用Reader和Writer类。虽然InputStream和OutputStream可以读取字符串但是对于Unicode的字符无法区分出来正常显示。

(3)组合流过滤器

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

       Java使用一种灵巧的机制来分离两种职责。某些流可以从文件和其他更外部的位置上获取字节,而其他的流可以将字节组装到更有用的数据型中。Java程序员必须对二者进行组合。

      通过嵌套过滤器来添加多重功能。例如,流在默认情况下是不被缓冲区缓存的,也就是说,每个对read的调用都会请求操作系统在分发一个字节。相比之下,请求一个数据块并将其置于缓冲区中会显得更加高效。如果我们想使用缓冲机制,以及用于文件的数据输入方法,那么就需要使用如下代码: DataInputStream din = new DataInputStream(new BuffereInputStream(new FileInputStream("employee.dat")));

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

0 0