跳到主要内容

Java BufferedInputStream 类

提示

1.BufferedInputStream 概念:Java 中的 BufferedInputStream 类用于高效读取数据(字节单位),通过在 java.io 包中与其他输入流一起使用,维护内部缓冲区提高读取效率。 2.创建和使用 BufferedInputStream:使用 BufferedInputStream 时,首先创建 FileInputStream,然后创建 BufferedInputStream 对象。它支持读取单个字节、字节数组,以及跳过和标记数据的功能。 3.BufferedInputStream 的工作原理:内部维护一个大小为 8192 字节的缓冲区,通过从磁盘一次性读取大量字节到缓冲区,然后逐个读取,减少与磁盘的通信次数,从而提高读取速度。

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

它继承了 InputStream 抽象类。

BufferedInputStream 类是 Java InputStream 的子类。

BufferedInputStream 的工作原理

BufferedInputStream 维护了一个内部缓冲区,大小为 8192 字节

BufferedInputStream 中进行读取操作时,会从磁盘读取一大块字节并存储在内部缓冲区中。然后从内部缓冲区逐个读取字节。

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

创建 BufferedInputStream

为了创建 BufferedInputStream,我们首先必须导入 java.io.BufferedInputStream 包。一旦我们导入了包,就可以这样创建输入流。

// 创建 FileInputStream
FileInputStream file = new FileInputStream(String path);

// 创建 BufferedInputStream
BufferedInputStream buffer = new BufferedInputStream(file);

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

这里,内部缓冲区的默认大小为 8192 字节。然而,我们也可以指定内部缓冲区的大小。

// 创建指定大小内部缓冲区的 BufferedInputStream
BufferedInputStream buffer = new BufferedInputStream(file, int size);

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

BufferedInputStream 的方法

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

read() 方法

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

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

这是文件中的一行文字。

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

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

class Main {
public static void main(String[] args) {
try {

// 创建 FileInputStream
FileInputStream file = new FileInputStream("input.txt");

// 创建 BufferedInputStream
BufferedInputStream input = new BufferedInputStream(file);

// 从文件中读取第一个字节
int i = input.read();

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

// 从文件中读取下一个字节
i = input.read();
}
input.close();
}

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

输出

这是文件中的一行文字。

在上面的示例中,我们与 FileInputStream 一起创建了名为 buffer 的缓冲输入流。该输入流与文件 input.txt 相关联。

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

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

available() 方法

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

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

public class Main {

public static void main(String args[]) {

try {

// 假设 input.txt 文件包含以下文本
// 这是文件中的一行文字。
FileInputStream file = new FileInputStream("input.txt");

// 创建 BufferedInputStream
BufferedInputStream buffer = new BufferedInputStream(file);

// 返回可用字节数量
System.out.println("开始时可用字节数: " + buffer.available());

// 从文件中读取字节
buffer.read();


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

// 返回可用字节数量
System.out.println("结束时可用字节数: " + buffer.available());

buffer.close();
}

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

输出

开始时可用的字节数:39
结束时可用的字节数:36

在上面的例子中,

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

skip() 方法

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

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

public class Main {

public static void main(String args[]) {

try {
// 假设,input.txt 文件包含以下文本
// This is a line of text inside the file.
FileInputStream file = new FileInputStream("input.txt");

// 创建一个 BufferedInputStream
BufferedInputStream buffer = new BufferedInputStream(file);

// 跳过5个字节
buffer.skip(5);
System.out.println("跳过5个字节后的输入流:");

// 从输入流读取第一个字节
int i = buffer.read();
while (i != -1) {
System.out.print((char) i);

// 从输入流中读取下一个字节
i = buffer.read();
}

// 关闭输入流
buffer.close();
}

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

输出

跳过5个字节后的输入流:is a line of text inside the file.

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

close() 方法

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

BufferedInputStream 的其他方法

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

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