java大文件的分割和合并详解编程语言

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.FilenameFilter; 
import java.io.SequenceInputStream; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Enumeration; 
import java.util.List; 
import java.util.Properties; 
  
/** 
 * SplitFile.java 
 * @author:<a href="mailto:[email protected]">bylv</a> 
 * @DATE:2015-9-7  上午09:27:43 
 *  Copyright (C) 2011 ISoftStone 
 */ 
  
/** 
 * 功能说明: 
 *  
 * @author: <a href="mailto:[email protected]">bylv</a> 
 * @DATE:2015-9-7 @TIME: 上午09:27:43 
 */ 
public class SplitFile { 
  
    private static final int SIZE = 1024 * 1024;// 定义单个文件的大小这里采用1m 
  
    /** 
     * 功能说明: 
     *  
     * @param args 
     * @author: <a href="mailto:[email protected]">bylv</a> 
     * @throws Exception 
     * @DATE:2015-9-7 @TIME: 上午09:27:44 
     */ 
    public static void main(String[] args) throws Exception { 
        // 拆分 
        // File file = new File("D:/无标题.bmp"); 
        // splitFile(file); 
        // 合并 
        File file = new File("C:/parfiles"); 
        mergeFile(file); 
    } 
  
    /** 
     * 功能说明:合并文件 
     *  
     * @param file 
     * @author: <a href="mailto:[email protected]">bylv</a> 
     * @throws Exception 
     * @throws FileNotFoundException 
     * @DATE:2015-9-7 @TIME: 上午09:47:31 
     */ 
    private static void mergeFile(File dir) throws Exception { 
        // 读取properties文件的拆分信息 
        File[] files = dir.listFiles(new FilenameFilter() { 
            @Override 
            public boolean accept(File dir, String name) { 
                return name.endsWith(".properties"); 
            } 
        }); 
        File file = files[0]; 
        // 获取该文件的信息 
        Properties pro = new Properties(); 
        FileInputStream fis = new FileInputStream(file); 
        pro.load(fis); 
        String fileName = pro.getProperty("fileName"); 
        int splitCount = Integer.valueOf(pro.getProperty("partCount")); 
        if (files.length != 1) { 
            throw new Exception(dir + ",该目录下没有解析的properties文件或不唯一"); 
        } 
  
        // 获取该目录下所有的碎片文件 
        File[] partFiles = dir.listFiles(new FilenameFilter() { 
            @Override 
            public boolean accept(File dir, String name) { 
                return name.endsWith(".part"); 
            } 
        }); 
        // 将碎片文件存入到集合中 
        List<FileInputStream> al = new ArrayList<FileInputStream>(); 
        for (int i = 0; i < splitCount; i++) { 
            try { 
                al.add(new FileInputStream(partFiles[i])); 
            } catch (Exception e) { 
                // 异常 
                e.printStackTrace(); 
            } 
        } 
        try { 
            // 构建文件流集合 
            Enumeration<FileInputStream> en = Collections.enumeration(al); 
            // 将多个流合成序列流 
            SequenceInputStream sis = new SequenceInputStream(en); 
            FileOutputStream fos = new FileOutputStream(new File(dir, fileName)); 
            byte[] b = new byte[1024]; 
            int len = 0; 
            while ((len = sis.read(b)) != -1) { 
                fos.write(b, 0, len); 
            } 
            fos.close(); 
            sis.close(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
  
    /** 
     * 功能说明:拆分文件 
     *  
     * @param file 
     * @author: <a href="mailto:[email protected]">bylv</a> 
     * @DATE:2015-9-7 @TIME: 上午09:28:58 
     */ 
    private static void splitFile(File file) { 
        try { 
            FileInputStream fs = new FileInputStream(file); 
            // 定义缓冲区 
            byte[] b = new byte[SIZE]; 
            FileOutputStream fo = null; 
            int len = 0; 
            int count = 0; 
  
            /** 
             * 切割文件时,记录 切割文件的名称和切割的子文件个数以方便合并 
             * 这个信息为了简单描述,使用键值对的方式,用到了properties对象 
             */ 
            Properties pro = new Properties(); 
            // 定义输出的文件夹路径 
            File dir = new File("C:/parfiles"); 
            // 判断文件夹是否存在,不存在则创建 
            if (!dir.exists()) { 
                dir.mkdirs(); 
            } 
            // 切割文件 
            while ((len = fs.read(b)) != -1) { 
                fo = new FileOutputStream(new File(dir, (count++) + ".part")); 
                fo.write(b, 0, len); 
                fo.close(); 
            } 
            // 将被切割的文件信息保存到properties中 
            pro.setProperty("partCount", count + ""); 
            pro.setProperty("fileName", file.getName()); 
            fo = new FileOutputStream(new File(dir, (count++) + ".properties")); 
            // 写入properties文件 
            pro.store(fo, "save file info"); 
            fo.close(); 
            fs.close(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
  
    } 
  
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10550.html

(0)
上一篇 2021年7月19日 10:19
下一篇 2021年7月19日 10:19

相关推荐

发表回复

登录后才能评论