`
biekwo
  • 浏览: 37410 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

合并文件

F# 
阅读更多
 1. 拆分
import java.io.File;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Date;

/**
 * 文件分隔器:给定文件的路径和每一块要拆分的大小,就可以按要求拆分文件
 * 如果指定的块给原文件都还要大,为了不动原文件,就生成另一个文件,以.bak为后缀,这样可以保证原文件
 * 如果是程序自动拆分为多个文件,那么后缀分别为".part序号",这样就可以方便文件的合并了 原理:很简单,就是利用是输入输出流,加上随机文件读取。
 */
public class Separator {
	String FileName = null;// 原文件名

	long FileSize = 0;// 原文件的大小

	long BlockNum = 0;// 可分的块数

	public Separator() {
	}

	/**
	 * 
	 * @param fileAndPath
	 *            原文件名及路径
	 */
	private void getFileAttribute(String fileAndPath)// 取得原文件的属性
	{
		File file = new File(fileAndPath);
		FileName = file.getName();
		FileSize = file.length();
	}

	/**
	 * 
	 * @param blockSize
	 *            每一块的大小
	 * @return 能够分得的块数
	 */
	private long getBlockNum(long blockSize)// 取得分块数
	{
		long fileSize = FileSize;
		if (fileSize <= blockSize)// 如果分块的小小只够分一个块
			return 1;
		else {
			if (fileSize % blockSize > 0) {
				return fileSize / blockSize + 1;
			} else
				return fileSize / blockSize;
		}
	}

	/**
	 * 
	 * @param fileAndPath
	 *            原文件及完整路径
	 * @param currentBlock
	 *            当前块的序号
	 * @return 现在拆分后块的文件名
	 */
	private String generateSeparatorFileName(String fileAndPath,
			int currentBlock)// 生成折分后的文件名,以便于将来合将
	{
		return fileAndPath + ".part" + currentBlock;
	}

	/**
	 * 
	 * @param fileAndPath
	 *            原文件及完整路径
	 * @param fileSeparateName
	 *            文件分隔后要生成的文件名,与原文件在同一个目录下
	 * @param blockSize
	 *            当前块要写的字节数
	 * @param beginPos
	 *            从原文件的什么地方开始读取
	 * @return true为写入成功,false为写入失败
	 */
	private boolean writeFile(String fileAndPath, String fileSeparateName,
			long blockSize, long beginPos)// 往硬盘写文件
	{

		RandomAccessFile raf = null;
		FileOutputStream fos = null;
		byte[] bt = new byte[10*1024*1024];
		long writeByte = 0;
		int len = 0;
		try {
			raf = new RandomAccessFile(fileAndPath, "r");
			fos = new FileOutputStream(fileSeparateName);
			
			MappedByteBuffer buf = raf.getChannel().map(FileChannel.MapMode.READ_ONLY, beginPos, blockSize);  
			fos.getChannel().write(buf);
//			raf.seek(beginPos);
//			while ((len = raf.read(bt)) > 0) {
//				if (writeByte < blockSize)// 如果当前块还没有写满
//				{
//					writeByte = writeByte + len;
//					if (writeByte <= blockSize)
//						fos.write(bt, 0, len);
//					else {
//						len = len - (int) (writeByte - blockSize);
//						fos.write(bt, 0, len);
//					}
//				}
//			}
			fos.close();
			raf.close();
		} catch (Exception e) {
			e.printStackTrace();
			try {
				if (fos != null)
					fos.close();
				if (raf != null)
					raf.close();
			} catch (Exception f) {
				f.printStackTrace();
			}
			return false;
		}
		return true;
	}

	/**
	 * 
	 * @param fileAndPath
	 *            原文路径及文件名
	 * @param blockSize
	 *            要拆分的每一块的大小
	 * @return true为拆分成功,false为拆分失败
	 */
	private boolean separatorFile(String fileAndPath, long blockSize)// 折分文件主函数
	{
		getFileAttribute(fileAndPath);// 将文件的名及大小属性取出来
		// System.out.println("FileSize:"+FileSize);
		// System.out.println("blockSize:"+blockSize);
		BlockNum = getBlockNum(blockSize);// 取得分块总数
		// System.out.println("BlockNum:"+BlockNum);
		// System.exit(0);
		if (BlockNum == 1)// 如果只能够分一块,就一次性写入
			blockSize = FileSize;
		long writeSize = 0;// 每次写入的字节
		long writeTotal = 0;// 已经写了的字节
		String FileCurrentNameAndPath = null;
		for (int i = 1; i <= BlockNum; i++) {
			if (i < BlockNum)
				writeSize = blockSize;// 取得每一次要写入的文件大小
			else
				writeSize = FileSize - writeTotal;
			if (BlockNum == 1)
				FileCurrentNameAndPath = fileAndPath + ".bak";
			else
				FileCurrentNameAndPath = generateSeparatorFileName(fileAndPath,
						i);
			// System.out.print("本次写入:"+writeSize);
			if (!writeFile(fileAndPath, FileCurrentNameAndPath, writeSize,
					writeTotal))// 循环往硬盘写文件
				return false;
			writeTotal = writeTotal + writeSize;
			// System.out.println(" 总共写入:"+writeTotal);
		}
		return true;
	}
  
	public static void main(String[] args) {
		
		Separator separator = new Separator();
		String fileAndPath = "f:\\test2\\123.zip";// 文件名及路径
		long blockSize = 10*1024 * 1024;// 每一个文件块的大小,大小是按字节计算
		if (separator.separatorFile(fileAndPath, blockSize)) {
			System.out.println("文件折分成功!");
		} else {
			System.out.println("文件折分失败!");
		}
			}
}
分享到:
评论

相关推荐

    文件分割器(自带bat文件合并文件).rar

    这个名为"文件分割器(自带bat文件合并文件).rar"的压缩包中,包含了文件分割器软件以及相关的批处理(BAT)文件,用于合并已经分割的文件。批处理文件是一种基于DOS命令的简单脚本,能够自动执行一系列操作,比如...

    Hadoop示例程序合并文件

    这个示例程序“Hadoop示例程序合并文件”旨在演示如何在Hadoop环境下整合多个文件,这对于理解Hadoop分布式文件系统(HDFS)的工作原理至关重要。下面将详细阐述Hadoop的核心组件、HDFS的特性以及如何在Hadoop环境中...

    合并文件(MFC)

    在Microsoft Foundation Classes (MFC) 中,合并文件是一项常见的任务,尤其在开发Windows应用程序时。MFC 是微软提供的一套C++类库,用于简化Windows API的使用,它提供了丰富的功能,包括窗口、对话框、控件、文档...

    js 模拟手机桌面,拖拽、合并文件、换位置

    在这个场景中,我们关注的核心知识点是“拖拽”、“合并文件”和“换位置”,这些都是构建此类应用的关键技术。接下来,我们将深入探讨这些概念。 一、拖拽(Drag and Drop) 拖拽功能在Web应用中广泛用于模拟现实...

    ftp文件递归下载到本地/合并文件/分析数据

    合并文件通常涉及到将多个具有相同格式或结构的文件内容整合到一个单一文件中。这可以通过读取每个文件,然后将内容追加到目标文件中来完成。如果文件是按时间顺序分块的,例如日志文件,那么合并可能需要按照...

    文件与复制合并.rar_合并文件_文件 存储_文件合并

    文件名用于识别原始文件的身份,文件长度则有助于确定在读取合并文件时应跳过多少字节,而文件在合并文件中的位置信息则确保可以精确地定位到原始文件内容。 实现这样的文件合并,可以编写一个简单的程序,遵循以下...

    pdf格式文件合并 将文件放置到目录pdf中,以pdf为后缀名 合并后生成的文件名为《合并文件.pdf》

    合并后生成的文件名为《合并文件.pdf》 pdf格式文件合并 将文件放置到目录pdf中,以pdf为后缀名 合并后生成的文件名为《合并文件.pdf》 pdf格式文件合并 将文件放置到目录pdf中,以pdf为后缀名 合并后生成的文件名为...

    WORD邮件合并文件拆分工具

    WORD邮件合并文件拆分工具,将邮件合并之后的Word文档拆分成多个文件并导出。

    NodeJs 合并文件

    标题 "NodeJs 合并文件" 指的是在 Node.js 环境下将多个文件内容合并到一个文件中的过程。这通常用于模块化开发,以便将代码组织成更小、更易管理的部分,然后在运行时组合在一起。Node.js 是一个基于 Chrome V8 ...

    C#实现合并文件功能

    本教程将探讨如何使用C#来实现合并文件的功能,特别是针对CSV(逗号分隔值)文件,这是一种常见的数据存储格式,常用于数据分析和表格数据交换。 CSV文件的特点是每一行都是一条记录,每条记录由多个字段组成,字段...

    拆分与合并文件

    对于压缩包中的"拆分与合并文件",这可能包含了一系列用于演示或教学的音频文件,通过这些文件,用户可以亲手实践文件的拆分和合并过程,以加深理解。在实际操作中,可以先使用上述提到的工具进行拆分,然后再合并,...

    delphi 利用内存流合并文件

    在Delphi编程环境中,利用内存流(Memory Stream)合并文件是一项常见的操作,特别是在处理大量数据或者需要高效读写文件的场景下。内存流允许我们直接在内存中存储和操作数据,而无需频繁地与磁盘交互,从而提高...

    Delphi 利用流分割与合并文件

    本文将深入探讨如何在 Delphi 中利用流技术来分割和合并文件,这对于多线程、P2P 和 FTP 文件传输等场景尤其有用,比如在实现迅雷等快速文件传输工具的功能时。 首先,理解什么是流。在 Delphi 中,流是数据的抽象...

    分割合并文件 VC源码

    在IT行业中,分割和合并文件是一项常见的操作,特别是在大数据处理、文件传输以及备份恢复等场景。这个名为"分割合并文件 VC源码"的资源显然提供了使用VC++(Visual C++)进行文件操作的源代码,可能包括MFC...

    VB演示 FileToSplit分割文件与合并文件.rar

    VB演示分割文件与合并文件,这里使用到比较多的文件操作函数,比如FileToSplit、FileLen、UBound、FileCount、FileInfo等。本范例文件分割的思路:程序通过调用FreeFile函数来取得可以的文件号,以二进制的方式打开...

    合并文件的软件

    这时,“合并文件的软件”就显得非常实用。这类软件能够帮助我们将大文件分割成多个小文件,便于分批传输或存储,然后在目标位置再将这些小文件重新合并成原始的大文件。 标题“合并文件的软件”提示我们,这种工具...

    C#拆分和合并文件例程

    本示例主要关注的是文件的拆分和合并功能,这对于处理大型文件或者优化数据传输过程尤为关键。以下将详细阐述C#中实现文件拆分和合并的基本原理及步骤。 1. **文件拆分** 文件拆分是指将一个大文件分割成多个小...

    文件分割器(自带bat文件合并文件).e.rar

    在本案例中,我们讨论的是一个名为“文件分割器(自带bat文件合并文件).e.rar”的压缩包,它包含了一个文件分割功能以及一个批处理(bat)文件来帮助用户合并这些分割后的文件。 首先,我们要理解文件分割的概念。...

    贴库网合并文件

    "贴库网合并文件"这个程序就是为了解决一个特定的问题:将贴库网上下载的多个TXT文本文件合并成一个单一的TXT文件,便于阅读和管理。这在处理大量分散的文本资料时非常有用,尤其对于那些喜欢在贴库网上阅读或收集...

Global site tag (gtag.js) - Google Analytics