java中的多线程下载器

时间:2015-03-28 12:47:07

标签: java multithreading download

好的我正在使用以下函数创建多个线程来下载文件。您可以看到函数采用链接,起始字节,结束字节和下载文件作为参数的路径。我调用此函数2次创建两个线程来下载所需的文件。

例如,如果文件是100个字节,我会执行以下操作

thread-1 - > DownloadFile(" http://localhost/file.zip",0,50 && 34; output.zip");

thread-2 - > DownloadFile(" http://localhost/file.zip",50,100," output.zip");

但是你知道会发生什么,只有几个字节没有被下载,我的进度条被卡在99%。这就是问题!!!

为何它被卡在99%?用语言为什么有些字节丢失了?我可以看到下载变量中的总字节数。

这是函数

public void DownloadFile(final String link, final long start,final long end, final String path){
    new Thread(new Runnable(){
        public void run(){
            try {
                URL url = new URL(link);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestProperty("Range", "bytes="+start+"-"+end);
                BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
                RandomAccessFile raf = new RandomAccessFile(path,"rw");
                raf.seek(start);

                int i=0;
                byte bytes[] = new byte[1024];


                while((i = bis.read(bytes))!=-1){
                    raf.write(bytes, 0, i);
                    downloaded = downloaded+i; 
                    int perc = (int) ((downloaded*100)/FileSize);
                    progress.setValue(perc);
                    percentLabel.setText(Long.toString(downloaded)+" out of "+FileSize);
                }


                if(FileSize==downloaded){
                    progress.setValue(100);
                    JOptionPane.showMessageDialog(null, "Download Success! ");
                    progress.setValue(0);
                    downloaded=0;
                    downBtn.setText("Download");
                }
                bis.close();
                raf.close();


            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }).start();
}

感谢您的期待。

1 个答案:

答案 0 :(得分:1)

RandomAccessFile is not thread safe.

raf.seek(begin)失败,请参阅RandomAccessFile.seek()

的文档
  

设置文件指针偏移量,从此开始测量   文件,发生下一次读或写。可以设置偏移   超出文件的末尾。将偏移量设置为超出结束范围   文件不会更改文件长度。文件长度仅会更改   通过写入偏移量已经设置超出文件末尾。

您可以将部分文件下载到单独的文件中,然后合并它们。

您确定并行下载更快吗?