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(); |

