- 一、前言
- 二、工具类使用步骤
- 1.添加相关maven依赖
- 2.工具类代码
- 3.调用测试
- 三、结语
一、前言
前段时间笔者在开发项目过程中涉及到大文件的传输功能。笔者实现的思路是先将大文件进行压缩,后分成多个小文件进行传输,接收端接收后再进行小文件合并,后再进行解压得到原文件。下面是笔者提供的工具类,可拿来直接使用。
二、工具类使用步骤 1.添加相关maven依赖
2.工具类代码org.projectlombok lombok1.18.16
package com.ctsi.dbbackup.core.util; import lombok.extern.slf4j.Slf4j; import java.io.*; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Slf4j public class FileSplitUtil { private static final int FILE_SIZE = 1024; private static final int FILE_NAME_EXT = 1000; private static final int EOF = -1; private static final String SPLIT_FILE_NAME = "-split."; private static final String PLACEHOLDER = "zzz"; public static void split(File srcFile, String outPutDir, String compressType) throws IOException { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile)); //拆分成每个为10kb大小的文件 int saveSize = 10 * FILE_SIZE; byte[] bytes = new byte[saveSize]; int length; // 子文件下标 int filenameExt = FILE_NAME_EXT; while ((length = bis.read(bytes)) > EOF) { int ext = filenameExt++; try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outPutDir + ext + SPLIT_FILE_NAME + compressType))) { bos.write(bytes, 0, length); } } bis.close(); } public static void merge(String sliceDir, String compressType) throws IOException { List3.调用测试subFileNames = getSplitFileNames(sliceDir, compressType); if (subFileNames.size() < 1) { throw new RuntimeException("目录下没有分片文件..."); } BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(sliceDir + UuidUtil.getUuid() + "." + compressType)); for (String subFilename : subFileNames) { try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sliceDir + subFilename))) { // 每次读取1Mb大小的文件 byte[] bytes = new byte[FILE_SIZE]; int length; while ((length = bis.read(bytes)) > EOF) { bos.write(bytes, 0, length); } bos.flush(); } finally { File eachSubFile = new File(sliceDir + subFilename); if (eachSubFile.exists() && eachSubFile.delete()) { log.info("删除分片文件成功..."); } } } bos.close(); } public static List getSplitFileNames(String sliceDir, String compressType) { File file = new File(sliceDir); if (!file.isDirectory()) { throw new RuntimeException("不是一个目录..."); } String[] list = file.list(); if (list == null || list.length == 0) { throw new RuntimeException("目录下没有任何文件..."); } // 这里zzz为通用占位符、匹配分片文件 String filename = (PLACEHOLDER + SPLIT_FILE_NAME + compressType).replace(PLACEHOLDER, "\d+"); return Arrays.stream(list) .filter(s -> s.matches(filename)) .sorted() .collect(Collectors.toList()); } }
- main方法
public static void main(String[] args) throws IOException { // 分片 split(new File("E:/opt/aaa/test.zip"), "E:/opt/aaa/", "zip"); //合并 merge("E:/opt/bbb/", "zip"); }
-
调用前
-
调用后
三、结语
以上便是笔者封装的文件分片、合并工具类。若有出入的地方, 欢迎博友们指正。笔者感激不尽!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)