栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

FileInputStream和BufferedInputStream的比较

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

FileInputStream和BufferedInputStream的比较

InputStream是Java标准库提供的最基本的输入流,位于java.io包里,InputStream是一个抽象类,是所有输入流的超类

FileInputStream是InputStream的子类,就是从文件流中读取数据。FileInputStream是读取一个文件来作InputStream。

BufferedInputStream是缓存输入流。继承于FilterInputStream。作用是为另一个输入流添加一些功能。BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能(如果可能的话),作用是为另一个输入流添加一些功能。它自己不能脱离里面那个单独存在,所以可以把BufferedInputStream套在FileInputStream外,来改善FileInputStream的性能。

区别就是:

FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高,FileInputStream的read()方法会出现阻塞;

就是说,当缓冲区的大小比8192小的时候,BufferedInputStream的效率更好。

BufferedInputStream有一个默认为8192字节的缓冲区,当自定义的缓冲区小于8192的时候,默认一次性从硬盘中读取8192字节到内存中,然后每次只按自定义的缓冲量返回数据,性能好在了减少了读取硬盘的次数。

以下代码会更好的帮大家理解。

代码实现:

FileInputStream read()方法实现:

public class Demo05 {
	public static void main(String[] args) throws IOException {
		//InputStream字节输入流父类
		
		//特点:读取字节内容的输入流
		FileInputStream fis = new FileInputStream("E:\KuGou\test02.txt");
		
		//逐个字节读取:每次调用read()方法,都会进行一次磁盘的读取,返回一个int类型的字节值
		int data = -1;
		while((data=fis.read())!=-1) {
			System.out.println(data);
		}
		System.out.println("-----------");
		
		//方式二
		//批量读取(自建缓冲区):每次调用read(缓冲区字节数组)方法,都会进行一次磁盘的读取,返回本次
		//并将读取到的内容,填充至自建缓冲区
		//读取至文件末尾,返回-1
		byte[] buff = new byte[4096];//字节数组代表一个缓冲区
		
		int len = -1;
		while((len=fis.read(buff))!= -1) {
			System.out.println(Arrays.toString(buff));
		}
   }
}

BufferedInputStream read()方法代码实现

public class Demo05 {
	public static void main(String[] args) throws IOException {
		//InputStream字节输入流父类
        //BufferedInputStream时FilterInputStream包装(装饰)器的子类
		//特点:自带缓存区(默认8192个字节),必须配合FileInputStream类进行工作
		
		BufferedInputStream bos = new BufferedInputStream(new FileInputStream("E:\壁纸总和\壁纸\杨洋\young.jpg"));
			
		
		//读取
		//方式一:逐个字节读取,每调用一次read()方法,都会到BufferedInputStream的缓存区中读取一个字节
		//缓冲区内容读取完毕后,会一次性fill满
		//bos.read();
		
		//方式二:(推荐)
		//批量读取(自建缓存区):
		byte[] buffData =new byte[128];
		int size = -1;
		while((size = bos.read(buffData))!=-1) {
			System.out.println(Arrays.toString(buffData));
		}
		
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/933776.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号