程序使用字节流(byte streams)执行8位字节的输入和输出。所有字节流类均来自 InputStream
和 OutputStream
。
有许多字节流类。为了演示字节流如何工作,我们将重点介绍文件I / O字节流 FileInputStream
和 FileOutputStream
。其他类型的字节流的使用方式大致相同。它们的主要区别在于它们的构造方式。
使用字节流
我们将研究FileInputStream
和FileOutputStream
检查一个名为CopyBytes
的示例程序,该程序使用字节流一次复制xanadu.txt
的一个字节。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyBytes {
public static void main(String[] args) throws IOException {
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
CopyBytes
大部分时间都花在一个简单的循环中,该循环读取输入流并写入输出流,一次写入一个字节, 如下图所示。
简单的字节流输入和输出。
始终关闭流
在不再需要时,关闭流非常重要-非常重要,以至于CopyBytes
使用一个finally
块来保证即使发生错误也将关闭两个流。这种做法有助于避免严重的资源泄漏。
一种可能的错误是CopyBytes
无法打开一个或两个文件。发生这种情况时,与文件相对应的流变量永远不会从其初始null
值更改。这就是为什么CopyBytes
在调用close
之前,确保每个流变量都包含一个对象引用。
何时不使用字节流
CopyBytes
看起来像是一个普通程序,但是它实际上代表了您应该避免的一种低级I / O。由于xanadu.txt
包含字符数据,因此最好的方法是使用字符流,如下一节所述。也有针对更复杂数据类型的流。字节流仅应用于最基本的I / O。
那么为什么要谈论字节流呢?因为所有其他流类型都建立在字节流上。