文件切割与合并

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件切割与合并相关的知识,希望对你有一定的参考价值。

  1 /*
  2  * 文件切割器。
  3  * 
  4  * 
  5  * 
  6  * 
  7  */
  8 
  9 public class SplitFileDemo {
 10 
 11     private static final int SIZE = 1024 * 1024;
 12 
 13     /**
 14      * @param args
 15      * @throws Exception
 16      */
 17     public static void main(String[] args) throws Exception {
 18 
 19         File file = new File("c:\\aa.mp3");
 20 
 21         splitFile_2(file);
 22     }
 23 
 24     private static void splitFile_2(File file) throws IOException {
 25 
 26         // 用读取流关联源文件。
 27         FileInputStream fis = new FileInputStream(file);
 28 
 29         // 定义一个1M的缓冲区。
 30         byte[] buf = new byte[SIZE];
 31 
 32         // 创建目的。
 33         FileOutputStream fos = null;
 34 
 35         int len = 0;
 36         int count = 1;
 37         
 38         
 39         /*
 40          * 切割文件时,必须记录住被切割文件的名称,以及切割出来碎片文件的个数。 以方便于合并。
 41          * 这个信息为了进行描述,使用键值对的方式。用到了properties对象
 42          * 
 43          */
 44         Properties prop  = new Properties();
 45         
 46     
 47 
 48         File dir = new File("c:\\partfiles");
 49         if (!dir.exists())
 50             dir.mkdirs();
 51 
 52         while ((len = fis.read(buf)) != -1) {
 53 
 54             fos = new FileOutputStream(new File(dir, (count++) + ".part"));
 55             fos.write(buf, 0, len);
 56             fos.close();
 57         }
 58         
 59         //将被切割文件的信息保存到prop集合中。
 60         prop.setProperty("partcount", count+"");
 61         prop.setProperty("filename", file.getName());
 62         
 63         
 64         
 65         fos = new FileOutputStream(new File(dir,count+".properties"));
 66         
 67         //将prop集合中的数据存储到文件中。 
 68         prop.store(fos, "save file info");
 69 
 70         fos.close();
 71         fis.close();
 72 
 73     }
 74 
 75     public static void splitFile(File file) throws IOException {
 76 
 77         // 用读取流关联源文件。
 78         FileInputStream fis = new FileInputStream(file);
 79 
 80         // 定义一个1M的缓冲区。
 81         byte[] buf = new byte[SIZE];
 82 
 83         // 创建目的。
 84         FileOutputStream fos = null;
 85 
 86         int len = 0;
 87         int count = 1;
 88 
 89         File dir = new File("c:\\partfiles");
 90         if (!dir.exists())
 91             dir.mkdirs();
 92 
 93         while ((len = fis.read(buf)) != -1) {
 94 
 95             fos = new FileOutputStream(new File(dir, (count++) + ".part"));
 96             fos.write(buf, 0, len);
 97         }
 98 
 99         fos.close();
100         fis.close();
101 
102     }
103 
104 }

 

 

文件合并:

 

  1 public class MergeFile {
  2 
  3     /**
  4      * @param args
  5      * @throws IOException 
  6      */
  7     public static void main(String[] args) throws IOException {
  8 
  9         File dir = new File("c:\\partfiles");
 10         
 11         mergeFile_2(dir);
 12     }
 13     
 14     public static void mergeFile_2(File dir) throws IOException {
 15         
 16         /*
 17          * 获取指定目录下的配置文件对象。
 18          */
 19         File[] files = dir.listFiles(new SuffixFilter(".properties"));
 20         
 21         if(files.length!=1)
 22             throw new RuntimeException(dir+",该目录下没有properties扩展名的文件或者不唯一");
 23         //记录配置文件对象。
 24         File confile = files[0];
 25         
 26         
 27         
 28         //获取该文件中的信息================================================。
 29         
 30         Properties prop = new Properties();
 31         FileInputStream fis = new FileInputStream(confile);
 32         
 33         prop.load(fis);
 34         
 35         String filename = prop.getProperty("filename");        
 36         int count = Integer.parseInt(prop.getProperty("partcount"));
 37         
 38         
 39         
 40         
 41         //获取该目录下的所有碎片文件。 ==============================================
 42         File[] partFiles = dir.listFiles(new SuffixFilter(".part"));
 43         
 44         if(partFiles.length!=(count-1)){
 45             throw new RuntimeException(" 碎片文件不符合要求,个数不对!应该"+count+"个");
 46         }
 47         
 48         
 49         
 50         //将碎片文件和流对象关联 并存储到集合中。 
 51         ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
 52         for(int x=0; x<partFiles.length; x++){
 53             
 54             al.add(new FileInputStream(partFiles[x]));
 55         }
 56         
 57         
 58         
 59         //将多个流合并成一个序列流。 
 60         Enumeration<FileInputStream> en = Collections.enumeration(al);
 61         SequenceInputStream sis = new SequenceInputStream(en);
 62         
 63         FileOutputStream fos = new FileOutputStream(new File(dir,filename));
 64         
 65         byte[] buf = new byte[1024];
 66         
 67         int len = 0;
 68         while((len=sis.read(buf))!=-1){
 69             fos.write(buf,0,len);
 70         }
 71         
 72         fos.close();
 73         sis.close();
 74         
 75         
 76         
 77         
 78         
 79         
 80     }
 81 
 82     public static void mergeFile(File dir) throws IOException{
 83         
 84         
 85         ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
 86         
 87         for(int x=1; x<=3 ;x++){
 88             al.add(new FileInputStream(new File(dir,x+".part")));
 89         }
 90         
 91         Enumeration<FileInputStream> en = Collections.enumeration(al);
 92         SequenceInputStream sis = new SequenceInputStream(en);
 93         
 94         FileOutputStream fos = new FileOutputStream(new File(dir,"1.bmp"));
 95         
 96         byte[] buf = new byte[1024];
 97         
 98         int len = 0;
 99         while((len=sis.read(buf))!=-1){
100             fos.write(buf,0,len);
101         }
102         
103         fos.close();
104         sis.close();
105         
106     }
107 
108 }

 

 

public class SuffixFilter implements FilenameFilter {

    private String suffix;
    
    public SuffixFilter(String suffix) {
        super();
        this.suffix = suffix;
    }

    @Override
    public boolean accept(File dir, String name) {

        return name.endsWith(suffix);
    }

}

 

以上是关于文件切割与合并的主要内容,如果未能解决你的问题,请参考以下文章

Linux 大文件如何切割与合并?

Linux 下大文件切割与合并

Linux下如何切割与合并大文件

Linux 大文件如何切割与合并?

切割与合并和增删改查

63.当当网txt数据按行切割与合并