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

Microsoft Visual J++. Создание приложений и аплетов на языке Java. Часть 2

© Александр Фролов, Григорий Фролов
Том 32, М.: Диалог-МИФИ, 1997, 288 стр.

[Назад] [Содеожание] [Дальше]

Приложение StreamDemo

Приложение StreamDemo было создано нами специально для того чтобы продемонстрировать наиболее распространенный способ работы с файлами через буферизованные форматированные потоки.

Действия, выполняемые этим приложением, достаточно просты. Вначале приложение выводит на консоль приглашение для ввода строки. Затем введенная строка записывается в файл через выходной буферизованный форматированный поток. После этого созданный файл читается через входной буферизованный поток. Его содержимое (введенная ранее строка) отображается на экране.

Исходный текст приложения

Исходный текст приложения StreamDemo представлен в листинге 2.2.

Листинг 2.2. Файл StreamDemo\StreamDemo.java


// =========================================================
// Демонстрация использования потоков для работы с файлами
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.io.*;

public class StreamDemo
{
  // -------------------------------------------------------
  // main
  // Метод, получающий управление при запуске приложения
  // -------------------------------------------------------
  public static void main(String args[])
  {
    // Выходной поток
    DataOutputStream OutStream;

    // Входной поток
    DataInputStream  InStream;

    // Массив для ввода строки с клавиатуры
    byte bKbdInput[] = new byte[256];

    // Введенная строка, которая будет записана в поток
    String sOut;

    // Выполняем попытку вывода на консоль строки 
    // приглашения
    try
    {
      // Выводим строку приглашения
      System.out.println("Hello, Java!\n" + 
        "Enter string and press <Enter>...");
      
      // Читаем с клавиатуры строку для записи в файл
      System.in.read(bKbdInput);

      // Преобразуем введенные символы в строку типа String
      sOut = new String(bKbdInput, 0);
    }
    catch(Exception ioe)
    {
      // При возникновении исключения выводим его описание
      // на консоль
      System.out.println(ioe.toString());
    }
    
    // Выполняем попытку записи в выходной поток
    try
    {
      // Создаем выходной буферизованный поток данных
      OutStream = new DataOutputStream(
        new BufferedOutputStream(
          new FileOutputStream("output.txt")));

      // Записываем строку sOut в выходной поток
      OutStream.writeBytes(sOut);

      // Сбрасываем содержимое буфера вывода
      OutStream.flush();

      // Закрываем выходной поток
      OutStream.close();
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
    
    // Выполняем попытку чтения из файла
    try
    {
      // Создаем входной буферизованный поток данных
      InStream = new DataInputStream(
        new BufferedInputStream(
          new FileInputStream("output.txt")));

      // Читаем одну строку из созданного входного потока
      // и отображаем ее на консоли
      System.out.println(InStream.readLine());

      // Закрываем входной поток
      InStream.close();
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }

    // Ожидаем ввода с клавиатуры, а затем завершаем 
    // работу приложения
    try
    {
      System.out.println(
        "Press <Enter> to terminate application...");

      System.in.read(bKbdInput);
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
  }
}

Описание исходного текста приложения

Внутри метода main мы создали ссылки на выходной поток OutStream и входной поток InStream:


DataOutputStream OutStream;
DataInputStream  InStream;

Кроме того, мы предусмотрели массив для ввода информации из стандартного входного потока:


byte bKbdInput[] = new byte[256];

Способ вывода приглашения и получения строки с клавиатуры ничем не отличается от использованного в предыдущем приложении, поэтому для экономии места мы не будем на нем останавливаться. Скажем только, что введенная строка записывается в поле sOut типа String.

Создание выходного потока для записи строки выполняется следующим образом:


OutStream = new DataOutputStream(
  new BufferedOutputStream(
  new FileOutputStream("output.txt")));

Вначале с помощью конструктора создается объект класса FileOutputStream - поток, связанный с файлом output.txt. Далее на базе этого потока создается буферизованный поток типа BufferedOutputStream. И, наконец, на базе буферизованного потока создается форматированный поток OutStream класса DataOutputStream.

Заметим, что конструктор класса FileOutputStream создает файл output.txt, если он не существует, и перезаписывает существующий файл. Если вам нужно исключить случайную перезапись существующего файла, необходимо воспользоваться классом File, о котором мы еще будем рассказывать.

Для записи строки sOut в выходной поток мы вызываем метод writeBytes:


OutStream.writeBytes(sOut);

После записи выполняется сброс содержимого буферов и закрытие потока:


OutStream.flush();
OutStream.close();

При закрытии потока содержимое буферов сбрасывается автоматически. Мы вызвали метод flush только для иллюстрации.

При работе с потоками могут возникать различные исключения. Наш обработчик этих исключений просто записывает в стандратный поток вывода название возникшего исключения:


catch(Exception ioe)
{
  System.out.println(ioe.toString());
}

На следующем этапе приложение открывает файл output.txt для чтения буферизованным форматированным потоком:


InStream = new DataInputStream(
  new BufferedInputStream(
  new FileInputStream("output.txt")));

В этой последовательности создания трех объектов различных классов для вас нет ничего нового. Вначале мы создаем поток ввода, связанный с файлом, затем на его базе - буферизованный входной поток, и, наконец, на базе буферизованного входного потока - буферизованный форматированный входной поток.

Для чтения строки из входного потока мы применили метод readLine:


System.out.println(InStream.readLine());

Прочитанная строка сразу отображается на консоли, для чего она записывается в стандартный поток вывода.

После завершения работы со входным потоком мы закрываем его методом close:


InStream.close();

На последнем этапе приложение ожидает ввода с клавиатуры и затем завершает свою работу.

[Назад] [Содеожание] [Дальше]