чтение кусками из большого файла с использованием java

У меня есть большой файл с 10K сущностями (сущность в строке)

Я хочу прочитать его кусками по 1 тыс. сущностей в список.

Я пытался:

public List<String> getNextRequestsChunk() {
    List<String> requests = new ArrayList<>();
    try {

        randomAccessFile.seek(currentSeekPosition);

        String line = null;
        while ((requests.size() < chunkSize) && (line = randomAccessFile.readLine()) != null)
        {
            currentSeekPosition += line.length();
            requests.add(line);
        }
    } catch (IOException ex) {
        ex.printStackTrace();
        throw new RuntimeException(ex);
    }

    return requests;
}

У меня есть этот файл:

11
22
33
..
100100

и когда я повторно запускаю этот метод для куска № 2, он не дает мне ожидаемую строку 33, а строку 2

(chunkSize — 2 строки, currentSeekPosition = 4)

Как я могу это исправить?


person Elad Benda    schedule 28.04.2015    source источник
comment
что это дает вам, если не строка 10?   -  person ACV    schedule 28.04.2015
comment
убедитесь, что currentSeekPosition не сбрасывается где-то снаружи   -  person ACV    schedule 28.04.2015
comment
пожалуйста, посмотрите мое обновление   -  person Elad Benda    schedule 28.04.2015
comment
Я думаю, вам нужно добавить: currentSeekPosition += line.length() + 1;   -  person ACV    schedule 28.04.2015
comment
Почему вы вообще возитесь с seek()? Просто прочитайте данные и позвольте указателю файла двигаться автоматически.   -  person Durandal    schedule 28.04.2015
comment
Я постараюсь. я полагаю, вы правы   -  person Elad Benda    schedule 28.04.2015


Ответы (1)


Добавить currentSeekPosition = randomAccessFile.getFilePointer(); после цикла while

public List<String> getNextRequestsChunk() {
    List<String> requests = new ArrayList<>();
    try {

        randomAccessFile.seek(currentSeekPosition);

        String line = null;
        while ((requests.size() < chunkSize) && (line = randomAccessFile.readLine()) != null)
        {
            // currentSeekPosition += line.length()+1; 
            requests.add(line);
        }
       // add this 
       currentSeekPosition = randomAccessFile.getFilePointer();
    } catch (IOException ex) {
        ex.printStackTrace();
        throw new RuntimeException(ex);
    }

    return requests;
}

Ваша проблема заключалась в том, что метод readLine не учитывает символ новой строки \n.

person MCHAppy    schedule 28.04.2015