Java BufferedInputStream 类用法说明及实例

本教程通过示例介绍 Java BufferedInputStream 类以及使用方法。

本教程通过示例介绍 Java BufferedInputStream 类以及使用方法。

java.io 包的 BufferedInputStream 类与其他输入流一起使用以更有效地以字节为单位读取数据。

BufferedInputStream 类它扩展了 InputStream 抽象类。

BufferedInputStream 类是 Java InputStream 的子类。
Java BufferedInputStream 类

BufferedInputStream 的原理

BufferedInputStream 内部维护一个 8192 个字节的缓冲器。

在读操作期间, BufferedInputStream 从磁盘中读取一个字节块并存储在内部缓冲区中,然后从内部缓冲区中单独读取字节。

因此,减少了与磁盘的通信次数,提高了读取的效率。

缓冲就是程序和磁盘之间的一个中间人。

创建 BufferedInputStream

BufferedInputStream 类位于 java.io 包中,BufferedInputStream 类提供了构造方法创建对象。 BufferedInputStream 都是作为其他流的包装类使用,因此构造方法中需要传入一个 InputStream 对象。如下:

// 文件输入流
FileInputStream file = new FileInputStream(String path);

// 包装了文件输入流的缓冲输入流
BufferedInputStream buffer = new BufferInputStream(file);

在上面的例子中,我们创建了一个名为 bufferBufferdInputStream 对象,它包装了 FileInputStream 对象。

此处,内部缓冲区的默认大小为 8192 字节。但是,我们也可以通过以下构造方法自定义内部缓冲区的大小。

BufferedInputStream buffer = new BufferInputStream(file, int size);

BufferedInputStream 的方法

BufferedInputStream 类实现了的 InputStream 类中的定义的所有的抽象方法。

read() 方法

  • read() - 从输入流中的数组中读取单个字节数据
  • read(byte[] array) - 从输入流中读取字节并存储在指定的数组中
  • read(byte[] array, int start, int length) - 读取从 start 指定的开始的长度为 length 的字节数据到指定的数组中

假设我们有一个名为input.txt的文件,其内容如下。

This is a line of text inside the file.

让我们尝试使用 BufferedInputStream 读取文件的内容。

import java.io.BufferedInputStream;
import java.io.FileInputStream;

public class Main {
  public static void main(String[] args) {
    try {
      // Creates a FileInputStream
      FileInputStream file = new FileInputStream("input.txt");

      // Creates a BufferedInputStream
      BufferedInputStream input = new BufferedInputStream(file);

      // Reads first byte from file
      int i = input.read();

      while (i != -1) {
        System.out.print((char) i);

        // Reads next byte from the file
        i = input.read();
      }
      input.close();
    } catch (Exception e) {
      e.getStackTrace();
    }
  }
}

输出

This is a line of text inside the file.

在上面的例子中,我们创建了一个名为 input 的缓冲输入流,并通过装饰 FileInputStream 输入流与文件 input.txt 关联起来。

然后,我们使用了 read() 从缓冲输入流的内部缓冲区读取字节数据。

available() 方法

available() 方法返回输入流中的可用的字节数。例如,

import java.io.FileInputStream;
import java.io.BufferedInputStream;

public class Main {

  public static void main(String args[]) {

    try {

      FileInputStream file = new FileInputStream("input.txt");
      BufferedInputStream buffer = new BufferedInputStream(file);

      System.out.println("Available bytes at the beginning: " + buffer.available());

      buffer.read();
      buffer.read();
      buffer.read();

      System.out.println("Available bytes at the end: " + buffer.available());

      buffer.close();
    } catch (Exception e) {
      e.getStackTrace();
    }
  }
}

输出

Available bytes at the beginning: 39
Available bytes at the end: 36

在上面的例子中,

  1. 首先,我们使用 available() 方法来返回输入流中的可用字节数。
  2. 然后,我们使用了 2 次 read() 方法从输入流中读取 2 个字节。
  3. 最后,我们再次检查了可用字节。这次可用字节减少了 2 个。

skip() 方法

skip() 方法跳过指定数量的字节。例如,

import java.io.FileInputStream;
import java.io.BufferedInputStream;

public class Main {

  public static void main(String args[]) {

    try {
      FileInputStream file = new FileInputStream("input.txt");
      BufferedInputStream buffer = new BufferedInputStream(file);

      // Skips the 5 bytes
      buffer.skip(5);
      System.out.println("Input stream after skipping 5 bytes: ");

      int i = buffer.read();
      while (i != -1) {
        System.out.print((char) i);
        i = buffer.read();
      }

      buffer.close();
    } catch (Exception e) {
      e.getStackTrace();
    }
  }
}

输出

Input stream after skipping 5 bytes: is a line of text inside the file.

在上面的例子中,我们使用了 skip() 方法从输入流的当前位置中跳过 5 个字节的数据。。因此,字节 'T''h''i''s'' ' 没有输出出来。

close() 方法

close() 方法用来关闭输入流。一旦调用了 close() 方法,我们就不能使用输入流来读取数据了。

在以上所有示例中,我们都使用了 close() 关闭文件输入流的方法。

BufferedInputStream 的其他方法

方法 说明
mark() 标记输入流中已读取数据的位置
reset() 将控制返回到输入流中设置标记的位置