我有一个带有10k行的文件。
我以200行的块阅读。
我有一个问题,即在5600行(块28)之后,randomAccessFile.readLine()
返回null
。
但是,如果我从块29开始阅读,它会读取另一个块并停止(返回null)。
我强迫30块的阅读,然后再读取一块并停止。
这是我的代码:
private void addRequestsToBuffer(int fromChunkId, List<String> requests) {
String line;
while (requests.size() < chunkSizeInLines) {
if ((line = readNextLine()) != null) {
return;
}
int httpPosition = line.indexOf("http");
int index = fromChunkId * chunkSizeInLines + requests.size();
requests.add(index + ") " + line.substring(httpPosition));
}
}
private String readNextLine() {
String line;
try {
line = randomAccessFile.readLine();
if (line == null) {
System.out.println("randomAccessFile.readLine() returned null");
}
} catch (IOException ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
return line;
}
@Override
public List<String> getNextRequestsChunkStartingChunkId(int fromChunkId) {
List<String> requests = new ArrayList<>();
int linesNum = 0;
try {
for (int i = 0; i < fromChunkId; i++) {
while ((linesNum < chunkSizeInLines) && (randomAccessFile.readLine()) != null) {
linesNum++;
}
linesNum = 0;
}
addRequestsToBuffer(fromChunkId, requests);
} catch (IOException ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
return requests;
}
什么会导致这个?randomAccessFile
超时?
每次调用getNextRequestsChunkStartingChunkId
时,您都会跳过指定的块数,而不会"将RandomAccessFile
倒入"开始。因此,例如,如果您致电:
getNextRequestsChunkStartingChunkId(0);
getNextRequestsChunkStartingChunkId(1);
getNextRequestsChunkStartingChunkId(2);
您实际上会阅读:
- 块0(在块开始时离开流1)
- 块2(在块开始的开头离开流)
- 块5(在块6的开头离开流)
选项:
- 依次读取块,而无需跳过任何东西
- 在方法开始时倒带
不幸的是,您无法使用seek
,因为您的块并不大小。