JavaRush/Java блог/Random/BufferedReader и BufferedWriter
Автор
John Selawsky
Senior Java-разработчик и преподаватель в LearningTree

BufferedReader и BufferedWriter

Статья из группы Random
участников
Java класс BufferedReader читает текст из потока ввода символов, буферизуя прочитанные символы, чтобы обеспечить эффективное считывание символов, массивов и строк. Можно указать в конструкторе вторым параметром размер буфера.
BufferedReader и BufferedWriter - 1
Конструкторы:
BufferedReader(Reader in) // Создает буферный поток ввода символов, который использует размер буфера по умолчанию.
BufferedReader(Reader in, int sz) // Создает буферный поток ввода символов, который использует указанный размер.
Методы:
close() // закрыть поток
mark(int readAheadLimit) // отметить позицию в потоке
markSupported() // поддерживает ли отметку потока
int read() // прочитать буфер
int read(char[] cbuf, int off, int len) // прочитать буфер
String readLine() // следующая строка
boolean ready() // может ли поток читать
reset() // сбросить поток
skip(long n) // пропустить символы
Пример использования классов BufferedReader и BufferedWriter: Чтения файла:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReaderExample {

	public static void main(String[] args) {
		String inputFileName = "file.txt";

		try (BufferedReader reader = new BufferedReader(new FileReader(inputFileName))) {
			String line;
			while ((line = reader.readLine()) != null) {
				System.out.println(line + "\n");
			}
		}
                catch (IOException e) {
			e.printStackTrace();
		}
	}

}
Java класс BufferedWriter записывает текст в поток вывода символов, буферизуя записанные символы, чтобы обеспечить эффективную запись символов, массивов и строк. Можно указать в конструкторе вторым параметром размер буфера. Конструкторы:
BufferedWriter(Writer out) // Создает буферный поток вывода символов, который использует размер буфера по умолчанию.
BufferedWriter(Writer out, int sz) // Создает буферный поток вывода символов, который использует указанный размер.
Методы:
close() // закрыть поток
flush() // передать данные из буфера во Writer
newLine() // перенос на новую строку
write(char[] cbuf, int off, int len) // запись в буфер
write(int c) // запись в буфер
write(String s, int off, int len) // запись в буфер
Пример использования классов Java BufferedReader и BufferedWriter: Запись в файл
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class FileWritterExample {

	public static void main(String[] args) {
		String outputFileName = "file.txt";
		String[] array = { "one", "two", "three", "four" };

		try (BufferedWriter writter = new BufferedWriter(new FileWriter(outputFileName))) {
			for (String value : array) {
				writter.write(value + "\n");
			}
		}
        catch (IOException e) {
			e.printStackTrace();
		}
	}

}
FileWriter сразу записывает данные на диск и каждый раз к нему обращается, буфер работает как обертка и ускоряет работу приложения. Буфер будет записывать данные в себя, а потом большим куском файлы на диск. Считываем данные с консоли и записываем в файл:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

public class ConsoleReaderExample {

	public static void main(String[] args) {
		String outputFileName = "file.txt";

		try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
			try (BufferedWriter writter = new BufferedWriter(new FileWriter(outputFileName))) {
				String line;
				while (!(line = reader.readLine()).equals("exit")) { // Прерывание цикла при написании строки exit
					writter.write(line);
				}
			}
		}
         catch (IOException e) {
			e.printStackTrace();
		}
	}

}
Комментарии (138)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Железов Сергей Анатольевич siebel разработчик в МКБ
24 марта, 10:45
а кто подскажет почему у нас на два try используется один catch ?
Dinislam Aminev
Уровень 16
Expert
24 января 2023, 22:00
Люди на 9 уровне пишут, что ничего непонятно. А я тут со своим 3м выпендриваюсь, что не понимаю
Denis Sever
Уровень 23
Expert
28 марта, 19:59
мне и на 16 ничего не понятно ) второй раз перечитываю уровень и еще видосики на ютубе смотрю )
Kirill
Уровень 22
18 ноября 2022, 21:58
Кто подскажет. Возможно я не правильно мыслю, но в задачи необходимо определить минимальную из 2х вводных. Я вот не могу понять, каким образом сразу загрузить входные данные, сразу два числа. Пока считывает с консоли только одно
ntimalyov
Уровень 28
6 декабря 2022, 06:56
2 раза нужна строка со считыванием переменной (только в разные строки). Например, так:
Scanner scan = new Scanner(System.in);
int x = scan.nextInt();
int y = scan.nextInt();
В итоге у вас будут 2 переменные - х и у с введёнными с клавиатуры значениями
Kirill
Уровень 22
6 декабря 2022, 14:51
Благодарю)) Как раз так и сделал
Anonymous #2835492
Уровень 24
30 сентября 2022, 08:23
Класс!!! Большое спасибо!
рост
Уровень 32
27 сентября 2022, 12:26
спасибо)
SerVit
Уровень 9
27 января 2022, 15:42
Ничего не понял. Вернусь позже...
Anonymous #2946557
Уровень 6
2 февраля 2022, 16:10
во во. прошел до 6 уровня, думаю "перечитаю детальнее" - просто посмотрел на иероглифы
Sereja
Уровень 36
3 февраля 2022, 11:49
Джентльмены, задачи по этой теме начинают встречаться только на Java Core ступени, вроде как, так что не переживайте,что пока что ничего не понятно.
Денис
Уровень 3
18 февраля 2022, 16:18
А вот и нет! 3 уровень: 3 уровень, 8 лекция, задача "План по захвату мира", и лекция до.
Axsell
Уровень 27
22 февраля 2022, 19:54
не забивайте себе этим голову на 3 уровне, если от вас требуют в задаче ввести текст с консоли пользуйтесь: BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)) и все! Большего от вас не требуется, не надо лезть в дебри, всему свое время.
🦔 Виктор веду учебный тг-канал в t.me/Javangelion Expert
20 мая 2022, 13:57
Разобрались в итоге? Всё получилось?
Павел Соловьёв докер - механизатор в Порт
10 июля 2022, 06:02
на 13м уровне актуально
hidden #2436024
Уровень 14
28 марта 2021, 06:36
try (BufferedWriter writter = new BufferedWriter(new FileWriter(outputFileName))) { Обьясните почему после слова try в круглых скобках выражение?Что значит?
Олег
Уровень 43
29 марта 2021, 12:51
Это оператор try with resources. Он создан для того, чтобы автоматически(без ручного вызова метода close()) закрывать поток и освобождать ресурсы.
🦔 Виктор веду учебный тг-канал в t.me/Javangelion Expert
4 января 2021, 05:04
Суховато, на статью не тянет, больше как справочный материал и примеры для решения задач 13 уровня. В любом случае, спасибо за труды. Оригинальная статья на Метаните: Буферизация символьных потоков. BufferedReader и BufferedWriter. Всё получится!
gerich
Уровень 41
8 сентября 2021, 10:26
Огромное спасибо тебе за, так сказать, "пасхалки" в каждых лекциях/уровнях и тд, твои допы очень помогают, благодарю сердечно!
🦔 Виктор веду учебный тг-канал в t.me/Javangelion Expert
20 мая 2022, 13:57
Спасибо за добрые слова. Как у вас дела? Вижу 41 уровень, держу кулачки! В итоге всё получилось?
Anastasiia
Уровень 7
Expert
2 февраля, 12:08
спасибо за ссылку! я, по ходу изучения джавараш, поняла, что не стоит рассчитывать на данный ресурс как единственный, и нагуглила тоже Метанит - там реально очень понятно всё) теперь и тут и там (и ещё дофига где - чего уж там😂) читаю параллельно
Regina C QA Auto Engineer в -
7 декабря 2020, 20:11
а с каких пор writer пишется с двумя t?)
Андрей Dungeon Master
11 ноября 2021, 07:26
главное что все работает))
Алексей Software Developer в АО СибКом
28 ноября 2020, 19:28
Как здесь закрывается поток для записи?
22 января 2021, 09:07
reader.close() writter.close()
Kurama
Уровень 50
28 мая 2021, 17:23
автоматически