原来觉得文件的切割与合并好神秘,觉得能够写这样程序的人简直就是高手、老鸟之类的人了,呵呵。
现在我自己这么一写,才觉得是如此之简单,连我这都菜鸟都能够写(不过,还是花了我将近半天的时间,呵呵),看来只要是人都能够写了。
暂时不懂,没有关系,好好拿去看一下。主要涉及的知识也没有几个,无非就是文件输入输出流、随机文件的读写之类的。其它的就是循环,很简单的,有兴趣的就看看。
只有两个文件:Separator.java(文件分割)、Combination.java(文件合并)。
Separator.java(文件分割):
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("文件折分失败!");
}
}
}
Combination.java(文件合并):
/**
* 合并文件:合并由拆分文件拆分的文件
* 要求将拆分文件放到一个文件夹中
* 主要利用随机文件读取和文件输入输出流
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Combination
{
String srcDirectory=null;//拆分文件存放的目录
String[] separatedFiles;//存放所有拆分文件名
String[][] separatedFilesAndSize;//存放所有拆分文件名及分件大小
int FileNum=0;//确定文件个数
String fileRealName="";//据拆分文件名确定现在原文件名
public Combination()
{
srcDirectory="d:\\test\\";
}
/**
*
* @param sFileName 任一一个拆分文件名
* @return 原文件名
*/
private String getRealName(String sFileName)
{
StringTokenizer st=new StringTokenizer(sFileName,".");
return st.nextToken()+"."+st.nextToken();
}
/**
* 取得指定拆分文件模块的文件大小
* @param FileName 拆分的文件名
* @return
*/
private long getFileSize(String FileName)
{
FileName=srcDirectory+FileName;
return (new File(FileName).length());
}
/**
* 生成一些属性,做初使化
* @param drictory 拆分文件目录
*/
private void getFileAttribute(String drictory)
{
File file=new File(drictory);
separatedFiles=new String[file.list().length];//依文件数目动态生成一维数组,只有文件名
separatedFiles=file.list();
//依文件数目动态生成二维数组,包括文件名和文件大小
//第一维装文件名,第二维为该文件的字节大小
separatedFilesAndSize=new String[separatedFiles.length][2];
Arrays.sort(separatedFiles);//排序
FileNum=separatedFiles.length;//当前文件夹下面有多少个文件
for(int i=0;i<FileNum;i++)
{
separatedFilesAndSize[i][0]=separatedFiles[i];//文件名
separatedFilesAndSize[i][1]=String.valueOf(getFileSize(separatedFiles[i]));//文件大上
}
fileRealName=getRealName(separatedFiles[FileNum-1]);//取得文件分隔前的原文件名
}
/**
* 合并文件:利用随机文件读写
* @return true为成功合并文件
*/
private boolean CombFile()
{
RandomAccessFile raf=null;
long alreadyWrite=0;
FileInputStream fis=null;
int len=0;
byte[] bt=new byte[1024];
try
{
raf = new RandomAccessFile(srcDirectory+fileRealName,"rw");
for(int i=0;i<FileNum;i++)
{
raf.seek(alreadyWrite);
fis=new FileInputStream(srcDirectory+separatedFilesAndSize[i][0]);
while((len=fis.read(bt))>0)
{
raf.write(bt,0,len);
}
fis.close();
alreadyWrite=alreadyWrite+Long.parseLong(separatedFilesAndSize[i][1]);
}
raf.close();
}
catch (Exception e)
{
e.printStackTrace();
try
{
if(raf!=null)
raf.close();
if(fis!=null)
fis.close();
}
catch (IOException f)
{
f.printStackTrace();
}
return false;
}
return true;
}
public static void main(String[] args)
{
Combination combination = new Combination();
combination.getFileAttribute(combination.srcDirectory);
combination.CombFile();
System.exit(0);
}
}
分享到:
相关推荐
在Java编程语言中,文件合并与分割是常见的文件操作任务,尤其在大数据处理、日志分析和文件管理等场景中尤为关键。本程序提供了一个基础的实现,旨在帮助初学者理解这一过程,并通过MD5校验确保文件的完整性和未被...
### Java实现文件分割与合并 #### 一、概述 本文将详细介绍如何使用Java语言实现文件的分割与合并功能。此技术对于数据传输、备份或处理大量数据时非常有用。通过分割大文件为较小的部分,可以有效地减少单个文件...
这个名为"Java写的文件分割与合并器"的程序就是针对这一需求设计的。它利用了Java的标准库,包括`java.awt.*`,`java.awt.event.*`以及`javax.swing.*`,这些是Java图形用户界面(GUI)的基础,用于创建友好的用户...
在文件合并时,程序会反向操作,将所有小文件的内容读取并写入一个新的大文件中。这个过程可能包括: 1. 检查子文件:确保所有子文件都存在且顺序正确。 2. 创建目标文件:创建一个新的`File`对象,作为合并后的文件...
标题 "文件分割合并程序" 涉及到的是一个实用工具,主要用于处理大文件的分割与合并。在日常工作中,我们可能遇到需要将一个大文件分成小块以便于传输、存储或管理的情况,或者需要将这些小块再重新组合成原始文件。...
分割合并源程序,自己刚完成不久的,还有很多需要改进的
【JAVA文件分割合并器】是一种基于Java编程语言开发的实用工具,主要功能是对大文件进行高效地分割和合并。在日常工作中,我们可能遇到需要处理大量数据或传输超大文件的情况,这时文件分割和合并的功能就显得尤为...
学习这个Java文件分割程序,你可以了解到以下关键知识点: 1. Java的I/O流:包括FileInputStream、FileOutputStream,以及它们的使用方式。 2. 文件操作:如打开、读取、写入和关闭文件。 3. 流的缓冲:可能会用到...
"文件分割与合并程序"是一个实用工具,主要用于处理大文件,使其能够更便捷地存储、传输或管理。以下将详细阐述这个程序的相关知识点: 1. **文件分割**:文件分割是将一个大文件拆分成多个较小的块,通常用于克服...
Java文件分割器是一种工具,用于将大文件分割成多个小文件,或者将多个小文件合并成一个大文件。这在处理非常大的数据集时特别有用,可以提高文件管理效率和数据处理速度,尤其是在网络传输、存储管理和数据分析领域...
1. **Linux命令:文件合并** - 合并文件是通过`cat`命令实现的。例如,`cat /home/leo/sd_000.txt /home/leo/sd_001.txt /home/leo/sd_002`这个命令会将三个文本文件`sd_000.txt`, `sd_001.txt`, 和 `sd_002`的内容...
文件合并则是将之前切割的多个小文件重新组合成原始的大文件。这个过程通常需要按照切割时的顺序依次读取每个小文件,并将其内容追加到新的大文件中。在JAVA中,我们可以使用`FileInputStream`和`FileOutputStream`...
1. **文件分割**: 用户可以指定一个文件以及每个分割文件的大小(默认单位为MB),程序将根据设定的大小将原文件分割成多个小文件。 2. **文件合并**: 用户可以选择已分割的小文件所在的目录,程序将自动识别这些...
总的来说,这个“文件分割(合并)器(源代码)”项目不仅提供了实际的文件处理功能,还为开发者提供了一次深入理解文件操作和程序设计的机会。通过学习和使用这个工具,你可以提升自己的编程技能,并在需要处理大...
在Java编程中,有时我们需要处理大文件,例如为了节省存储空间、提高传输效率或适应某些系统限制,可能需要将大文件分割成多个小文件。这个资源包提供了实现这一功能的代码,同时也支持将这些小文件合并回原始的大...
闲着没事用java写的一个文件分割器,感觉还可以
在Java编程中,文件分割是一项常见的任务,尤其在大数据处理、网络传输或存储优化时显得尤为重要。本示例“java实现文件的分割.rar”提供的SplitFile程序,利用了Java的随机访问流(RandomAccessFile)来实现文件的...
6. **文件合并**:合并过程则与分割相反,读取每个分割文件,按照元数据中的顺序和位置,将内容追加到目标文件中。 在描述中提到,这个工具具有速度快和占用空间小的特点。这通常得益于高效的文件读写操作和合理的...
【面试笔试】写两个函数,完成文件分割与合并的功能。假设每个分割文件的大小为100KB,被分割文件的大小不限。分割的第1个文件含有文件合并的信息(以下简称 信息块),即通过解析第1个文件,即可完成文件合并的操作...
Java文件分割器是一种实用工具,尤其对于处理大文件而言,它可以将大文件分解为多个小文件,便于存储、传输或管理。这个特定的Java实现已经被打包成一个名为`split.jar`的可执行JAR文件,用户可以直接运行来对大文件...