这两天把原来写的多线程下载程序整理了一下,考虑到原来的都是散文件,使用起来也不方便,所以决定把其写JAR,这样,使用起来也方便。并且增加使用XML保存下载文件以便下次再次下载,也修正了原来的一些BUG,只要你的电脑允许,想同时有多少个下载就有多少个下载。
这里我有一个示例,因为这里用到了JDOM处理XML文件,本来是想把用到的JDOM也把包到downFile.jar(下载地址:http://dl2.csdn.net/down4/20070710/10102631756.rar,源程序下载地址:http://dl2.csdn.net/down4/20070710/10140804846.rar)(第一次修正后的jar:(又传不上来了))里面的,可是试了好多次、好几种方法都不行,所以你首先得把JDOM配好,然后再把我的downFile.jar也放在类路径里面,直接运行就可以看到效果,在保存文件目录下面会生成一个保存文件下载的XML文件,该文件不能够自动删除,可以删除也可以不删除,并不会影响到程序的运行,这个文件主要是方便于断点续传,下面是示例源程序,很简单的:
import com.downfile.*;
/*
*请先配置好JDOM及downFile.jar
*作者:http://blog.csdn.net/fenglibing
*希望听到各位的见意,里面肯定还有很多的不足,如果需要源程序,请给我联系。
*/
public class DownFileTest {
public DownFileTest() {
}
public static void main(String[] args) {
String urlFile; //网络地址
int threadNum; //文件下载线程数
String localAddress; //本地地址
urlFile = "http://www.netbox.cn:88/download/nbsetup.EXE";
//现在还只能够处理1到9个线程,后面的的版本再增加
threadNum = 9;
//注:路径的形式一定要写出下面的格式,特别的最好的路径称号不能缺
localAddress = "d://multiDownTest//";//这个文件夹如果不存在,会自动创建
//这里采用三个软件同时下载,当然你可以多下载,使用就是这么方便
DownFile downFile = new DownFile(urlFile, threadNum, localAddress);
downFile.startDownFile();
urlFile = "http://dl.360safe.com/setup.exe";
DownFile downFile1 = new DownFile(urlFile, threadNum, localAddress);
downFile1.startDownFile();
urlFile = "http://down.sandai.net/Thunder5.6.8.329.exe";
DownFile downFile2 = new DownFile(urlFile, threadNum, localAddress);
downFile2.startDownFile();
}
}
--------------------------------------------------
BUG修正:
抓出来的BUG,错误分析及解决方案:
1、发生错误,说是找不到文件
原因,肯定是在合并的时候,又在删除文件,并且删除文件比合并先完成,而不是合成完成后再删除文件
java.io.FileNotFoundException: d:/multiDownTest/tmp0/setup.exe.part27.tp (系统找不到指定的路径。)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:70)
at com.downfile.GetFileThread.run(GetFileThread.java:148)
at java.lang.Thread.run(Thread.java:595)
解决:原来的利用线程去检测临时文件夹中是否还有.tp临时文件,如果没有就执行合并及删除操作,
假设当前只有一个临时文件,而恰恰就在这个时假完成了,那么下面就没有临时文件了,那此
我就执行了合并删除操作,而我的程序去还要去删除那些根本没有产生的文件,所以就会报错,
解决方法:下面的“为什么找不到文件”
2、在程序运行的过程中,到生成的临时文件夹中去查看,如要求生成30个线程,可是在临时文件夹下面
只能够看到10多个左右的临时文件,表明线程并没有完成生成
有两个原因:
1)本身程序的问题,就是没有把线程抛出完,就却执行下一个操作,是还没有来得急产生需要数目的线程,
另外的线程在执行中
解决办法:如下“为什么找不到文件”
为什么找不到文件:
我想可能是这样的,因为线程在创建的时候,有可能只创建只创建了一个线程,就被其它的线程给抢走了,
而检查当前文件夹下面是否还有.tp文件就刚好在这个文件下载完成的时候去检测,那它就认为没有.tp文件了,
解决办法:
1):是把检测时间设长一点
2):一定要当前是二十个(如线程数为20)文件才能够说是完成了
3):两者同时使用,要保证当前文件夹下面文件的数目是我们设定的设定的线程数目才去检测是否已经完成
检测时间可不设那么长,因为这要拖延时间,这就会间接的产生超时错误
3、java.net.ConnectException: Connection timed out: connect,连接超时错误,如果一个线程
的操作时间过长,超过了默认的等待时间,那么线程就会报操作超时的错误,因为在当前程序中操作I/O的
时候比较多,为了尽量减少超时的可能性,我通过程序设定了超时的时间为15秒。当然,并不能够完全避免
超时的错误,只能够说尽量的避免,这还与个人电脑的配置及网络的带宽有一定的联系了。
4、出现数字格式化错误:
java.lang.NumberFormatException: null
at java.lang.Long.parseLong(Long.java:372)
at java.lang.Long.parseLong(Long.java:461)
at com.downfile.MultiThreadGetFile.init(MultiThreadGetFile.java:148)
at com.downfile.MultiThreadGetFile.run(MultiThreadGetFile.java:196)
at java.lang.Thread.run(Thread.java:595)
原因:在格式化取得文件长度为长整性时发生错误,一时有可能当前网络一时阻塞,没能够获得文件的长度,
就会出错,原来没有在这个方面处理一下,现在一直去读该文件去读,直到一定的次数后才放弃,这样
就保证不能够读到文件长度的机率大大减少,增强的程序的健状性。
注:该程序在运行的时候还是有可能出现连接超时的情况,如果出现这种情况,请再尝试调用程序,此时程序会自动进行断点续传,前提是没有更改下载线程数及文件存放位置。