Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

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();
[Назад] [Содеожание] [Дальше]