Основываясь на ответе Джона, я подумал, что создать декоратор, который будет действовать как файловый итератор, должно быть достаточно просто, чтобы вы могли использовать цикл foreach:
public class BufferedReaderIterator implements Iterable<String> {
private BufferedReader r;
public BufferedReaderIterator(BufferedReader r) {
this.r = r;
}
@Override
public Iterator<String> iterator() {
return new Iterator<String>() {
@Override
public boolean hasNext() {
try {
r.mark(1);
if (r.read() < 0) {
return false;
}
r.reset();
return true;
} catch (IOException e) {
return false;
}
}
@Override
public String next() {
try {
return r.readLine();
} catch (IOException e) {
return null;
}
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
Справедливое предупреждение: это подавляет IOException, чтоможет произойти во время чтения и просто останавливает процесс чтения.Неясно, что в Java есть способ обойти это без исключений времени выполнения, так как семантика методов итератора хорошо определена и должна соответствовать, чтобы использовать синтаксис for-each.Кроме того, запуск нескольких итераторов здесь будет иметь странное поведение;поэтому я не уверен, что это рекомендуется.
Я все же проверил это, и оно работает.
В любом случае, вы получаете преимущество синтаксиса для каждого, используя его как своего рода декоратор:
for(String line : new BufferedReaderIterator(br)){
// do some work
}