Java. Работа с консолью в Java. Классы InputStreamReader, PrintStream

Работа с консолью в Java. Классы InputStreamReader, PrintStream. Создание потока ввода/вывода связанного с консолью. Перенаправление потоков ввода/вывода в файл, из файла, из строки. Примеры


Содержание


Поиск на других ресурсах:




1. Создание потока ввода, связанного с консолью. Класс InputStreamReader

Поток ввода данных из консоли можно организовать одним из двух способов:

  • с помощью потока ввода байтов;
  • с помощью потока ввода символов. В этом случае данные, которые вводятся из консоли, считываются из стандартного потока ввода, которому соответствует переменная System.in из пакета java.lang. Иными словами, переменная System.in ссылается на стандартный поток ввода, которым, по умолчанию, считается клавиатура.

В языке Java для реализации операций ввода из консоли используется класс InputStreamReader. Этот класс есть подклассом абстрактного базового класса Reader и предназначен для конвертирования байт в символы.

Чтобы получить объект типа InputStreamReader нужно создать экземпляр этого типа по следующей общей форме

InputStreamReader objStream = new InputStreamReader(input_stream);

здесь

  • objStream – экземпляр, который связан с потоком ввода символов;
  • inputStream – поток ввода символов. В случае с консолью, этим потоком выступает переменная System.in.

Значит, для потока System.in, чтобы создать экземпляр (объект) типа InputStreamReader, нужно вызвать следующий конструктор

InputStreamReader objStream = new InputStreamReader(System.in);

 

2. Создание потока вывода, связанного с консолью. Класс PrintStream. Методы print(), println(). Пример

В пакете java.lang реализованы две переменные, которые связаны с потоком записи данных на консоль:

  • System.out. Эта переменная соответствует потоку вывода на консоль;
  • System.err. Эта переменная связана с потоком вывода ошибок.

Для работы с выводом на консоль разработан специальный класс PrintStream, который есть производным от класса OutputStream. В этом классе основными являются методы print() и println().

Чтобы создать поток вывода, связанный с консолью, нужно объявить экземпляр класса PrintStream. При создании экземпляра нужно связать его с соответствующим потоком как показано в следующем примере

import java.io.*;

...

public static void main(String[] args) throws IOException
{
  // Создание потока вывода. Класс PrintStream.
  // 1. Связать ссылку outStream с потоком вывода System.out
  PrintStream outStream = new PrintStream(System.out);

  // 2. Связать ссылку errStream с потоком вывода System.err
  PrintStream errStream = new PrintStream(System.err);

  // 3. Использовать обе ссылки
  outStream.println("Hello world!"); // Метод println()
  errStream.print("Some error..."); // Метод print()
}

...

Результат выполнения программы

Hello world!
Some error...

 

3. Класс InputStreamReader. Чтение символов из консоли с помощью метода read(). Примеры

Как известно, с консолью связана стандартная переменная System.in. Чтобы прочитать символы из консоли без буферизации можно использовать возможности класса InputStreamReader. Класс InputStreamReader есть подклассом абстрактного класса Reader. Класс InputStreamReader предназначен для конвертирования байт в символы.

Основным методом класса InputStreamReader есть метод read(), который имеет две перегруженные реализации. Первая реализация имеет следующую общую форму

int read();

В этом случае метод возвращает код введенного символа из консоли.

Общая форма второй реализации метода следующая

int read(char[] ac, int index, int count);

Здесь метод заполняет массив ac типа char[] введенными значениями символов из консоли. Параметр count задает количество символов, которые нужно вставить в массив ac. Для массива ac предварительно может быть выделена память. Второй вариант метода возвращает количество символов, которые могут быть прочитаны.

Пример 1. Чтобы прочитать отдельный символ из потока ввода (консоли) используется метод read(). Ниже приведена функция ReadConsolle(), которая демонстрирует чтение символов из консоли без буферизации. Символы считываются до тех пор, пока не будет введен символ ‘ . ‘.

import java.io.*;

...

// Пример чтения символов из консоли System.in
// без использования буферизации.
public void ReadConsolle() throws IOException
{
  char c;

  // Создать экземпляр потока, который связан с консолью
  InputStreamReader sr = new InputStreamReader(System.in);

  System.out.println("Введите символы, '.' - для выхода.");

  // цикл чтения символов
  do {
    c = (char)sr.read();
    System.out.println(c);
  } while (c != '.');
}

Пример 2. Использование метода read(), который обрабатывает массив типа char[].

import java.io.*;

...

// Использование варианта метода read(), заполняющего массив
// символов типа char[] символами, введенными из консоли.
// Общая форма метода:
// int read(char[], int, int)
public void ReadConsolle2() throws IOException
{
  // 1. Объявить внутренние переменные
  char arrChar[] = new char[10]; // массив типа char[] - буфер памяти
  InputStreamReader sr = new InputStreamReader(System.in); // поток ввода, который ассоциируется с консолью
  int count; // Количество прочитанных символов

  // Прочитать 4 символа из консоли.
  // Записать эти символы в массив arrChar начиная с позиции 0.
  System.out.println("Enter characters (maximum 10):");
  count = sr.read(arrChar, 0, 4);

  // Вывести результат
  System.out.println("You can process " + count + " characters");

  System.out.println("The arrChar after input:");

  for (int i=0; i<arrChar.length; i++)
    System.out.println("arrC[" + i + "] = " + arrChar[i]);
}

Результат выполнения программы

Enter characters (maximum 10):
sds
You can process 4 characters
The arrChar after input:
arrC[0] = s
arrC[1] = d
arrC[2] = s
arrC[3] =
arrC[4] =

 

4. Чтение символов из консоли с буферизацией. Классы InputStreamReader, BufferedStreamReader. Пример

Чтобы реализовать буферизацию при чтении символов из консоли, нужно экземпляр класса InputStreamReader поместить в оболочку объекта класса BufferedReader. В этом случае, общая форма конструктора класса BufferedReader следующая

BufferedReader(Reader поток_чтения_введенных_данных)

здесь

  • поток_чтения_введенных_данных – некоторый поток данных (файл, консоль и т.п.). В случае консоли здесь задается экземпляр класса InputStreamReader (смотрите предыдущий пункт).

Такой подход реализует паттерн Декоратор (Decorator). В паттерне Декоратор экземпляр одного класса служит оболочкой для экземпляра другого класса. Таким образом происходит наслаивание объектов.

Ниже приведен пример функции ReadConsoleBuf(), которая реализует чтение символов из консоли с буферизацией.

import java.io.*;

...

// Чтение символов из консоли с поддержкой буферизации
public void ReadConsolleBuf() throws IOException {
  char c;

  // Создать экземпляр потока, который связан с консолью
  InputStreamReader sr = new InputStreamReader(System.in);

  // Объявить экземпляр класса BufferedReader, поместить в него
  // экземпляр потока InputStreamReader
  BufferedReader br = new BufferedReader(sr);

  System.out.println("Введите символы, '.' - для выхода.");

  // цикл чтения символов
  do {
    c = (char)br.read();
    System.out.println(c);
  } while (c != '.');
}

 

5. Запись данных, выводимых на консоль. Вывод массива вещественных чисел в консоль. Класс PrintStream. Пример

Пример есть демонстрационным. Вывод происходит в экземпляр класса PrintStream, который связан с консолью (переменной System.out).

import java.io.*;

...

public static void main(String[] args) throws IOException
{
  // Вывод массива вещественных чисел в консоль
  // 1. Создать входные данные - массив вещественных чисел. Заполнить массив значениями
  double AD[] = new double[5];
  for (int i=0; i<AD.length; i++)
    AD[i] = i*2.5 + 1;

  // 2. Создать экземпляр класса PrintStream
  PrintStream ps = new PrintStream(System.out);

  // 3. Вывести массив через метод println()
  ps.println("Array AD:");

  for (int i=0; i<AD.length; i++)
    ps.println(AD[i]);
}

...

 

6. Чтение строк из консоли с поддержкой буферизации и вывод их на экран. Классы InputStreamReader, BufferedStreamReader. Метод readLine(). Пример

Читать строки из консоли можно используя буферизацию или без нее. Если используется механизм буферизации, то класс InputStreamReader помещается в конструктор класса BufferedReader.

Чтение одной строки осуществляется с помощью функции readLine().

import java.io.*;

...

public static void main(String[] args) throws IOException
{
  // Считать строки из консоли с поддержкой буферизации. Вывести строки на экран
  // Использовать метод readLine()
  InputStreamReader sr = new InputStreamReader(System.in); // создать экземпляр InputStreamReader
  BufferedReader br = new BufferedReader(sr); // экземпляр класса буферизации
  String s;

  System.out.println("Enter strings:");

  do {
    s = br.readLine(); // считать одну строку
    System.out.println(s); // вывести эту строку на экран
  } while (!s.equals("end")); // пока не будет введена строка "end"
}

...

Результат выполнения программы:

Enter strings:
abc
abc
def
def
0 1 2
0 1 2
end
end

 

7. Чтение строк из консоли и запись их в файл. Классы InputStreamReader, BufferedReader, FileInputStream, PrintStream. Пример

В примере продемонстрировано перенаправление ввода с консоли в текстовый файл.

import java.io.*;

...

public static void main(String[] args) throws IOException
{
  // Считать строки из консоли и записать их в файл.
  // Использовать метод readLine()
  // 1. Объявление экземпляров классов, которые получают данные (строки)
  InputStreamReader sr = new InputStreamReader(System.in); // создать экземпляр InputStreamReader
  BufferedReader br = new BufferedReader(sr); // класс буферизации

  // 2. Объявление экземпляров классов, выводящих строки
  FileOutputStream fos = new FileOutputStream("strings.txt");
  PrintStream ps = new PrintStream(fos);

  // 3. Дополнительная переменная
  String s;

  // 4. Цикл ввода строк из консоли и запись их в файл
  System.out.println("Enter strings:");

  do {
    s = br.readLine(); // считать одну строку
    System.out.println(s); // вывести эту строку на экран
    ps.println(s); // записать эту строку в поток ps => записать в файл "strings.txt"
  } while (!s.equals("end")); // пока не будет введена строка "end"

  ps.close();
}

Результат выполнения программы:

Enter strings:
abc
abc
def
def
0 1 2 3
0 1 2 3
end
end

Содержимое файла «strings.txt»

abc
def
0 1 2 3
end

 

8. Чтение строк из символьного файла и вывод их на консоль. Класс FileReader. Пример

Пусть задан символьный (текстовый) файл, который нужно вывести на консоль. Чтение строк из файла можно реализовать с помощью метода read() класса FileReader. Строка из файла читается в заведомо выделенный участок памяти – буфер.

Чтобы определить конец файла нужно использовать метод ready() класса FileReader. Если конец файла, то метод возвращает false.

import java.io.*;

...

public static void main(String[] args) throws IOException
{
  // Прочитать строки из файла и вывести их на консоль
  FileReader fr = new FileReader("strings.txt");
  char buffer[] = new char[1000]; // буфер для чтения строк

  // Цикл чтения строк из файла
  do {
    fr.read(buffer); // Прочитать строку в буфер buffer
    System.out.println(buffer); // Вывести строку на консоль
  } while (fr.ready()); // проверка, не конец ли файла

  fr.close();
}

...

 

9. Классы PrintStream, FileOutputStream. Перенаправление потока вывода из строки String в файл. Пример

Пусть задана некоторая строка типа String. Нужно записать эту строку в файл путем использования перенаправления потока вывода в файл.

Чтобы реализовать запись строки в файл нужно выполнить следующие действия:

  • создать экземпляр класса FileOutputStream с именем файла, в который будет осуществляться запись строки;
  • создать экземпляр класса PrintStream, в конструктор которого поместить созданный экземпляр класса FileOutputStream;
  • использовать один из методов print() или println() для записи строки в файл.

Фрагмент программного кода, осуществляющего перенаправление потока вывода из строки в файл, следующий

import java.io.*;

...

public static void main(String[] args) throws IOException
{
  // Направить вывод из строки String в файл с именем "output.txt"
  // 1. Входные данные
  String s = "www.bestprog.net"; // строка, которая записывается в файл
  String filename = "output.txt"; // имя файла, в который записывается строка

  // 2. Создать экземпляр класса FileOutputStream
  FileOutputStream fs = new FileOutputStream(filename);

  // 3. Создать экземпляр класса PrintStream, в который поместить экземпляр FileOutputStream
  PrintStream ps = new PrintStream(fs);

  // 4. Записать строку "www.bestprog.net" в файл "output.txt"
  ps.println(s);

  // 5. Закрыть файл
  ps.close();
}

...

По данному примеру можно реализовать функцию, которая записывает массив строк в файл.

 


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