Чтение онлайн

на главную - закладки

Жанры

Программирование на Java
Шрифт:

Пример:

FileInputStream inFile1 = null;

FileInputStream inFile2 = null;

SequenceInputStream sequenceStream = null;

FileOutputStream outFile = null; try {

inFile1 = new FileInputStream("file1.txt");

inFile2 = new FileInputStream("file2.txt");

sequenceStream = new SequenceInputStream(inFile1, inFile2);

outFile = new FileOutputStream("file3.txt");

int readedByte = sequenceStream.read;

while(readedByte!=-1) {

outFile.write(readedByte);

readedByte = sequenceStream.read;

}

}

catch (IOException e) {

System.out.println("IOException: " + e.toString);

}

finally {

try {

sequenceStream.close;

}

catch(IOException e) {

};

try {

outFile.close;

}

catch(IOException e) {};

}

Пример 15.5.

В результате выполнения этого примера в файл file3.txt будет записано содержимое файлов file1.txt и file2.txt – сначала полностью file1.txt, потом file2.txt. Закрытие потоков производится в блоке finally. Поскольку при вызове метода close может возникнуть IOException, необходим try-catch блок. Причем, каждый вызов метода close взят в отдельный try-catch блок - для того, чтобы возникшее исключение при закрытии одного потока не помешало закрытию другого. При этом нет необходимости закрывать потоки inFile1 и inFile2 – они будут автоматически закрыты при использовании в sequenceStream - либо когда в них закончатся данные, либо при вызове у sequenceStream метода close.

Объект SequenceInputStream можно было создать и другим способом: сначала получить объект Enumeration, содержащий все потоки, и передать его в конструктор SequenceInputStream:

Vector vector = new Vector;

vector.add(new StringBufferInputStream("Begin file1\n"));

vector.add(new FileInputStream("file1.txt"));

vector.add(new StringBufferInputStream("\nEnd of file1, begin file2\n"));

vector.add(new FileInputStream("file2.txt"));

vector.add(new StringBufferInputStream("\nEnd of file2"));

Enumeration en = vector.elements;

sequenceStream = new SequenceInputStream(en);

Пример 15.6.

Если заменить в предыдущем примере инициализацию sequenceStream на приведенную здесь, то в файл file3.txt, кроме содержимого файлов file1.txt и file2.txt, будут записаны еще три строки – одна в начале файла, одна между содержимым файлов file1.txt и file2.txt и еще одна в конце file3.txt.

Классы FilterInputStream и FilterOutputStream и их наследники

Задачи, возникающие при вводе/выводе весьма разнообразны - это может быть считывание байтов из файлов, объектов из файлов, объектов из массивов, буферизованное считывание строк из массивов и т.д. В такой ситуации решение с использованием простого наследования приводит к возникновению слишком большого числа подклассов. Более эффективно применение надстроек (в ООП этот шаблон называется адаптер) Надстройки – наложение дополнительных объектов для получения новых свойств и функций. Таким образом, необходимо создать несколько дополнительных объектов – адаптеров к классам ввода/вывода. В java.io их еще называют фильтрами. При этом надстройка-фильтр включает в себя интерфейс объекта, на который надстраивается, поэтому может быть, в свою очередь, дополнительно надстроена.

В java.io интерфейс для таких надстроек

ввода/вывода предоставляют классы FilterInputStream (для входных потоков ) и FilterOutputStream (для выходных потоков ). Эти классы унаследованы от основных базовых классов ввода/вывода – InputStream и OutputStream, соответственно. Конструктор FilterInputStream принимает в качестве параметра объект InputStream и имеет модификатор доступа protected.

Классы FilterI/OStream являются базовыми для надстроек и определяют общий интерфейс для надстраиваемых объектов. Потоки-надстройки не являются источниками данных. Они лишь модифицируют (расширяют) работу надстраиваемого потока.

BufferedInputStream и BufferedOutputStream

На практике при считывании с внешних устройств ввод данных почти всегда необходимо буферизировать. Для буферизации данных служат классы BufferedInputStream и BufferedOutputStream.

BufferedInputStream содержит массив байт, который служит буфером для считываемых данных. То есть когда байты из потока считываются либо пропускаются (метод skip ), сначала заполняется буферный массив, причем, из надстраиваемого потока загружается сразу много байт, чтобы не требовалось обращаться к нему при каждой операции read или skip. Также класс BufferedInputStream добавляет поддержку методов mark и reset. Эти методы определены еще в классе InputStream, но там их реализация по умолчанию бросает исключение IOException. Метод mark запоминает точку во входном потоке, а вызов метода reset приводит к тому, что все байты, полученные после последнего вызова mark, будут считываться повторно, прежде, чем новые байты начнут поступать из надстроенного входного потока.

BufferedOutputStream предоставляет возможность производить многократную запись небольших блоков данных без обращения к устройству вывода при записи каждого из них. Сначала данные записываются во внутренний буфер. Непосредственное обращение к устройству вывода и, соответственно, запись в него, произойдет, когда буфер заполнится. Инициировать передачу содержимого буфера на устройство вывода можно и явным образом, вызвав метод flush. Так же буфер освобождается перед закрытием потока. При этом будет закрыт и надстраиваемый поток (так же поступает BufferedInputStream ).

Следующий пример наглядно демонстрирует повышение скорости считывания данных из файла с использованием буфера:

try {

String fileName = "d:\\file1";

InputStream inStream = null;

OutputStream outStream = null;

//Записать в файл некоторое количество байт

long timeStart = System.currentTimeMillis;

outStream = new FileOutputStream(fileName);

outStream = new BufferedOutputStream(outStream);

for(int i=1000000; --i>=0;) {

outStream.write(i);

}

long time = System.currentTimeMillis - timeStart;

System.out.println("Writing time: " + time + " millisec");

outStream.close;

// Определить время считывания без буферизации

timeStart = System.currentTimeMillis;

inStream = new FileInputStream(fileName);

while(inStream.read!=-1) {

}

time = System.currentTimeMillis - timeStart; inStream.close;

System.out.println("Direct read time: " + (time) + " millisec");

Поделиться:
Популярные книги

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Город Богов

Парсиев Дмитрий
1. Профсоюз водителей грузовых драконов
Фантастика:
юмористическая фантастика
детективная фантастика
попаданцы
5.00
рейтинг книги
Город Богов

Звездная Кровь. Изгой II

Елисеев Алексей Станиславович
2. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой II

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Адвокат Империи 7

Карелин Сергей Витальевич
7. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 7

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2

Идеальный мир для Лекаря 18

Сапфир Олег
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 18

Двойник Короля 5

Скабер Артемий
5. Двойник Короля
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Двойник Короля 5

Неудержимый. Книга XVII

Боярский Андрей
17. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVII

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Барин-Шабарин

Гуров Валерий Александрович
1. Барин-Шабарин
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Барин-Шабарин

Развод с миллиардером

Вильде Арина
1. Золушка и миллиардер
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Развод с миллиардером

Курсант. На Берлин

Барчук Павел
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Курсант. На Берлин

Мастеровой

Дроздов Анатолий Федорович
Фантастика:
фэнтези
боевая фантастика
альтернативная история
7.40
рейтинг книги
Мастеровой