Он не основан на NIO, но я бы взглянул на метод Guava CharStreams.readLines (InputSupplier, LineProcessor) . Он делает то, что вы хотите, я бы сказал:
File file = ...
Foo result = CharStreams.readLines(Files.newReaderSupplier(file, Charsets.UTF_8),
new LineProcessor<Foo>() {
public boolean processLine(String line) {
// do stuff for this line
return true; // or false if you want to stop processing here
}
public Foo getResult() {
return result; // if you create some result when processing the lines
}
});
При этом используется обратный вызов, чтобы вы могли последовательно обрабатывать каждую строку в файле. Он не загружает следующую строку в память, пока вы не закончите обработку текущей. Если вы не хотите создавать какой-либо один объект результата при чтении строк, вы можете просто использовать LineProcessor<Void>
и иметь getResult()
return null
.