FileInputStream与BufferedInputStream的区别

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值