Вы также можете сделать это с помощью вложенных циклов 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 вновь прочитанное значение и продолжить внешний цикл.