randomAccessFile.readLine()在多次使用后返回null,即使没有达到EOF?

时间:2015-05-10 15:31:47

标签: java file io random-access randomaccessfile

我有一个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超时?

1 个答案:

答案 0 :(得分:2)

每次调用getNextRequestsChunkStartingChunkId时,您都会跳过指定数量的块,而不会将RandomAccessFile“倒带”到开头。例如,如果你打电话:

getNextRequestsChunkStartingChunkId(0);
getNextRequestsChunkStartingChunkId(1);
getNextRequestsChunkStartingChunkId(2);

你真的会读到:

  • Chunk 0(将流保留在块1的开头)
  • Chunk 2(将流保留在块3的开头)
  • 第5块(将流保留在第6块的开头)

选项:

  • 按顺序读取块,而不跳过任何内容
  • 在方法开始时倒退

不幸的是,你不能使用seek,因为你的块的大小不同,就字节而言。