我正在阅读一个巨大的文字文件(每行一个字)但我必须不时停止它,以便在第二天恢复阅读。现在我正在使用Apache的lineiterator,但这完全是错误的解决方案。我的文件是7Gb,我不得不打断它在1Gb左右读取它。为了恢复读取,我保存了已读取的行数。这意味着我在while循环上有一个if语句。 Apache的FileUtils不允许寻找,这是我的解决方案。
什么是最好/最快的解决方案?我想使用RandomAccessfile到达正确的行并继续阅读,但我不确定我是否可以去正确的地方以及如何保存我上次读到的正确位置。我可以再次重新开始几行,所以精度不是那么重要,但我还没有找到一种获取指针的方法。我有一个BufferedReader来读取File和一个RandomAccessFile来寻找正确的位置,但我不知道如何使用BufferedReader定期保存一个位置。 任何提示?
代码:(注意“SOMETHING”我应该在seekToByte上打印我可以使用的值)
try {
RandomAccessFile rand = new RandomAccessFile(file,"r");
rand.seek(seekToByte);
startAtByte = rand.getFilePointer();
rand.close();
} catch(IOException e) {
// do something
}
// Do it using the BufferedReader
BufferedReader reader = null;
FileReader freader = null;
try {
freader = new FileReader(file);
reader = new BufferedReader(freader);
reader.skip(startAtByte);
long i=0;
for(String line; (line = reader.readLine()) != null; ) {
lines.add(line);
System.out.print(i+" ");
if (lines.size()>1000) {
commit(lines);
System.out.println("");
lines.clear();
System.out.println(SOMETHING?);
}
}
} catch(Exception e) {
// handle this
} finally {
if (reader != null) {
try {reader.close();} catch(Exception ignore) {}
}
}
答案 0 :(得分:2)
RandomAccessfile
确实是一种方法。使用
long position = file.getFilePointer();
当您停止阅读以保存文件中的位置时,然后使用以下命令恢复:
file.seek(position);
要在同一个地方继续阅读。
但是,使用RandomAccessfile
时要小心,因为其readLine
方法不完全支持Unicode。
答案 1 :(得分:0)
你能以某种方式使用预定的偏移量,例如将文件分成四个部分(offset0,offset1)(offset1,offset2)等,并使用RecursiveAction(ForkJoin API)来利用并行性。