java - 从磁盘读取文件并将文件加载到主存中进行处理

标签 java file

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

我使用读取文件, 我用

BufferReader buf = new BufferedReader(FileReader());

我假设这是从磁盘逐行读取文件。这样做有什么好处?

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

我找到了一些关于 ScannerRandomAccessFile 方法的例子。他们是否将文件加载到内存中?我应该使用它们吗?我应该使用两者中的哪一个?

提前致谢!!!

最佳答案

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?

  1. 找出文件有多大。
  2. 分配一个足够大的字节(或字符)数组。
  3. 使用相关的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,其次是性能方面的考虑。如果您打算在阅读时解析它,使用 BufferedInputStreamBufferedReader 通常足以获得可接受的* 性能。 (但如果您实际上需要将整个文件以其原始形式保存在内存中,那么 BufferedXxx 包装类实际上会使读取速度变慢。)


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

关于java - 从磁盘读取文件并将文件加载到主存中进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13096543/

相关文章:

Java - 根据偏移量从随机访问文件中获取行

java 将 string[] 数组拆分为多个文件

C:从文件输入排序,收到大量编译错误

java - 无法删除或更改特定文件

java - 不要从父类(super class)构造函数中调用子类方法

java - 从 Java 中的 Spark 数据集中获取唯一单词

java - Spring boot MessageSource 在 application.properties 中不起作用

java - 如何在 spring DriverManagerDataSource 上设置超时

git - 用Git记录文件复制操作

java - Java 8 Swing中的 Accordion 小部件