读取文件vs将文件从磁盘加载到主内存中进行处理

Mah*_*nan 5 java file

如何将文件加载到主内存?

我用的是我读的文件

BufferReader buf = new BufferedReader(FileReader());
Run Code Online (Sandbox Code Playgroud)

我认为这是从磁盘逐行读取文件.这有什么好处?

将文件直接加载到内存中有什么好处?我们如何用Java做到这一点?

我找到了一些例子ScannerRandomAccessFile方法.他们将文件加载到内存中吗?我应该使用它们吗?我应该使用哪两个?

提前致谢!!!

Ste*_*n C 7

BufferReader buf = new BufferedReader(FileReader());
Run Code Online (Sandbox Code Playgroud)

我认为这是从磁盘逐行读取文件.这有什么好处?

不完全是.它正在以块的形式读取文件,其大小是默认的缓冲区大小(我认为是8k字节).

优点是你不需要一个巨大的堆来读取一个巨大的文件.这是一个重要问题,因为最大堆大小只能在JVM启动时指定(使用Hotspot Java).

您也不会消耗系统的物理/虚拟内存资源来表示巨大的堆.

将文件直接加载到内存中有什么好处?

它减少了系统调用的次数,并且可以更快地读取文件.多快取决于许多因素.你有处理真正大文件的问题.

我们如何用Java做到这一点?

  1. 找出文件的大小.
  2. 分配足够大的字节(或字符)数组.
  3. 使用相关read(byte[], int, int)read(char[], int, int)方法读取整个文件.

您还可以使用内存映射文件......但这需要使用Buffer可能有点棘手的API.

我在Scanner或RandomAccessFile方法上找到了一些例子.他们将文件加载到内存中吗?

不,不.

我应该使用它们吗?我应该使用哪两个?

它们是否提供您所需的功能?您需要阅读/解析基于文本的数据吗?你需要对二进制数据进行随机访问吗?

在正常情况下,您应该主要根据所需的功能选择I/O API,其次是性能考虑因素.如果您打算在阅读时解析它,使用BufferedInputStreamBufferedReader通常足以获得可接受的*性能.(但是如果你真的需要以原始形式将整个文件保存在内存中,那么BufferedXxx包装类实际上会使读取速度变慢.)


* - 请注意,可接受的性能与最佳性能不同,但您的客户/项目经理可能不希望您浪费时间编写代码以实现最佳性能......如果这不是规定的要求.