java网络下载 文件错误的一个可能原因
寒假开始无事在家的我想遍一个多线程下载程序,语言当然是Java,原因有二一是linux下的下载程序太恶心....找不到好的,自己想写一个用用..二是想多实践一些java的基础编程,主要是网络和多线程编程.. 假期花了一个星期的时间基本完成了代码,不过遇到一个极端郁闷的问题:下载小程序完全正确,但是下载2M以上的程序就会出现下载完毕后程序不能运行。开始怀疑是Input流的问题,不过一直得不到解决,后
·
寒假开始无事在家的我想遍一个多线程下载程序,语言当然是Java,原因有二
一是linux下的下载程序太恶心....找不到好的,自己想写一个用用..
二是想多实践一些java的基础编程,主要是网络和多线程编程..
假期花了一个星期的时间基本完成了代码,不过遇到一个极端郁闷的问题:
下载小程序完全正确,但是下载2M以上的程序就会出现下载完毕后程序不能运行。开始怀疑是Input流的问题,不过一直得不到解决,后来自己也就没继续做这件事情。。。玩了一个假期。
最近几天把原来的程序拿出来,进行了一遍重构,增加了连接超时,连接重连,和保存半成品信息,并改进了原来的程序结构。不过不管怎么改进,原来那个恶心的问题还是存在,今天仔细的对比了用讯雷下载的文件,和我用我自己写的程序下载的文件的源文件(幸好有16进制编辑器。。。)终于发现了错误的规律是:
在出错的地方多出了一排00000000000000代码 或者其他代码,并且下载下来的文件与正确文件的大小不符。
接下载仔细看程序,和阅读api
我的一段读取代码(有错误时候) :
//512是缓存区域大小
byte[] b = new byte[512];
//读取InputStream的字节,in是一个InputStream对象
in.read(b);
//写入文件
raf.write(b);
这段代码有一个可怕的错误,从InputStream流中读入的数据只有缓冲区的0-256(从输入不稳定网络,很有可能这样),则后256个字节全部都是0
并且会被误认为读取了512个字节...这样的一个错误如果没有经验..确实难发现啊.,并且这段代码没有检查文件末尾
改正后的代码我把InputStream换成了BufferedInputStream,这样可以提高很大的下载效率
代码也改为
byte[] b = new byte[512];
int readBytesNumber = in.read(b, 0, b.length);
//遇到文件末尾
if(readBytesNumber==-1)
break
好的问题终于解决了。。。。。。。。。
一是linux下的下载程序太恶心....找不到好的,自己想写一个用用..
二是想多实践一些java的基础编程,主要是网络和多线程编程..
假期花了一个星期的时间基本完成了代码,不过遇到一个极端郁闷的问题:
下载小程序完全正确,但是下载2M以上的程序就会出现下载完毕后程序不能运行。开始怀疑是Input流的问题,不过一直得不到解决,后来自己也就没继续做这件事情。。。玩了一个假期。
最近几天把原来的程序拿出来,进行了一遍重构,增加了连接超时,连接重连,和保存半成品信息,并改进了原来的程序结构。不过不管怎么改进,原来那个恶心的问题还是存在,今天仔细的对比了用讯雷下载的文件,和我用我自己写的程序下载的文件的源文件(幸好有16进制编辑器。。。)终于发现了错误的规律是:
在出错的地方多出了一排00000000000000代码 或者其他代码,并且下载下来的文件与正确文件的大小不符。
接下载仔细看程序,和阅读api
我的一段读取代码(有错误时候) :
//512是缓存区域大小
byte[] b = new byte[512];
//读取InputStream的字节,in是一个InputStream对象
in.read(b);
//写入文件
raf.write(b);
这段代码有一个可怕的错误,从InputStream流中读入的数据只有缓冲区的0-256(从输入不稳定网络,很有可能这样),则后256个字节全部都是0
并且会被误认为读取了512个字节...这样的一个错误如果没有经验..确实难发现啊.,并且这段代码没有检查文件末尾
改正后的代码我把InputStream换成了BufferedInputStream,这样可以提高很大的下载效率
代码也改为
byte[] b = new byte[512];
int readBytesNumber = in.read(b, 0, b.length);
//遇到文件末尾
if(readBytesNumber==-1)
break
好的问题终于解决了。。。。。。。。。
更多推荐
已为社区贡献1条内容
所有评论(0)