当前位置:   article > 正文

FileInputStream与BufferedInputStream有哪些区别?_bufferedinputstream和fileinputstream

bufferedinputstream和fileinputstream


前言

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

	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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();
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

二、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();
		}
		
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/146878
推荐阅读
  

闽ICP备14008679号