Система ввода/вывода Java. Потоки. Байтовые потоки. Символьные потоки. Стандартные потоки
Содержание
- 1. Общие понятия системы ввода/вывода Java. Поток. Определение потока
- 2. Виды потоков в Java
- 3. Байтовые потоки ввода/вывода. Обзор классов байтовых потоков. Классы InputStream, OutputStream
- 4. Символьные потоки ввода/вывода. Обзор классов символьных потоков
- 5. Стандартные потоки ввода/вывода из пакета java.lang
- 6. Стандартный поток ввода. Переменная System.in. Особенности использования. Пример
- 7. Стандартный поток вывода. Переменная System.out. Особенности использования. Пример
- 8. Стандартный поток вывода. Переменная System.err. Особенности использования. Пример
- Зв’язані теми
Поиск на других ресурсах:
1. Общие понятия системы ввода/вывода Java. Поток. Определение потока
В языке программирования Java ввод/вывод информации базируется на понятии потока. Поток – это абстрактное понятие, которое символизирует источник или приемник данных, который может передавать или получать некоторую информацию. Любой поток скрывает операции над данными, которые выполняются на низших уровнях непосредственно в устройствах ввода/вывода.
Соответственно назначению потоков, классифицируются и классы в языке Java. Одни классы реализуют операции ввода, другие реализуют операции вывода. Чтобы использовать классы потоков ввода/вывода нужно импортировать пакет java.io
import java.io.*;
Объекты классов Java, которые используются для ввода/вывода, для обеспечения необходимой функциональности наслаиваются друг на друга. Такая модель взаимодействия объектов поддерживается в паттерне «Декоратор». В этом паттерне при создании потока нужно использовать несколько объектов.
⇑
2. Виды потоков в Java
В языке Java различают два вида потоков:
- байтовые потоки. Это аналог потоков двоичных данных, позволяющих компактно сохранять информацию;
- символьные потоки. Это потоки, которые представлены удобным способом (для людей) кодирования информации в виде понятных текстовых символов. Во многих языках программирования символьные потоки ассоциируются с текстовым форматом представления информации.
⇑
3. Байтовые потоки ввода/вывода. Обзор классов байтовых потоков. Классы InputStream, OutputStream
Байтовые потоки ввода/вывода реализованы на самом низком уровне (в отличие от символьных). В языке Java существует ряд классов, которые обеспечивают работу байтовых потоков ввода/вывода. Все классы байтовых потоков разделены на две иерархии. В вершине одной иерархии (соответствует вводу) размещается класс InputStream. В вершине второй иерархии (соответствует выводу) размещается класс OutputStream.
Классы, которые реализуют байтовые потоки ввода унаследованы от абстрактного класса InputStream:
- InputStream – абстрактный класс, который описывает поток ввода. Данный класс есть базовым для всех других классов системы ввода;
- BufferedInputStream – класс, который описывает буферизованные поток ввода;
- ByteArrayInputStream – класс, который описывает поток ввода, читающий байты из массива;
- DataInputStream –класс, который реализует методы для чтения данных стандартных типов, определенных в Java (int, double, float и т.д.);
- FileInputStream – класс, который реализует поток ввода, который читает данные из файла;
- FilterInputStream – это реализация абстрактного класса InputStream;
- ObjectInputStream – класс, реализующий поток ввода объектов;
- PipedInputStream – класс, соответствующий каналу ввода;
- PushbackInputStream – класс, соответствующий потоку ввода, который поддерживает возврат одного байта обратно в поток ввода;
- SequenceInputStream – класс, который реализует поток ввода, состоящий из двух или более потоков ввода, данные из которых читаются поочередно.
Классы, которые реализуют байтовые потоки вывода унаследованы от абстрактного класса OutputStream:
- OutputStream – абстрактный класс, который описывает поток вывода. Все другие классы системы вывода есть подклассами класса OutputStream;
- BufferedOutputStream – класс, который имплементирует буферизованный поток вывода;
- ByteArrayOutputStream – класс, который реализует поток вывода, записывающий байты в массив;
- DataOutputStream – класс, который реализует поток вывода, содержащий методы для чтения данных стандартных типов, определенных в Java (int, float, double и т.п.);
- FileOutputStream – класс, который соответствует потоку вывода записывающему данные в файл;
- FilterOutputStream – класс, реализующий абстрактный класс OutputStream;
- ObjectOutputStream – класс, соответствующий потоку вывода объектов;
- PipedOutputStream – класс, который ассоциируется с каналом вывода;
- PrintStream – класс, который представляет собой поток вывода, содержащий методы print() и println().
⇑
4. Символьные потоки ввода/вывода. Обзор классов символьных потоков
Классы, которые предназначены для описания символьных потоков делятся на два вида:
- классы потоков ввода. Эти классы унаследованы от абстрактного класса Reader;
- классы потоков вывода, которые унаследованы от абстрактного класса Writer.
Классы потоков ввода следующие:
- Reader – абстрактный класс, описывающий поток ввода символов. Этот класс есть суперклассом для всех нижеследующих подклассов;
- BufferedReader – класс, который описывает буферизованный поток ввода символов;
- CharArrayReader – класс, который реализует поток ввода, читающий символы из массива;
- FileReader – класс, который описывает поток ввода связанный с символьным файлом;
- FilterReader – класс, представляющий фильтрованный поток чтения;
- InputStreamReader – класс, который представляет собой поток ввода, превращающий байты в символы;
- LineNumberReader – класс, соответствующий потоку ввода, который подсчитывает строки;
- PipedReader – класс, который ассоциируется с каналом ввода;
- PushbackReader – класс, соответствующий потоку ввода, который позволяет возвращать символы обратно в поток ввода;
- StringReader – класс, который реализует поток ввода, читающий символы из строки.
Классы потоков вывода следующие:
- Writer – абстрактный класс, описывающий поток вывода символов. Все нижеследующие классы являются подклассами класса Writer;
- BufferedWriter – класс, который описывает буферизованный поток вывода символов;
- CharArrayWriter – класс, который соответствует потоку вывода, записывающему символы в массив;
- FileWriter – класс, который соответствует потоку вывода, записывающему символы в файл;
- FilterWriter – класс, реализующий фильтрованный поток записи;
- OutputStreamWriter – класс, реализующий средства преобразования символов в байты;
- PipedWriter – класс, который ассоциируется с каналом вывода;
- StringWriter – класс, который реализует поток вывода, записывающий символы в строку.
⇑
5. Стандартные потоки ввода/вывода из пакета java.lang
Как известно, пакет java.lang содержит много средств для организации работы. Этот пакет импортируется автоматически (не обязательно использовать директиву import). Базовым классом, определенным в этом пакете, есть класс System. Класс System имплементирует три переменные, которые связаны со стандартными (заведомо определенными) потоками ввода-вывода:
- переменная System.in – это ссылка на стандартный поток ввода, которому соответствует клавиатура;
- переменная System.out – ссылка на стандартный поток вывода, которому соответствует консоль;
- переменная System.err – ссылка на стандартный поток вывода ошибок. Этому потоку соответствует консоль.
⇑
6. Стандартный поток ввода. Переменная System.in. Особенности использования. Пример
В языке Java стандартный поток ввода представлен переменной System.in. Эта переменная (объект) имеет тип InputStrem. Класс InputStream есть абстрактным и размещается в вершине иерархии классов ввода (смотрите пункт 3).
Пример, в котором используется переменная System.in. В примере сначала предлагается ввести символ со стандартного потока ввода (клавиатуры), затем этот символ выводится на экран.
import java.io.*; ... public static void main(String[] args) throws IOException { // Демонстрация использования переменной System.in InputStream is = System.in; // получить ссылку на System.in // Получить код из консоли System.out.println("Enter code:"); int code = is.read(); // использовать метод read() для чтения из консоли // Вывести код введеного символа System.out.println("You are entered character with code: " + code); } ...
Результат выполнения программы
Enter code: A You are entered character with code: 65
⇑
7. Стандартный поток вывода. Переменная System.out. Особенности использования. Пример
Стандартный поток вывода ассоциируется с переменной (объектом) System.out, тип которой PrintStream. Класс PrintStream содержит методы вывода на консоль print() и println().
Пример. В примере демонстрируется перенаправление из потока System.in на поток System.out.
import java.io.*; ... public static void main(String[] args) throws IOException { // Демонстрация использования переменных System.out и System.in InputStream input = System.in; // получить ссылку на System.in PrintStream output = System.out; // получить ссылку на System.out // Цикл ввода из System.in и отображение введеного символа в System.out. // Конец ввода - символ '.' int endCode = (int)'.'; int Code; // Вывести информационное сообщение output.print("Please, enter characters: "); do { // Получить символ с клавиатуры Code = input.read(); // Отобразить (продублировать) символ на экране output.write(Code); // используется метод write() } while (Code!=endCode); // цикл выполняется, пока не будет введена '.' } ...
Результат выполнения программы
Please, enter characters: a a b b 0 0 Z Z .
⇑
8. Стандартный поток вывода. Переменная System.err. Особенности использования. Пример
Переменная System.err имеет тип PrintStream и ассоциируется со стандартным потоком вывода ошибок, которым, по умолчанию есть консоль. В общем работа с System.err не отличается от работы с System.out.
Пример. Демонстрируется использование переменной (объекта) System.err.
import java.io.*; ... public static void main(String[] args) throws IOException { // Демонстрация использования переменной System.err // Решение квадратного уравнения. double a, b, c, D, x1, x2; PrintStream error = System.err; // Если будут ошибки, то сюда будут выводится сообщения Scanner input = new Scanner(System.in); System.out.println("Please, enter a, b, c: "); System.out.print("a = "); a = input.nextDouble(); System.out.print("b = "); b = input.nextDouble(); System.out.print("c = "); c = input.nextDouble(); // Вычислить дискриминант D = b*b - 4*a*c; // Если дискриминант отрицательный if (D<0) { // Использовать консоль ошибок System.err error.println("The equation has no solution."); // вывести на консоль ошибок } else { x1 = (-b - Math.sqrt(D)) / (2*a); x2 = (-b + Math.sqrt(D)) / (2*a); System.out.println("x1 = " + x1); System.out.println("x2 = " + x2); } } ...
Результат выполнения программы
Please, enter a, b, c: a = 5 b = 5 c = 5 The equation has no solution.
⇑
Связанные темы
- 14.1. Система ввода/вывода. Байтовые потоки. Символьные потоки. Стандартные потоки
- 14.2. Работа с консолью в Java. Классы InputStreamReader, PrintStream. Создание потока ввода/вывода связанного с консолью. Перенаправление потоков ввода/вывода
⇑