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

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

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

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

Приложение URLDemo

В качестве практического примера применения класса URL мы создали приложение URLDemo. Это приложение вводит с консоли адрес URL текстового или двоичного файла, расположенного на сервере Web и создает для этого файла входной поток. С использованием данного потока приложение копирует файл на локальный диск компьютера в текущий каталог.

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

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

Листинг 3.2. Файл URLDemo\URLDemo.java


// =========================================================
// Копирование файла, расположенного в каталоге
// сервера Web, с помощью класса URL
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.net.*;
import java.io.*;
import java.util.*;

// =========================================================
// Класс InetAddressDemo
// Главный класс приложения
// =========================================================
public class URLDemo
{
  // -------------------------------------------------------
  // main
  // Метод, получающий управление при запуске приложения
  // -------------------------------------------------------
  public static void main(String args[])
  {
    // Массив для ввода строки с клавиатуры
    byte bKbdInput[] = new byte[256];

    // Введенная строка
    String sIn;

    // Строка адреса URL
    String sURL;

    // Адрес URL удаленного узла
    URL u;

    // Рабочий буфер для копирования файла
    byte buf[] = new byte[1024];

    try
    {
      // Вводим адрес URL удаленного узла
      System.out.println("Enter remote host name...");
      System.in.read(bKbdInput);
      sIn = new String(bKbdInput, 0);

      // Обрезаем строку, удаляя символ конца строки
      StringTokenizer st;
      st   = new StringTokenizer(sIn, "\r\n");
      sURL = new String((String)st.nextElement());

      // Создаем объект класса URL
      u = new URL(sURL);

      // Создаем входной поток, связанный с объектом,
      // адрес URL которого хранится в поле u
      InputStream is = u.openStream();

      // Создаем выходной буферизованный форматированный
      // поток для записи принятого файла
      DataOutputStream os = new DataOutputStream(
        new BufferedOutputStream(
          new FileOutputStream("output.dat")));

      // Выполняем в цикле чтение файла, расположенного
      // по адресу u, копируя этот файл в выходной поток
      while(true)
      {
        int nReaded = is.read(buf);
       
        if(nReaded == -1)
          break;

        os.write(buf, 0, nReaded);
      }

      // Закрываем входной и выходной потоки
      is.close();
      os.close();

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

    try
    {
      System.out.println("Press <Enter> to terminate...");
      System.in.read(bKbdInput);
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
  }
}

Описание исходного текста

Сразу после запуска приложение запрашивает с консоли текстовую строку адреса URL файла, который необходимо переписать через сеть на локальный диск. После удаления символа перевода строки адрес записывается в поле sURL.

Далее приложение создает объект класса URL, соответствующий введенному адресу:


u = new URL(sURL);

На следующем этапе для объекта URL создается входной поток, для чего вызывается метод openStream:


InputStream is = u.openStream();

Идентификатор этого потока сохраняется в поле is.

Принятый файл будет записан в текущий каталог под именем output.dat. Для этого мы создаем входной буферизованный форматированный поток os, как это показано ниже:


DataOutputStream os = new DataOutputStream(
  new BufferedOutputStream(
  new FileOutputStream("output.dat")));

После знакомства с главой нашей книги, посвященной работе с потоками, эти строки не должны вызывать у вас никаких вопросов.

Операция чтения данных из входного потока и записи в выходной поток выполняется в цикле:


while(true)
{
  int nReaded = is.read(buf);
  if(nReaded == -1)
    break;
  os.write(buf, 0, nReaded);
}

Вначале для входного потока вызывается метод read. Он возвращает количество прочитанных байт данных или значение -1, если был достигнут конец потока. В последнем случае цикл прерывается.

Принятые данные размещаются в массиве buf, откуда затем они записываются в выходной поток методом write. Мы записываем в выходной поток столько байт данных, сколько было считано.

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


is.close();
os.close();
[Назад] [Содеожание] [Дальше]