Один Reader
должен использоваться один раз для чтения файла.Если вы хотите снова прочитать файл, создайте на его основе новый Reader
.
Используя утилиты ввода-вывода Guava , вы можете создать красивую абстракцию, которая позволит вам читать файлстолько раз, сколько вы хотите, используя Files.newReaderSupplier (File, Charset) .Это дает вам InputSupplier , из которого вы можете получить новый Reader
, вызвав getInput()
в любое время.
Еще лучше, в Guava есть много служебных методов, которые используютиз InputSupplier
s напрямую ... это избавляет вас от необходимости беспокоиться о закрытии поставляемого Reader
самостоятельно.Класс CharStreams содержит большинство текстовых утилит ввода-вывода.Простой пример:
public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
boolean needToDoMoreStuff = true;
while (needToDoMoreStuff) {
// this handles creating, reading, and closing the Reader!
List<String> lines = CharStreams.readLines(readerSupplier);
// do some stuff with the lines you read
}
}
Учитывая File
, вы можете вызвать этот метод следующим образом:
File file = ...;
doSomeStuff(Files.newReaderSupplier(file, Charsets.UTF_8)); // or whatever charset
Если вы хотите выполнить некоторую обработку для каждой строки без чтения каждой строки вво-первых, вы можете использовать перегрузку readLines
, которая принимает LineProcessor .