如何将文件加载到主内存中?
我用这个文件阅读, 我用
BufferReader buf = new BufferedReader(FileReader());
我认为这是从磁盘中逐行读取文件。这有什么好处?
将文件直接加载到内存中有什么好处? 我们如何用Java做到这一点?
我在Scanner
或RandomAccessFile
方法上找到了一些示例。他们将文件加载到内存中吗?我应该使用它们吗?我应该使用哪两个?
提前致谢!!!
答案 0 :(得分:7)
BufferReader buf = new BufferedReader(FileReader());
我认为这是从磁盘中逐行读取文件。这有什么好处?
不完全是。它正在以块的形式读取文件,其大小是默认的缓冲区大小(我认为是8k字节)。
优点是你不需要一个巨大的堆来读取一个巨大的文件。这是一个重要问题,因为最大堆大小只能在JVM启动时指定(使用Hotspot Java)。
您也不会消耗系统的物理/虚拟内存资源来代表巨大的堆。
将文件直接加载到内存中有什么好处?
它减少了系统调用次数,可以更快地读取文件。多快取决于许多因素。而且你有处理非常大的文件的问题。
我们如何用Java做到这一点?
read(byte[], int, int)
或read(char[], int, int)
方法阅读整个文件。您也可以使用内存映射文件......但这需要使用Buffer
API,这可能有点难以使用。
我在Scanner或RandomAccessFile方法上找到了一些例子。他们将文件加载到内存中吗?
不,不。
我应该使用它们吗?我应该使用哪两个?
他们是否提供您需要的功能?您需要阅读/解析基于文本的数据吗?您是否需要对二进制数据进行随机访问?
在正常情况下,您应该主要根据所需的功能选择I / O API,其次是性能考虑因素。如果您打算在阅读时解析它,使用BufferedInputStream
或BufferedReader
通常就足以获得可接受的 * 性能。 (但是如果你真的需要以原始形式将整个文件保存在内存中,那么BufferedXxx
包装类实际上会使读取速度变慢。)
* - 请注意,可接受的性能与最佳性能不同,但您的客户/项目经理可能不希望您浪费时间编写代码如果这不是一个规定的要求,那就是最佳表现。
答案 1 :(得分:3)
如果您正在读取文件然后解析它,从头到尾走一次以提取数据,然后再不再引用该文件,缓冲读取器就像您将得到的那样“最佳”。您可以通过调整缓冲区大小来“调整”性能 - 较大的缓冲区将从文件中读取较大的块。 (使缓冲区的功效为2 - 例如262144.)读取整个大文件(大于1mb)通常会使您在分页和堆管理方面的性能降低。