Pull to refresh

Эволюция Java на примере чтения строк из файла

Reading time 2 min
Views 126K
Приведу небольшой и интересный, на мой взгляд, пример, как изменилась жизнь простого крестьянина Java разработчика, на примере задачи чтения и печати строк из файла.



Многие из нас помнят

'до 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 — надо делать хорошо, и не надо плохо.

Спасибо за внимание и успехов в кодировании!
Tags:
Hubs:
+2
Comments 17
Comments Comments 17

Articles