我正在使用内存映射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
答案 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