深夜求帮助
求一个写多线程下载器的思路,深夜冒死求帮助啊 --------------------编程问答-------------------- 假定目标站点支持断点续传,那么思路如下:◎ 将下载的目标URL先设置好,简单起见可以作为一个 private static final String URL = ".....";
◎ 主线程启动后,用HttpClient 或自己写Socket程序也行,请求URL资源,获取其响应头信息的ContentLength,然后就可以切断连接了;
◎ 主线程创建子线程(比如10个),并为每个线程分配下载的起始字节位置和终止字节位置,然后start所有线程;
◎ 各子线程负责找URL获取指定位置的内容,利用HTTP头信息的Range;
◎ 主线程等待子线程结束后,组装各子线程所下载结果,然后合并写入文件。
注意,上述思路只是简单实现多点下载,如果碰到目标文件很大,将会导致OOM。
如果要支持大目标文件,主线程还需要一开始就根据服务器上的目标文件大小,在本地磁盘创建一个同样大小的文件,并打开为RandomAccess模式。各子线程下载一段内容后(比如 256KB),就需要直接写入本地文件(注意做并发保护synchronized),然后再继续下载。
发现网上大把已经实现代码,而且都不差,自己学习吧:
http://www.blogjava.net/Rexcj/archive/2008/07/27/217793.html
http://www.cnblogs.com/codestiny/articles/1269388.html
--------------------编程问答-------------------- 将下载的目标URL先设置好,简单起见可以作为一个 private static final String URL = ".....";
这个。我是想从我的输入框里截取到输入的URL地址,
下面那个文件分割的那个有点复杂,我可能还做不来。
能不能帮忙看看这段代码
public void run(){
try{
//网络文件的URL
String text = DownloadExamine.this.lblShowurl.getText();
URL url = new URL(text);
// 打开该网络文件的URL连接
URLConnection uc = url.openConnection();
//获得资源总共大小
int total = uc.getContentLength();
int length = String.valueOf(total).length();
String str = "";
if(length < 4){
str = String.valueOf((double) (Math.round(total *1000)/1000.0))+" 字节";
}
else if(length >= 4){
str = String.valueOf((double) (Math.round(total /1024d*1000)/1000.0))+" K";
}
else if(length >= 7){
str = String.valueOf((double) (Math.round(total /1024d/1024d*1000)/1000.0))+" M";
}
else if(length >= 10){
str = String.valueOf((double) (Math.round(total /1024d/1024d/1024d*1000)/1000.0))+" G";
}
else {
str = String.valueOf((double) (Math.round(total /1024d/1024d/1024d/1024d*1000)/1000.0))+" T";
}
lblShowfilesize.setText(str);
//创建网络文件的输入流
InputStream is = uc.getInputStream();
//从地址中提取文件名称以及类型
String fileName = text.substring(text.lastIndexOf("/")+1,text.length());
// 创建本地文件输出流
String fileName = lblShowname.getText();
FileOutputStream fos = new FileOutputStream(showsave+"\\"+fileName);
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int current = 0;//当前下载了几个字节
//读取网络文件到本地文件
int data;
while((data = bis.read())!=-1){
bos.write(data);
current++;
//计算下载程度填入
long percent = current*100L/total;
pgbDownplan.setValue((int)percent);
}
JOptionPane.showMessageDialog(null,"恭喜您,下载完成");
bis.close();
bos.close();
}catch(Exception e3){
e3.printStackTrace();
}
}
--------------------编程问答-------------------- 代码有什么好看的,写完了就测啊.
--------------------编程问答-------------------- 比较赞成三楼的观点,首先自己测试,然后说出自己发现的问题、疑问和分析观点,这样大家才能更有针对性的帮你,否则动辄就是好多代码,看多了也晕了 @_@ --------------------编程问答--------------------
补充:Java , Java SE