Лучший способ создать менеджер загрузки файлов Java - PullRequest
1 голос
/ 22 апреля 2011

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

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

Я думал о чем-то вроде этого:

//user chose directory to download his files
//fc is a FileChooser
//fc.showSaveDialog(this)==JFileChooser.APPROVE_OPTION
try {
    for(i=0;i<=urls.length-1;i++){

         String fileName = '...';//obtaining filename and extension

         fileName=fileName.replaceAll(" ", "_");
         //I am not sure if line above resolves all problems with names of files...

         String path = file.getAbsolutePath() + File.separator + fileName;

         try{
              InputStream is=null;
              FileOutputStream os=new FileOutputStream(path);
              URLConnection uc = urls[i].openConnection();
              is = uc.getInputStream();

              int a=is.read();
              while(a!=-1){
                  os.write(a);
                  a=is.read();
              }
              is.close();
              os.close();
         }
         catch(InterruptedIOException iioe) {
              //TODO User cancelled.
         }
         catch(IOException ioe){
              //TODO
         }
     }
}

но яЯ уверен, что есть лучшее решение.

Есть еще одна вещь - когда пользователь хочет загрузить действительно огромное количество файлов (например, 1000, от 10 МБ до 1 ГБ), возникнет несколько проблем.Итак, я подумал об установке ограничения для него, но я не знаю, как решить, сколько файлов одновременно.Должен ли я проверить интернет-соединение пользователя или загрузку компьютера?

Заранее спасибо

BroMan

1 Ответ

2 голосов
/ 22 апреля 2011

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

Надеюсь, вы имеете в виду последовательно, как написан ваш код. В этой ситуации не было бы никакого преимущества, если бы параллельно запускались несколько потоков загрузки.

Мне кажется, что такой апплет легко взломать или заразить.

Обязательно зашифруйте свой поток связи. Поскольку, похоже, вы просто обращаетесь к URL-адресам на сервере, возможно, настройте сервер на использование HTTPS.

Более того, наверняка понадобится много систем ресурсы для запуска.

Почему вы так думаете? Пропускная способность сети будет ограничивающим фактором. Вы не будете облагать налогом свои другие ресурсы очень. Возможно, вы хотели избежать насыщения полосы пропускания пользователя. Вы можете реализовать простое регулирование, предоставляя пользователю настраиваемую задержку, которую вы вставляете между каждым файлом или даже каждой итерацией цикла чтения / записи. Используйте Thread.sleep для реализации задержки.

Итак, я подумал об установлении предела для него, но я не действительно знаю, как решить, сколько файлов одновременно.

Если вы выполняете загрузку последовательно, установка лимитов не является техническим вопросом. Подробнее о том, какие услуги вы хотите предоставить. Больше файлов означает, что загрузка занимает больше времени.

int a = is.read ();

Ваша реализация потокового чтения / записи очень неэффективна. Вы хотите читать / писать порциями, а не отдельными байтами. Смотрите версии методов чтения / записи, которые принимают byte [].

Вот базовый логический поток для копирования данных из входного потока в выходной поток.

InputStream in = null;
OutputStream out = null;

try
{
    in = ...
    out = ...

    final byte[] buf = new byte[ 1024 ];

    for( int count = in.read( buf ); count != -1; count = in.read( buf ) )
    {
        out.write( buf, 0, count );
    }
}
finally
{
    if( in != null )
    {
        in.close();
    }

    if( out != null )
    {
        out.close();
    }
}
...