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)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
24 марта 2024
а кто подскажет почему у нас на два try используется один catch ?
Dinislam Aminev Уровень 16 Expert
24 января 2023
Люди на 9 уровне пишут, что ничего непонятно. А я тут со своим 3м выпендриваюсь, что не понимаю
Kirill Уровень 22
18 ноября 2022
Кто подскажет. Возможно я не правильно мыслю, но в задачи необходимо определить минимальную из 2х вводных. Я вот не могу понять, каким образом сразу загрузить входные данные, сразу два числа. Пока считывает с консоли только одно
Anonymous #2835492 Уровень 24
30 сентября 2022
Класс!!! Большое спасибо!
рост Уровень 32
27 сентября 2022
спасибо)
SerVit Уровень 9
27 января 2022
Ничего не понял. Вернусь позже...
hidden #2436024 Уровень 14
28 марта 2021
try (BufferedWriter writter = new BufferedWriter(new FileWriter(outputFileName))) { Обьясните почему после слова try в круглых скобках выражение?Что значит?
🦔 Виктор Уровень 20 Expert
4 января 2021
Суховато, на статью не тянет, больше как справочный материал и примеры для решения задач 13 уровня. В любом случае, спасибо за труды. Оригинальная статья на Метаните: Буферизация символьных потоков. BufferedReader и BufferedWriter. Всё получится!
Regina C Уровень 36
7 декабря 2020
а с каких пор writer пишется с двумя t?)
Алексей Уровень 16
28 ноября 2020
Как здесь закрывается поток для записи?