好的我正在使用以下函数创建多个线程来下载文件。您可以看到函数采用链接,起始字节,结束字节和下载文件作为参数的路径。我调用此函数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();
}
感谢您的期待。
答案 0 :(得分:1)
RandomAccessFile is not thread safe.
raf.seek(begin)
失败,请参阅RandomAccessFile.seek()
设置文件指针偏移量,从此开始测量 文件,发生下一次读或写。可以设置偏移 超出文件的末尾。将偏移量设置为超出结束范围 文件不会更改文件长度。文件长度仅会更改 通过写入偏移量已经设置超出文件末尾。
您可以将部分文件下载到单独的文件中,然后合并它们。
您确定并行下载更快吗?