内存映射文件从一个由新行字符分隔的巨大文件中读取

时间:2015-04-21 02:06:41

标签: java memory-mapped-files

我正在使用内存映射I / O读取一个巨大的文件。 我遇到的问题是,我正在按字符读取MemoryMappedByteBuffer字符。所以我需要传递文件中存在的多个字符串,这些字符串由“\ n”分隔。

        RandomAccessFile aFile = new RandomAccessFile(this.getFileName(), "r");
        FileChannel inChannel = aFile.getChannel();
        MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 
        0, inChannel.size());

        buffer.load(); 
        for (int i = 0; i < buffer.limit(); i++)
        {   // There are many strings in the file separated by \n
            System.out.println((char) buffer.get() == '\n'); // Gives true 
             //need to make a complete string over here.
        }
        buffer.clear(); // do something with the data and clear/compact it.           
        return null; // The String which has been made in the above for loop

1 个答案:

答案 0 :(得分:1)

这不是您要求的答案,因为这不使用内存映射文件。如果它真的没用,我会将其删除。

  

我正在使用内存映射I / O

读取一个巨大的文件

如果文件真的很大,那么你采取的方法将会对内存要求很高。

另一种方法是使用BufferedReader,这会使您的任务变得非常简单:

final List<String> lines = new ArrayList<>();
final BufferedReader br = new BufferedReader(
    new InputStreamReader(new FileInputStream(file), charset));

String line;
while ((line = br.readLine()) != null)
{
  lines.add(line);
}

return lines;

此代码的等效代码已包含在JDK实用程序方法Files.readAllLines(Path,Charset)中:

  

从文件中读取所有行。此方法确保文件是     读取所有字节或I / O错误或其他运行时时关闭     异常,被抛出。文件中的字节被解码为字符     使用指定的字符集。

public static List<String> readAllLines(Path path, Charset cs) throws IOException