`
metaphy
  • 浏览: 344095 次
  • 性别: 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();
		}

	}

}


分享到:
评论

相关推荐

    最好的文件分割与合并工具

    在这种情况下,文件分割与合并工具就显得尤为重要。本文将详细介绍一款被称为“最好的文件分割与合并工具”,并探讨其相关知识点。 首先,文件分割是指将一个大文件分解成多个小文件,每个小文件通常具有相同的格式...

    C# 文件分割与合并 实例源码(文件处理)

    通过这个"C# 文件分割与合并"实例源码,开发者可以学习到如何在C#环境中进行高效的文件操作,这对于开发涉及大量文件处理的项目至关重要。同时,这也是提升程序性能和用户体验的一个重要方面。理解并掌握这些技术,...

    vue实现文件分割与合并

    总结来说,Vue.js结合JavaScript的Blob API提供了处理大文件分割与合并的能力。通过灵活运用这些API,开发者可以构建出高效、可靠的文件处理系统。在实际项目中,还可以结合axios等HTTP库进行网络通信,以及vuex进行...

    python实现大文件分割与合并

    ### Python 实现大文件分割与合并 在日常的开发工作中,我们经常遇到处理大文件的情况。这些文件可能因为体积过大而难以一次性加载到内存中进行处理,或是由于网络传输限制,需要将其分割成较小的部分来分别传输。...

    文件分割与合并器

    本文将详细探讨文件分割与合并的基本概念、工作原理以及使用"文件分割与合并器"这一工具的优势。 文件分割是指将一个大文件拆分为多个小文件的过程,以便于传输、存储或满足特定条件。这通常通过计算文件的大小,...

    C++实现文件分割与合并.rar

    通过理解并应用以上知识点,开发者可以构建出一个完整的C++文件分割与合并工具。这个工具不仅在理论知识上体现了C++的文件操作能力,还涉及到实际编程中的错误处理、性能优化和用户体验设计等多方面实践。

    vb 文件分割与合并 实例源码

    资源名:vb 文件分割与合并 实例源码 资源类型:程序源代码 源码说明: 文件分割,就是将一个大文件先拆分为若干个小文件,然后再对这些小文件分别进行处理。文件之所以能够被分割,是与文件在计算机里的存储方式...

    VC实现的文件分割与合并程序

    总结来说,"VC实现的文件分割与合并程序"是一个使用Visual C++编写的工具,通过多线程技术提高文件处理速度。其中,`SimpleFileCut`负责基础的单线程文件切割,`ThreadFileCut`和`ThreadFCut_class`实现了多线程文件...

    文件分割与合并实例——单线程模式

    文件分割与合并是两个常见的操作,尤其在处理大型文件时,为了方便传输、存储或分步处理,我们常常需要将大文件分割成若干小文件,完成后又将其合并恢复原状。本实例以"文件分割与合并实例——单线程模式"为主题,...

    基于QT的文件分割与合并程序源码file_split.zip

    【标题】"基于QT的文件分割与合并程序源码file_split.zip"是一个使用C++编程语言,基于QT框架开发的应用程序。这个程序的主要功能是将大文件进行分割成多个小文件,以便于存储、传输或者分块处理,同时也可以将这些...

    C# 文件管理 文件分割与合并 可加密文件

    C# 文件管理 文件分割与合并 可加密文件 try { if (txtLength.Text == ""||txtFile.Text.Trim()==""||txtPath.Text.Trim()=="") { MessageBox.Show("请将信息填写完整!", "提示", MessageBoxButtons.OK, ...

    Java实现文件分割与合并

    ### Java实现文件分割与合并 #### 一、概述 本文将详细介绍如何使用Java语言实现文件的分割与合并功能。此技术对于数据传输、备份或处理大量数据时非常有用。通过分割大文件为较小的部分,可以有效地减少单个文件...

    文件分割与合并器 v1.0.zip

    《文件分割与合并器 v1.0》是一款轻量级的实用工具,专注于解决大文件处理问题。在日常工作中,我们经常会遇到需要传输或存储的大文件,这时文件分割与合并的功能就显得尤为重要。这款软件仅有52Kb的体积,无需安装...

    VC++ 文件分割与合并

    本示例聚焦于“VC++ 文件分割与合并”这一主题,这涉及到对大文件进行处理,以便更有效地存储、传输或管理。在《Visual C++ 程序开发范例宝典》中,这一部分主要讲解了如何使用INI文件来存储配置信息,以及如何进行...

    大文件分割与合并

    "大文件分割与合并"是一个重要的技术主题,特别是在资源有限或者需要优化传输效率的情况下。Java作为广泛使用的编程语言,提供了丰富的API和库来处理这类问题。下面我们将详细探讨Java实现大文件分割与合并的相关...

    文件分割与合并源码(VC)

    在IT领域,文件分割与合并是一项基础且实用的技术,尤其对于处理大文件时非常有用。在Windows操作系统中,Visual C++(简称VC)是一种常用的编程环境,它支持C++语言,可以用来编写实现文件分割与合并功能的源代码。...

    c#文件处理之文件分割与合并源码.rar

    本压缩包中的"文件分割与合并源码"提供了一个实用的示例,展示了如何使用C#来实现大文件的分割和合并功能。这些功能在很多场景下都非常有用,例如在网络传输、存储优化或者数据分析中。现在,我们将深入探讨C#中实现...

    文件分割与合并程序

    "文件分割与合并程序"是一个实用工具,主要用于处理大文件,使其能够更便捷地存储、传输或管理。以下将详细阐述这个程序的相关知识点: 1. **文件分割**:文件分割是将一个大文件拆分成多个较小的块,通常用于克服...

Global site tag (gtag.js) - Google Analytics