文件分割与合并

package com.test.filestool;  
  
import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.FileReader;  
import java.io.FileWriter;  
import java.io.IOException;  
import java.math.BigInteger;  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.Random;  
  
public class FileSplit {  
    private static final boolean SPLIT_ACTION = true;   
    private static final String FOLDER = "/Users/user/Documents/abakup/";  
//  private static final String FOLDER = "/Users/user/Desktop/fstest/";  

    private static final String[] FILES = { "a", "b", "c","d"};  
    private static final int BLOCK_SIZE = 1024 * 1024; // 1M  

    private static final int SPLIT_TO_FOLDERS_COUNT = 10;   
    private static final String MAPPING = "mapping.txt";  
        
  
    private HashMap<String, ArrayList<String>> folderMap = new HashMap<String, ArrayList<String>>();  
  
    public FileSplit() {  
        // init. create folders 0-9  

        for (int i = 0; i < SPLIT_TO_FOLDERS_COUNT; i++) {  
            File folder = new File(FOLDER + i);  
            if (!folder.exists()) {  
                folder.mkdirs();  
            }  
        }  
        for (String f : FILES) {  
            folderMap.put(f, new ArrayList<String>());  
        }  
    }  
  
    // Split the file into smaller ones  

    private void split(String fileName) throws IOException {  
        Random r = new Random();  
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(FOLDER + fileName));  
        FileOutputStream fos = null;  
        byte[] buf = new byte[BLOCK_SIZE];  
        int len = 0;  
        while ((len = bis.read(buf)) != -1) {  
            String blockName = new BigInteger(165, r).toString(36);  
            String newFileName = String.valueOf(r.nextInt(SPLIT_TO_FOLDERS_COUNT)) + "/" + blockName;  
            // System.out.println(newFileName);  

            File newFile = new File(FOLDER + newFileName);  
            if (!newFile.exists()) {  
                newFile.createNewFile();  
            }  
            fos = new FileOutputStream(newFile);  
            fos.write(buf, 0, len);  
            fos.close();  
            // save to mapping  

            ArrayList<String> list = folderMap.get(fileName);  
            list.add(newFileName);  
            folderMap.put(fileName, list);  
        }  
        bis.close();  
        System.out.println("File split done. [Filename] = " + fileName);   
    }  
  
    // Save mapping to the file  

    private void saveMapping() throws IOException {  
        StringBuffer sbf = new StringBuffer();  
        for (String f : FILES) {  
            ArrayList<String> list = folderMap.get(f);  
            for (String s : list) {  
                sbf.append(f + ":" + s + "\n");  
            }  
        }  
        File output = new File(FOLDER + MAPPING);  
        if (!output.exists()) {  
            output.createNewFile();  
        }  
        FileWriter fw = new FileWriter(output);  
        fw.write(sbf.toString());  
        fw.close();  
        //System.out.println(sbf.toString());  

        System.out.println("Mapping file saved!");  
    }  
      
    private void splitAll() throws IOException {  
        //Split  

        for(String fileName: FILES) {  
            split(fileName);  
        }  
        saveMapping();  
    }  
    // Combine the new file  

    private void combine() throws IOException {  
        HashMap<String, ArrayList<String>> smallFiles = new HashMap<String, ArrayList<String>>();  
        BufferedReader br = new BufferedReader(new FileReader(FOLDER + MAPPING));  
        String line = null;  
        while ((line = br.readLine()) != null) {  
            line = line.trim();  
            if (!line.equals("")) {  
                String[] ss = line.split(":");  
                ArrayList<String> list = null;  
                if (smallFiles.containsKey(ss[0])) {  
                    list = smallFiles.get(ss[0]);  
                } else {  
                    list = new ArrayList<String>();  
                }  
                list.add(ss[1]);  
                smallFiles.put(ss[0], list);  
            }  
        }  
        br.close();  
          
        byte[] buf;   
        for(String file: smallFiles.keySet()) {  
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(FOLDER + file));  
            ArrayList<String> list = smallFiles.get(file);  
            for(String smallF: list) {  
//              System.out.println(smallF);  

                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(FOLDER + smallF));  
                buf = new byte[BLOCK_SIZE];   
                int len = bis.read(buf);  
                bos.write(buf, 0, len);  
                bis.close();  
            }  
            bos.close();  
            System.out.println("File generated. [Filename] = " + file);   
        }  
    }  
      
    public static void main(String[] args) {  
        FileSplit myfs = new FileSplit();  
        try {  
            if (SPLIT_ACTION) {  
                myfs.splitAll();   
            } else {  
                myfs.combine();  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
    }  
  
}