Байтові та символьні потоки введення
При створенні програм завжди виникає необхідність прочитати інформацію з будь-якого джерела та зберегти результат. Дії з читання/запису інформації є стандартним і простим видом діяльності. Найперші класи введення/виводу пов'язані з передачею та вилученням послідовності байтів.
Потоки введення послідовності байтів є підкласами абстрактного класуInputStream, потоки виведення - підкласами абстрактного класуOutputStream. Ці класи є суперкласами для введення масивів байтів, рядків, об'єктів, а також для вибору файлів і мережевих з'єднань. p align="justify"> При роботі з файлами використовуються підкласи цих класів відповідноFileInputStreamіFileOutputStream, конструктори яких відкривають потік і пов'язують його з відповідним фізичним файлом.
Потік введення зв'язується з одним із джерел даних, як яких можуть бути використані масив байтів, рядок, файл, «pipe»-канал, мережеві з'єднання та ін. Набір класів для взаємодії з перерахованими джерелами наведено на рис. 9.1.

Мал. 9.1.Ієрархія класів байтових потоків введення
Абстрактний класFilterInputStreamвикористовується як шаблон для налаштування класів введення, що успадковуються від класуInputStream. КласDataInputStreamнадає методи для читання з потоку даних значень базових типів, але з версії 1.2 клас був позначений як deprecated і не рекомендується до використання. КласBufferedInputStreamприєднує до потоку буфер для прискорення подальшого доступу.
Для виведення даних використовуються потоки таких класів.

Мал.9.2.Ієрархія класів байтових потоківвисновку
Абстрактний класFilterOutputStreamвикористовується як шаблон для налаштування похідних класів. КласBufferedOutputStreamприєднує буфер до потоку для прискорення виведення та зменшення доступу до зовнішніх пристроїв.
Починаючи з версії 1.2, пакетjava.ioзазнав значних змін. З'явилися нові класи, які виробляють швидкісну обробку потоків, хоча й повністю перекривають можливості класів попередньої версії.
Для обробки символьних потоків у форматі Unicode застосовується окрема ієрархія підкласів абстрактних класівReaderтаWriter, які майже повністю повторюють функціональність байтових потоків, але є актуальнішими при передачі текстової інформації. Наприклад, аналогом класуFileInputStreamє класFileReader. Такий широкий вибір потоків дозволяє вибрати найкращий спосіб запису у кожному конкретному випадку.
У прикладах наскільки можна використовуються способи ініціалізації для різних сімейств потоків вводу/вывода.
Мал.9.3.Ієрархія символьних потоків введення/виводу
/* приклад # 2: читання по одному байту (символу) з потоку введення :ReadDemo.java*/
public classReadDemo
public static voidmain(String[] args)