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);
    }
}
相关推荐
姚青&8 小时前
测试左移体系
python·自动化
weixin_307779139 小时前
Linux下Nginx故障系统化检查Shell脚本
linux·运维·服务器·nginx·自动化
安当加密03019 小时前
凭据管理自动化:从硬编码密码到动态轮换的DevSecOps实践
自动化·devsecops·凭据管理·密码轮换·硬编码治理
姚青&10 小时前
测试右移体系
自动化
2501_9336707910 小时前
二本通信工程就业前景与岗位分析:CDA数据分析师证书的加持之路
自动化
机器懒得学习12 小时前
WorkBuddy 使用教程:让 AI 成为你的超级助手
自动化·工作效率·[ai工具·ai助手]
曦尧13 小时前
Claude Code 全栈实战手册:从环境配置到生产部署
ai·自动化
随性而行36013 小时前
微信API接口与AI自动化:开发者的实现思路
运维·服务器·开发语言·人工智能·微信·自动化
霍格沃兹测试开发学社测试人社区17 小时前
TID质量竞争大会分享议题|科大讯飞:端到端大模型效果评测,从人工周级到自动化天级
大数据·人工智能·自动化
智脑API平台17 小时前
Codex CLI 怎么用 .env 配置 API Key?本地项目和自动化脚本接入教程
运维·自动化