程序使用字节流(byte streams执行8位字节的输入和输出。所有字节流类均来自 InputStreamOutputStream
有许多字节流类。为了演示字节流如何工作,我们将重点介绍文件I / O字节流 FileInputStreamFileOutputStream。其他类型的字节流的使用方式大致相同。它们的主要区别在于它们的构造方式。

使用字节流

我们将研究FileInputStreamFileOutputStream检查一个名为CopyBytes的示例程序,该程序使用字节流一次复制xanadu.txt的一个字节。

  1. import java.io.FileInputStream;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. public class CopyBytes {
  5. public static void main(String[] args) throws IOException {
  6. FileInputStream in = null;
  7. FileOutputStream out = null;
  8. try {
  9. in = new FileInputStream("xanadu.txt");
  10. out = new FileOutputStream("outagain.txt");
  11. int c;
  12. while ((c = in.read()) != -1) {
  13. out.write(c);
  14. }
  15. } finally {
  16. if (in != null) {
  17. in.close();
  18. }
  19. if (out != null) {
  20. out.close();
  21. }
  22. }
  23. }
  24. }

CopyBytes大部分时间都花在一个简单的循环中,该循环读取输入流并写入输出流,一次写入一个字节, 如下图所示。
字节流 - 图1
简单的字节流输入和输出。

始终关闭流

在不再需要时,关闭流非常重要-非常重要,以至于CopyBytes使用一个finally块来保证即使发生错误也将关闭两个流。这种做法有助于避免严重的资源泄漏。
一种可能的错误是CopyBytes无法打开一个或两个文件。发生这种情况时,与文件相对应的流变量永远不会从其初始null值更改。这就是为什么CopyBytes在调用close之前,确保每个流变量都包含一个对象引用。

何时不使用字节流

CopyBytes看起来像是一个普通程序,但是它实际上代表了您应该避免的一种低级I / O。由于xanadu.txt包含字符数据,因此最好的方法是使用字符流,如下一节所述。也有针对更复杂数据类型的流。字节流仅应用于最基本的I / O。
那么为什么要谈论字节流呢?因为所有其他流类型都建立在字节流上。