В Java есть два типа классов для ввода и вывода (I / O): потоки и читатели / писатели .
Streams ( InputStream
, OutputStream
и все , что расширяет их) предназначено для чтения и записи двоичных данных из файлов, сетей, или какой - либо другого устройства.
Читатели и писатели предназначены для чтения и записи текста (символов). Это слой поверх потоков, который преобразует двоичные данные (байты) в символы и обратно с использованием кодировки символов .
Чтение данных с диска побайтно очень неэффективно. Один из способов ускорить это - использовать буфер: вместо чтения одного байта за раз, вы читаете сразу несколько тысяч байтов и помещаете их в буфер в памяти. Затем вы можете просматривать байты в буфере один за другим.
Java учебник Oracle, о I / O объясняет это в деталях.
Взглянув на предоставленную вами строку кода:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.in
это InputStream
. Вы создаете объект, InputStreamReader
который читает байты из System.in
. Затем вы помещаете это в файл BufferedReader
.
Итак, в конечном итоге у вас есть объект, BufferedReader
который читает из файла, InputStreamReader
который читает из System.in
.
InputStreamReader
- это оболочкаInputStream
, позволяющая читать текст изInputStream
. Если вы просто хотите читать байты (не символы), вам не нужноInputStreamReader
. Это полезно, если вы хотите интерпретировать байты как текстовые символы.Буфер:
Это область физической памяти, используемая для временного хранения данных во время их перемещения из одного места в другое. Этим хранилищем физической памяти в большинстве случаев будет RAM ( память с произвольным доступом).
Но из контекста этого вопроса Buffer используется при чтении / записи данных. Его не нужно использовать при перемещении данных из одного места в другое.
Пример для буфера: если ваша система имеет 4 ГБ ОЗУ, 4 КБ памяти (ОЗУ) может быть выделено для буфера системой. КБ - Килобайт, ГБ - Гигабайт
Поток ввода / вывода (или) поток:
I / O означает ввод / вывод.
Таким образом, входной поток может быть источником ввода, таким как дисковый файл, сетевое соединение и т. Д.
Кроме того, выходной поток может быть местом назначения, например дисковым файлом, сетевым подключением и т. Д.
Согласно официальной документации JAVA , потоки бывают трех типов.
Байтовые потоки:
Классы Byte Input Stream получают ввод в виде необработанных байтов . Классы Byte Output Stream выдают результат в виде необработанных байтов .
InputStream
- Прямые известные подклассыOutputStream
- Прямые известные подклассыСимвольные потоки: они являются слоем поверх байтовых потоков. Они преобразуют байты (двоичные данные) в символы и символы в байты, используя кодировку символов.
Reader
- Прямые известные подклассыWriter
- Прямые известные подклассыПотоки байтов и потоки символов используют небуферизованный ввод-вывод .
Буферизованные потоки:
Программа может преобразовать небуферизованный поток в буферизованный поток, используя идиому упаковки, где небуферизованный объект потока передается конструктору для класса буферизованного потока.
Пример:
inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
Существует 4 класса буферизованных потоков, которые используются для обертывания небуферизованных потоков:
Для создания буферизованных байтовых потоков используйте
BufferedInputStream
иBufferedOutputStream
классов.Для создания буферизованного Character Streams использовать,
BufferedReader
иBufferedWriter
классы.источник
Ну, это вопрос всех, кто начинает работать над пакетом java.io. Чтобы ответить на ваш вопрос, термины InputStreamReader и BufferedReader представляют только объекты java (в них нет ничего особенного), но они созданы для операций io, таких как чтение и запись из / в различные входы / выходы, такие как файл, объект и т. Д.
Теперь давайте перейдем к линии
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
InputStreamReader - это класс для чтения входного потока байтов, но чтение каждого байта - дорогостоящая операция, поэтому мы обертываем его вокруг BufferedReader, чтобы он буферизовался (что является шаблоном декоратора)
Итак, что произойдет еще до того, как вы начнете читать, bufferedReader сохранит некоторый кусок байтов в регистре и когда вы выполните операцию чтения. он будет прочитан из этого места, что намного дешевле, чем чтение из консоли / файла. Но в случае InputStreamReader, когда вы выполняете операцию чтения каждый раз, когда выполняется операция доступа к диску
источник
Поток - это соединение и фактическая информация, передаваемая между точками. Буфер - это контейнер для хранения, который хранит часть или все передаваемые данные и передает их на устройство вывода.
Конечно, дело в том, что если поток замедляется сверх скорости, необходимой для отображения данных, то вывод будет приостановлен. Буфер предотвращает это.
источник
stream
пакетов. Затем удаленный компьютер сохраняет каждый пакет в буфере. Удаленный компьютер считывает данные из своего буфера и создает, скажем, видео из этого. Надеюсь, это поможет!Буфер - это часть памяти, которая используется для хранения потока данных от периферийных устройств. Затем из этого буфера этот поток данных собирается и сохраняется в переменных. Поток можно определить как непрерывный поток данных.
Сам термин «ввод / вывод» означает не что иное, как перемещение данных в буферы и из них. Просто помните об этом все время. Процессы выполняют ввод-вывод, запрашивая у операционной системы, что данные должны быть удалены из буфера (операция записи) или чтобы буфер был заполнен данными (операция чтения).
Логическая диаграмма движения данных
Проще говоря, представьте, что когда вы вводите данные на клавиатуре, данные перемещаются по конвейеру ( потоку ) в буфер, а затем из буфера на диск (операция записи). Точно так же, когда данные перемещаются с диска в буфер и из буфера в консоль, это операция чтения.
Вы можете прочитать ссылки для лучшего понимания. Надеюсь, поможет!.
Что такое буфер в Java,
введите описание ссылки здесь
источник