Урок 18

Классы символьных потоков

1. Класс Reader

Класс  Reader  - абстрактный класс, определяющий символьный потоковый ввод. В случае ошибок все методы класса передают исключение IOException.

Методы класса Reader:

Существует 3 основных read()-метода:

  • int read() - возвращает представление очередного доступного символа во входном потоке в виде целого числа.
  • int read(char[] buffer) - пытается прочесть максимум buffer.length символов из входного потока в массив buffer. Возвращает количество символов, в действительности прочитанных из потока.
  • int read(char[] buffer, int offset, int length) - пытается прочесть максимум length символов, расположив их в массиве buffer, начиная с элемента offset. Возвращает количество реально прочитанных символов.
  • close() – метод закрывает поток.

2. Класс Writer

Класс Writer - абстрактный класс, определяющий символьный потоковый вывод. В случае ошибок все методы класса передают исключение IOException.

Методы класса Writer:

Существуют 5 основных write()-метода:

  • void write(int c) – записывает один символ в поток.
  • void write(char[] buffer) – записывает массив символов в поток.
  • void write(char[] buffer, int offset, int length) – записывает в поток подмассив символов длиной length, начиная с позиции offset.
  • void write(String aString) – записывает строку в поток.
  • void write(String aString, int offset, int length) – записывает в поток подстроку символов длиной length, начиная с позиции offset.

3. Класс FileWriter

Класс FileWriter создаёт объект класса, производного от класса Writer, который вы можете применять для записи файла. Создание объекта не зависит от наличия файла, он будет создан в случае необходимости. Если файл существует и он доступен только для чтения, то передаётся исключение IOException.

4. Класс FileReader

Класс FileReader, производный от класса Reader, можно использовать для чтения содержимого файла. В конструкторе класса нужно указать либо путь к файлу, либо объект типа File.

Пример 1. Использование FileWriter и FileReader

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterReaderDemo {
    public static void main(String[] args) {
        char[] in = new char[50];
        int size = 0;
        File file = new File("fileWrite.txt");
        try (FileWriter fw = new FileWriter(file);
             FileReader fr = new FileReader(file);) {

            fw.write("Learn\nJava!\n");
            fw.flush();

            size = fr.read(in); // читаем !
            // how many bytes read
            System.out.println("Количество прочитанных символов: "
                    + size + " ");
            for (char c : in) {
                System.out.print(c);
            }
        } catch (IOException e) {
            System.out.print(e.getMessage());
        }
    }
}

5. Класс BufferedWriter

Класс BufferedWriter записывает текст в поток, предварительно буферизируя записываемые символы, тем самым снижая количество обращений к физическому носителю для записи данных.

По сравнению с классом FileWriter, BufferedWriter записывает относительно большие куски данных в файл, минимизируя количество обращений к файлу. Другими словами операции проходят быстрее.

Добавляет метод void newLine().

Конструкторы класса BufferedWriter:

BufferedWriter(Writer out);
BufferedWriter(Writer out, int sz);

В качестве параметра он принимает поток вывода, в который надо осуществить запись. Второй параметр указывает на размер буфера.

Пример 2. Использование класса BufferedWriter

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterDemo {
    public static void main(String[] args) {
        try (BufferedWriter bufferedWriter = new BufferedWriter(
                new FileWriter("src\\io\\buffWriter.txt"))) {
            String text = "Привет мир!";
            bufferedWriter.write(text);
            bufferedWriter.newLine();
            bufferedWriter.write(text);
            bufferedWriter.flush();
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

6. Класс BufferedReader

Класс BufferedReader считывает текст из символьного потока ввода, буферизируя прочитанные символы. Использование буфера призвано увеличить производительность чтения данных из потока.

Добавляет метод String readLine().

Конструкторы класса BufferedReader:

BufferedReader(Reader in);
BufferedReader(Reader in, int sz);

Второй конструктор, кроме потока ввода, из которого производится чтение, также определяет размер буфера, в который будут считываться символы.

Пример 3. Использование класса BufferedReader

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(
                new FileReader("src\\io\\file.txt"))) {
            //чтение построчно
            String s;
            while ((s = br.readLine()) != null) {
                System.out.println(s);
            }
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

7. Класс PrintWriter

Класс PrintWriter расширяет класс Writer. Содержит методы для форматирования.

Конструкторы класса PrintWriter:

  • PrintWriter(File file) - автоматически добавляет информацию в указанный файл.
  • PrintWriter(String fileName) - автоматически добавляет информацию в файл по указанному имени.
  • PrintWriter(OutputStream out) - для вывода информации используется существующий объект OutputStream, автоматически сбрасывая в него данные.
  • PrintWriter(Writer out) - для вывода информации используется существующий объект Writer, в который автоматически идет запись данных.

Методы класса PrintWriter:

  • println() - вывод строковой информации с переводом строки.
  • print() - вывод строковой информации без перевода строки.
  • printf() - форматированный вывод.
  • format() - форматированный вывод.

Пример 4. Использование класса PrintWriter

import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriterDemo {
    public static void main(String[] args) {
        String s1 = "Привет мир!";
        String s2 = "Hello World!";
        try (PrintWriter printWriter = new PrintWriter("notes.txt")) {
            printWriter.println(s1);
            int i = 2;
            printWriter.printf("Квадрат числа %d равен %d %n", i, i * i);
            printWriter.write(s2);
            printWriter.print("Конец");
            System.out.println("Запись в файл произведена");
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

8. Классы символьных потоков

Класс

Назначение

BufferedReader

Буферизованный входной символьный поток.

BufferedWriter

Буферизованный выходной символьный поток. 

CharArrayReader

Входной поток, который читает из символьного массива. 

CharArrayWriter

Выходной поток, который пишет в символьный массив. 

FileReader

Входной поток, читающий файл. 

FileWriter

Выходной поток, пишущий в файл. 

FilterReader

Фильтрующий читатель. 

FilterWriter

Фильтрующий писатель. 

InputStreamReader

Входной поток, транслирующий байты в символы. 

LineNumberReader

Входной поток, подсчитывающий строки. 

OutputStreamWriter

Выходной поток, транслирующий байты в символы.

PipedReader

Входной канал.

PipedWriter

Выходной канал.

PrintWriter

Выходной поток, включающий print() и println().

PushbackReader

Входной поток, позволяющий возвращать символы обратно в поток.

Reader

Абстрактный класс, описывающий символьный ввод.

StringReader

Входной поток, читающий из строки.

StringWriter

Выходной поток, пишущий в строку.

Writer

Абстрактный класс, описывающий символьный вывод.




0 comments
Leave your comment: