我有一个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
超时?
答案 0 :(得分:2)
每次调用getNextRequestsChunkStartingChunkId
时,您都会跳过指定数量的块,而不会将RandomAccessFile
“倒带”到开头。例如,如果你打电话:
getNextRequestsChunkStartingChunkId(0);
getNextRequestsChunkStartingChunkId(1);
getNextRequestsChunkStartingChunkId(2);
你真的会读到:
选项:
不幸的是,你不能使用seek
,因为你的块的大小不同,就字节而言。