Java BufferedInputStream 类用法说明及实例
本教程通过示例介绍 Java BufferedInputStream 类以及使用方法。
本教程通过示例介绍 Java BufferedInputStream 类以及使用方法。
java.io
包的 BufferedInputStream
类与其他输入流一起使用以更有效地以字节为单位读取数据。
BufferedInputStream
类它扩展了 InputStream
抽象类。
BufferedInputStream 的原理
BufferedInputStream
内部维护一个 8192
个字节的缓冲器。
在读操作期间, BufferedInputStream
从磁盘中读取一个字节块并存储在内部缓冲区中,然后从内部缓冲区中单独读取字节。
因此,减少了与磁盘的通信次数,提高了读取的效率。
缓冲就是程序和磁盘之间的一个中间人。
创建 BufferedInputStream
BufferedInputStream
类位于 java.io
包中,BufferedInputStream
类提供了构造方法创建对象。 BufferedInputStream
都是作为其他流的包装类使用,因此构造方法中需要传入一个 InputStream
对象。如下:
// 文件输入流
FileInputStream file = new FileInputStream(String path);
// 包装了文件输入流的缓冲输入流
BufferedInputStream buffer = new BufferInputStream(file);
在上面的例子中,我们创建了一个名为 buffer
的 BufferdInputStream
对象,它包装了 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
在上面的例子中,
- 首先,我们使用
available()
方法来返回输入流中的可用字节数。 - 然后,我们使用了 2 次
read()
方法从输入流中读取 2 个字节。 - 最后,我们再次检查了可用字节。这次可用字节减少了 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() |
将控制返回到输入流中设置标记的位置 |