Ревью 5. Что такое потоки вводавывода Как это реализовано в Java 3 Классынадстройки потоков вводавывода 4
Скачать 110.73 Kb.
|
Что такое System.in, что такое System.out?Как вам должно быть уже известно, во все программы на Java автоматически импортируется пакет java. lang. В этом пакете определен класс System, инкапсулирующий некоторые элементы среды выполнения программ. Помимо прочего, в нем содержатся предопределенные переменные in, out и err, представляющие стандартные потоки ввода-вывода. Эти поля объявлены как public, final и static. А это означает, что ими можно пользоваться в любой другой части программы, не ссылаясь на конкретный объект типа System. Переменная System.out ссылается на поток стандартного вывода. По умолчанию этот поток связан с консолью. А переменная System, in ссылается на поток стандартного ввода (по умолчанию с клавиатуры). И наконец, переменная System.err ссылается на поток стандартных сообщений об ошибках, которые по умолчанию выводятся на консоль. По мере необходимости все эти потоки могут быть перенаправлены на другие совместимые устройства ввода-вывода. Поток System.in представляет собой объект типа InputStream, а потоки System.out и System.err — объекты типа PrintStream. Хотя эти потоки обычно используются для чтения и записи символов, они на самом деле являются байтовыми потоками. Дело в том, что эти потоки были определены в первоначальной спецификации Java, где символьные потоки вообще не были предусмотрены. Как станет ясно в дальнейшем, для этих потоков можно по необходимости создать оболочки, превратив их в символьные потоки. Что делает flush? Почему важно закрывать потоки?Методы, определенные в классе Writer abstract void flush() - Выводит текущее содержимое буфера на устройство. В результате выполнения данной операции буфер очищается/ Методы, определенные в классе OutputStream void flush() - Выводит содержимое выходного буфера вывода в целевой поток. По завершении этой операции выходной буфер очищается При закрытии файла освобождаются связанные с ним системные ресурсы, чтобы использовать их для работы с другим файлом. Если же файл не будет закрыт, могут произойти “утечки памяти” из-за того, что часть памяти остается выделенной для неиспользуемых ресурсов. Есть два способа закрытия файла. Первый традиционный заключается в использовании блока try..catch..finally. Поскольку при открытии или считывании файла может произойти ошибка ввода-вывода, то код считывания помещается в блок try. И чтобы быть уверенным, что поток в любом случае закроется, даже если при работе с ним возникнет ошибка, вызов метода close() помещается в блок finally. И, так как метод close() также в случае ошибки может генерировать исключение IOException, то его вызов также помещается во вложенный блок try..catch Начиная с Java 7 можно использовать еще один способ, который автоматически вызывает метод close. Этот способ заключается в использовании конструкции try-with-resources (try-с-ресурсами). Данная конструкция работает с объектами, которые реализуют интерфейс AutoCloseable. Так как все классы потоков реализуют интерфейс Closeable, который в свою очередь наследуется от AutoCloseable, то их также можно использовать в данной конструкции. Расскажи про классы Reader и Writer?Для определения символьных потоков служат две иерархические структуры классов, на вершине которых находятся абстрактные классы Reader и Writer соответственно. Класс Reader и его подклассы используются для чтения, а класс Writer и его подклассы — для записи данных. Конкретные классы, производные от классов Reader и Writer, оперируют символами в уникоде. Классы, производные от классов Reader и Writer, предназначены для выполнения различных операций ввода-вывода символов. Символьные классы присутствуют в Java параллельно с байтовыми классами. Чем отличаются и что общего у InputStream, OutputStream, Reader, Writer?InputStream и его наследники - совокупность для получения байтовых данных из различных источников; OutputStream и его наследники - набор классов, определяющих потоковый байтовый вывод; Reader и его наследники определяют потоковый ввод символов Unicode; Writer и его наследники определяют потоковый вывод символов Unicode. Какие подклассы класса Reader вы знаете, для чего они предназначены?Reader - абстрактный класс, описывающий символьный ввод; BufferedReader - буферизованный входной символьный поток; CharArrayReader - входной поток, который читает из символьного массива; FileReader - входной поток, читающий файл; FilterReader - абстрактный класс, предоставляющий интерфейс для классов-надстроек; InputStreamReader- входной поток, транслирующий байты в символы; LineNumberReader - входной поток, подсчитывающий строки; PipedReader - входной канал; PushbackReader - входной поток, позволяющий возвращать символы обратно в поток; StringReader - входной поток, читающий из строки. |