`
metaphy
  • 浏览: 339262 次
  • 性别: Icon_minigender_1
  • 来自: 大西洋底
社区版块
存档分类
最新评论

文件分割与合并

阅读更多
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/peter/Documents/abakup/";
//	private static final String FOLDER = "/Users/peter/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();
		}

	}

}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics