Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_Po_Tp.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.44 Mб
Скачать

2.3.3 Закрытие потоков

Так как в системе интерпретации приложений Java есть процесс «сборки мусора», то возникает вопрос - выполняет ли он автоматическое закрытие потоков, с которыми приложение завершило работу?

Нужно сказать, процесс «сборки мусора» не делает ничего подобного. «Сборка мусора» выполняется только для объектов, размещенных в оперативной памяти. Для потоков же программисты должны предусмотреть явное закрытие, для чего используется метод close().

2.3.4 Принудительный сброс буферов

Еще один важный момент работы связан с буферизированными потоками. Уже отмечалось, что буферизация ускоряет работу приложений с потоками, так как при ее использовании сокращается количество обращений к системе ввода-вывода. Можно постепенно в течении долгого времени добавлять в буферизированный поток данные, и только потом эти данные физически записать в файл на диске.

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

2.3.5 Приложение StreamDemo

Создадим приложение, которое демонстрирует наиболее распространенный способ работы с файлами через буферизированные потоки.

Задание. Создать автономное приложение StreamDemo, в окне которого содержится область редактирования, в которой пользователь может вводить текст. Приложение должно иметь выпадающее меню «File» (пункты «Open File» и «Save File»). При выборе пункта «Open File» в область редактирования записывается содержимое файла out.txt, а при выборе пункта Save File» содержимое области редактирования записывается в файл out.txt. Для записи и чтения необходимо использовать буферизированные потоки форматированных данных.

Замечание. Исходные тексты этого приложения сохранить для их последующей модификации в процессе создания приложения FileDialogDemo (см. далее).

Методические указания. Приложение должно быть создано на основе шаблона, содержащегося в Приложении 7.

Объявление элементов класса фрейма.

В классе фрейма объявим следующие элементы - ссылки на объекты классов:

TextArea text; // ссылка на область редактирования

Конструктор класса фрейма (метод MainWndFrame()).

В конструкторе класса фрейма создадим панель меню mainMenu класса MenuBar и при помощи метода setMenuBar() установим эту панель для фрейма.

После этого создадим меню «File» - объект file класса Menu и добавим его в панель меню mainMenu методом add().

Затем в меню file введем методом add() элементы «Open File» и «Save File» - объекты класса MenuItem.

В качестве поля редактирования создадим текстовую область text класса TextArea, а затем добавим ее в центральную часть фрейма методом add().

Обработка событий (метод handleEvent()).

В этот метод добавим обработку события Event.ACTION_EVENT (сообщения от меню). Следует обратить внимание, что фрагменты кода, где будет происходить работа с файлами, должны быть заключены в блоки try-catch, что является необходимым для обработки возможных исключительных ситуаций:

case Event.ACTION_EVENT:

if(evt.target instanceof MenuItem) // события меню

{ String label=(String) evt.arg;

if(label.equals("Open File"))

{ // обработка исключения при работе с файлами

try

{ // добавить необходимые действия

}

catch(IOException e)

{ // вывод названия возникшего исключения

System.out.println(e.toString());

}

}

else if(label.equals("Save File"))

{ // обработка исключения при работе с файлами

try

{ // добавить необходимые действия

}

catch(IOException e)

{ // вывод названия возникшего исключения

System.out.println(e.toString());

}

}

else return false;

}

return true;

При выборе пользователем пункта меню «Open File» объявим переменные s и ss класса String (переменную s проинициализируем пустой строкой).

Затем создадим входной буферизированный поток форматированных данных, связанный с файлом out.txt. Для этого выполним следующие действия:

  • создадим поток класса FileInputStream, связанный с файлом out.txt, и ссылку на этот поток присвоим переменной file класса FileInputStream;

  • поток file, связанный с файлом, передадим конструктору класса BufferedInputStream, в результате чего образуется буферизированный поток, ссылку на который присвоим переменной buf класса BufferedInputStream;

  • буферизированный поток buf передадим конструктору класса DataInputStream, который и создаст нужный поток, ссылку на который присвоим переменной dataIn класса DataInputStream.

Далее прочитаем в строку s все строки из потока dataIn при помощи метода readLine(). После считывания файла поток dataIn закроем методом close().

Содержимое строки s запишем в текстовую область, применяя метод setText() для объекта text и передавая этому методу строку s.

При выборе пользователем пункта меню «Save File» объявим переменную s класса String, в которую при помощи метод setText() для объекта text прочитаем содержимое текстовой области.

Затем создадим выходной буферизированный поток форматированных данных, связанный с файлом out.txt. Для этого выполним следующие действия:

  • создадим поток класса FileOutputStream, связанный с файлом out.txt, и ссылку на этот поток присвоим переменной file класса FileOutputStream;

  • поток file, связанный с файлом, передадим конструктору класса BufferedOutputStream, в результате чего образуется буферизированный поток, ссылку на который присвоим переменной buf класса BufferedOutputStream;

  • буферизированный поток buf передадим конструктору класса DataOutputStream, который и создаст нужный поток, ссылку на который присвоим переменной dataOut класса DataOutputStream.

Далее запишем строку s в поток dataOut при помощи метода writeBytes(). После записи выполним принудительный сброс буфера потока dataOut методом flush() и закроем поток dataOut методом close().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]