Программирование
Тема 6.2 Работа с файлами в Java
1
Классы байтовых потоков
-
Фрагмент иерархии классов байтовых потоков
2
Классы байтовых потоков
-
В Java так же как и в С++ для описания работы по вводу/выводу используется специальное понятие поток данных (stream). Поток данных связан с некоторым источником, или приемником, данных, способным получать или предоставлять информацию. Соответственно, потоки делятся на входящие – читающие данные и выходящие – передающие (записывающие) данные. Введение концепции stream позволяет отделить основную логику программы, обменивающейся информацией с любыми устройствами одинаковым образом, от низкоуровневых операций с такими устройствами ввода/вывода.
-
В Java потоки естественным образом представляются объектами. Описывающие их классы как раз и составляют основную часть пакета java.io. Все классы разделены на две части – одни осуществляют ввод данных, другие – вывод.
-
На рисунке слайда представлен фрагмент иерархии классов байтовых потоков. Классы байтовых потоков используются для работы с бинарными файлами.
-
Классы входных байтовых потоков наследуются от InputStream, а выходных – от OutputStream. Базовые, наиболее универсальные, классы позволяют считывать и записывать информацию в виде набора байт. Чтобы их было удобно применять в различных задачах, java.io содержит также классы, преобразующие любые данные в набор байт.
-
Например, если нужно сохранить результаты вычислений – набор значений типа double – в файл, то их можно сначала превратить в набор байт, а затем эти байты записать в файл. Аналогичные действия совершаются и в ситуации, когда требуется сохранить объект (т.е. его состояние) – преобразование в набор байт и последующая их запись в файл. Понятно, что при восстановлении данных в обоих рассмотренных случаях проделываются обратные действия – сначала считывается последовательность байт, а затем она преобразуется в нужный формат.
3
Классы InputStream и OutputStream
-
Методы класса InputStream:
-
int read()
-
int read(byte[] buf)
-
int read(byte[] buf, int offset, int len)
-
available()
-
close()
-
Методы класса OutputStream:
-
void write(int)
-
void write(byte[] buf)
-
void write(byte[] buf, int offset, int len)
-
flush()
-
close()
4
Классы InputStream и OutputStream
-
InputStream – это базовый класс для байтовых потоков ввода. Методы этого класса необходимы всем классам, которые наследуются от InputStream.
-
Метод read() является абстрактным и, поэтому определяется в классах-наследниках. Этот метод предназначен для считывания ровно одного байта из потока, однако возвращает при этом значение типа int.. Если достигнут конец потока, то есть в нем больше нет информации для чтения, то возвращаемое значение равно -1. Если же считать из потока данные не удается из-за каких-то ошибок, или сбоев, будет брошено исключение java.io.IOException. Этот класс наследуется от Exception, т.е. его всегда необходимо обрабатывать явно.
-
На практике обычно приходится считывать не один, а сразу несколько байт – то есть массив байт. Для этого используется метод read(), где в качестве параметров передается массив byte[]. Возможна ситуация, когда в потоке байт содержится меньше, чем длина массива. Поэтому метод возвращает значение int, указывающее, сколько байт было реально считано. Понятно, что это значение может быть от 0 до величины длины переданного массива.
-
Если же мы изначально хотим заполнить не весь массив, а только его часть, то для этих целей используется метод read(), которому, кроме массива byte[], передаются еще два int значения. Первое – это позиция в массиве, с которой следует начать заполнение, второе – количество байт, которое нужно считать.
-
Метод available( ) возвращает значение типа int, которое показывает