Под потоком понимают последовательность байтов. Входящий поток переносит данные из источника в программу, исходящий – наоборот.
Байтовые потоки (классы) происходят от InputStream и OutputStream. Один байт считывается в единицу времени.После окончания работы потока, его обязательно нужно закрыть.
Байтовые потоки обслуживают ввод/вывод низкого уровня. В этих случаях их и следует использовать.
Для работы с символами исползуют символьные потоки (character stream).
Байтовые и символьные потоки можно использовать совместно. Байтовые отвечают за загрузку в приложение последовательности байтов, а символьные потоки заняты преобразованием между байтами и символами.
Символьные потоки способны считывать сразу целую строку.
Потоки можно буферизировать, т.е. чтение или запись выполнять не прямо, что повышает скорость. Сначала загрузка идёт в буфер, когда он будет заполнен, то из него запрашивается сразу весь объём информации.Чтобы использовать буферизированные потоки, надо использовать обычные потоки как аргумент буферизированных.
Файловый ввод/вывод осуществляется классами FileInputStream и FileOutputStream. Для текстовых файлов используют классы FileReader и FileWriter.
В примере создадим файл InputFile, загрузим в него текст, выгрузим содержимое этого файла в другой файл OutputFile.
В примере сначала создаём файл InputFile.doc в конструкторе:
второй аргумент говорит о том, что файл будет переписан заново, если этот аргумент равен true, то запись добавляется в конец файла. Теперь в файл можно добавить строку:
Файл готов. Обязательно следует закрыть поток FileWriter. Делаем это в блоке finally.
Далее рассмотрим порядок использования потоков FileInputStream и FileOutputStream. Читаем инфомацию из только что созданного файла так:
Создаём новый файл OutputFile.doc для перекачивания в него информации из InputFile.doc:
Переброску информации делаем в цикле:
где -1 указывает на достижение конца потока.
Обязательно следует закрыть потоки FileInputStream и FileOutputStream. Делаем это в блоке finally: