JavaRush /Java блог /Архив info.javarush /BufferedReader vs Scanner
KarmaHacker
30 уровень
Новосибирск

BufferedReader vs Scanner

Статья из группы Архив info.javarush
Решал сегодня задачу level22.lesson09.task01. В условии нужно считать слова разделенные пробелом, состоящие из несколько строк. Смотря комментарии к этой задачи удивился, что люди считывают строки в основном через BufferedReader. При этом у них возникает куча проблем, строку нужно разделять на слова при помощи split() с переносом строки тоже возникают трудности. Подобные вопросы возникали у меня и на более ранних задачах. В связи с этим вопрос: почему у ДжаваРашевцев такая не любовь к Scanner`у? Это всеобщее заблуждение или я чего-то не знаю? Ведь Scanner отлично справляется, если нам нужно считать не строку целиком, а именно слова разделенные пробелами и на разных строках. Не надо вставлять ни каких костылей в виде сплитов и думать о переносе строк.
Комментарии (10)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
hidden #2729207 Уровень 47
1 сентября 2021
Сканер небезопасен для многопоточного использования без внешней синхронизации.
bridennis Уровень 35
8 декабря 2016
На вкус и цвет — товарищей нет, но…

Если Вы сравните две такие реализации:

1) используем BufferedReader

        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("c:/Denis/wwwroot/1.txt")))) {
            List<String> chunks = new ArrayList<>();
            String line;
            while ((line = reader.readLine()) != null) {
                for (String chunk : line.split("\\s")) {
                    chunks.add(chunk);
                }
            }
            reader.close();
            System.out.println(chunks);
        } catch (IOException e) {
        }


2) используем Scanner

        try (Scanner reader = new Scanner(new InputStreamReader(new FileInputStream("c:/Denis/wwwroot/1.txt")))) {
            List<String> chunks = new ArrayList<>();
            while (reader.hasNext()) {
                chunks.add(reader.next());
            }
            reader.close();
            System.out.println(chunks);
        } catch (IOException e) {
        }


то первая, естественно, всегда будет работать быстрее (хотя вторая компактнее).
Если мы перепишем Scanner на работу со строками:

3) используем Scanner со строками

        try (Scanner reader = new Scanner(new InputStreamReader(new FileInputStream("c:/Denis/wwwroot/1.txt")))) {
            List<String> chunks = new ArrayList<>();
            while (reader.hasNextLine()) {
                for (String chunk : reader.nextLine().split("\\s")) {
                    chunks.add(chunk);
                }
            }
            reader.close();
            System.out.println(chunks);
        } catch (IOException e) {
        }


то, чт