Java切割文件、合并文件

java后端开发,有时候会碰到大文件操作,这时候就需要堆大文件进行分割操作,左后最合并

导入依赖工具:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
</dependency>

自定义工具类:

/**
 * @version v1.0
 * @description: {单文件切割 、碎片文件合并}
 * @author: admin
 */
public class SplitMergeFileUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(SplitMergeFileUtil.class);
    /**
     * @param targetFileName   目标文件路径
     * @param saveDir      存放的目录
     * @param saveFileName 生成文件的前缀名
     * @param suffix       生成文件的后缀名
     * @param splitSize    每一个文件 多少行数据
     */
    public static void splitFile(String targetFileName, String saveDir, String saveFileName, String suffix, long splitSize) throws Exception {
        if (!saveDir.endsWith("\\")) {
            saveDir += File.separator;
        }
        File saveDirFile=new File(saveDir);
        if(!saveDirFile.exists()){
            saveDirFile.mkdirs();
        }
        File targetFile = new File(targetFileName);
        if (!targetFile.exists()) {
            throw new Exception("目标路径:[ " + targetFileName + " ] 有错误...");
        }
        //输入缓冲流
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(targetFileName), StandardCharsets.UTF_8));
        String str = null;
        //行数
        long len = 0;
        System.out.println("开始写入......请等待......");
        long startTime = System.currentTimeMillis();
        //输出缓冲流
        BufferedWriter writer = null;
        while ((str = reader.readLine()) != null) {
            //当前行文件
            long txtSize = (len/splitSize) + 1;
            String fileName = saveDir + saveFileName + txtSize + "." + suffix;
            //使用BufferedWriter如果 不进行 flush或者close 写入不了内容。
            writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName, true)));
            writer.write(str + System.lineSeparator());
            writer.flush();
            len++;
        }
        assert writer != null;
        writer.close();
        reader.close();
    }

    /**
     * 切割指定源文件
     * @param srcFile      指定要切割的源文件
     * @param outputDir   指定输出目录
     * @param size        切割大小
     * @param prefix       件名前缀
     * @param suffix       文件名后缀
     * @param
     * @throws IOException 有异常时抛出,由调用者处理
     */
    public static void split(File srcFile, String outputDir,String prefix, String suffix, int size) throws IOException {
        File  outFile=new File(outputDir);
        if(!outFile.exists()){
            outFile.mkdirs();
        }
        try (FileInputStream inputStream = FileUtils.openInputStream(srcFile);) {
            byte[] buffer = new byte[size];
            int len = 0;
            for (int i = 0; (len = IOUtils.read(inputStream, buffer)) > 0; i++) {
                String  fileName=suffix+i+"."+suffix;
                LOGGER.info("开始执行切割文件fileName="+fileName);
                File temp = FileUtils.getFile(outputDir, fileName);
                FileUtils.writeByteArrayToFile(temp, buffer, 0, len);
                LOGGER.info("结束执行切割文件fileName="+fileName);
            }
        }
    }


    /**
     * 合并文件
     * @param inputDir 碎片输入目录
     * @param destDir  合并目标文件目录
     * @param destName   合并后文件名称
     * @throws IOException 有异常时抛出,由调用者处理
     */
    public static void  combine(String inputDir, String  destDir,String destName ) throws IOException {
        File  destDirFile=new File(destDir);
        if(!destDirFile.exists()){
            destDirFile.mkdirs();
        }
        File inputPath = FileUtils.getFile(inputDir);
        String[] files = inputPath.list();
        try (FileOutputStream outputStream = FileUtils.openOutputStream(new File(destDir+destName))) {
            // 按文件名排序
            assert files != null;
            Arrays.sort(files);
            for (String fileName : files) {
                LOGGER.info("combineFormChips遍历指定目录的文件fileName="+fileName);
                File file = FileUtils.getFile(inputPath, fileName);
                byte[] data = FileUtils.readFileToByteArray(file);
                IOUtils.write(data, outputStream);
            }
        } catch (Exception e) {
            LOGGER.info("合并文件异常{}" + e.toString());
        }
    }



    public    static   void  main(String[]  args){
        try {
            split(new File("D:/download/NIO缓冲区.avi"),"D:/download/nio/","newNio","avi",30*1024*1024);
            combine("D:/download/nio/","D:/download/comnio/","combineNewNio.avi");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值