`
guafei
  • 浏览: 326696 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

文件分割程序

F# 
阅读更多
package com.IO;

import java.io.File;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;

/**
* 文件分隔器:给定文件的路径和每一块要拆分的大小,就可以按要求拆分文件
* 如果指定的块给原文件都还要大,为了不动原文件,就生成另一个文件,以.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[1024];
long writeByte = 0;
int len = 0;
try {
raf = new RandomAccessFile(fileAndPath, "r");
raf.seek(beginPos);
fos = new FileOutputStream(fileSeparateName);
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 = "d:\\test.rar";// 文件名及路径
long blockSize = 200 * 1024;// 每一个文件块的大小,大小是按字节计算
if (separator.separatorFile(fileAndPath, blockSize)) {
System.out.println("文件折分成功!");
} else {
System.out.println("文件折分失败!");
}

}
}
分享到:
评论
1 楼 zhaomengbin 2012-03-02  
写的很不错,可以写个文件给合并的方法么?,将分割后的几份文件还原到原来的样子

相关推荐

    C语言文件分割程序

    标题 "C语言文件分割程序" 描述了一个使用C语言实现的特定功能——文件分割。C语言是一种基础且强大的编程语言,常用于系统级编程、软件开发以及底层数据处理。在这个项目中,它被用来创建一个文件分割工具,该工具...

    文件分割程序(未完成)

    文件分割程序是一个实用工具,它允许用户将大文件拆分为较小的部分,以便于存储、传输或管理。在标题和描述中提到的“文件分割程序(未完成)”可能是指一个正在开发中的项目,尚未实现所有功能或者存在某些待解决的...

    Wav文件分割程序

    本篇文章将深入探讨一个基于C++的Wav文件分割程序,该程序能够按照指定的时长将Wav音频文件拆分为多个独立的部分。 首先,让我们了解Wav文件。Wav是一种无损音频格式,由微软开发,广泛用于Windows操作系统。它存储...

    简单的TXT文件分割程序

    在IT领域,文本处理是一项基础且重要的任务,而“简单的TXT文件分割程序”就是针对这一需求设计的一个小程序。TXT文件是一种常见的纯文本格式,适用于记录简单数据或文档,但有时由于文件过大,阅读、传输或者处理...

    Java文件分割程序源代码.rar

    Java文件分割程序是一种用于大文件处理的技术,尤其在需要传输或存储大文件时非常有用。这个源代码包,"Java文件分割程序源代码.rar",提供了实现这一功能的Java编程逻辑,可以跨多个平台运行,这得益于Java的“一次...

    C#文件分割程序

    C#文件分割程序编译环境VS2010,该程序实现功能将大文本文件分割成若干小文件,从而解决大文本文件无法打开或者难以处理的问题。源程序提供了测试文件,可处理多种类型文件,清测可用,源代码可进行修改从而改变分割...

    简单的文件分割程序 自带VC 源码.rar

    标题中的“简单的文件分割程序 自带VC 源码.rar”指的是一个使用Microsoft Visual C++(简称VC)编写的源代码项目,这个项目实现了文件分割和合并的功能。这个程序允许用户将大文件按照指定的大小分割成多个小文件,...

    分割文件程序

    总之,`FileSpliter`这样的文件分割程序为用户提供了便捷的工具,解决了大文件处理中的诸多问题。了解其基本操作和原理,有助于更高效地管理和处理文件。在实际使用中,结合个人需求,选择合适的分割大小和合并方法...

    文件分割分割文件小程序

    本小程序“文件分割分割文件小程序”专注于这一功能,提供了便捷的文件分割与复原服务。 首先,我们来详细了解文件分割的概念。文件分割是指将一个大文件拆分成若干个小文件,每个小文件的大小可以根据需要进行设定...

    java 写的文件分割程序

    这是用java写的一个分割文件的程序。将一个文件分割成相等的n个文件。主要用了输入、输出流的知识。

    使用python和ffmpeg制作的音频文件分割程序

    本程序主要使用python和ffmpeg来制作,其中UI界面使用PyQt5来制作,而界面配色...综合来说,本程序希望实现的是对音频文件的分割,但初版是单次分割,后续会添加多段分割,以及自动分割时长计算等,请关注博文的更新。

    Tiff图片文件分割程序

    可以将有多页的TIFF文件分割成单个图片。

    文件分割联合程序源代码

    文件分割程序可以基于各种编程语言实现,如C++、Java、Python或C#,每种语言都有其独特的语法和优点。 源代码的组织结构可能包括以下几个关键部分: 1. **主程序**:这是程序的入口点,它负责调用其他模块并管理...

    JS文件分割器.zip_JS文件分割_visual c_文件分割器

    描述中的"自己写的文件分割程序的源代码"提示我们,这是一份个人开发的作品,包含了源码,用户可以查看、学习和修改这些代码,以理解其工作原理或者根据自己的需求进行定制。 标签中的"js文件分割"是指该工具的核心...

    java实现文件的分割.rar

    在Java编程中,文件分割是一项常见的任务,尤其在大...通过理解以上知识点,你可以编写自己的文件分割程序,实现大文件的高效处理。具体实现细节需要查看压缩包中的SplitFile源代码,以获取更具体的实现方法和技术。

    文件分割合并程序

    标题 "文件分割合并程序" 涉及到的是一个实用工具,主要用于处理大文件的分割与合并。在日常工作中,我们可能遇到需要将一个大文件分成小块以便于传输、存储或管理的情况,或者需要将这些小块再重新组合成原始文件。...

    文件分割器 源码

    文件分割器是一种实用工具,主要用于将大文件分割成若干个小文件,便于存储、传输或管理。源码是指程序的原始代码,是程序员编写的、人类可读的指令集合,通过编译或解释后才能被计算机执行。在"文件分割器 源码"这...

Global site tag (gtag.js) - Google Analytics