Что именно означает "поток" и "буфер" в Java I/O?

Я только что узнал о вводе / выводе с помощью BufferedReader.

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

также, что эта строка кода служит нам:

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

5 ответов


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

потоки (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.


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

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

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

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

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


буфера:

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

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

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

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

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

I / O означает вход / выход.

Итак, входной поток может быть источником ввода, таким как дисковый файл, сетевое подключение и т. д.

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

по данным официальная документация JAVA, потоки 3 типы.

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

Байтовых Потоков:

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

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

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

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

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

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream

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

все классы символьного потока происходят от читатель и писатель.

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

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader

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

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

Потоки Байтов И Потоки Символов использовать unbuffered I / O.

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

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

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

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

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

пример:

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

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

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

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


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

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


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

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