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

Библиотека примеров приложений Java

Оглавление
Работа с классом InetAddress
Работа с классом URL
Просмотр файлов сервера Web
Копирование файлов сервера Web
Контрольная сумма аплета
Потоковые сокеты - сервер
Потоковые сокеты - клиент
Общение в реальном времени
Широковещатель-
ные сообщения

Аплет и расширение сервера Web

Назад Вперед

8.4. Копирование файлов сервера Web

Более сложный по сравнению с предыдущим пример приложения также демонстрирует использование класса URL для создания потока ввода данных, связанного с ресурсом сервера Web. Он позволяет не только получить произвольный файл, расположенный в каталоге сервера Web, но и сохранить его на локальном диске вашего компьютера.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

Из соображений безопасности аплеты могут читать файлы только с того сервера Web, с которого они сами были загружены. По этой причине аплет, исходный текст которого приведен в разделе "6.10. Чтение с сервера Web в отдельном потоке", не способен загружать файлы из каталогов произвольных серверов Web.

Автономные приложения не имеют таких ограничений. Используя технику создания входных потоков, связанных с ресурсами серверов Web, примененную нами в предыдущем примере, автономные приложения могут читать файлы из каталогов любого сервера Web (лишь бы для этих файлов было разрешено чтение).

Описание примера

В главном окне нашего приложения имеется меню File, содержащее строки Open URL и Save As File (рис. 1).

pic1.gif (3735 bytes)

Рис. 1. Главное окно приложения

С помощью строки Open URL вы можете указать адрес URL файла, который нужно загрузить, а затем сохранить на локальном диске. Если выбрать эту строку, на экране появится диалоговая панель Enter new URL, показанная на рис. 2.

pic2.gif (2736 bytes)

Рис. 2. Диалоговая панель Enter new URL

В том случае если введенный адрес соответствует реально существующему файлу, файл будет загружен в многострочный редактор текста, расположенный в главном окне приложения.

Далее с помощью строки Save As File вы можете сохранить загруженный объект на локальном диске. При этом приложение выведет на экран стандартную диалоговую панель выбора выходного файла.

Перейдем к описанию самых важных фрагментов исходного текста приложения.

Главный класс приложения GetFile

В методе main главного класса приложения мы создаем окно класса FrameWindow, которое, в свою очередь, было образовано на базе класса Frame:

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class GetFile
{
  public static void main(String args[])
  {
    FrameWindow frame;
    frame =  new FrameWindow(
      "Get File from Web Site");
    frame.setVisible(true);
  }
}

Созданное окно становится видимым после вызова метода setVisible.

Класс FrameWindow

В исходных текстах класса FrameWindow представляет интерес реализация метода actionPerformed, отвечающего за обработку событий, связанных со строками меню, а также методов getUrlFile и saveUrlFile.

Метод actionPerformed

Когда пользователь выбирает строку Enter new URL, метод actionPerformed отображает на экране диалоговую панель класса GetURLDialog:

if(e.getSource().equals(miOpen))
{
  GetURLDialog nUrl = 
    new GetURLDialog("Enter new URL", this);
        
  nUrl.show();
  szNewURL = nUrl.getURL();
      
  if(szNewURL != null)
  {
    getUrlFile(szNewURL);
  }
}

С помощью этой панели, показанной на рис. 2, пользователь вводит адрес URL.

Этот адрес затем извлекается методом getURL и сохраняется в поле szNewURL. В том случае когда пользователь действительно ввел правильный адрес, ссылка на поле szNewURL передается методу getUrlFile, выполняющему загрузку указанного удаленного файла в многострочное окно редактирования текста.

В ответ на выбор строки Save As File метод actionPerformed проверяет поле szNewURL и, если оно не пустое, вызывает метод saveUrlFile:

else if(e.getSource().equals(miSave))
{
  if(szNewURL != null)
  {
    saveUrlFile(szNewURL);
  }     
}

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

Метод getUrlFile

Получив управление, метод getUrlFile создает новый объект класса URL. При этом соответствующему конструктору передается текстовая строка адреса URL, введенная польователем в окне диалоговой панели Enter new URL:

URL u;
try
{
  u = new URL(szUrl);
  . . .
}
catch(Exception ex)
{
  System.out.println(ex.toString());
}

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

InputStream is = u.openStream();

Чтение содержимого потока и его отображение в окне многострочного редактора выполняется в цикле:

String str;
byte buf[] = new byte[100];
      
while(true)
{
  int nReaded = is.read(buf);
  if(nReaded == -1)
    break;
          
  str = new String(buf);
  ta.append(str.substring(0, nReaded));
}
Метод saveUrlFile

В начале своей работы метод saveUrlFile также создает объект класса URL и открывает для него входной поток:

URL u;
try
{
  u = new URL(szUrl);
  InputStream is = u.openStream();
  . . .
}
catch(Exception ex)
{
  System.out.println(ex.toString());
}

Затем метод saveUrlFile отображает на экране стандартную панель выбора выходного файла класса FileDialog:

fdlg = new FileDialog(
  this, "Save file as...", 
  FileDialog.SAVE);
fdlg.show();
      
if(fdlg.getDirectory() == null &&
  fdlg.getFile() == null)
return;

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

FileOutputStream fos = 
  new FileOutputStream(
    fdlg.getDirectory() + fdlg.getFile());
      
ta.append("\nSave as: " + 
  fdlg.getDirectory() +
  fdlg.getFile() + "\n");

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

byte buf[] = new byte[100];
while(true)
{
  int nReaded = is.read(buf);
        
  if(nReaded == -1)
    break;
  fos.write(buf, 0, nReaded);  
}
is.close();
fos.close();

Класс GetURLDialog

Класс GetURLDialog создан на базе класса Dialog:

class GetURLDialog extends Dialog
  implements ActionListener, WindowListener
{
  . . .
}

Он реализует интерфейсы ActionListener и WindowListener. Первый из них нужен для обработки событий от кнопок OK и Cancel, расположенных в диалоговой панели, а второй используетя для скрытия диалоговой панели при попытке пользователя закрыть соответствующее окно.

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

Конструктор класса GetURLDialog

Конструктор класса GetURLDialog создает компоненты для диалоговой панели обычным образом:

tfURL = new TextField(20);
tfURL.setText("http://");
tfURL.selectAll();
lbName = new Label("Enter URL:");
bOK = new Button("OK");
bCancel = new Button("Cancel");

Для кнопок мы определяем обработчики событий:

bOK.addActionListener(this);
bCancel.addActionListener(this);

Далее все компоненты добавляются в окно панели с применением режима размещения компонент GridBagLayout.

Метод actionPerformed класса GetURLDialog

Когда пользователь нажимает кнопку OK, метод actionPerformed извлекает введенный адрес из однострочного редактора текста tfURL и записывает его в переменную szURL:

if(e.getSource().equals(bOK))
{
  String szURL = tfURL.getText();
      
  if(!szURL.equals(""))
    szNewURL = szURL;
  else   
    szNewURL = null;
 
  setVisible(false);
}

Если эта строка непустая, она затем копируется в поле szNewURL.

В том случае когда пользователь нажимает кнопку Cancel, метод actionPerformed записывает в поле szNewURL значение null:

else if(e.getSource().equals(bCancel))
{
  szNewURL = null;
  setVisible(false);
}
Метод getURL класса GetURLDialog

Этот метод просто возвращает строку адреса URL, хранящуюся в поле szNewURL:

public String getURL()
{
  return szNewURL;
}

Назад Вперед

[Назад]