RandomAccessFile.Readline()即使未达到EOF,许多用途后都会返回null



我有一个带有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,因为您的块并不大小。

最新更新