FileInputStream与BufferedInputStream有哪些区别?


前言

InputStream(字节输入流)是Java标准库提供的最基本的输入流。它在java.io这个包里,InputStream并不是一个接口而是一个抽象类,是所有抽象流的父类。其中最常用的两个子类为FileInputStream(文件输入流)和BufferedInputStream(缓冲输入流),那么FileInputStream与BufferedInputStream都有哪些区别呢?


一、FileInputStream(文件输入流)

FileInputStream就是从文件流中读取数据,创建一个FileInputStream的实例对象,相当于在磁盘和内存之间建立一个管道,对磁盘中的文件进行读(输入)操作。
注意:在创建对象的同时必须传入文件的路径
下面的代码分别演示了如何完整逐个字节读取和批量字节读取一个文件的所有字节。

1.逐个字节读取:

代码示例如下:

public static void main(String[] args) {
		// 创建(实例化)"字节输入流"对象
		//放在try()中会自动关闭,释放资源
		try (InputStream in = new FileInputStream("D:\\tuji.txt")) {
			// 保证每次读取到的字节值
			int data = -1;
			
			// 正常读取 :0-255
			// 读取末尾 :-1
			while ((data = in.read()) != -1) {//逐个字节读取
				System.out.print((char) data);//不能读中文 乱码
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

2.批量字节读取:

代码示例如下:

public static void main(String[] args) {
		try (InputStream in = new FileInputStream("D:\\tuji.txt")) {
			//批量字节读取(缓冲)
			byte[] buff = new byte[128];
			
			//每次读取若干字节,填充到buff字节数组中
			int len = -1;
			while((len = in.read(buff)) != -1) {
				System.out.printf("本次读取%d字节:%s\n",len,Arrays.toString(buff));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

二、BufferedInputStream(缓冲输入流)

BufferedInputStream是缓冲输入流,它继承于FilterInputStream。BufferedInputStream比FileInputStream的效率高,它的作用就是为另一个输入流添加一些和功能,例如,提供“缓冲功能”、支持“mark()标记”和“reset()重置方法”。BufferedInputStream其实就是在内存和磁盘之间通过字节数组(默认为8192)建立一个缓冲区,当要读取磁盘中的文件数据时,先通过FileInputStream从磁盘中读取数据,再分批将数据分批填入到缓冲区中。每当缓冲区的数据被读完,FileInputStream会在次填充数据缓冲区,直到读完文件数据。
注意:在创建对象时必须传入一个输入流对象
代码示例如下:

public static void main(String[] args) {
		//带有缓冲区的字节输入流
		//缓冲区大小为8192
		try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\Users\\Lenovo\\Desktop\\javaEE\\Spring.png"))) {
			//从内存的buff缓冲区中读取一个字节
			int data = -1;
			while((data = bis.read()) != -1) {
				System.out.println(data);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值