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.

 


Связанные темы