如何将文件加载到主内存中?
我使用读取文件, 我用
BufferReader buf = new BufferedReader(FileReader());
我假设这是从磁盘逐行读取文件。这样做有什么好处?
直接加载文件到内存有什么好处? 我们如何在 Java 中做到这一点?
我找到了一些关于 Scanner
或 RandomAccessFile
方法的例子。他们是否将文件加载到内存中?我应该使用它们吗?我应该使用两者中的哪一个?
提前致谢!!!
最佳答案
BufferReader buf = new BufferedReader(FileReader());
I presume that this is reading the file line by line from the disk. What is the advantage of this?
不完全是。它以默认缓冲区大小(我认为是 8k 字节)为单位读取文件。
优点是你不需要一个巨大的堆来读取一个巨大的文件。这是一个重要问题,因为最大堆大小只能在 JVM 启动时指定(使用 Hotspot Java)。
您也不会消耗系统的物理/虚拟内存资源来表示巨大的堆。
What is the advantage of loading the file directly into memory?
它减少了系统调用的次数,并且可以更快地读取文件。快多少取决于许多因素。而且你有处理非常大的文件的问题。
How do we do that in Java?
- 找出文件有多大。
- 分配一个足够大的字节(或字符)数组。
- 使用相关的
read(byte[], int, int)
或read(char[], int, int)
方法读取整个文件。<
您也可以使用内存映射文件……但这需要使用 Buffer
API,使用起来可能有点棘手。
I found some examples on Scanner or RandomAccessFile methods. Do they load the files into memory?
没有,也没有。
Should I use them? Which of the two should I use ?
它们是否提供您需要的功能?您需要读取/解析基于文本的数据吗?您需要对二进制数据进行随机访问吗?
在正常情况下,您应该主要根据所需的功能来选择 I/O API,其次是性能方面的考虑。如果您打算在阅读时解析它,使用 BufferedInputStream
或 BufferedReader
通常足以获得可接受的* 性能。 (但如果您实际上需要将整个文件以其原始形式保存在内存中,那么 BufferedXxx
包装类实际上会使读取速度变慢。)
* - 请注意,可接受性能与最佳性能不同,但您的客户/项目经理可能不希望您浪费时间编写代码以最佳方式执行...如果这不是规定的要求。
关于java - 从磁盘读取文件并将文件加载到主存中进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096543/