EasyClick 大文件分割合并

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);
    }
}
相关推荐
疯狂的维修23 分钟前
PDPS关于cable的设定
自动化
云飞云共享云桌面6 小时前
苏州昆山精密机械加工厂研发部门10个SolidWorks可以部署云飞云共享云桌面吗?
大数据·运维·服务器·自动化·汽车·制造
云飞云共享云桌面7 小时前
自动化设备厂 10 人研发团队,如何共用一台服务器做 SolidWorks 建模?
运维·服务器·网络·3d·自动化·制造
醉颜凉1 天前
数据仓库实战:自动化数据质量检测全流程——精准提升数据准确性与完整性
大数据·数据仓库·自动化
HBYKKJ1 天前
格雷希尔GFL浮动组件:大范围浮动补偿赋能自动化产线高效柔性对接,兼容大部分对正场景,适配市面常见的机器人末端执行器与工装安装板
人工智能·机器人·自动化
天远Date Lab1 天前
零信任架构实战:基于天远行驶证核查构建自动化车队准入网关
运维·人工智能·架构·自动化
St_rive1 天前
webUI自动化实现及封装
运维·自动化
QYR_111 天前
2032年气相分解设备市场规模达2.25亿美元:VPD向高灵敏度、自动化晶圆污染检测升级
运维·自动化
Είναι η κοπέλα1 天前
游戏窗口自动化点击与防误点设计:模板匹配 + 区域限制 + 强制置顶
运维·游戏·自动化
深念Y1 天前
AI Agent 时代运维安全:rm 防误删方案对比
linux·运维·人工智能·安全·自动化·agent