设计Java文件下载管理器的最佳方法

时间:2011-04-22 17:05:15

标签: java download io

我想为我的备份网站编写简单的Java下载程序。重要的是,applet应该能够一次下载许多文件。

所以,这是我的问题。这样的小程序在我看来很容易被黑客攻击或感染。更重要的是,它肯定需要很多系统资源才能运行。所以,我想听听你的意见,这是最好,最优和最安全的方式。

我想到了这样的事情:

//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,介于10MB和1GB之间)时,会出现一些问题。所以,我想为它设置一个限制,但我真的不知道如何确定一次有多少文件是好的。我应该检查用户的互联网连接或计算机的负载吗?

提前致谢

BroMan

1 个答案:

答案 0 :(得分:2)

  

我想为我的备份网站编写简单的Java下载程序。   重要的是,applet应该能够一次下载许多文件。

我希望你的意思是像你的代码一样。在这种情况下,并行运行多个下载流没有任何优势。

  

这样的小程序在我看来很容易被攻击或感染。

确保加密您的通讯流。由于您看起来只是访问服务器上的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();
    }
}