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