Система вводу/виводу 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.
⇑
Зв’язані теми
- Система вводу/виводу Java. Потік. Байтові потоки. Символьні потоки. Стандартні потоки
- Робота з консоллю в Java. Класи InputStreamReader, PrintStream. Створення потоку вводу/виводу зв’язаного з консоллю. Перенаправлення потоків вводу виводу
⇑