Java. Система вводу/виводу Java. Потік. Байтові потоки. Символьні потоки. Стандартні потоки

Система вводу/виводу Java. Потік. Байтові потоки. Символьні потоки. Стандартні потоки


Зміст


Пошук на інших ресурсах:




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.

 


Зв’язані теми