Многие из нас помнят
'до Java 7' мучения:
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(FILE_NAME), Charset.forName("UTF-8")));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// log error
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
// log warning
}
}
}
которые могли облегчить, разве что
Apache Commons IO
InputStreamReader in = null;
try {
in = new InputStreamReader(new FileInputStream(new File(FILE_NAME)), Charsets.UTF_8);
LineIterator it = new LineIterator(in);
while (it.hasNext()) {
System.out.println(it.nextLine());
}
} catch (IOException e) {
// log error
} finally {
IOUtils.closeQuietly(in);
}
Или даже так:
LineIterator it = null;
try {
it = FileUtils.lineIterator(new File(FILE_NAME), "UTF-8");
while (it.hasNext()) {
System.out.println(it.nextLine());
}
} catch (IOException e) {
// log error
} finally {
if (it != null) {
it.close();
}
}
Java 7
принесла automatic resource management (ARM), NIO.2 и StandardCharsets. Теперь без подключения сторонних библиотек появилась возможность сделать:
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(FILE_NAME), StandardCharsets.UTF_8))){
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// log error
}
или еще короче:
List<String> lines = Files.readAllLines(Paths.get(FILE_NAME), StandardCharsets.UTF_8);
for(String line: lines){
System.out.println(line);
}
И, наконец:
Java 8
со своим Stream API и Лямбда-выражениями позволила сделать это в одну строчку:
Files.lines(Paths.get(FILE_NAME), StandardCharsets.UTF_8).forEach(System.out::println);
Мораль: если у вас современная Java — надо делать хорошо, и не надо плохо.
Спасибо за внимание и успехов в кодировании!
Комментарии (13)
nomit
28.10.2015 11:08+13Мораль: если у вас современная Java — надо делать хорошо, и не надо плохо.
Нет, не та мораль. Нужна такая — Мораль: Цените свое время, читайте только интересные статьи, шлак фильтруйте.
dim_s
28.10.2015 11:20Я для чтения строк из файла использую класс Scanner с методами hasNextLine() + nextLine().
EjikVTumane
28.10.2015 15:14Который как раз при использовании regexp'а по-умолчанию (LINE_PATTERN) для 'hasNextLine()' и 'nextLine()' очень любит внезапно спотыкаться ;)
dim_s
28.10.2015 16:19Обычно я использую его только для чтения файла построчно и соответственно не использую regexp. Остальные методы чтения файла построчно у меня иногда выдавали некорректный результат на различных ОС, на одной работало, на другой нет.
EjikVTumane
28.10.2015 17:17Вот как раз при построчном чтении там и есть regexp'ы под капотом, для определения строки которую нужно вернуть при вызове 'nextLine()'.
Поэтому Scanner все же стоит использовать аккуратно в отличие от прочих методов.
baldr
29.10.2015 23:53+1Содержит много сарказма, не читать java-программистамОбожемой! В Java наконец-то можно прочитать файл «без подключения сторонних библиотек»! И теперь с лямбдой и неким Stream API! И наконец-то в одну строку, а не в 25!
Могуч язык, что сказать. Нам с нашими питонами-руби не угнаться…
Ну не могу еще раз не вставить эту картинку, уж извините…
gkislin
01.11.2015 22:09Есть такое. Но смотреть свысока на java будет близорукостью… Хотя бы потому что #1 по использованию и востребуемостии.
> Нам с нашими питонами-руби не угнаться…
Сарказм, да, читается. Вообще — область применения разная. Там где надо без этой портянки за одну строчку что то написать — конкурировать трудно, но, как видите, уже можно. Тот же Play вместо Django.
А вот что то тяжелее- проект на 10^6 строк, где размер стека уже не так важен — увы для питон-руби…
SamVimes
При переходе от 7 к 8 потерялась обработка exception'ов, что, конечно же, уменьшает количество кода:)
eaa
Просто автор сам себе этим слегка так противоречит «Мораль: если у вас современная Java — надо делать хорошо, и не надо плохо.»
nikitasius
В 9й версии будет как на картинке «sudo bring beer», и JDK сама напишет код с нуля. В 10й можно будет нарисовать мышкой схематику работы, а в 11й введут пластиковые «кубики от 3х лет» для джуниор и сеньор программистов и искоренят понятие говнокода, так весь код будет говно, и котлеты пропадут.
eaa
И вообще: «Я согласен, подготовка программистов — гиблое дело. И вообще, скоро программистов можно будет заменить компьютером, чтобы он писал код» (директор центра стратегических инноваций «Ростелекома» Борис Глазков).
nikitasius
Но ведь кто-то будет писать код для компьютера, который будет писать код // Inception
Ждем появление сверх языка или буст asm?