Byte Streams

程序使用字节流来执行 8 位字节的 Importing 和输出。所有字节流类均来自InputStreamOutputStream

有许多字节流类。为了演示字节流如何工作,我们将重点介绍文件 I/O 字节流FileInputStreamFileOutputStream。其他类型的字节流的使用方式大致相同。它们的主要区别在于构造方式。

使用字节流

我们将通过研究名为CopyBytes的示例程序来探索FileInputStreamFileOutputStream,该示例程序使用字节流一次复制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将其大部分时间花费在一个简单的循环中,该循环读取 Importing 流并写入输出流,一次写入一个字节,如下图所示。

简单的字节流 Importing 和输出。

简单的字节流 Importing 和输出。

始终关闭信息流

在不再需要时关闭流非常重要-非常重要,以致CopyBytes使用finally块以确保即使发生错误也将关闭两个流。这种做法有助于避免严重的资源泄漏。

一个可能的错误是CopyBytes无法打开一个或两个文件。发生这种情况时,与文件相对应的流变量永远不会从其初始null值更改。这就是CopyBytes在调用close之前确保每个流变量包含一个对象引用的原因。

何时不使用字节流

CopyBytes似乎是一个普通程序,但实际上代表了您应避免的一种低级 I/O。由于xanadu.txt包含字符数据,所以最好的方法是使用character streams,这将在下一节中讨论。也有用于更复杂数据类型的流。字节流仅应用于最原始的 I/O。

那么为什么要谈论字节流呢?因为所有其他流类型都构建在字节流上。