// =========================================================
// Копирование файла, расположенного в каталоге
// сервера 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());
    }
  }
}

