这是项目中遇到的一个问题,需要解析一个xml文件,得到要下载的文件列表,根据该文件列表来下载数据包。刚开始一直想用使用for、while等流程控制语句。但导致的结构就是开启了多个线程。可是,实际上只能开启一个任务,该任务为下载列表中某个数据包的下载任务,而该下载任务则是使用多线程下载实现的。
后来,因为涉及到当前下载进度的统计和反馈,越写越乱。于是又重新写了个测试程序,突然想到可以使用递归实现单任务的线程队列。于是,这个问题就就解决了,在这里mark一下,基础水平太差啊,不是专业出身,就该更加努力啊!!!
public void startDownload() {
HttpURLConnection connection = null;
RandomAccessFile randomAccessFile = null;
InputStream is = null;
try {
URL url = new URL(URL_PATH + this.dataPaths[downloadFlag]);
connection = (HttpURLConnection)url.openConnection();
connection.setConnectTimeout(5000);
connection.setRequestMethod("GET");
int fileSize = connection.getContentLength();
//设置数据范围,格式为Range:bytes x-y
//connection.setRequestProperty("Range", "bytes=0-" + fileSize);
File file = new File(localFile + dataPaths[downloadFlag]);
if(!file.exists()) {
file.createNewFile();
}
randomAccessFile = new RandomAccessFile(localFile
+ dataPaths[downloadFlag], "rwd");
randomAccessFile.seek(0);
//将要下载的文件写到保存路径中
is = connection.getInputStream();
byte[] buffer = new byte[4096]; //每次读取的数据量
int length = -1;
while((length = is.read(buffer)) != -1) {
randomAccessFile.write(buffer, 0, length);
}
//递归方法,下载下一个数据包
downloadFlag ++;
if(downloadFlag < this.dataPaths.length) {
startDownload();
}
} catch(Exception e){
e.printStackTrace();
} finally {
try {
is.close();
randomAccessFile.close();
connection.disconnect();
} catch(Exception e){
e.printStackTrace();
}
}
}