[java]拆分、合并文件

本文介绍了一种使用Java实现的文件拆分与合并工具。该工具能够将大文件拆分成多个小文件,并能将这些小文件重新合并为原始文件。适用于需要处理大文件但受限于内存或磁盘空间的情况。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileSplit 
{
	static final int partSize = 1000*1024;
	public static void main(String[] args) 
	{
		if (args.length < 1) 
		{
			System.out.println("请输入文件名参数");
			return;
		}
			
        String fileName = args[0];
        File file = new File(fileName);
        FileInputStream fis = null;
        byte[] buf = new byte[1024];
        int byteRead = 0, byteToWrite = 0;
        
        try 
        {
        	fis = new FileInputStream(file); 
        	long fileLength = file.length();
        	long fileCount = (fileLength % partSize == 0) ? 
        			(fileLength / partSize) : (1 + fileLength / partSize);  

        	long num = 1;
        	while (true)
        	{
        		String partFileName = fileName + ".part" + getPartNum(fileCount, num++);
        		FileOutputStream fos = new FileOutputStream(new File(partFileName));
        		if (byteToWrite < byteRead)
        		{
        			int byteLeft = byteRead - byteToWrite;
        			fos.write(buf, byteToWrite, byteLeft);        			
        		}
        		
        		int byteWrited = 0;
        		while (byteWrited < partSize)
        		{
        			byteRead = fis.read(buf);
        			if (byteRead <= 0)
        				break;
        			
        			byteToWrite = byteRead < (partSize - byteWrited) ? byteRead : (partSize - byteWrited);
        			fos.write(buf, 0, byteToWrite); 
				byteWrited += byteToWrite;
        		}
        		fos.close();
        		if (byteRead <= 0)
        		{
        			fis.close();
        			break;
        		}
        	} 
        }
        catch (IOException e) 
        {
            e.printStackTrace();
            return;
        }
	}

	static private String getPartNum(long total, long x)
	{
		String prefix = "";
		while (Long.toString(total).length() > Long.toString(x).length())
		{
			total /= 10;
			prefix += "0";
		}
		
		return prefix + Long.toString(x);		
	}
}


=========================================================================================

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.Vector;

//合并拆分的文件(fileName.part1~fileName.partx)
public class FileMerge 
{
	//如果拆分的文件放在目录dir下,被拆分的文件名称为test.exe,合并后的文件路径为dst,
	//那么,输入的参数就是"java FileMerge dir det test.exe"
	//其中,dir目录下有test.exe.part1,test.exe.part2等拆分文件
	
	public static void main(String[] args) 
	{
		if (args.length < 3) 
		{
			System.out.println("三个参数: part文件路径,生成文件路径,被拆分的文件的名称");
			return;
		}
		merge(args[0], args[1], args[2]);
	}
	
	//把partDir下的fileName的拆分文件合并后,写到desDir目录下
	//如果partDir或者desDir为空都返回false,不会自己创建目录
	public static boolean merge(String partDir, String destDir, String fileName)
	{
		Vector<String> partFileNames = new Vector<String>();
		
		//验证拆分文件的目录是否存在
		File partDirFile = new File(partDir);
		if (!partDirFile.exists() || !partDirFile.isDirectory())
		{
			System.out.println("拆分文件夹不存在");
			return false;
		}
		
		//验证目标文件的目录是否存在
		File destDirFile = new File(destDir);
		if (!destDirFile.exists() || !destDirFile.isDirectory())
		{
			System.out.println("目标文件夹不存在");
			return false;
		}
		
		//找出partDir目录下的fileName.part<1,2,...,x>文件,并排序
		File[] filesOrDirs = partDirFile.listFiles();
		int i, length = filesOrDirs.length;
		for (i = 0; i < length; i++)
		{
			String tmpName = filesOrDirs[i].getName();
			if (filesOrDirs[i].isFile() && tmpName.startsWith(fileName + ".part"))
				partFileNames.add(tmpName);
		}
		Collections.sort(partFileNames);

		if (partFileNames.size() <= 0)
		{
			System.out.println("没有找到拆分文件");
			return false;
		}
		
		//逐个读取partFileNames文件,并重写到新目的地
		try 
		{
			byte[] buf = new byte[1024];
			FileOutputStream fos = new FileOutputStream(destDir + "/" + fileName);
	
			int size = partFileNames.size();
			for (i = 0; i < size; i++)
			{
				File file = new File(partFileNames.elementAt(i));
				FileInputStream fis = new FileInputStream(file);
				int num = -1;
				while((num = fis.read(buf)) > 0)
					fos.write(buf, 0, num);
				fis.close();
			}
			fos.close();
		} 
		catch (IOException e1)
		{
			e1.printStackTrace();
		}
		return true;
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

piaopiaolanghua

感谢老板鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值