EasyClick 大文件分割合并
适用于网络不好的情况下载大文件容易失败,将大文件分割后上传服务器,分批次小量多次下载,然后合并为原文件
分割代码
js
// 分割
splitFile(源文件, 输出目录, 分片大小);
合并代码
js
mergeFiles(输出目录, 合并输出);
完整源码
JavaScript
const 源文件 = "/sdcard/xxxxxx.zip";
const 输出目录 = "/sdcard/fsplit/";
const 合并输出 = "/sdcard/xxxxxx2.zip";
const 分片大小 = 1024 * 1024; // 1MB
// 分割
splitFile(源文件, 输出目录, 分片大小);
// 合并
mergeFiles(输出目录, 合并输出);
/**
* 分割文件
* @param src
* @param dir
* @param chunkSize
*/
function splitFile(src, dir, chunkSize) {
try {
let fis = new java.io.FileInputStream(src);
let buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 8192);
let index = 1;
let fos = null;
new java.io.File(dir).mkdirs();
while (true) {
let len = fis.read(buffer);
if (len === -1) break;
if (!fos) {
let num = index + "";
while (num.length < 3) num = "0" + num;
let name = dir + new java.io.File(src).getName() + "." + num;
fos = new java.io.FileOutputStream(name);
}
fos.write(buffer, 0, len);
if (fos.getChannel().size() >= chunkSize) {
fos.close();
fos = null;
index++;
}
}
if (fos) fos.close();
fis.close();
toast("分割完成");
} catch (e) {
toast("分割错误:" + e);
}
}
/**
* 合并文件
* @param dir
* @param outPath
*/
function mergeFiles(dir, outPath) {
try {
let folder = new java.io.File(dir);
let files = folder.listFiles();
if (!files || files.length === 0) {
toast("无分片");
return;
}
// 正确排序:按文件名排序(001 → 002 → 003)
java.util.Arrays.sort(files);
let out = new java.io.FileOutputStream(outPath);
let buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 8192);
// 合并所有分片,不做错误过滤!
for (let i = 0; i < files.length; i++) {
let f = files[i];
let name = f.getName();
// 只合并 .001 .002 .003 ... 格式
if (name.matches(".+\\.\\d{3}$")) {
let inStream = new java.io.FileInputStream(f);
while (true) {
let len = inStream.read(buffer);
if (len === -1) break;
out.write(buffer, 0, len);
}
inStream.close();
}
}
out.close();
toast("合并完成!文件完整!");
} catch (e) {
toast("合并错误:" + e);
}
}
