Потоки ввода/вывода
Четвертый метод skip (long n) "проматывает" поток с текущей позиции на п символов или байтов вперед. Эти элементы потока не вводятся методами read(). Метод возвращает реальное число пропущенных элементов, которое может отличаться от п, например поток может закончиться.
Текущий элемент потока можно пометить методом mark (int n), а затем вернуться к помеченному элементу методом reset (), но не более чем через п элементов. Не все подклассы реализуют эти методы, поэтому перед расстановкой пометок следует обратиться к логическому методу marksupported (), который возвращает true, если реализованы методы расстановки и возврата к пометкам.
Классы выходных потоков writer и outputstream определяют по три почти одинаковых метода вывода:
- write (char[] buf) – выводит массив в выходной поток, в классе Outputstream массив имеет тип byte[];
- write (char[] buf, int offset, int len) – выводит len элементов массива buf, начиная с элемента с индексом offset;
- write (int elem) в классе Writer - выводит 16, а в классе Outputstream 8 младших битов аргумента elem в выходной поток,
В классе writer есть еще два метода:
- write (string s) – выводит строку s в выходной поток;
- write (String s, int offset, int len) – выводит len символов строки s, начиная с символа с номером offset.
Многие подклассы классов writer и outputstream осуществляют буферизованный вывод. При этом элементы сначала накапливаются в буфере, в оперативной памяти, и выводятся в выходной поток только после того, как буфер заполнится. Это удобно для выравнивания скоростей вывода из программы и вывода потока, но часто надо вывести информацию в поток еще до заполнения буфера. Для этого предусмотрен метод flush (). Данный метод сразу же выводит все содержимое буфера в поток.
Наконец, по окончании работы с потоком его необходимо закрыть методом closed.
Классы, входящие в иерархии потоков ввода/вывода, показаны на рис. 18.1 и 18.2.
Рис. 18.1. Иерархия символьных потоков
Рис. 18.2. Классы байтовых потоков