feat(download): 支持分区存储Uri下载模式
This commit is contained in:
@@ -22,6 +22,7 @@ import com.arialyy.aria.core.loader.IRecordHandler;
|
||||
import com.arialyy.aria.core.task.IThreadTaskAdapter;
|
||||
import com.arialyy.aria.util.ALog;
|
||||
import com.arialyy.aria.util.FileUtil;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
final class FtpDTTBuilderAdapter extends AbsNormalTTBuilderAdapter {
|
||||
@@ -31,6 +32,10 @@ final class FtpDTTBuilderAdapter extends AbsNormalTTBuilderAdapter {
|
||||
}
|
||||
|
||||
@Override public boolean handleNewTask(TaskRecord record, int totalThreadNum) {
|
||||
if (isUriMode()) {
|
||||
// 分区存储(Uri)模式没有本地临时文件,目标内容由ContentProvider管理,无需清理
|
||||
return true;
|
||||
}
|
||||
if (!record.isBlock) {
|
||||
if (getTempFile().exists()) {
|
||||
FileUtil.deleteFile(getTempFile());
|
||||
|
||||
@@ -15,14 +15,15 @@
|
||||
*/
|
||||
package com.arialyy.aria.ftp.download;
|
||||
|
||||
import aria.apache.commons.net.ftp.FTPClient;
|
||||
import aria.apache.commons.net.ftp.FTPReply;
|
||||
import com.arialyy.aria.core.AriaConfig;
|
||||
import com.arialyy.aria.core.common.SubThreadConfig;
|
||||
import com.arialyy.aria.exception.AriaFTPException;
|
||||
import com.arialyy.aria.ftp.BaseFtpThreadTaskAdapter;
|
||||
import com.arialyy.aria.util.ALog;
|
||||
import com.arialyy.aria.util.BufferedRandomAccessFile;
|
||||
import com.arialyy.aria.util.CommonUtil;
|
||||
import com.arialyy.aria.util.UriRandomAccessFile;
|
||||
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@@ -31,6 +32,9 @@ import java.nio.channels.Channels;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
|
||||
import aria.apache.commons.net.ftp.FTPClient;
|
||||
import aria.apache.commons.net.ftp.FTPReply;
|
||||
|
||||
/**
|
||||
* @author lyy
|
||||
* Date: 2019-09-18
|
||||
@@ -82,6 +86,27 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
|
||||
return;
|
||||
}
|
||||
|
||||
if (getThreadConfig().tempUri != null) {
|
||||
// 分区存储:通过 Uri 写入,支持断点续传
|
||||
UriRandomAccessFile uriFile = null;
|
||||
try {
|
||||
uriFile = new UriRandomAccessFile(AriaConfig.getInstance().getAPP(),
|
||||
getThreadConfig().tempUri, getThreadRecord().startLocation);
|
||||
readNormal(is, uriFile);
|
||||
handleComplete();
|
||||
} catch (IOException e) {
|
||||
fail(new AriaFTPException(
|
||||
String.format("通过 Uri 下载失败【%s】", getThreadConfig().url), e), true);
|
||||
} finally {
|
||||
if (uriFile != null) {
|
||||
try {
|
||||
uriFile.close();
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (getThreadConfig().isBlock) {
|
||||
readDynamicFile(is);
|
||||
} else {
|
||||
@@ -214,4 +239,29 @@ final class FtpDThreadTaskAdapter extends BaseFtpThreadTaskAdapter {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 分区存储:通过 Uri(FileChannel)写入数据,支持断点续传
|
||||
*/
|
||||
private void readNormal(InputStream is, UriRandomAccessFile file) throws IOException {
|
||||
byte[] buffer = new byte[getTaskConfig().getBuffSize()];
|
||||
int len;
|
||||
while (getThreadTask().isLive() && (len = is.read(buffer)) != -1) {
|
||||
if (getThreadTask().isBreak()) {
|
||||
break;
|
||||
}
|
||||
if (mSpeedBandUtil != null) {
|
||||
mSpeedBandUtil.limitNextBytes(len);
|
||||
}
|
||||
if (getThreadRecord().endLocation > 0
|
||||
&& getRangeProgress() + len >= getThreadRecord().endLocation) {
|
||||
len = (int) (getThreadRecord().endLocation - getRangeProgress());
|
||||
file.write(buffer, 0, len);
|
||||
progress(len);
|
||||
break;
|
||||
}
|
||||
file.write(buffer, 0, len);
|
||||
progress(len);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user