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();
}
}
}
分享到:
相关推荐
C# 文件分割与合并 实例源码(文件处理)
资源名:vb 文件分割与合并 实例源码 资源类型:程序源代码 源码说明: 文件分割,就是将一个大文件先拆分为若干个小文件,然后再对这些小文件分别进行处理。文件之所以能够被分割,是与文件在计算机里的存储方式...
最好的文件分割与合并工具,很好用的说推荐
C# 文件管理 文件分割与合并 可加密文件 try { if (txtLength.Text == ""||txtFile.Text.Trim()==""||txtPath.Text.Trim()=="") { MessageBox.Show("请将信息填写完整!", "提示", MessageBoxButtons.OK, ...
C++实现文件分割与合并
主要为大家详细介绍了python实现大文件分割与合并,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
vue实现文件分割与合并
实现文件分割与合并:是DELPHI关于文件分割与合并的源码
VC实现的文件分割与合并,为了提高效率实现多线程文件分割和合并。
【面试笔试】写两个函数,完成文件分割与合并的功能。假设每个分割文件的大小为100KB,被分割文件的大小不限。分割的第1个文件含有文件合并的信息(以下简称 信息块),即通过解析第1个文件,即可完成文件合并的操作...
Java实现文件分割与合并,初级开发人员学习
文件分割与合并源码 文件分割与合并源码 文件分割与合并源码 VC
java实现的大文件分割与合并
你在为文件太大而烦恼吗? 你在为文件传输信息而烦恼吗? 那就来看看这个文件分割器吗? VB编写 用二进制将文件分割成多个文件,后然再选择生成的ML信息文件即可将分割后的文件合并如初
提供文件分割与合并实例——单线程模式的源代码,所有代码在vc++6.0调试通过,
基于QT的文件分割与合并程序源码,C与C++
Winform中实现文件分割与合并示例代码;
文件分割与合并(C# Winforms)