Назад
Вперед
8.4. Копирование файлов сервера Web
Более сложный по сравнению с предыдущим пример
приложения также демонстрирует использование
класса URL для создания потока ввода данных,
связанного с ресурсом сервера Web. Он позволяет не
только получить произвольный файл,
расположенный в каталоге сервера Web, но и
сохранить его на локальном диске вашего
компьютера.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
Из соображений безопасности аплеты могут
читать файлы только с того сервера Web, с которого
они сами были загружены. По этой причине аплет,
исходный текст которого приведен в разделе "6.10. Чтение с сервера Web в
отдельном потоке", не способен загружать
файлы из каталогов произвольных серверов Web.
Автономные приложения не имеют таких
ограничений. Используя технику создания входных
потоков, связанных с ресурсами серверов Web,
примененную нами в предыдущем примере,
автономные приложения могут читать файлы из
каталогов любого сервера Web (лишь бы для этих
файлов было разрешено чтение).
Описание примера
В главном окне нашего приложения имеется меню
File, содержащее строки Open URL и Save As File (рис. 1).
Рис. 1. Главное окно приложения
С помощью строки Open URL вы можете указать адрес URL
файла, который нужно загрузить, а затем сохранить
на локальном диске. Если выбрать эту строку, на
экране появится диалоговая панель Enter new URL,
показанная на рис. 2.
Рис. 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;
}
Назад Вперед |