Мне никогда не надоест сутенерство библиотек гуавы от Google , которое избавляет от многих проблем ... ну, большинство вещей в Java.
Как насчет:
for (String line : Files.readLines(new File("file.txt"), Charsets.UTF_8)) {
// Do something
}
В случае, когда у вас есть большой файл, и вы хотите построчный обратный вызов (а не чтение всего этого в памяти), вы можете использовать LineProcessor
, который добавляет немного шаблона (из-за отсутствия замыканий ... вздох), но все же не дает вам разобраться с самим чтением и всеми связанными Exceptions
:
int matching = Files.readLines(new File("file.txt"), Charsets.UTF_8, new LineProcessor<Integer>(){
int count;
Integer getResult() {return count;}
boolean processLine(String line) {
if (line.equals("foo")
count++;
return true;
}
});
Если вы на самом деле не хотите, чтобы результат возвращался из процессора, и вы никогда не прерывали работу раньше (причина логического возврата из processLine
), вы могли бы , тогда сделать что-то вроде:
class SimpleLineCallback extends LineProcessor<Void> {
Void getResult{ return null; }
boolean processLine(String line) {
doProcess(line);
return true;
}
abstract void doProcess(String line);
}
и тогда ваш код может быть:
Files.readLines(new File("file.txt"), Charsets.UTF_8, new SimpleLineProcessor(){
void doProcess(String line) {
if (line.equals("foo");
throw new FooException("File shouldn't contain 'foo'!");
}
});
что соответственно чище.