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(); |

