NaN Asked:2020-11-23 23:09:30 +0000 UTC2020-11-23 23:09:30 +0000 UTC 2020-11-23 23:09:30 +0000 UTC Java 中对缓冲流的需求 772 使用 BufferedStream 而不是常规的 IOStream 总是更好吗?在什么情况下最好不要使用 Buffered? java 1 个回答 Voted Best Answer Leonis 2020-11-25T16:33:46Z2020-11-25T16:33:46Z 要回答这个问题,我们必须记住 Java 程序在 RAM 中并且运行速度非常快。当您需要从慢速设备(例如硬盘驱动器)获取数据时,麻烦就开始了。现代 SDD 速度很快,但仍比 RAM 慢。最令人不快的是,任何对文件的访问,即使是读取单个字节,都是一项相当繁重的任务,因为会发生对操作系统的本机请求。 BufferedInputStream 试图最小化硬盘访问。它一次读取 8192 个字节并将它们存储在其缓冲区中。当程序请求一个字节的信息时,BIS 只是从其缓冲区中提供它,这以 RAM 的速度发生,即立即发生。我必须补充一点,硬盘也不是逐字节提供信息,而是分批提供信息,因此,在性能方面,每个人都很高兴。 顺便说一句,实验表明存在更智能的解决方案。Java NIO 中的同一个 FileChannel 类。如果必须铲除大量数据,与传统的文件 I/O 方法相比,它显示出意想不到的速度。 所以是的,如果从文件中读取超过 1 个字节,那么最好通过缓冲区来完成。
要回答这个问题,我们必须记住 Java 程序在 RAM 中并且运行速度非常快。当您需要从慢速设备(例如硬盘驱动器)获取数据时,麻烦就开始了。现代 SDD 速度很快,但仍比 RAM 慢。最令人不快的是,任何对文件的访问,即使是读取单个字节,都是一项相当繁重的任务,因为会发生对操作系统的本机请求。
BufferedInputStream 试图最小化硬盘访问。它一次读取 8192 个字节并将它们存储在其缓冲区中。当程序请求一个字节的信息时,BIS 只是从其缓冲区中提供它,这以 RAM 的速度发生,即立即发生。我必须补充一点,硬盘也不是逐字节提供信息,而是分批提供信息,因此,在性能方面,每个人都很高兴。
顺便说一句,实验表明存在更智能的解决方案。Java NIO 中的同一个 FileChannel 类。如果必须铲除大量数据,与传统的文件 I/O 方法相比,它显示出意想不到的速度。
所以是的,如果从文件中读取超过 1 个字节,那么最好通过缓冲区来完成。