Basic I/O. Базовый ввод/вывод

Под потоком понимают последовательность байтов. Входящий поток переносит данные из источника в программу, исходящий – наоборот.

Байтовые потоки (классы) происходят от InputStream и OutputStream. Один байт считывается в единицу времени.После окончания работы потока, его обязательно нужно закрыть.

Байтовые потоки обслуживают ввод/вывод низкого уровня. В этих случаях их и следует использовать.

Для работы с символами исползуют символьные потоки (character stream).

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

Символьные потоки способны считывать сразу целую строку.

Потоки можно буферизировать, т.е. чтение или запись выполнять не прямо, что повышает скорость. Сначала загрузка идёт в буфер, когда он будет заполнен, то из него запрашивается сразу весь объём информации.Чтобы использовать буферизированные потоки, надо использовать обычные потоки как аргумент буферизированных.

Файловый ввод/вывод осуществляется классами FileInputStream и FileOutputStream. Для текстовых файлов используют классы FileReader и FileWriter.

В примере создадим файл InputFile, загрузим в него текст, выгрузим содержимое этого файла в другой файл OutputFile.

В примере сначала создаём файл InputFile.doc в конструкторе:

fw = new FileWriter(«H:\InputFile.doc», false);

второй аргумент говорит о том, что файл будет переписан заново, если этот аргумент равен true, то запись добавляется в конец файла. Теперь в файл можно добавить строку:

fw.write(«This is a new file.»);

Файл готов. Обязательно следует закрыть поток FileWriter. Делаем это в блоке finally.

Далее рассмотрим порядок использования потоков FileInputStream и FileOutputStream. Читаем инфомацию из только что созданного файла так:

ism = new FileInputStream(«H:\InputFile.doc»);

Создаём новый файл OutputFile.doc для перекачивания в него информации из InputFile.doc:

os = new FileOutputStream(«H:\OutputFile.doc»);

Переброску информации делаем в цикле:

int cur; while((cur = ism.read()) != -1) { os.write(cur); }

где -1 указывает на достижение конца потока.

Обязательно следует закрыть потоки FileInputStream и FileOutputStream. Делаем это в блоке finally:

finally { if (ism != null) { ism.close(); } if (os != null) { os.close(); } }