程序使用字节流(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。
那么为什么要谈论字节流呢?因为所有其他流类型都建立在字节流上。
