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)文件,用于合并已经分割的文件。批处理文件是一种基于DOS命令的简单脚本,能够自动执行一系列操作,比如...
这个示例程序“Hadoop示例程序合并文件”旨在演示如何在Hadoop环境下整合多个文件,这对于理解Hadoop分布式文件系统(HDFS)的工作原理至关重要。下面将详细阐述Hadoop的核心组件、HDFS的特性以及如何在Hadoop环境中...
在Microsoft Foundation Classes (MFC) 中,合并文件是一项常见的任务,尤其在开发Windows应用程序时。MFC 是微软提供的一套C++类库,用于简化Windows API的使用,它提供了丰富的功能,包括窗口、对话框、控件、文档...
在这个场景中,我们关注的核心知识点是“拖拽”、“合并文件”和“换位置”,这些都是构建此类应用的关键技术。接下来,我们将深入探讨这些概念。 一、拖拽(Drag and Drop) 拖拽功能在Web应用中广泛用于模拟现实...
合并文件通常涉及到将多个具有相同格式或结构的文件内容整合到一个单一文件中。这可以通过读取每个文件,然后将内容追加到目标文件中来完成。如果文件是按时间顺序分块的,例如日志文件,那么合并可能需要按照...
【文件合并器】是一款基于易语言开发的简单实用工具,主要功能是调用Windows系统内置的`copy/b`命令来实现多个文件的合并操作。在IT行业中,文件合并是一项常见的需求,例如在处理大型文本数据、整合代码文件或制作...
文件名用于识别原始文件的身份,文件长度则有助于确定在读取合并文件时应跳过多少字节,而文件在合并文件中的位置信息则确保可以精确地定位到原始文件内容。 实现这样的文件合并,可以编写一个简单的程序,遵循以下...
合并后生成的文件名为《合并文件.pdf》 pdf格式文件合并 将文件放置到目录pdf中,以pdf为后缀名 合并后生成的文件名为《合并文件.pdf》 pdf格式文件合并 将文件放置到目录pdf中,以pdf为后缀名 合并后生成的文件名为...
WORD邮件合并文件拆分工具,将邮件合并之后的Word文档拆分成多个文件并导出。
标题 "NodeJs 合并文件" 指的是在 Node.js 环境下将多个文件内容合并到一个文件中的过程。这通常用于模块化开发,以便将代码组织成更小、更易管理的部分,然后在运行时组合在一起。Node.js 是一个基于 Chrome V8 ...
本教程将探讨如何使用C#来实现合并文件的功能,特别是针对CSV(逗号分隔值)文件,这是一种常见的数据存储格式,常用于数据分析和表格数据交换。 CSV文件的特点是每一行都是一条记录,每条记录由多个字段组成,字段...
对于压缩包中的"拆分与合并文件",这可能包含了一系列用于演示或教学的音频文件,通过这些文件,用户可以亲手实践文件的拆分和合并过程,以加深理解。在实际操作中,可以先使用上述提到的工具进行拆分,然后再合并,...
在Delphi编程环境中,利用内存流(Memory Stream)合并文件是一项常见的操作,特别是在处理大量数据或者需要高效读写文件的场景下。内存流允许我们直接在内存中存储和操作数据,而无需频繁地与磁盘交互,从而提高...
理解这种格式对于正确合并文件至关重要。 3. **数据一致性**:在合并过程中,软件需要确保不丢失任何数据,并且合并后文件的结构保持有效。这可能需要处理冲突、校验和检查以及数据定位等问题。 4. **数据完整性**...
本文将深入探讨如何在 Delphi 中利用流技术来分割和合并文件,这对于多线程、P2P 和 FTP 文件传输等场景尤其有用,比如在实现迅雷等快速文件传输工具的功能时。 首先,理解什么是流。在 Delphi 中,流是数据的抽象...
在IT行业中,分割和合并文件是一项常见的操作,特别是在大数据处理、文件传输以及备份恢复等场景。这个名为"分割合并文件 VC源码"的资源显然提供了使用VC++(Visual C++)进行文件操作的源代码,可能包括MFC...
VB演示分割文件与合并文件,这里使用到比较多的文件操作函数,比如FileToSplit、FileLen、UBound、FileCount、FileInfo等。本范例文件分割的思路:程序通过调用FreeFile函数来取得可以的文件号,以二进制的方式打开...
这时,“合并文件的软件”就显得非常实用。这类软件能够帮助我们将大文件分割成多个小文件,便于分批传输或存储,然后在目标位置再将这些小文件重新合并成原始的大文件。 标题“合并文件的软件”提示我们,这种工具...
本示例主要关注的是文件的拆分和合并功能,这对于处理大型文件或者优化数据传输过程尤为关键。以下将详细阐述C#中实现文件拆分和合并的基本原理及步骤。 1. **文件拆分** 文件拆分是指将一个大文件分割成多个小...