Что означает "Stream" и "Buffer" в Java I/O?

Я только что узнал о вводе/выводе, используя BufferedReader.

Я хотел знать, что именно означают значения термина Stream и Buffer?

И что нам делает эта строка кода:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

Ответ 1

Java имеет два типа классов для ввода и вывода (I/O): потоки и читателей/писателей.

Потоки (InputStream, OutputStream и все, что их расширяет) предназначены для чтения и записи двоичных данных из файлов, сети или любого другого устройства.

Читатели и писатели предназначены для чтения и записи текста (символов). Они представляют собой слой поверх потоков, который преобразует двоичные данные (байты) в символы и обратно, используя кодировку символов.

Чтение данных с байта по байту очень неэффективно. Один из способов ускорить это - использовать буфер: вместо чтения одного байта за один раз вы читаете несколько тысяч байт одновременно и помещаете их в буфер, в память. Затем вы можете поочередно просматривать байты в буфере.

Учебник по Oracle Java об I/O подробно объясняет это.

Посмотрите на строку кода, которую вы указали:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

System.in является InputStream. Вы создаете InputStreamReader, который считывает байты из System.in. Затем вы оберните это в BufferedReader.

Итак, в конце концов, у вас есть BufferedReader, который читает с InputStreamReader, который читается из System.in.

Ответ 2

Ну, это вопрос в everbodys, который начинает работать над пакетом java.io. Чтобы ответить на ваши вопросы, термины InputStreamReader и BufferedReader представляют только объекты java (в них нет ничего особенного), но они созданы для операций io, таких как чтение и запись с/на разные входы/выходы, такие как файл, объект и т.д.

Теперь перейдем к строке

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

InputStreamReader - это класс для чтения входного потока байтов. Но для чтения каждого байта стоит дорого, поэтому мы обертываем его вокруг BufferedReader, чтобы он буферизовался (что является рисунком декоратора).

Итак, что произойдет, еще до того, как вы начнете читать, bufferedReader сохранит некоторый фрагмент байтов в регистре и когда вы выполните операцию чтения. он будет считан из того места, которое намного дешевле, чем чтение из консоли/файла. Но в случае InputStreamReader, когда вы выполняете операцию чтения каждый раз, когда происходит операция доступа к диску

Ответ 3

Буфер:

Это область физической памяти, используемая для временного хранения данных во время их перемещения из одного места в другое. В большинстве случаев эта физическая память будет ОЗУ (оперативная память).

Но из этого контекста вопроса буфер используется при чтении/записи данных. Его не нужно использовать при перемещении данных из одного места в другое.

Пример для буфера: если ваша система имеет 4 ГБ ОЗУ, система может выделить 4 КБ памяти (ОЗУ) для буфера. КБ - килобайт (ы), ГБ - гигабайт (ы)

Поток ввода/вывода (или) Поток:

Поток ввода/вывода представляет собой источник ввода или назначение вывода. Поток может представлять множество различных типов источников и назначений, включая дисковые файлы, устройства, другие программы и массивы памяти.

Ввод/вывод означает ввод/вывод.

Таким образом, Input Stream может быть источником ввода, таким как файл на диске, сетевое соединение и т.д.

И, Output Stream может быть местом назначения вывода, таким как файл на диске, сетевое соединение и т.д.

Согласно официальной документации JAVA, потоки бывают трех типов.

  1. Потоки байтов (чтение или запись байтов)
  2. Потоки символов (чтение или запись символов)
  3. Буферизованные потоки (чтение или запись в буфер для эффективности)

Байтовые потоки:

Они выполняют ввод и вывод 8-битных байтов. Все классы потока байтов происходят от InputStream и OutputStream.

Байт Входные классы потока получают входные данные как необработанные байты. Выходные байтовые классы дают выходные данные в виде необработанных байтов.

InputStream - прямые известные подклассы

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.

OutputStream - прямые известные подклассы

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

Потоки символов: это слой поверх потоков байтов. Они преобразуют байты (двоичные данные) в символы и символы в байты, используя кодировку символов.

Все классы символьных потоков происходят от Reader и Writer.

Reader - Прямые известные подклассы

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

Writer - прямые известные подклассы

BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter

Байтовые потоки и символьные потоки используют небуферизованный ввод/вывод.

Это означает, что каждый запрос на чтение или запись обрабатывается непосредственно базовой ОС. Это может сделать программу намного менее эффективной, поскольку каждый такой запрос часто вызывает доступ к диску, сетевую активность или какую-либо другую операцию, которая является относительно дорогой. Чтобы уменьшить этот вид издержек, платформа Java реализует буферизованные потоки ввода/вывода.

Буферизованные потоки:

Буферизованные входные потоки считывают данные из области памяти, известной как буфер; родной API ввода вызывается только тогда, когда буфер пуст.

Аналогично, буферизованные выходные потоки записывают данные в буфер, а собственный API вывода вызывается только тогда, когда буфер заполнен.

Программа может преобразовать небуферизованный поток в буферизованный поток с использованием идиомы обертывания, где объект небуферизованного потока передается в конструктор для класса буферизованного потока.

Пример:

inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));

Существует 4 класса буферизованных потоков, которые используются для упаковки небуферизованных потоков:

Для создания буферизованных потоков байтов используйте классы BufferedInputStream и BufferedOutputStream.

Для создания буферизованных символьных потоков используйте классы BufferedReader и BufferedWriter.

Ответ 4

Потоки. Потоки - это потоки данных, с которых вы можете читать или писать. потоки обычно подключаются к источнику данных или месту назначения данных, например файлу, сетевому соединению и т.д.

Буфер: контейнер для данных определенного примитивного типа. Буфер представляет собой линейную конечную последовательность элементов определенного примитивного типа. Помимо его содержания существенными свойствами буфера являются его емкость, предел и положение:

Ответ 5

Поток - это соединение и фактическая информация, передаваемая между точками. Буфер представляет собой контейнер хранения, который хранит часть или все потоковые данные и подает их на устройство вывода.

Конечно, дело в том, что если поток замедляется за пределами скорости передачи данных, необходимой для отображения данных, то выход будет приостановлен. Буфер предотвращает это.

Ответ 6

Буфер - это часть в памяти, которая используется для хранения потока данных с периферийных устройств. Затем из этого буфера этот поток данных собирается и сохраняется в переменных. Поток может быть определен как непрерывный поток данных.

Сам термин "ввод/вывод" означает не что иное, как перемещение данных в буферы и из них. Просто держите это в уме все время. Процессы выполняют ввод/вывод, запрашивая у операционной системы данные, которые должны быть выгружены из буфера (операция записи) или что буфер заполняется данными (операция чтения).
Логическая диаграмма движения данных

Проще говоря, представьте, что когда вы вводите данные на клавиатуре, данные перемещаются через канал (поток) в буфер, а затем из буфера на диск (операция записи). Аналогично, когда данные перемещаются с диска в буфер и из буфера в консоль, выполняется операция чтения.

Вы можете прочитать ссылки для лучшего понимания. Надеюсь, поможет!.
Что такое буфер в Java
введите описание ссылки здесь