Я только что узнал об использовании ввода / вывода BufferedReader
.
Я хотел знать, что именно означает термин Stream
и Buffer
?
И что нам служит эта строка кода:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Я только что узнал об использовании ввода / вывода BufferedReader
.
Я хотел знать, что именно означает термин Stream
и Buffer
?
И что нам служит эта строка кода:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Ответы:
В 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 , потоки бывают трех типов.
Байтовые потоки:
Они выполняют ввод и вывод 8-битных байтов. Все классы байтовых потоков являются потомками InputStream и OutputStream .
Классы Byte Input Stream получают ввод в виде необработанных байтов . Классы Byte Output Stream выдают результат в виде необработанных байтов .
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
классов.
Для создания буферизованного Character Streams использовать, BufferedReader
и BufferedWriter
классы.
Ну, это вопрос всех, кто начинает работать над пакетом java.io. Чтобы ответить на ваш вопрос, термины InputStreamReader и BufferedReader представляют только объекты java (в них нет ничего особенного), но они созданы для операций io, таких как чтение и запись из / в различные входы / выходы, такие как файл, объект и т. Д.
Теперь давайте перейдем к линии
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
InputStreamReader - это класс для чтения входного потока байтов, но чтение каждого байта - дорогостоящая операция, поэтому мы обертываем его вокруг BufferedReader, чтобы он буферизовался (что является шаблоном декоратора)
Итак, что произойдет еще до того, как вы начнете читать, bufferedReader сохранит некоторый кусок байтов в регистре и когда вы выполните операцию чтения. он будет прочитан из этого места, что намного дешевле, чем чтение из консоли / файла. Но в случае InputStreamReader, когда вы выполняете операцию чтения каждый раз, когда выполняется операция доступа к диску
Поток - это соединение и фактическая информация, передаваемая между точками. Буфер - это контейнер для хранения, который хранит часть или все передаваемые данные и передает их на устройство вывода.
Конечно, дело в том, что если поток замедляется сверх скорости, необходимой для отображения данных, то вывод будет приостановлен. Буфер предотвращает это.
stream
пакетов. Затем удаленный компьютер сохраняет каждый пакет в буфере. Удаленный компьютер считывает данные из своего буфера и создает, скажем, видео из этого. Надеюсь, это поможет!
Буфер - это часть памяти, которая используется для хранения потока данных от периферийных устройств. Затем из этого буфера этот поток данных собирается и сохраняется в переменных. Поток можно определить как непрерывный поток данных.
Сам термин «ввод / вывод» означает не что иное, как перемещение данных в буферы и из них. Просто помните об этом все время. Процессы выполняют ввод-вывод, запрашивая у операционной системы, что данные должны быть удалены из буфера (операция записи) или чтобы буфер был заполнен данными (операция чтения).
Логическая диаграмма движения данных
Проще говоря, представьте, что когда вы вводите данные на клавиатуре, данные перемещаются по конвейеру ( потоку ) в буфер, а затем из буфера на диск (операция записи). Точно так же, когда данные перемещаются с диска в буфер и из буфера в консоль, это операция чтения.
Вы можете прочитать ссылки для лучшего понимания. Надеюсь, поможет!.
Что такое буфер в Java,
введите описание ссылки здесь