Java切割文件、合并文件

    技术2022-07-11  89

    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(); } } }

     

    Processed: 0.015, SQL: 9