Буфер:
Це область фізичної пам'яті, яка використовується для тимчасового зберігання даних під час їх переміщення з одного місця в інше. Це фізична пам’ять у більшості випадків буде оперативною пам’яттю (оперативною пам’яттю).
Але з контексту цього питання, Buffer використовується під час читання / запису даних. Його не потрібно використовувати під час переміщення даних з одного місця в інше.
Приклад для буфера: Якщо у вашій системі є 4 ГБ оперативної пам'яті, система може виділити для буфера 4 КБ пам’яті (RAM) . КБ - Кілобайт (и), ГБ - Гігабайт (и)
Потік вводу-виводу (або) Потік:
Потік вводу-виводу являє собою джерело вхідного сигналу або вихідний пункт призначення. Потік може представляти безліч різних видів джерел і пунктів призначення, включаючи файли дисків, пристрої, інші програми та масиви пам'яті.
Введення / виведення означає вхід / вихід.
Отже, Input Stream може бути джерелом вхідних даних, наприклад, файлом на диску, мережевим підключенням тощо.
І вихідний потік може бути вихідним призначенням, як файл диска, мережеве підключення тощо.
Згідно з офіційною документацією JAVA , потоки бувають 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
класи.