如何将文件加载到主内存?
我用的是我读的文件
BufferReader buf = new BufferedReader(FileReader());
我认为这是从磁盘逐行读取文件.这有什么好处?
将文件直接加载到内存中有什么好处?我们如何用Java做到这一点?
我找到了一些例子Scanner或RandomAccessFile方法.他们将文件加载到内存中吗?我应该使用它们吗?我应该使用哪两个?
提前致谢!!!
Run Code Online (Sandbox Code Playgroud)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包装类实际上会使读取速度变慢.)
* - 请注意,可接受的性能与最佳性能不同,但您的客户/项目经理可能不希望您浪费时间编写代码以实现最佳性能......如果这不是规定的要求.