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

Имена классов байтовых потоков ввода и вывода заканчиваются на InputStream или OutputStream соответственно. Исключения из этого правила составляют PrintStream (не рекомендуется к использованию в настоящее время) и LogStream (deprecated без замены). Эти потоки служат для чтения и записи данных в бинарном формате.

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

Операции потоков связанные с чтением и записью являются блокирующими.

OutputStream предоставляет метод write для записи одного байта (принимает int, но записывает только младший байт), массива байт и части массива начиная с определенного места. Метод для записи одного байта по умолчанию является абстрактным, однако чаще всего перегружается и метод записывающий часть массива.

InputStream предоставляет метод для считывания байта (причем, метод возвращает int, равный -1, если поток закончился), считывания байт в массив и считывания байт в определенную позицию массива до определенной длины. Методы, считывающие данные в массив возвращают -1, если поток закончился или число прочитанных байтов, которое, в принципе может быть равно нулю, согласно документации. Тем не менее, обычно метод возвращает управление только в том случае, если поток получил какие-либо данные.

Метод skip позволяет проигнорировать часть байт потока, он возвращает число байт, которые реально были проигнорированы.

Метод available возвращает количество байт, которые могут быть прочитаны до того, как поток будет заблокирован.

Методы mark и reset позволяют отметить позицию во время чтения и потом вернуться в нее, если markSupported возвращает true. Метод reset может работать, если метод mark не работает в зависимости от потока. Как правило, имеется в виду, что состояние потока будет сброшено на начальное состояние.

FileInputStream и FileOutputStream позволяют читать из файлов и писать в файлы.

ByteArrayInputStream и ByteArrayOutputStream позволяю читать из массива байтов писать в массив байтов.

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

FilterInputStream и FilterOutputStream – фильтрующие потоки. Это означает, что во время чтения или записи они применяют к данным фильтр, который, в общем случае, может делать всё что угодно. Они не содержат никаких дополнительных методов, но реализованы таким образом, что используют какой-то другой поток в качестве параметра конструктора и перенаправляют операции ввода-вывода этому потоку.

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

CheckedInputStream и CheckedOutputStream – фильтрующие потоки, считающие контрольную сумму.

CipherInputStream и CipherOutputStream – потоки пакета javax.crypto, предоставляющие возможность шифровать данные при записи и дешифровать при чтении.

DataInputStream и DataOutputStream – фильтрующие потоки, позволяющие записывать и считывать любые примитивные типы и строки в формате UTF согласно реализуемым интерфейсам DataInput и DataOutput. Метод writeTo у DataOutputStream позволяет изменить источник записи во время работы потока. Методы readFully позволяют читать из потока, пока буфер не будет заполнен или не будет выброшен EOFException. Метод readLine являются deprecated, так как неправильно работает, начиная с версии 1.1.

SequenceInputStream позволяет объеденить несколько потоков ввода в один. Чтение будет производиться из первого потока до конца, затем будет прочита второй поток до конца, затем третий и так далее.

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

ProgressMonitorInputStream – поток, действие которого может быть остановлено пользователем с помощью диалога. Используется в связке с другими классами javax.swing.

Поток PrintStream используется для символьного ввода вывода и не рекомендуется к использованию за исключением потока System.out.

Потоки LineNumberInputStream, LogStream, StringBufferInputStream были созданы до того как символьные потоки стали достаточно популярны и на сегоднешний день являются deprecated. Они были оставлены для поддержки уже написанного кода с их помощью На сегодняшний день они могут работать неправильно.