Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 2© Александр Фролов, Григорий ФроловТом 32, М.: Диалог-МИФИ, 1997, 288 стр. Приложение MemStreamАплет MemStream создает два потока в оперативной памяти - выходной и входной. Вначале во время инициализации метод init создает выходной поток и записывает в него текстовую строку “Hello, Java!”. Содержимое этого потока затем копируется в массив, и на базе этого массива создается входной поток. Во время рисования окна аплета метод paint создает из только что упомянутого массива входной поток, читает из этого потока одну строку и отображает ее в окне аплета. Аплет не может работать с обычными локальными файлами, поэтому для выполнения описанных выше действий необходимы потоки в оперативной памяти. Исходные тексты приложенияИсходный текст аплета MemStream приведен в листинге 2.3. Листинг 2.3. Файл MemStream\MemStream.java // ========================================================= // Работа с потоками в оперативной памяти // // (C) Фролов А.В, 1997 // // E-mail: frolov@glas.apc.org // WWW: http://www.glasnet.ru/~frolov // или // http://www.dials.ccas.ru/frolov // ========================================================= import java.applet.*; import java.awt.*; import java.io.*; public class MemStream extends Applet { // Выходной поток DataOutputStream OutStream; // Входной поток DataInputStream InStream; // Строка, которая будет записана в поток String sOut; // Массив, в который будет копироваться содержимое // выходного потока byte[] bMemStream; // ------------------------------------------------------- // getAppletInfo // Метод, возвращающей строку информации об аплете // ------------------------------------------------------- public String getAppletInfo() { return "Name: MemStream\r\n" + "Author: Alexandr Frolov\r\n" + "E-mail: frolov@glas.apc.org" + "WWW: http://www.glasnet.ru/~frolov" + "Created with Microsoft Visual J++ Version 1.0"; } // ------------------------------------------------------- // init // Метод init, получает управление при инициализации // аплета // ------------------------------------------------------- public void init() { // Инициализируем строку для записи в поток sOut = "Hello, Java!"; try { // Создаем выходной поток в оперативной памяти ByteArrayOutputStream baStream = new ByteArrayOutputStream(255); // Создаем буферизованный форматированный поток // на базе потока baStream OutStream = new DataOutputStream( new BufferedOutputStream(baStream)); // Записываем строку sOut в выходной поток OutStream.writeBytes(sOut); // Сбрасываем содержимое буфера OutStream.flush(); // Копируем содержимое потока в массив bMemStream bMemStream = baStream.toByteArray(); // Закрываем выходной поток OutStream.close(); } catch(Exception ioe) { } } // ------------------------------------------------------- // paint // Метод paint, выполняющий рисование в окне аплета // ------------------------------------------------------- public void paint(Graphics g) { // Определяем текущие размеры окна аплета Dimension dimAppWndDimension = size(); // Выбираем в контекст отображения желтый цвет g.setColor(Color.yellow); // Закрашиваем внутреннюю область окна аплета g.fillRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); // Выбираем в контекст отображения черный цвет g.setColor(Color.black); // Рисуем рамку вокруг окна аплета g.drawRect(0, 0, dimAppWndDimension.width - 1, dimAppWndDimension.height - 1); try { // Создаем входной буферизованный поток данных InStream = new DataInputStream( new BufferedInputStream( new ByteArrayInputStream(bMemStream))); // Читаем одну строку из созданного входного потока // и отображаем ее g.drawString(InStream.readLine(), 10, 20); // Закрываем входной поток InStream.close(); } catch(Exception ioe) { } } } В листинге 2.4 вы найдете исходный текст документа HTML, созданный автоматически для нашего аплета системой Microsoft Visual J++. Листинг 2.4. Файл MemStream\MemStream.html <html> <head> <title>MemStream</title> </head> <body> <hr> <applet code=MemStream.class id=MemStream width=320 height=240 > </applet> <hr> <a href="MemStream.java">The source.</a> </body> </html> Описание исходных текстовМы рассмотрим только самые важные методы нашего аплета - init и paint. Метод initВ начале своей работы метод init записывает в поле sOut текстовую строку, которая будет записана в выходной поток: String sOut; sOut = "Hello, Java!"; Далее метод init создает поток baStream класса ByteArrayOutputStream, устанавливая начальный размер выделенного для него массива равным 255 байт: ByteArrayOutputStream baStream = new ByteArrayOutputStream(255); Для выполнения форматированного вывода нам нужен поток класса DataOutputStream, который мы и создаем на базе потока baStream: OutStream = new DataOutputStream( new BufferedOutputStream(baStream)); Для записи строки в выходной поток мы воспользовались методом writeBytes: OutStream.writeBytes(sOut); Так как наш выходной поток буферизован, после вызова метода writeBytes данные могут остаться в промежуточном буфере, не достигнув массива, выделенного для хранения потока. Чтобы переписать данные из буфера в массив, мы выполняем сброс буфера методом flush: OutStream.flush(); После сброса буфера (и только после этого) можно копировать содержимое потока методом toByteArray: bMemStream = baStream.toByteArray(); Этот метод возвращает ссылку на созданный массив, которую мы записываем в поле bMemStream. В дальнейшем на базе этого массива мы создадим поток ввода. Перед завершением своей работы метод init закрывает входной поток,вызывая метод close: OutStream.close(); Метод paintПосле традиционного для наших аплетов раскрашивания окна и рисования рамки метод paint создает входной буферизованный поток на базе массива bMemStream: InStream = new DataInputStream( new BufferedInputStream( new ByteArrayInputStream(bMemStream))); Поток создается в три этапа с помощью классов ByteArrayInputStream, BufferedInputStream и DataInputStream. Далее мы читаем из созданного таким образом входного потока одну строку, вызывая для этого метод readLine: g.drawString(InStream.readLine(), 10, 20); Прочитанная строка отображается в окне аплета методом drawString. После завершения работы с потоком мы его закрываем, для чего вызываем метод close: InStream.close(); |