读/写大文件时尽可能少使用内存的最佳方法?

时间:2013-07-19 03:26:18

标签: java android

我在手机上(android),并且有一个大文本文件,大约50mb。我希望能够打开文件并寻找特定位置,然后从那一点开始将数据读入缓冲区。如果我想尽可能少地使用内存,那么使用FileReader + BufferedReader是最好的方法吗?:

BufferedReader in
    = new BufferedReader(new FileReader("foo.txt"));
in.skip(byteCount); // in some cases I have to read from an offset
// start reading a line at a time here

我还需要写入文件,只需要附加数据,所以:

FileWriter w = new FileWriter("foo.txt", true);
w.write(someCharacters);

我主要想知道如果误用错误的文件读取器/写入器类,我可能会在读取或写入之前意外地将整个文件内容加载到内存中,

由于

2 个答案:

答案 0 :(得分:0)

您可以尝试使用内存映射文件(java.nio.channels.FileChannel.map())。我不确定会为此分配多少堆空间。

答案 1 :(得分:0)

基本上你不想读取整个文件,只读取它的某个部分。在这种情况下,请改用java.io.RandomAccessFile

  1. seek()方法可以保证搜索而不是阅读&丢弃(这是InputStream.skip()实际执行的一些实现)
  2. seek()方法可以移回文件指针 - 这是您无法为InputStream执行的操作
  3. 提供getFilePointer()方法以获取文件中的当前位置。
  4. 它只读取你告诉它的内容,所以不用担心你会意外加载超出你想要的东西
  5. 我的词典应用程序使用RandomAccessFile来访问大约45MB的数据,当每个Android应用程序只能使用16MB的RAM时,运行我的字典引擎的服务在相同的45MB数据上运行仅使用大约2MB的RAM(并且大多数它的概率被Davlik VM使用而不是我的搜索引擎)。所以这个课程绝对有效。