浅谈“FileInputStream”和“BufferedInputStream”的区别

FileInputStream就是从文件流中读取数据的一个类,它是抽象类InputStream的子类,FileInputStream从磁盘中读取数据时,可以一个一个的读取,也可以一批一批的读取,具体实现代码如下:

FileInputStream在磁盘中逐个读取数据的代码如下:

public class InputStream01 {
	public static void main(String[] args) {
		//实例化放在try后面的小括号里自动关闭
		try (InputStream in=new FileInputStream("C:\\hpc\\新建 文本文档.txt")){
			//创建(实例化)"字节输入流"对象
			
			//保存每次读取到的字节值
			int date=-1;
			
			//正常读取:0-255
			//读取末尾:-1
			while((date=in.read())!=-1) {
				System.out.print((char)date);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

这就相当于你去草莓园里摘草莓一样,你摘一个草莓,然后拿出来放在草莓园外面的箱子里,然后再进去摘,再拿出来......这样不仅耗时而且还耗力;因此,我们还可以通过在read()方法中添加参数,在磁盘中批量读取数据。

在磁盘中批量读取数据的代码如下:

public class InputStream02 {
	public static void main(String[] args) {
		try (FileInputStream in=new FileInputStream("C:\\hpc\\新建 文本文档.txt")){
			byte[] buff=new byte[128];
			int len=-1;
			while((len=in.read(buff))!=-1) {
				System.out.printf("本次读取%d个字节:%s\n",len,Arrays.toString(buff));
			}
				
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		 
	}

}

批量读取的方式就是你拿了一个箱子进入草莓园里摘草莓,箱子摘满后再拿出来。

BufferedInputStream是抽象类InputStream的子类FilterInputStream的子类,BufferedInputStream实际上是FileInputStream的装饰器,BufferedInputStream是不能直接在磁盘中读取数据的,因此,在创建BufferedInputStream的对象时,我们要传入FileInputStream对象来作为参数,利用FileInputStream在磁盘中读取数据;BufferedInputStream本质上是通过一个内部缓冲区数组实现的,缓冲中的数据实际上是保存在内存中,这个内部缓冲数组的默认大小是8192个字节,在新建某输入流对应的BufferedInputStream后,当我们通过read()读取输入流的数据时,BufferedInputStream会将该输入流的数据分批的填入到缓冲区中,每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据为止。

具体实现代码如下:

public class InputStream03 {
	public static void main(String[] args) {
		//带有缓冲区的字节输入流
		//缓冲区的默认大小为8192
		
		try(BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\hpc\\新建 文本文档.txt"))) {


			int date=-1;
			while((date=bis.read())!=-1) {
				System.out.print(date);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
				
	}

}

这种方法就相当于草莓园的外面放了一个箱子,有人把草莓摘好放进箱子里,我们在草莓园外面的箱子里取草莓,不用进去摘,如果箱子里没有草莓了,会有人去摘草莓将箱子填满,我们只需在外面的箱子里去草莓就行了,直到拿完草莓园的草莓为止;这个箱子我们如果没有规定大小,就默认为8192个字节大小。

总之,BufferedInputStream是在内存中读取文件,而FileInputStream是在磁盘中读取文件,因此,BufferedInputStream读取文件的效率要比FileInputStream读取文件的速度快、效率高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值