2012-02-08 1 views
7

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

Перед тем, как поместить объект на карту и выполнить цикл до следующего, мне нужно проверить, является ли следующая строка 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. 
} 
+1

'BufferedReader()' имеет 'mark()' и 'reset()' методы, которые могут вам помочь (я никогда не использовал их, поэтому я не отправляю их как ответ). – hmjd

+0

В чем проблема? –

+2

Можно просто вызвать input.mark() без каких-либо параметров? –

ответ

8
  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.

+3

Как использовать метод input.mark()? Я имею в виду. Мне нужно передать параметр (я думаю, это позиция, которую я хочу отметить), но как ее получить, поскольку я читаю строки? –

+0

Он обозначает текущее положение. Невозможно получить его, вы можете только попросить поток любезно вернуться к позиции, которую вы отметили ранее. Параметр определяет, как далеко вы можете прочитать, прежде чем отметка будет признана недействительной. Если вы пойдете дальше, вы не сможете «переустановить»() поток. У этого есть свои ограничения, и вы должны принять их или использовать что-то еще. – Joni

1

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

1

Вы также можете сделать это с вложенными делать ... в то время как петли, без перечитывания что-нибудь из своего потока:

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; 
    } 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^