Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к коллоквиуму.docx
Скачиваний:
2
Добавлен:
17.11.2018
Размер:
49.95 Кб
Скачать
  1. Символьные потоки.

Имена символьных потоков ввода и вывода заканчиваются на Reader и Writer соответственно.

Все потоки реализуют интерфейс Closeable (операция close закрывает поток, после чего, он не может использоваться для чтения и записи), а начиная с версии 7, AutoCloseable, что позволяет использовать потоки в try-with конструкциях. Это позволяет легко обойти ситуацию при которой метод close выбрасывает IOException и гарантирует, что поток будет закрыт автоматически.

Операции потоков связанные с чтением и записью являются блокирующими. В конструкторы символьных потоков может быть передан объект, с помощью которого будут синхронизироваться операции ввода/вывода.

Потоки вывода реализуют Flushable (операция flush выталкивает всю информацию из буфера и записывает её туда, куда надо) и Appendable (методы append работают точно также как и write). Потоки вывода предоставляют набор операций write для записи символа, строк, части строки, массива символов и части массива символов.

Потоки ввода реализуют Readable (операция read – чтение символов в CharBuffer). А также набор методов read для чтения одного символа, чтения в масив и в определенную позицию массива. Метод skip позволяет проигнорировать часть символов потока, он возвращает число символов, которые реально были проигнорированы. Метод ready возвращает true или false в зависимости от того, готов поток или нет, к тому, чтобы из него читали. Методы mark и reset позволяют отметить позицию во время чтения и потом вернуться в нее, если markSupported возвращает true. Метод reset может работать, если метод mark не работает в зависимости от потока. Как правило, имеется в виду, что состояние потока будет сброшено на начальное состояние.

OutputStreamWriter и InputStreamReader являются мостом между символьными и байтовыми потоками – символьными оболочками байтовых потоков. При необходимости «превратить» байтовый поток в символьный поток можно воспользоваться этими классами. При преобразовании можно указать используемую кодировку.

FileWriter и FileReader подклассы OutputStreamWriter и InputStreamReader. Позволяют записывать символы в файл и считывать символы из файла.

CharArrayWriter и CharArrayReader позволяют писать в массив символов и читать из массива символов. StringWriter и StringReader позволяют писать в StringBuffer и читать из строки.

PipedWriter и PipedReader - работают в комбинации: данные записанные в PipedWriter будут считываться из PipedReader. Поток считается сломанным, если нить в которой работал другой поток завершила работу. Использование потоков из оденой нити может привести к блокировке (deadlock).

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

FilterWriter и FilterReader – фильтрующие символьные потоки. Эти потоки перенаправляют запросы на чтение и запись потоку, переданному в конструктор. Классы являются абстрактными так как не выполняют никакой работы и существуют на случай, если потребуется реализовать фильтрующий символьный поток. В пакете JDK до версии 7 включительно таких потоков не было.

LineNumberReader – BufferedReader считающий количество строк.

PushbackReader - поток, имеющий pusback-буфер (по умолчанию равен 1 символ, но в конструктор может быть передано любое значение). Поток позволяет после прочтения выполнять операцию unread, кладущую данные назад, в поток (используется буфер).

PrintWriter – класс реализующий все методы PrintStream, за исключением тех, которые записывают в поток байты в сыром виде. Этот класс на сегодняшний день рекомендуется к использованию вместо PrintStream. Главной особенностью является возможность работать с «формат строками».