文件分割与合并
文件分割与合并
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();
}
}
}