首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在缓冲区大小相同的情况下,FileInputStream比BufferedInputStream快得多

在缓冲区大小相同的情况下,为什么FileInputStream比BufferedInputStream快得多?

FileInputStream和BufferedInputStream是Java中用于读取文件的两个常用类。它们之间的性能差异主要是由于它们的工作原理和数据读取方式的不同。

  1. 工作原理:
    • FileInputStream:FileInputStream是一个基于字节的输入流,它直接从文件中读取字节数据,并将其传递给应用程序。
    • BufferedInputStream:BufferedInputStream是一个缓冲输入流,它在内部维护了一个缓冲区,通过一次性读取一定数量的数据块(默认为8192字节),然后将数据存储在缓冲区中,最后逐个字节地将数据传递给应用程序。
  • 数据读取方式:
    • FileInputStream:FileInputStream每次从文件中读取一个字节,并将其传递给应用程序。这意味着每次读取操作都会导致磁盘访问,而磁盘访问是相对较慢的操作。
    • BufferedInputStream:BufferedInputStream通过一次性读取一定数量的数据块(缓冲区大小),减少了对磁盘的访问次数。当应用程序需要读取数据时,它首先从缓冲区中获取数据,如果缓冲区中没有足够的数据,则会再次从文件中读取一定数量的数据块到缓冲区中。

基于以上的工作原理和数据读取方式的不同,可以解释为什么在缓冲区大小相同的情况下,FileInputStream比BufferedInputStream快得多:

  • FileInputStream每次读取一个字节,需要频繁地进行磁盘访问,而磁盘访问是相对较慢的操作,因此效率较低。
  • BufferedInputStream通过一次性读取一定数量的数据块,并将其存储在缓冲区中,减少了对磁盘的访问次数,从而提高了效率。

综上所述,当缓冲区大小相同时,BufferedInputStream由于减少了对磁盘的频繁访问,因此比FileInputStream具有更高的读取效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

BufferedInputStream类详解

BufferedInputStream 父类是FilterInputStream FilterInputStream父类是InputStream(字节输入流超类)   相对于 FileInputStream...,使用BufferedInputStream读资源FileInputStream读取资源效率高(BufferedInputStreamread方法会读取尽可能多字节,执行read时先从缓冲区读取...,因此,当每次读取数据量很小时,FileInputStream每次都是从硬盘读入,而BufferedInputStream大部分是从缓冲区读入。...读取内存速度读取硬盘速度快得多,因此BufferedInputStream效率高,且FileInputStream对象read方法会出现阻塞;BufferedInputStream默认缓冲区大小是...BufferedInputStream(InputStream in, int size)  创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。

89130

Sharded:相同显存情况下使pytorch模型参数大小加倍

本文中,我将给出sharded工作原理,并向您展示如何利用PyTorch 几分钟内用将使用相同内存训练模型参数提升一倍。...一种方法(DP)中,每批都分配给多个GPU。这是DP说明,其中批处理每个部分都转到不同GPU,并且模型多次复制到每个GPU。 但是,这种方法很糟糕,因为模型权重是设备之间转移。...例如,Adam 优化器会保留模型权重完整副本。 另一种方法(分布式数据并行,DDP)中,每个GPU训练数据子集,并且梯度GPU之间同步。此方法还可以许多机器(节点)上使用。...在此示例中,每个GPU获取数据子集,并在每个GPU上完全相同地初始化模型权重。然后,向后传递之后,将同步所有梯度并进行更新。...除了仅针对部分完整参数计算所有开销(梯度,优化器状态等)外,它功能与DDP相同,因此,我们消除了在所有GPU上存储相同梯度和优化器状态冗余。

1.5K20

Java基础笔记20

返回值为什么是int) read()方法读取是一个字节,为什么返回是int,而不是byte 因为字节输入流可以操作任意类型文件,比如图片音频等,这些文件底层都是以二进制形式存储,如果每次读取都返回...和BufferOutputStream拷贝) A:缓冲思想 字节流一次读写一个数组速度明显一次读写一个字节速度快很多, 这是加入了数组这样缓冲区效果,java本身在设计时候, 也考虑到了这样设计思想...(装饰设计模式后面讲解),所以提供了字节缓冲区流 B.BufferedInputStream BufferedInputStream内置了一个缓冲区(数组) 从BufferedInputStream...中读取一个字节时 BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个 程序再次读取时, 就不用找文件了, 直接从缓冲区中获取 直到缓冲区中所有的都被使用过...直到缓冲区写满, BufferedOutputStream才会把缓冲区数据一次性写到文件里 D.拷贝代码 FileInputStream fis = new FileInputStream

41840

java基础io流——OutputStream和InputStream故事(温故知新)

IO流分类  按照数据流向  输入流 读入数据  输出流 写出数据  按照数据类型  字节流  字符流  什么情况下使用哪种流呢? ...字节流一次读写一个数组速度明显一次读写一个字节速度快很多,这是加入了数组这样缓冲区效果。 ...java本身在设计时候,也考虑到了这样设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流。 ...构造方法可以指定缓冲区大小,但是我们一般用不上,因为默认缓冲区大小就足够了。为什么不传递一个具体文件或者文件路径,而是传递一个OutputStream对象呢?...原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计。但是呢,真正读写操作还得靠基本流对象实现。

60740

Java IO 操作基础1---普通文件相关操作

FileInputStream方法类似,这个类主要进行文件内容写入操作,flush() 方法为强制把缓冲区内容写入文件中,常用于带有缓冲区输出流中。...一般步骤是:目标文件夹中创建一个和原文件名相同文件 –> 使用输入输出流类进行文件读写 –> 删除原文件。...对于这个问题,Java 给我们提供带有缓冲区文件输入输出流:BufferedInputStream 和 BufferedOutputStream 类,BufferedInputStream 类提供了缓冲区去储存读入数据...,BufferedOutputStream 类提供了从缓冲区中写入数据到文件中方法,因为缓冲区是在内存中,内存读写速度磁盘快得多,所以这样就间接地减少了文件操作中读写磁盘次数,进而提高了程序运行速度...这里我提供了一个 55 Mb 左右视频工程文件夹中,同样我们把这个视频移动到 bin 文件夹中,修改 Main.java 内容: import java.io.BufferedInputStream

57730

初识字节流+实现缓冲字节流OutputStream主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回是Int型而不是

读 read():int read(byte[] array):int 与Reader类一样,如果到了文件末尾,返回-1 这里有个特别好用方法,可以用来知道文件大小 available...():int; 返回文件字节数 这时就可以用这个方法来定义array大小,那么就可以一次性读完了 关流 flush() ---- 缓冲技术 缓冲技术就是把信息分批处理,再一起丢出去,这样处理速度会快很多...); } } 下面是结果 C:\Users\钟绍威\Desktop>java Demo 复制所用时间:117毫秒 Tips:用write(byte[])会比write(int)快得多多...输入缓冲就是先把数据存在数组中,从数组中一个个读到控制台 输出缓冲就是把数据存到数组中,再一起写到OutputStream中缓冲区,最后刷新 刚刚用这个复制一个11.1MMP3花了0.6...---- 错误返回了-1 如果扫描到了11111111那么此时将byte->int是-1,如果这样的话,程序就会终止不会进行 为什么read()返回是Int型而不是byte型呢??

1.2K80

阶段01Java基础day20IO流01

返回值为什么是int) read()方法读取是一个字节,为什么返回是int,而不是byte 因为字节输入流可以操作任意类型文件,比如图片音频等,这些文件底层都是以二进制形式存储,如果每次读取都返回...和BufferOutputStream拷贝) A:缓冲思想 字节流一次读写一个数组速度明显一次读写一个字节速度快很多, 这是加入了数组这样缓冲区效果,java本身在设计时候, 也考虑到了这样设计思想...(装饰设计模式后面讲解),所以提供了字节缓冲区流 B.BufferedInputStream BufferedInputStream内置了一个缓冲区(数组) 从BufferedInputStream中读取一个字节时...BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个 程序再次读取时, 就不用找文件了, 直接从缓冲区中获取 直到缓冲区中所有的都被使用过, 才重新从文件中读取..., BufferedOutputStream才会把缓冲区数据一次性写到文件里 D.拷贝代码 FileInputStream fis = new FileInputStream("致青春.mp3

26720

java基础io流——OutputStream和InputStream故事(温故知新)

IO流分类 按照数据流向 输入流 读入数据 输出流 写出数据 按照数据类型 字节流 字符流 什么情况下使用哪种流呢?...字节流一次读写一个数组速度明显一次读写一个字节速度快很多,这是加入了数组这样缓冲区效果。 java本身在设计时候,也考虑到了这样设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流。...BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt")); byte[] bytes = new...构造方法可以指定缓冲区大小,但是我们一般用不上,因为默认缓冲区大小就足够了。 为什么不传递一个具体文件或者文件路径,而是传递一个OutputStream对象呢?...原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计。但是呢,真正读写操作还得靠基本流对象实现。

85020

java.io.outputstream_java input

IO流分类 按照数据流向 输入流 读入数据 输出流 写出数据 按照数据类型 字节流 字符流 什么情况下使用哪种流呢?...字节流一次读写一个数组速度明显一次读写一个字节速度快很多,这是加入了数组这样缓冲区效果。 java本身在设计时候,也考虑到了这样设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流。...BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt")); byte[] bytes = new...构造方法可以指定缓冲区大小,但是我们一般用不上,因为默认缓冲区大小就足够了。 为什么不传递一个具体文件或者文件路径,而是传递一个OutputStream对象呢?...原因很简单,字节缓冲区流仅仅提供缓冲区,为高效而设计。但是呢,真正读写操作还得靠基本流对象实现。

35720

字节缓冲流

1、字节缓冲流 字节流一次读写一个数组速度明显一次读写一个字节速度快很多,这是加入了数组这样缓冲区效果,java本身在设计时候,也考虑到了这样设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流...字节缓冲输出流 BufferedOutputStream 字节缓冲输入流 BufferedInputStream 这种类被称为:缓冲区类(高效类) 构造方法可以指定缓冲区大小,但是我们一般用不上...,因为默认缓冲区大小就足够了。...(InputStream in) BufferedInputStream bis = new BufferedInputStream( new FileInputStream...= -1) { System.out.print(new String(bys, 0, len)); } // 释放资源 bis.close(); } 为什么不传递一个具体文件或者文件路径

39010

Java 压缩20M文件从30秒到1秒优化过程,真不相信?

之前没有接触过用Java压缩文件,所以就直接上网找了一个例子改了一下用了,改完以后也能使用, 但是随着前端所传图片大小越来越大时候,耗费时间也急剧增加,最后测了一下压缩20M文件竟然需要30...例如我们现在有30000个字节数据,如果使用FileInputStream那么就需要调用30000次本地方法来获取这些数据, 而如果使用缓冲区的话(这里假设初始缓冲区大小足够放下30000字节数据...BufferedInputStream内部封装了一个byte数组用于存放数据,默认大小是8192 优化过后代码如下 public static void zipFileBuffer() { File...使用Channel 为什么要用Channel呢? 因为NIO中新出了Channel和ByteBuffer。...既然直接缓冲区那么快,我们为什么不都用直接缓冲区呢? 其实直接缓冲区有以下缺点。直接缓冲区缺点: 不安全 消耗更多,因为它不是JVM中直接开辟空间。

45120

深入理解Java IO流之BufferedInputStream类详解

BufferedInputStream 对象,第二个构造方法则创建一个指定缓冲区大小 BufferedInputStream 对象,第三个构造方法则将指定字节数组作为缓冲区。...缓冲区过大会占用过多内存,而缓冲区过小则不能充分发挥 BufferedInputStream 优势。因此,需要根据实际情况设置合适缓冲区大小。...public synchronized int available() throws IOException:返回不受阻塞情况下从输入流中能够读取字节数。...其中,缓冲区大小为8字节,即每次读取数据量为8字节。  随后定义一个长度为1024字节数组buffer,用于存储读取到数据。...但是使用 BufferedInputStream过程中,需要注意缓冲区大小设置,避免过大或过小导致性能问题。...

28561

压缩20M文件从30秒到1秒优化,太骚了

之前没有接触过用Java压缩文件,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片大小越来越大时候,耗费时间也急剧增加,最后测了一下压缩20M文件竟然需要30秒时间...例如我们现在有30000个字节数据,如果使用FileInputStream那么就需要调用30000次本地方法来获取这些数据,而如果使用缓冲区的话(这里假设初始缓冲区大小足够放下30000字节数据...BufferedInputStream内部封装了一个byte数组用于存放数据,默认大小是8192 优化过后代码如下 public static void zipFileBuffer() { File...使用Channel 为什么要用Channel呢?因为NIO中新出了Channel和ByteBuffer。...既然直接缓冲区那么快,我们为什么不都用直接缓冲区呢?其实直接缓冲区有以下缺点。直接缓冲区缺点: 不安全 消耗更多,因为它不是JVM中直接开辟空间。

34410

Java 压缩20M文件从30秒到1秒优化过程,还不相信?

之前没有接触过用Java压缩文件,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片大小越来越大时候,耗费时间也急剧增加,最后测了一下压缩20M文件竟然需要30秒时间...例如我们现在有30000个字节数据,如果使用FileInputStream那么就需要调用30000次本地方法来获取这些数据,而如果使用缓冲区的话(这里假设初始缓冲区大小足够放下30000字节数据...BufferedInputStream内部封装了一个byte数组用于存放数据,默认大小是8192 优化过后代码如下 public static void zipFileBuffer() { File...使用Channel 为什么要用Channel呢?因为NIO中新出了Channel和ByteBuffer。...image 既然直接缓冲区那么快,我们为什么不都用直接缓冲区呢?其实直接缓冲区有以下缺点。直接缓冲区缺点: 不安全 消耗更多,因为它不是JVM中直接开辟空间。

67341

20M 文件用 Java 压缩从30秒到1秒优化过程

之前没有接触过用Java压缩文件,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片大小越来越大时候,耗费时间也急剧增加,最后测了一下压缩20M文件竟然需要30秒时间...例如我们现在有30000个字节数据,如果使用 FileInputStream那么就需要调用30000次本地方法来获取这些数据,而如果使用缓冲区的话(这里假设初始缓冲区大小足够放下30000字节数据...BufferedInputStream内部封装了一个byte数组用于存放数据,默认大小是8192 优化过后代码如下 public static void zipFileBuffer() { File...使用Channel 为什么要用 Channel呢?因为NIO中新出了 Channel和 ByteBuffer。...image 既然直接缓冲区那么快,我们为什么不都用直接缓冲区呢?其实直接缓冲区有以下缺点。直接缓冲区缺点: 1、不安全 2、消耗更多,因为它不是JVM中直接开辟空间。

68720

java(io流—字符输入流、字符输出流、转换流)

; 构造方法: FileReader(String fileName):在给定从中读取数据文件名情况下创建一个新 FileReader; FileReader(File file):在给定从中读取数据...File 情况下创建一个新 FileReader; 参数:读取文件数据源; FileReader fileReader=new FileReader("D:\\Java\\abc.txt");...); 使用FileWriter中flush()方法,把内存中数据,刷新到文件中; 释放资源; flush和close区别: flush:刷新缓冲区,流对象可以继续使用; close:先刷新缓冲区,...后边增加一个(),括号中可以定义流对象; 那么这个流对象作用域就在try中有效; 异常处理: try (FileWriter fileWriter= new FileWriter("D:\\Java...; 构造方法: BufferedReader(Reader in):创建一个使用默认大小输入缓冲区缓冲字符输入流; 代码: //读取一行文本 FileReader fr=new FileReader(

92520

压缩20M文件从30秒到1秒优化过程

之前没有接触过用Java压缩文件,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片大小越来越大时候,耗费时间也急剧增加,最后测了一下压缩20M文件竟然需要30秒时间...例如我们现在有30000个字节数据,如果使用FileInputStream那么就需要调用30000次本地方法来获取这些数据,而如果使用缓冲区的话(这里假设初始缓冲区大小足够放下30000字节数据...BufferedInputStream内部封装了一个byte数组用于存放数据,默认大小是8192 优化过后代码如下 public static void zipFileBuffer() {...使用Channel 为什么要用Channel呢?因为NIO中新出了Channel和ByteBuffer。...既然直接缓冲区那么快,我们为什么不都用直接缓冲区呢?其实直接缓冲区有以下缺点。直接缓冲区缺点: 不安全 消耗更多,因为它不是JVM中直接开辟空间。

59440

Java 压缩20M文件从30秒到1秒优化过程

之前没有接触过用Java压缩文件,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片大小越来越大时候,耗费时间也急剧增加,最后测了一下压缩20M文件竟然需要30秒时间...例如我们现在有30000个字节数据,如果使用 FileInputStream那么就需要调用30000次本地方法来获取这些数据,而如果使用缓冲区的话(这里假设初始缓冲区大小足够放下30000字节数据...BufferedInputStream内部封装了一个byte数组用于存放数据,默认大小是8192 优化过后代码如下 public static void zipFileBuffer() { File...使用Channel 为什么要用 Channel呢?因为NIO中新出了 Channel和 ByteBuffer。...image 既然直接缓冲区那么快,我们为什么不都用直接缓冲区呢?其实直接缓冲区有以下缺点。直接缓冲区缺点: 1、不安全 2、消耗更多,因为它不是JVM中直接开辟空间。

1.2K20

不是我吹,20M压缩文件我只用了1秒!

之前没有接触过用Java压缩文件,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片大小越来越大时候,耗费时间也急剧增加,最后测了一下压缩20M文件竟然需要30秒时间...例如我们现在有30000个字节数据,如果使用FileInputStream那么就需要调用30000次本地方法来获取这些数据,而如果使用缓冲区的话(这里假设初始缓冲区大小足够放下30000字节数据...BufferedInputStream内部封装了一个byte数组用于存放数据,默认大小是8192 优化过后代码如下 public static void zipFileBuffer() {...使用Channel 为什么要用Channel呢?因为NIO中新出了Channel和ByteBuffer。...既然直接缓冲区那么快,我们为什么不都用直接缓冲区呢?其实直接缓冲区有以下缺点。直接缓冲区缺点: 不安全 消耗更多,因为它不是JVM中直接开辟空间。

47920

javaIO流之字节流

从传输上面讲,字节流是字节文件测层次上进行操作,并没有用到缓冲区,字符流会用到缓冲区,然后通过缓冲区操作文件。...涉及到一些编码问题上,比如文件中存在汉字,我们可以去用字符流去处理。 为什么输入流是读数据,而输出流是写数据? 不知道你是否有这样疑问。 为什么输入流是读取数据,而输出流却是写数据。...每种情况下,元件b[0]至b[off]和元件b[off+len]至b[b.length-1]不受影响。...BufferedInputStream(InputStream in, int size) 创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。...来加快读取写入速度。 当然我们可以用缓冲区,缓冲流。进行相关操作。可以用字节缓冲流一次读取一个字节数据,也可以一次读取一个字节数组大小数据。

27830
领券