当前位置:   article > 正文

浅谈“FileInputStream”和“BufferedInputStream”的区别_如果使用fileinputstream每次读取8192个字节是不是就不需要缓冲区了

如果使用fileinputstream每次读取8192个字节是不是就不需要缓冲区了

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

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

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

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

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

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

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

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

具体实现代码如下:

  1. public class InputStream03 {
  2. public static void main(String[] args) {
  3. //带有缓冲区的字节输入流
  4. //缓冲区的默认大小为8192
  5. try(BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\hpc\\新建 文本文档.txt"))) {
  6. int date=-1;
  7. while((date=bis.read())!=-1) {
  8. System.out.print(date);
  9. }
  10. } catch (FileNotFoundException e) {
  11. e.printStackTrace();
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/147046
推荐阅读
相关标签
  

闽ICP备14008679号