Java IO - luk6233/interview GitHub Wiki
Поток Stream - это абстрактное понятие источника или приёмника данных, которые способны обрабатывать информацию. Есть два типа потоков: байтовые и символьные.
Базовый класс InputStream - это абстрактный класс, определяющий входной поток данных, и является родителем для классов, получающих данные из различных источников : массив байтов, строки (String), файлы, каналы pipe, у которых одна из сторон является входом, а вторая сторона играет роль выхода, и т.д. Методы класса InputStream при возникновении ошибки вызывают исключение IOException.
Методы класса InputStream:
- int read() возвращает очередной доступный символ во входном потоке в виде целого
- int read(byte b[]) чтение b.length байтов из входного потока в массив b. Возвращает количество прочитанных из потока байтов
- int read(byte b[], int off, int len) чтение len байтов в массиве b, начиная со смещения off. Возвращает количество реально прочитанных байтов
- long skip(long n) пропуск во входном потоке n байтов. Возвращает количество пропущенных байтов
- int available() получение количество доступных для чтения байтов
- void close() закрытие источник ввода. Последующие попытки чтения из этого потока вызывают IOException
- void mark(int readlimit) установка метки в текущей позиции входного потока, которую можно будет использовать до тех пор, пока из потока не будет прочитано readlimit байтов
- void reset() перевод указателя потока на установленную ранее метку
- boolean markSupported() проверка поддержки потоком операции mark/reset
Класс OutputStream - это абстрактный класс, определяющий байтовый поток вывода. Наследники данного класса определяют куда направлять данные: в массив байтов, в файл или канал. Из массива байт можно создать текстовую строку String.
Методы класса OutputStream:
- void write(int b) записывает один байт в выходной поток. Аргумент этого метода имеет тип int, что позволяет вызывать write, передавая ему выражение, при этом не нужно выполнять приведение его типа к byte.
- void write(byte b[]) записывает в выходной поток весь указанный массив байтов.
- void write(byte b[], int off, int len) записывает в поток len байтов массива, начиная с элемента b[off].
- void flush() очищает любые выходные буферы, завершая операцию вывода.
- void close() закрывает выходной поток. Последующие попытки записи в этот поток будут возбуждать IOException.
Абстрактные классы Reader и Writer являются символьными потоками.
Абстрактный класс Reader
Класс Reader обеспечивает поддержку символьного потока чтения аналогично тому, как это делает InputStream, реализующий модель байтового потока ввода. Методы Reader схожи с теми, которые объявлены в составе InputStream.
Методы класса Reader
- abstract void close() throws IOException Закрытие ранее открытого потока чтения. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа IOException, но повторное закрытие потока эффектов не вызывает.
- void mark(int limit) Размещение метки в текущей позиции входного потока
- boolean markSupported() Функция проверки поддержки потоком методов mark() и reset()
- boolean ready() Функция проверки готовности объекта для чтения данных, т.е. в нем существует хотя бы один доступный символ. Следует заметить, что результат, равный false, отнюдь не свидетельствует о том, что очередной вызов read приведет к возникновению блокировки, поскольку в промежутке между обращениями к ready и read в поток может поступить очередная порция данных.
- void reset() Сброс указателя ввода в ранее установленную позицию метки.
- long skip(long count) Функция пропуска указанного в параметре count количества символов ввода. Возвращает количество действительно пропущенных символов. Значение count не должно быть отрицательным.
- int read() throws lOException Чтение одного символа данных в виде целого числа в диапазоне от 0 до 65535. Если символов, готовых для чтения, нет ввиду достижения конца потока, то возвращается значение -1. Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы, не достигнут конец потока либо не выброшено исключение.
- abstract int read(char[] buf, int offset, int count) throws lOException Чтение символов и сохранение их в массиве buf типа char. Максимальное количество читаемых символов определяется значением count. Символы записываются в массив, начиная с смещение offset. Содержимое всех остальных элементов массива buf остается неизменным. Метод возвращает количество фактически считанных символов. Если достигнут конец потока и не считан ни один символ, возвращается -1. Если значение count равно нулю, чтение не производится и возвращается 0. Метод выполняет блокировку до тех пор, пока имеются доступные для чтения символы не достигнут конец потока либо не выброшено исключение.
- int read(char[] buf) throws IOException Метод аналогичен предыдущему при условии, offset = 0, count = buf.length.
Абстрактный класс Writer обеспечивает поддержку символьного потока записи аналогично тому, как это делает OutputStream, реализующий модель байтового потока вывода. Многие методы Writer схожи с теми, которые объявлены в OutputStream; помимо этого, в классе Writer предусмотрены некоторые другие полезные версии метода write.
Методы класса Writer
Все методы класса вызывают исключение IOException при возникновении ошибки.
- append(char c) Добавление символа в конец вызывающего выходного потока.
- abstract void close() throws lOException Закрытие ранее открытого поток записи; при необходимости выполняется сброс потока. Метод используется для высвобождения ресурсов, связанных с потоком (таких как дескрипторы открытых файлов). Любые попытки обращения к закрытому потоку приводят к выбрасыванию исключения типа lOException, но повторное закрытие потока эффектов не вызывает.
- abstract void flush() Сброс потока. Если поток сохраняет в промежуточном буфере некоторое число символов, переданных методами write различных версий, flush провоцирует выполнение операции непосредственной записи данных в объект-получатель. Затем, если получателем является другой поток, тот в свою очередь также сбрасывается. Таким образом, единственный вызов flush приводит к сбросу всех буферов в цепочке взаимосвязанных потоков. Если поток не относится к категории буферизованных, никакие действия не выполняются.
- void write(int char) throws lOException Запись символа в выходной поток. Метод выполняет блокировку потока до тех пор, пока символ не будет записан.
- abstract void write(char[] buf, int offset, int count) throws lOException Запись count символов массива buf, начиная с элемента buf [offset]. Метод выполняет блокировку до тех пор, пока символы не будут записаны.
- void write(char[] buf) throws lOException Метод аналогичен предыдущему при условии offset = 0 и count = buf.length.
- void write(String string, int offset, int count) throws lOException Запись count символов строки string, начиная с символа string.charAt(offset).
- void write(String string) throws lOException Метод аналогичен предыдущему при условии offset = 0 и count = string.length()).