。这里outputStream也 有两次flush,与上面类似,不再赘述。
/** *//**author by http://www.bt285.cn http://www.guihua.org */
private void tempFileToTargetFile(ChildThread[] childThreads) {
try {
BufferedOutputStream outputStream = new BufferedOutputStream(
new FileOutputStream(fileDir + fileName));
// 遍历所有子线程创建的临时文件,按顺序把下载内容 写入目标文件中
for (int i = 0; i < threadNum; i++) {
if (statusError) {
for (int k = 0; k < threadNum; k++) {
if (childThreads [k].tempFile.length() == 0)
childThreads [k].tempFile.delete();
}
System.out.println("本次下载任务不 成功,请重新设置线程数。");
break;
}
BufferedInputStream inputStream = new BufferedInputStream(
new FileInputStream (childThreads[i].tempFile));
System.out.println("Now is file " + childThreads[i].id);
int len = 0;
int count = 0;
byte[] b = new byte[1024];
while ((len = inputStream.read(b)) != -1) {
count += len;
outputStream.write(b, 0, len);
if ((count % 5000) == 0) {
outputStream.flush();
}
// b = new byte[1024];
}
inputStream.close();
// 删除临时文件
if (childThreads[i].status == ChildThread.STATUS_HAS_FINISHED) {
childThreads[i].tempFile.delete ();
}
}
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
用java多线程断点续传实践(5)
时间:2010-12-22 BlogJava bitmap
4、最后,说说断点续传,前面为了实现断点续传,在每个下载线程中都创建 了一个临时文件,现在我们就要利用这个临时文件来设置断点的位置。由于临时 文件的命名方式都是固定的,所以我们就专门找对应下载的目标文件的临时文件 ,临时文件中已经下载的字节数就是我们需要的断点位置。startPos是一个数组 ,存放了每个线程的已下载的字节数。
//第一步,分析已下载的临时文件,设置断点,如果是新的下载任务,则建 立目标文件。
private long[] setThreadBreakpoint(String fileDir2, String fileNa
|