Java BufferedInputStream 类
1.BufferedInputStream 概念:Java 中的 BufferedInputStream
类用于高效读取数据(字节单位),通过在 java.io
包中与其他输入流一起使用,维护内部缓冲区提高读取效率。
2.创建和使用 BufferedInputStream:使用 BufferedInputStream
时,首先创建 FileInputStream
,然后创建 BufferedInputStream
对象。它支持读取单个字节、字节数组,以及跳过和标记数据的功能。
3.BufferedInputStream 的工作原理:内部维护一个大小为 8192 字节的缓冲区,通过从磁盘一次性读取大量字节到缓冲区,然后逐个读取,减少与磁盘的通信次数,从而提高读取速度。
java.io
包中的 BufferedInputStream
类与其他输入流一起使用,可以更高效地读取数据(以字节为单位)。
它继承了 InputStream
抽象类。
BufferedInputStream 的工作原理
BufferedInputStream
维护了一个内部缓冲区,大小为 8192 字节。
在 BufferedInputStream
中进行读取操作时,会从磁盘读取一大块字节并存储在内部缓冲区中。然后从内部缓冲区逐个读取字节。
因此,与磁盘的通信次数减少了。这就是为什么使用 BufferedInputStream
读取字节更快的原因。
创建 BufferedInputStream
为了创建 BufferedInputStream
,我们首 先必须导入 java.io.BufferedInputStream
包。一旦我们导入了包,就可以这样创建输入流。
// 创建 FileInputStream
FileInputStream file = new FileInputStream(String path);
// 创建 BufferedInputStream
BufferedInputStream buffer = new BufferedInputStream(file);
在上面的示例中,我们使用名为 file
的 FileInputStream
创建了名为 buffer
的 BufferedInputStream
。
这里,内部缓冲区的默认大小为 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
在上面的例子中,
- 我们首先使用
available()
方法来检查输入流中可用的字节数。 - 然后,我们使用了
read()
方法三次,从输入流中读取了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 文档)。