# 字节流

程序使用 字节流 执行 8-bit 字节的输入和输出。所有字节流类都来自 InputStreamOutputStream

# 使用字节流

我们将探索和研究一个示例程序,它使用字节流复制,一次一个字节。

public class CopyBytes {
    public static void main(String[] args) throws IOException {
        FileInputStream in = null;
        FileOutputStream out = null;

        try {
            // 需要注意在 ide 中,这样写是找不到 resources 中中文件的
            // 用常规的文件查找方式就 ok
            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();
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

CopyBytes 将大部分时间用在读取输入流和写入输出流的简单循环中,每次一个字节,如下 图所示。

Integer Variable :一个字节是一个 int 数值 0 - 255。二进制一个 Byte 表示也是最大 255

# 始终关闭流

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

一个可能的错误是 CopyBytes 无法打开一个或两个文件。当这种情况发生时,流变量可能为 null, 所以要先保证流变量不为 null,才能调用关闭方法关闭流。

# 当不使用字节流时

CopyBytes 似乎是一个正常的程序,但它实际上代表了一种应该避免的低级 I / O。由于 xanadu.txt 包含字符数据,最好的方法是使用字符流,如下一节所述。还有更复杂数据类型的数据流。字节流只能用于最原始的 I / O。

那么为什么要谈论字节流?因为所有其他流类型都是基于字节流构建的。