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# 文件分割与合并"实例源码,开发者可以学习到如何在C#环境中进行高效的文件操作,这对于开发涉及大量文件处理的项目至关重要。同时,这也是提升程序性能和用户体验的一个重要方面。理解并掌握这些技术,...
总结来说,Vue.js结合JavaScript的Blob API提供了处理大文件分割与合并的能力。通过灵活运用这些API,开发者可以构建出高效、可靠的文件处理系统。在实际项目中,还可以结合axios等HTTP库进行网络通信,以及vuex进行...
### Python 实现大文件分割与合并 在日常的开发工作中,我们经常遇到处理大文件的情况。这些文件可能因为体积过大而难以一次性加载到内存中进行处理,或是由于网络传输限制,需要将其分割成较小的部分来分别传输。...
本文将详细探讨文件分割与合并的基本概念、工作原理以及使用"文件分割与合并器"这一工具的优势。 文件分割是指将一个大文件拆分为多个小文件的过程,以便于传输、存储或满足特定条件。这通常通过计算文件的大小,...
通过理解并应用以上知识点,开发者可以构建出一个完整的C++文件分割与合并工具。这个工具不仅在理论知识上体现了C++的文件操作能力,还涉及到实际编程中的错误处理、性能优化和用户体验设计等多方面实践。
资源名:vb 文件分割与合并 实例源码 资源类型:程序源代码 源码说明: 文件分割,就是将一个大文件先拆分为若干个小文件,然后再对这些小文件分别进行处理。文件之所以能够被分割,是与文件在计算机里的存储方式...
总结来说,"VC实现的文件分割与合并程序"是一个使用Visual C++编写的工具,通过多线程技术提高文件处理速度。其中,`SimpleFileCut`负责基础的单线程文件切割,`ThreadFileCut`和`ThreadFCut_class`实现了多线程文件...
文件分割与合并是两个常见的操作,尤其在处理大型文件时,为了方便传输、存储或分步处理,我们常常需要将大文件分割成若干小文件,完成后又将其合并恢复原状。本实例以"文件分割与合并实例——单线程模式"为主题,...
【标题】"基于QT的文件分割与合并程序源码file_split.zip"是一个使用C++编程语言,基于QT框架开发的应用程序。这个程序的主要功能是将大文件进行分割成多个小文件,以便于存储、传输或者分块处理,同时也可以将这些...
C# 文件管理 文件分割与合并 可加密文件 try { if (txtLength.Text == ""||txtFile.Text.Trim()==""||txtPath.Text.Trim()=="") { MessageBox.Show("请将信息填写完整!", "提示", MessageBoxButtons.OK, ...
### Java实现文件分割与合并 #### 一、概述 本文将详细介绍如何使用Java语言实现文件的分割与合并功能。此技术对于数据传输、备份或处理大量数据时非常有用。通过分割大文件为较小的部分,可以有效地减少单个文件...
《文件分割与合并器 v1.0》是一款轻量级的实用工具,专注于解决大文件处理问题。在日常工作中,我们经常会遇到需要传输或存储的大文件,这时文件分割与合并的功能就显得尤为重要。这款软件仅有52Kb的体积,无需安装...
本示例聚焦于“VC++ 文件分割与合并”这一主题,这涉及到对大文件进行处理,以便更有效地存储、传输或管理。在《Visual C++ 程序开发范例宝典》中,这一部分主要讲解了如何使用INI文件来存储配置信息,以及如何进行...
"大文件分割与合并"是一个重要的技术主题,特别是在资源有限或者需要优化传输效率的情况下。Java作为广泛使用的编程语言,提供了丰富的API和库来处理这类问题。下面我们将详细探讨Java实现大文件分割与合并的相关...
在IT领域,文件分割与合并是一项基础且实用的技术,尤其对于处理大文件时非常有用。在Windows操作系统中,Visual C++(简称VC)是一种常用的编程环境,它支持C++语言,可以用来编写实现文件分割与合并功能的源代码。...
本压缩包中的"文件分割与合并源码"提供了一个实用的示例,展示了如何使用C#来实现大文件的分割和合并功能。这些功能在很多场景下都非常有用,例如在网络传输、存储优化或者数据分析中。现在,我们将深入探讨C#中实现...
"文件分割与合并程序"是一个实用工具,主要用于处理大文件,使其能够更便捷地存储、传输或管理。以下将详细阐述这个程序的相关知识点: 1. **文件分割**:文件分割是将一个大文件拆分成多个较小的块,通常用于克服...