Java BufferedReader проверяет следующие строки цикла перед циклом - PullRequest
7 голосов
/ 08 февраля 2012

Я анализирую файл .cvs.Для каждой строки cvs я создаю объект с проанализированными значениями и помещаю их в набор.

Прежде чем поместить объект на карту и перейти к следующему, мне нужно проверить, есть ли у следующих cvsстрока - это тот же объект, что и фактический, но с другим значением свойства.

Для этого мне нужно проверить следующие строки буфера, но сохранить буфер цикла в той же позиции.

Например:

BufferedReader input  = new BufferedReader(new InputStreamReader(new FileInputStream(file),"ISO-8859-1"));
String line = null;

while ((line = input.readLine()) != null) {
    do something

    while ((nextline = input.readLine()) != null) { //now I have to check the next lines
       //I do something with the next lines. and then break.
    }
    do something else and continue the first loop.
}

Ответы [ 3 ]

8 голосов
/ 08 февраля 2012
  1. Вы можете отметить текущую позицию, используя BufferedReader.mark(int). Для возврата на позицию вы звоните BufferedReader.reset(). Параметр mark является «пределом чтения впереди»; если вы попытаетесь reset() после прочтения больше лимита, вы можете получить IOException.

  2. Или вы можете использовать RandomAccessFile вместо:

    // Get current position
    long pos = raf.getFilePointer();
    // read more lines...
    // Return to old position
    raf.seek(pos);
    
  3. Или вы можете использовать PushbackReader, что позволяет вам unread символов. Но есть недостаток: PushbackReader не предоставляет метод readLine.

1 голос
/ 08 февраля 2012

Вы также можете сделать это с помощью вложенных циклов do… while, не перечитывая ничего из вашего потока:

public void process(File file) throws Exception {
    BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(file), "ISO-8859-1"));
    String batchParent = input.readLine(); // read the first line in the file, this is a new batch
    String batchChild;
    do {
        currentBatch = new Batch(batchParent);
        do {
            batchChild = input.readLine();
        } while (addToBatchIfKeysMatch(batchParent, batchChild));
        // if we break out of the inner loop, that means batchChild is a new parent
        // assign it to batchParent and continue the outer loop
        batchParent = batchChild;
    } while (batchParent != null);
}

private boolean addToBatchIfKeysMatch(final String batchParent, final String batchChild) {
    if (batchChild != null && keysMatch(batchParent, batchChild)) {
        currentBatch.add(batchChild);
        return true;
    } else {
        return false;
    }
}

Ключ заключается в том, чтобы просто прочитать каждый файл и либо обработать его как дочернюю строку во внутреннем цикле, либо установить для parentLine вновь прочитанное значение и продолжить внешний цикл.

1 голос
/ 08 февраля 2012

Подумайте об использовании чего-то, что уже сделано, как OpenCSV .Я думаю, что вы могли бы создать что-то вроде пользовательской стратегии сопоставления для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...