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

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

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

Аналогично, для записи байт в массив применяется класс ByteArrayOutputStream. Этот класс использует внутри себя объект byte[], куда записывает данные, передаваемые при вызове методов write. Чтобы получить записанные в массив данные, вызывается метод toByteArray. Пример:

ByteArrayOutputStream out =

new ByteArrayOutputStream;

out.write(10);

out.write(11);

byte[] bytes = out.toByteArray;

В этом примере в результате массив bytes будет состоять из двух элементов: 10 и 11.

Использовать классы ByteArrayInputStream

и ByteArrayOutputStream может быть очень удобно, когда нужно проверить, что именно записывается в выходной поток. Например, при отладке и тестировании сложных процессов записи и чтения из потоков. Эти классы хороши тем, что позволяют сразу просмотреть результат и не нужно создавать ни файл, ни сетевое соединение, ни что-либо еще.

Классы FileInputStream и FileOutputStream

Класс FileInputStream используется для чтения данных из файла. Конструктор такого класса в качестве параметра принимает название файла, из которого будет производиться считывание. При указании строки имени файла нужно учитывать, что она будет напрямую передана операционной системе, поэтому формат имени файла и пути к нему может различаться на разных платформах. Если при вызове этого конструктора передать строку, указывающую на несуществующий файл или каталог, то будет брошено java.io.FileNotFoundException. Если же объект успешно создан, то при вызове его методов read возвращаемые значения будут считываться из указанного файла.

Для записи байт в файл используется класс FileOutputStream. При создании объектов этого класса, то есть при вызовах его конструкторов, кроме имени файла, также можно указать, будут ли данные дописываться в конец файла, либо файл будет перезаписан. Если указанный файл не существует, то сразу после создания FileOutputStream он будет создан. При вызовах методов write передаваемые значения будут записываться в этот файл. По окончании работы необходимо вызвать метод close, чтобы сообщить системе, что работа по записи файла закончена. Пример:

byte[] bytesToWrite = {1, 2, 3};

byte[] bytesReaded = new byte[10];

String fileName = "d:\\test.txt";

try {

// Создать выходной поток FileOutputStream

outFile = new FileOutputStream(fileName);

System.out.println("Файл открыт для записи");

// Записать массив outFile.write(bytesToWrite);

System.out.println("Записано: " + bytesToWrite.length + " байт");

// По окончании использования должен быть закрыт

outFile.close;

System.out.println("Выходной поток закрыт");

// Создать входной поток

FileInputStream inFile = new FileInputStream(fileName);

System.out.println("Файл открыт для чтения");

// Узнать, сколько байт готово к считыванию

int bytesAvailable = inFile.available;

System.out.println("Готово к считыванию: " + bytesAvailable + " байт");

// Считать в массив

int count = inFile.read(bytesReaded,0,bytesAvailable);

System.out.println("Считано: " + count + " байт");

for (int i=0;i<count;i++) System.out.print(bytesReaded[i]+",");

System.out.println;

inFile.close;

System.out.println("Входной поток закрыт");

}

catch (FileNotFoundException e) {

System.out.println("Невозможно

произвести запись в файл: " + fileName);

}

catch (IOException e) {

System.out.println("Ошибка ввода/вывода: " + e.toString);

}

Пример 15.1.

Результатом работы программы будет:

Файл открыт для записи

Записано: 3 байт

Выходной поток закрыт

Файл открыт для чтения

Готово к считыванию: 3 байт

Считано: 3 байт

1,2,3,

Входной поток закрыт

Пример 15.2.

При работе с FileInputStream метод available практически наверняка вернет длину файла, то есть число байт, сколько вообще из него можно считать. Но не стоит закладываться на это при написании программ, которые должны устойчиво работать на различных платформах,– метод available возвращает число байт, которое может быть на данный момент считано без блокирования. Тот факт, что, скорее всего, это число и будет длиной файла, является всего лишь частным случаем работы на некоторых платформах.

В приведенном примере для наглядности закрытие потоков производилось сразу же после окончания их использования в основном блоке. Однако лучше закрывать потоки в finally блоке.

...

}

finally {

try {

inFile.close;

}

catch(IOException e) {};

}

Такой подход гарантирует, что поток будет закрыт и будут освобождены все связанные с ним системные ресурсы.

PipedInputStream и PipedOutputStream

Классы PipedInputStream и PipedOutputStream характеризуются тем, что их объекты всегда используются в паре – к одному объекту PipedInputStream привязывается (подключается) один объект PipedOutputStream. Они могут быть полезны, если в программе необходимо организовать обмен данными между модулями (например, между потоками выполнения).

Эти классы применяются следующим образом: создается по объекту PipedInputStream и PipedOutputStream, после чего они могут быть соединены между собой. Один объект PipedOutputStream может быть соединен с ровно одним объектом PipedInputStream, и наоборот. Затем в объект PipedOutputStream записываются данные, после чего они могут быть считаны именно в подключенном объекте PipedInputStream. Такое соединение можно обеспечить либо вызовом метода connect с передачей соответствующего объекта PipedI/OStream (будем так кратко обозначать пару классов, в данном случае PipedInputStream и PipedOutputStream ), либо передать этот объект еще при вызове конструктора.

Использование связки PipedInputStream и PipedOutputStream показано в следующем примере:

try {

int countRead = 0;

byte[] toRead = new byte[100];

PipedInputStream pipeIn = new PipedInputStream;

PipedOutputStream pipeOut = new PipedOutputStream(pipeIn);

// Считывать в массив, пока он полностью не будет заполнен

while(countRead<toRead.length) {

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

for(int i=0; i<(Math.random*10); i++) {

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

Императорский отбор

Свободина Виктория
Фантастика:
фэнтези
8.56
рейтинг книги
Императорский отбор

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

Ты не мой Boy 2

Рам Янка
6. Самбисты
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Ты не мой Boy 2

Проданная Истинная. Месть по-драконьи

Белова Екатерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи

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

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

Холодный ветер перемен

Иванов Дмитрий
7. Девяностые
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Холодный ветер перемен

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Его наследник

Безрукова Елена
1. Наследники Сильных
Любовные романы:
современные любовные романы
эро литература
5.87
рейтинг книги
Его наследник

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

Новая Инквизиция 2

Злобин Михаил
2. Новая инквизиция
Фантастика:
фэнтези
боевая фантастика
городское фэнтези
5.00
рейтинг книги
Новая Инквизиция 2

Приручитель женщин-монстров. Том 1

Дорничев Дмитрий
1. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 1

Свои чужие

Джокер Ольга
2. Не родные
Любовные романы:
современные любовные романы
6.71
рейтинг книги
Свои чужие