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.*;

public class ReadFile {
	public static void main(String[] args) {
		try {
			File file = new File("file.txt");
			FileReader fileReader = new FileReader(file); // поток который подключается к текстовому файлу
			BufferedReader bufferedReader = new BufferedReader(fileReader); // соединяем FileReader с BufferedReader

			String line;
			while((line = bufferedReader.readLine()) != null) {
				System.out.println(line); // выводим содержимое файла на экран построчно
			}

			bufferedReader.close(); // закрываем поток
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
Java класс BufferedWriter записывает текст в поток вывода символов, буферизуя записанные символы, чтобы обеспечить эффективную запись символов, массивов и строк. Можно указать в конструкторе вторым параметром размер буфера. Конструкторы:
BufferedWriter(Writer out) // Создает буферный поток вывода символов который использует размер буфера по умолчанию.
BufferedWriter(Writer out, int sz) // Создает буферный поток вывода символов который использует указанный размер.
Методы:
close() // закрыть поток
flush() // передать даные из буфера в Writter
newLine() // перенос на новую строку
write(char[] cbuf, int off, int len) // запись в буфер
write(int c) // запись в буфер
write(String s, int off, int len) // запись в буфер

Пример использования классов Java BufferedReader и BufferedWriter:

Запись в файл
import java.io.*;

public class WriteFile {
    public static void main(String[] args) {
        String[] list = {"one", "two", "three", "fo"};
        try {
            File file = new File("file.txt");
            FileWriter fileReader = new FileWriter(file); // поток который подключается к текстовому файлу
            BufferedWriter bufferedWriter = new BufferedWriter(fileReader); // соединяем FileWriter с BufferedWitter

            for(String s : list) {
                bufferedWriter.write(s + "\n");
            }

            bufferedWriter.close(); // закрываем поток
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
FileWriter сразу записывает данные на диск и каждый раз к нему обращается, буфер работает как обертка и ускоряет работу приложения. Буфер будет записывать данные в себя, а потом большим куском файлы на диск. Считываем данные с консоли и записываем в файл:
import java.io.*;

class ConsoleRead {
    public static void main(String[] args) {
        try {
            File file = new File("file.txt");
            InputStreamReader inputStreamReader = new InputStreamReader(System.in); // поток чтения с консоли
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  // соединяем InputStreamReader с BufferedReader

            FileWriter fileReader = new FileWriter(file); // поток который подключается к текстовому файлу
            BufferedWriter bufferedWriter = new BufferedWriter(fileReader); // соединяем FileWriter с BufferedWitter

            String line;
            while(!(line = bufferedReader.readLine()).equals("exit")) {
                bufferedWriter.write(line);
            }

            bufferedReader.close(); // закрываем поток
            bufferedWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}