首页 > 代码库 > 流与文件

流与文件

Java中,一个可以读取字节序列的对象被称为输入流,一个可以写入字节序列的对象被称为输出流。在抽象类InputStreamOutputStream中对它们进行了说明。

读写字节

InputStream类有一个抽象的方法:

abstract int read()

该方法将读取一个字节,并将其返回。如果已经读到了输入源的末尾,将返回-1。具体的输入流类的设计者覆盖这个方法以提供具体的功能实现。例如,System.in是一个预定义的InputStream的子类的对象,使用它可以从键盘读取信息。

同样地,OutputStream类定义了这个抽象方法:

abstract void write(int b)

将一个字节写到指定的输出位置。

这里的read方法和write方法都是阻塞I/O

available方法可以检查目前可以读取的字节数。也就是说,下面这样的代码不可能永远被阻塞:

int bytesAvailable = in.available();if(bytesAvailable > 0){    byte[] data = http://www.mamicode.com/new byte[bytesAvailable];    in.read(data);}

当完对一个流的读取或者写入后,就应该调用close方法将它关闭,这样可以释放流所占用的操作系统资源。关闭一个输出流也可以冲洗(flush)输出流占用的缓存区,即临时存储在缓冲区中等待形成较大的数据包后再发送的那些字符,此时将他们发送出去。

 

流过滤器的分层

FileInputStream和FileOutputStream能够把输入和输出流与磁盘文件关联起来。例如:

FileInputStream fin = new FileInputStream("employee.data");

也可以使用一个File对象

File f = new File("employee.dat");

FileInputStream fin = new FileInputStream(f);

因为所有在java.io中的类都是将相对路径名解释为起始于用户的当前工作目录,所以应该清楚当前的目录。可以通过调用System.getProperty("user.dir")来获得。

与抽象类的InputStream和OutputStream类似,这些类只在字节层次上支持读写。这意味着,只能从fin对象中读取字节和字节数组。

byte b = (byte)fin.read();

一些流(例如FileInputStream以及URL类中利用openStream方法来返回的输入流)可以从文件以及其他地方接收字节。另一些流(例如DataInputStream和PrintWiter)可以将字节组合成更加有用的数据类型。Java程序员采用将一个已经存在的流传递给另一个流的构造器方法,将这两种流结合起来,结合后的流被称为过滤流。例如:

FileInputStream fin = new FileInputStream("employee.dat");

DataInputStream din = new DataInputStream(fin);

double s = din.readDouble();

非常重要的一点是:利用上面的代码建立的数据输入流并没有与一个新的磁盘文件对应。新创建的流依然通过访问与文件输入流相联系的文件获取数据。但是,现在可以使用一种功能更多的接口了。

 

文本流

 

 

流与文件