Java标准库的java.io.InputStream定义了所有输入流的超类:
FileInputStream实现了文件流输入;
BufferedInputStream使用缓冲区提高文件的读取效率;
ByteArrayInputStream在内存中模拟一个字节流输入;
一. FileInputStream(文件输入流)
FileInputStream是InputStream的子类,是从文件流中读取数据,每次读取都是从硬盘中读取,读取速度较慢;
InputStream中通过 read()方法读取输入流的下一字节,并返回字节表示的 int 值(0 ~ 255),如果读到-1就不能继续读取;
InputStream缓冲读取:先定义一个byte[]数组作为缓冲区,read()方法会尽可能多的读取字节到缓冲区,但不会超过缓冲区的大小。
利用缓冲区一次读取InputStream的所有字节(两种方法):
(1) 逐个字节读取;(2)批量读取。
代码实现如下:
try (InputStream in = new FileInputStream("D:\\countNumber.text")) {
// 方式1:逐个字节读取
// int data = -1;
// while((data = in.read()) != -1) {
// System.out.println((char)data);
// }
// 方式2:批量读取
byte[] buff = new byte[1000]; // 定义1000个字节大小的缓冲区
int size = -1;
while((size = in.read(buff)) != -1) {
System.out.println();
}
} catch (IOException e1) {
e1.printStackTrace();
}
二 . BufferedInputStream(缓冲输入流)
BufferedInputStream是缓冲输入流(带有缓冲区的字节输入流),继承于FilterInputStream(是InputStream的子类),作用是为另一个输入流添加一些功能:提供缓冲功能以及支持“mark() 标记”,“reset()重置方法";
BufferedInputStream本质是通过一个内部缓冲区数组实现的,它有一个默认大小为8192的缓冲区(读取速度较快)。例如,在新建某输入流对应的BufferedInputStream后,当我们通过read()读取输入流的数据时,BufferedInputStream会将该输入流的数据分批的填充到缓冲区中。每当缓冲区的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。
public class BufferedInputStream extends FilterInputStream {
private static int DEFAULT_BUFFER_SIZE = 8192;
...}
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\countNumber.text"))) {
// 方式1:逐个字节读取
// int data = -1;
//while((data = bis.read()) != -1) {
// System.out.println(data);
// }
// 方式2:批量读取
byte[] buffData = new byte[128]; // 用来存储每次读取到的字节数组
int len = -1; // 每次读取到的字节数组的长度
while((len = bis.read(buffData)) != -1) {
System.out.println(Arrays.toString(buffData));
}
} catch (IOException e) {
e.printStackTrace();
}
注:如果打开了一个文件进行读写,完成后要及时关闭,以便让os释放资源 (try语句:快捷键:shift+alt+z,编译器会自动写入finally并调用close()),实际上,编译器并不会特别的为InputStream加上自动关闭,而是因为其实现了AutoCloseable接口,由于实现了此接口,才会自动写入finally并调用close();