原文: https://www.programiz.com/java-programming/bufferedinputstream

在本教程中,我们将借助示例学习 Java BufferedInputStream及其方法。

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

它扩展了InputStream抽象类。

Java `BufferedInputStream`类 - 图1


BufferedInputStream的工作原理

BufferedInputStream维护 8192 字节的内部缓冲区

BufferedInputStream中进行读取操作期间,将从磁盘读取一部分字节并将其存储在内部缓冲区中。 并从内部缓冲区中逐个读取字节。

因此,减少了与磁盘的通信次数。 这就是为什么使用BufferedInputStream读取字节更快的原因。


创建一个BufferedInputStream

为了创建一个BufferedInputStream,我们必须首先导入java.io.BufferedInputStream包。 导入包后,便可以在此处创建输入流。

  1. // Creates a FileInputStream
  2. FileInputStream file = new FileInputStream(String path);
  3. // Creates a BufferedInputStream
  4. BufferedInputStream buffer = new BufferInputStream(file);

在上面的示例中,我们使用名为file创建了名为bufferBufferdInputStream

在此,内部缓冲区的默认大小为 8192 字节。 但是,我们也可以指定内部缓冲区的大小。

  1. // Creates a BufferedInputStream with specified size internal buffer
  2. BufferedInputStream buffer = new BufferInputStream(file, int size);

buffer将有助于更快地从文件中读取字节。


BufferedInputStream的方法

BufferedInputStream类提供了InputStream类中存在的不同方法的实现。

read()方法

  • read() - 从输入流中读取一个字节
  • read(byte[] arr) - 从流中读取字节并将其存储在指定的数组中
  • read(byte[] arr, int start, int length) - 从流中读取等于length的字节数,并从位置start开始存储在指定的数组中

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

  1. This is a line of text inside the file.

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

  1. import java.io.BufferedInputStream;
  2. import java.io.FileInputStream;
  3. class Main {
  4. public static void main(String[] args) {
  5. try {
  6. // Creates a FileInputStream
  7. FileInputStream file = new FileInputStream("input.txt");
  8. // Creates a BufferedInputStream
  9. BufferedInputStream input = new BufferedInputStream(file);
  10. // Reads first byte from file
  11. int i = input .read();
  12. while (i != -1) {
  13. System.out.print((char) i);
  14. // Reads next byte from the file
  15. i = input.read();
  16. }
  17. input.close();
  18. }
  19. catch (Exception e) {
  20. e.getStackTrace();
  21. }
  22. }
  23. }

输出

  1. This is a line of text inside the file.

在上面的示例中,我们创建了一个名为bufferFileInputStream的缓冲输入流。 输入流与文件input.txt链接。

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

在这里,我们已使用read()方法从缓冲读取器的内部缓冲区读取字节数组。


available()方法

要获取输入流中可用字节的数量,我们可以使用available()方法。 例如,

  1. import java.io.FileInputStream;
  2. import java.io.BufferedInputStream;
  3. public class Main {
  4. public static void main(String args[]) {
  5. try {
  6. // Suppose, the input.txt file contains the following text
  7. // This is a line of text inside the file.
  8. FileInputStream file = new FileInputStream("input.txt");
  9. // Creates a BufferedInputStream
  10. BufferedInputStream buffer = new BufferedInputStream(file);
  11. // Returns the available number of bytes
  12. System.out.println("Available bytes at the beginning: " + buffer.available());
  13. // Reads bytes from the file
  14. buffer.read();
  15. buffer.read();
  16. buffer.read();
  17. // Returns the available number of bytes
  18. System.out.println("Available bytes at the end: " + buffer.available());
  19. buffer.close();
  20. }
  21. catch (Exception e) {
  22. e.getStackTrace();
  23. }
  24. }
  25. }

输出

  1. Available bytes at the beginning: 39
  2. Available bytes at the end: 36

在上面的示例中,

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

skip()方法

要丢弃并跳过指定的字节数,可以使用skip()方法。 例如,

  1. import java.io.FileInputStream;
  2. import java.io.BufferedInputStream;
  3. public class Main {
  4. public static void main(String args[]) {
  5. try {
  6. // Suppose, the input.txt file contains the following text
  7. // This is a line of text inside the file.
  8. FileInputStream file = new FileInputStream("input.txt");
  9. // Creates a BufferedInputStream
  10. BufferedInputStream buffer = new BufferedInputStream(file);
  11. // Skips the 5 bytes
  12. buffer.skip(5);
  13. System.out.println("Input stream after skipping 5 bytes:");
  14. // Reads the first byte from input stream
  15. int i = buffer.read();
  16. while (i != -1) {
  17. System.out.print((char) i);
  18. // Reads next byte from the input stream
  19. i = buffer.read();
  20. }
  21. // Closes the input stream
  22. buffer.close();
  23. }
  24. catch (Exception e) {
  25. e.getStackTrace();
  26. }
  27. }
  28. }

输出

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

在上面的示例中,我们使用skip()方法从文件输入流中跳过 5 个字节。 因此,从输入流中跳过字节'T''h''i''s'' '


close()方法

要关闭缓冲的输入流,可以使用close()方法。 调用close()方法后,我们将无法使用输入流读取数据。


BufferedInputStream的其他方法

方法 内容描述
mark() 标记输入流中已读取数据的位置
reset() 将控件返回到输入流中设置了标记的点

要了解更多信息,请访问 Java BufferdInputStream(官方 Java 文档)