开箱即用IO流实现文件分块合并

2023-11-06


在这里插入图片描述

断点上传文件的前置知识,用io流实现文件分块与合并。
分块示例

一、文件分块

    /**
     * 文件分块
     *
     * @param sourceFile 源文件
     * @param targetDir  分块文件存放目录
     */
    public static void Chunk(String sourceFile, String targetDir) {
        //        准备文件
        File file = new File(sourceFile);
        if (!file.exists()) {
            System.out.println("源文件不存在");
            return;
        }

        //准备输入流读取文件,并且分块写入到指定目录
        RandomAccessFile randomAccessFile = null;
        try {
//            随机流,用于读取文件到内存,并且写入文件到磁盘
            randomAccessFile = new RandomAccessFile(file, "rw");
            //        分块大小 此处为1M
            long chunkSize = 1024 * 1024 * 1;

//        每次读取的字节数
            byte[] bytes = new byte[1024];

//        分块数   向上取整
            long ceil = (long) Math.ceil(randomAccessFile.length() * 1.0 / chunkSize);
//          分块文件放在指定目录
            File dir = new File(targetDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            int len = -1;
            for (int i = 0; i < ceil; i++) {
                File temp = new File(targetDir + "\\" + i);
                RandomAccessFile randomAccessFile1 = new RandomAccessFile(temp, "rw");
                while ((len = randomAccessFile.read(bytes)) != -1) {
                    randomAccessFile1.write(bytes, 0, len);
                    if (temp.length() >= chunkSize) {
                        break;
                    }
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (randomAccessFile != null) {
                try {
                    randomAccessFile.close();
                    System.out.println("分块成功");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

二、文件合并

    /**
     * @param sourceDir 分块文件目录
     * @param fileName  合并文件名,需要带上后缀
     */
    public static void Merge(String sourceDir, String fileName) {
//        找到源文件路径,循环所有的分块文件,输出到一个文件中
        File file = new File(sourceDir);
        if (!file.exists()) {
            System.out.println("目录不存在");
            return;
        }
        File[] files = file.listFiles();
        if (files.length == 0) {
            System.out.println("目录中没有文件");
        }

        RandomAccessFile randomAccessFile = null;
        try {
//            合并的文件放在分块目录中
            randomAccessFile = new RandomAccessFile(sourceDir + "\\" + fileName, "rw");
            //        确保合并的顺序   分块是0-n,要确保合并顺序
            List<File> list = Arrays.asList(files);
            Collections.sort(list, (a, b) -> Integer.valueOf(a.getName()) - Integer.valueOf(b.getName()));
            RandomAccessFile randomAccessFile1 = null;
            for (File temp : list) {
                randomAccessFile1 = new RandomAccessFile(temp, "rw");
                int len = -1;
                byte[] bytes = new byte[1024];
                while ((len = randomAccessFile1.read(bytes)) != -1) {
                    randomAccessFile.write(bytes, 0, len);
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                randomAccessFile.close();
                System.out.println("合并成功");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开箱即用IO流实现文件分块合并 的相关文章

随机推荐

  • 使用注解开发springmvc

    第三步 pom xml文件引入相关依赖 主要有Spring框架核心库 Spring MVC servlet JSTL等 第四步 配置web xml 映射路径 不要为 会404 第六步 创建Controller RequestMapping
  • 某宝滑块ua特征研究

    从137版本开始某宝新加了x 82类型滑块 和之前无感或者滑动验证js 类似 不过浏览器特征检测 反调试干扰都增加了不少 变得更有难度 下面稍微讲下研究过程 首先处理大量三目运算符 这个没啥好办法 博主用ast处理的 类似下面这种 单步调试
  • 贪心算法求解TSP问题(python)

    这里使用贪心算法求解TSP问题的python版本 dist 为距离矩阵 start index 为起始位置 def tsp quick dist list start index int sum distance seq result n
  • 用C++做一颗会跳动的爱心

    先来看看效果 程序描述 程序先以较慢的速度画一个大爱心 之后跳动的心其实从视觉上看就是一大一小两个心相互切换 但是要调整一下大小爱心变化时的时间间隔 代码主要是通过设置两个函数 利用cls来清屏 重复打印大心和小心 并设置颜色为红色 详细代
  • php公众号获取code,微信公众号获取code

    methods getCode 非静默授权 第一次有弹框 this code var local window location href 获取页面url var appid wx65adcf075369 this code this ge
  • 使用LFM(Latent factor model)隐语义模型进行Top-N推荐

    最近在拜读项亮博士的 推荐系统实践 系统的学习一下推荐系统的相关知识 今天学习了其中的隐语义模型在Top N推荐中的应用 在此做一个总结 隐语义模型LFM和LSI LDA Topic Model其实都属于隐含语义分析技术 是一类概念 他们在
  • Windows 下如何安装配置Snort视频教程

    Windows 下如何安装配置Snort视频教程 第一步 http www tudou com programs view UUbIQCng360 第二部 http www tudou com programs view NqcPETQk2
  • 【算法】算法学习三:递归算法 & 栈

    文章目录 一 递归的含义 二 基线条件和递归条件 三 栈 3 1 什么是栈 3 2 调用栈 3 3 递归调用栈 一 递归的含义 递归算法是一种解决问题的方法 其中函数在执行过程中调用自身 它通过将一个大问题拆分成一个或多个相似的子问题 并逐
  • 数据倾斜2

    数据倾斜的原因和解决方案 MapReduce简介 MapReduce是面向大数据并行处理的计算模型 框架和平台 它隐含了以下三层含义 1 MapReduce是一个基于集群的高性能并行计算平台 Cluster Infrastructure 它
  • 文件上传到Linux服务器常用方法

    本文介绍几种常见的方法 把文件上传到Linux服务器中 常见有使用 scp命令 xshell软件里的xftp程序 U盘挂载 服务器自带的lrzsz程序 一 scp使用说明 1 把本机的文件传给目的服务器 linux linux scp ge
  • 修改Windows的git bash的主题(样式)

    背景 Windows的git bash页面默认是黑白的 如何改成别的颜色 PS 我一直不太喜欢黑色主题的软件 有几个原因 大多软件是白色的 看久了黑色切换到其他软件的时候眼睛不适应 字体等对比不强 我真的不知道为啥这么多人喜欢IDEA黑色主
  • 数组类型方法

    数组类型方法 1 concat 创建一个新数组 将array与任何数组 或 值连接在一起 let arr 1 2 3 4 let arr2 9 let arr3 arr concat arr2 console log arr3 1 2 3
  • jQuery操作类样式(增加、移除、判断)

    一 增加和移除一个或多个类样式的方法 1 增加一个类样式的方法 1 当前需要增加样式的元素 addClass cls 注意在addClass方法中类样式的名字前面没有点 2 增加多个类样式的方法 1 第一种写法 当前需要增加样式的元素 ad
  • 最新Landsat数据下载教程

    目前 国内下载Landsat数据可以通过USGS网站或者地理空间数据云下载 由于USGS对Landsat数据进行了修改 地理空间数据云目前只存储有2017年5月之前的数据 本文只介绍从USGS网站下载Landsat数据 USGS有两个网站可
  • mysql: using the Connector/J connection property ‘autoReconnect=true‘ to avoid this problem

    报错信息 com mysql cj jdbc exceptions CommunicationsException The last packet successfully received from the server was 1 12
  • 怎么使用Web Workers提升性能?

    一 概述 Web Workers 使得一个Web应用程序可以在与主执行线程分离的后台线程中运行一个脚本操作 这样做的好处是可以在一个单独的线程中执行费时的处理任务 从而允许主 通常是UI 线程运行而不被阻塞 它的作用就是给JS创造多线程运行
  • samba linux命令,Linux下的samba命令技巧

    昨天想DX学习了的Linux命令 当我想独占服务器上的A文件上 发现已经有用户正在使用 可以打下如下命令 smbstatus grep DEF M 显示如下 albert koidemrp smbstatus grep DEF M PID
  • centos使用sh脚本启动jar包

    centos使用sh脚本启动jar包 1 可以在windows上编辑好 上传至服务器 也可以在centos中直接新建文件 文件以 sh命名 例如 demo sh abc sh bin bash name jar包启动脚本 jar包所在位置
  • 【C++】—— 多态

    目录 一 多态的概念 二 多态的定义及实现 1 多态的构成条件 2 虚函数 3 虚函数的重写 4 虚函数重写的两个例外 1 协变 2 析构函数的重写 5 C 11 override和final 6 重载 覆盖 重写 隐藏 重定义 的对比 三
  • 开箱即用IO流实现文件分块合并

    文章目录 一 文件分块 二 文件合并 断点上传文件的前置知识 用io流实现文件分块与合并 一 文件分块 文件分块 param sourceFile 源文件 param targetDir 分块文件存放目录 public static voi