在Java中实现文件的分割与合并

对打文件进行分割,分割成固定大小的文件,并存放与指定的目录,可以指定分割的大小。代码如下:

/**
* @description
* @param filePath 文件名称,包括路径
* @param filterFolder 分割文件存放目录
* @param fileSize 分割文件大小
* @throws IOException 
*/
public static void cutFile(String filePath, String filterFolder, int fileSize) throws IOException{
	File file = new File(filePath);
	if(!file.exists())
		throw new FileNotFoundException("Source file not found.filePath:"+filePath); 
	File storeFiles = new File(filterFolder);
	if(!storeFiles.exists())
		storeFiles.mkdirs();
	RandomAccessFile sourceFile = new RandomAccessFile(filePath, "r");
	long sourceFileLen = sourceFile.length();
	long fileNum = sourceFileLen/fileSize;
	long readedLen = 0;
	int fileNameNum = 1;
	
	for(; fileNameNum <= fileNum; fileNameNum++) {
		RandomAccessFile outFile = new RandomAccessFile(storeFiles.getAbsolutePath()+File.separator+file.getName()+(fileNameNum)+"tmp", "rw");
		for(int j = 0; j< fileSize; j ++,readedLen++) {
			outFile.write(sourceFile.read());
		}
		outFile.close();
	}
	if(readedLen<sourceFileLen) {
		RandomAccessFile outFile = new RandomAccessFile(storeFiles.getAbsolutePath()+File.separator+file.getName()+(fileNameNum++)+"tmp", "rw");
		for(long j = readedLen; j< sourceFileLen; j ++) {
			outFile.write(sourceFile.read());
		}
		outFile.close();
	}
	sourceFile.close();
	System.out.println("文件长度:"+sourceFileLen+";单个文件长度:"+fileSize+";文件分割个数:"+(--fileNameNum));
}

将指定目录下符合文件名称条件的文件合并成一个文件,可以指定输出文件的存放目录,代码如下:


/**
* @description Unit files
* @param outFileName 合并文件名称
* @param fileFolder 被合并文件所在目录
* @param filterName 被合并文件名过滤条件
* @throws IOException
*/
public static void unitFile(String outFileName, String fileFolder, final String filterName) throws IOException{
	File[] inFiles;
	File outFile = new File(outFileName);
	File inFilesFolder = new File(fileFolder);
	if(!inFilesFolder.exists())
		throw new FileNotFoundException("Source file folder not found.filePath:"+fileFolder); 
	//get confirmed condition files
	inFiles = inFilesFolder.listFiles(new FilenameFilter() {
		@Override
		public boolean accept(File dir, String name) {
			String fileName = new File(name).getName();
			return fileName.startsWith(filterName);
		}
	});
	RandomAccessFile out = new RandomAccessFile(outFile, "rw");
	for (File file : inFiles) {
		System.out.println(file);
		RandomAccessFile infile = new RandomAccessFile(file, "r");
		int readed;
		while((readed = infile.read())!= -1)
			out.write(readed);
		infile.close();
	}
	out.close();
}

两个方法都是采用的随机读写流对文件进行读写的。

这样存在两个问题:

分割文件中,采用单个字节读取方式的优点是,可以将文件分割的大小精确到字节。但对中文进行分割就会出现大小有上下浮动,同时存在将一个中文分割成两个字节存放到两个文件中。


合并文件中,根据上面的方法,不能对被合并的文件进行排序,既合并时,文件顺序是按照文件名称排序的,这种情况下,如果文件名中有数字,就会出现混乱的情况。

测试代码很简单就不贴上了。


上面的两个问题解决方案:

对于有中文的文件分割,推荐使用字符流取代字节流进行读取;

文件合并中,取得文件列表后,使用集合对文件按照文件名称进行排序即可。


如果你有更好的解决方案或者实现方法,欢迎留言指正。


如果你感兴趣,测试代码和解决上面两个问题的代码不妨去实现一下吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值