0

我在移动设备(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);

我主要想知道是否通过滥用错误的文件读取器/写入器类,我可能会在读取或写入之前不小心将整个文件内容加载到内存中,

谢谢

4

2 回答 2

0

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

于 2013-07-19T04:15:33.097 回答
0

基本上,您不想阅读整个文件,而只想阅读其中的一部分。在这种情况下,请改用java.io.RandomAccessFile

  1. 它的seek()方法保证进行搜索而不是读取和丢弃(这是 InputStream.skip() 的某些实现实际所做的)
  2. seek() 方法可以向后移动文件指针——这是 InputStream 无法做到的
  3. 提供了一个getFilePointer()方法来获取文件中的当前位置。
  4. 它只会读取您告诉它读取的内容,因此不必担心您会意外加载超出您想要的内容

当每个 Android 应用程序只能使用 16MB 的 RAM 时,我的字典应用程序使用 RandomAccessFile 来访问大约 45MB 的数据,而且运行我的字典引擎的服务在相同的 45MB 数据上运行仅使用大约 2MB 的 RAM(而且大部分可能由 Davlik VM 使用,而不是我的搜索引擎)。所以这个类肯定能按预期工作。

于 2013-07-19T05:10:20.443 回答