文件切割机

文件切割

Java的文件切割实质上是利用的IO对文件进行读和写,原理很简单,只要熟练运用IO即可。

一、按大小切:

package cn.hncu.io.fileSplit;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

import javax.swing.JFileChooser;

public class FileSplit1 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		JFileChooser jfc=new JFileChooser();
		File file=null;
		File dir=null;
		int result=jfc.showOpenDialog(null);
		if (result==jfc.APPROVE_OPTION){
			file=jfc.getSelectedFile();
			dir=new File(file.getParent(),"splitedFiles");
			try {
				fileSplit(file,dir);//切割
				
				String fileName=file.getName();
				fileMerge(fileName,dir);//合并
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

	private static void fileMerge(String fileName, File dir) throws IOException {
		if (!dir.exists()){
			throw new RuntimeException(dir.getName()+" do not exists");
		}
		File partFiles[]=dir.listFiles();
		if (partFiles.length==0){
			throw new RuntimeException(dir.getName()+" has not files");
		}
		BufferedInputStream bis=null;
		ArrayList<BufferedInputStream> list=new ArrayList<BufferedInputStream>();
		for (int i=0;i<partFiles.length;i++){
			bis = new BufferedInputStream(new FileInputStream(dir.getName()+"\\"+partFiles[i].getName()));
			list.add(bis);
		}
		Enumeration<BufferedInputStream> en=Collections.enumeration(list);
		SequenceInputStream sis=new SequenceInputStream(en);
		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(dir.getName()+"\\"+fileName));
		int len=0;
		byte buf[]=new byte[10240];
		while ((len=sis.read(buf))!=-1){
			bos.write(buf,0,len);
		}
		bos.close();
		bis.close();
		sis.close();
		
	}

	private static void fileSplit(File file, File dir) throws IOException {
		if (!dir.exists()){
			dir.mkdirs();
		}
		InputStream in=new BufferedInputStream(new FileInputStream(file));
		OutputStream out=null;
		byte[] buf=new byte[10240];
		int len=0;
		int index=1;
		int endIndex=file.getName().indexOf(".");
		String fileName=file.getName().substring(0, endIndex);
		while ((len=in.read(buf))!=-1){
			out=new BufferedOutputStream(new FileOutputStream(dir.getName()+"\\"+fileName+(index++)+".part"));
			out.write(buf, 0, len);
		}
		out.close();
		in.close();
	}
}

二、按数量切:

package cn.hncu.io.fileSplit;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Logger;

import javax.swing.JFileChooser;

public class FileSplitByQuantity {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int quantity=10;//要切成的数量
		JFileChooser jfc=new JFileChooser();
		int result=jfc.showOpenDialog(null);
		
		File file=null;
		File dir=null;
		if (result==jfc.APPROVE_OPTION){
			file=jfc.getSelectedFile();
			dir=new File(file.getParent(),"splitedByQuantity");
			 try {
				fileSplit(file,dir,quantity);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

	private static void fileSplit(File file, File dir, int quantity) throws IOException {
		if (!dir.exists()){
			dir.mkdirs();
		}
		
		FileInputStream fis=new FileInputStream(file);
		InputStream in=new BufferedInputStream(fis);
		long length=file.length();
		int l=(int)(length/quantity+1);
		
		byte buf[]=new byte[l];
		int len=0;
		FileOutputStream fos=null;
		
		//定新文件名前缀
		int index=1;
		int endIndex=file.getName().indexOf(".");
		String fileName=file.getName().substring(0, endIndex);
		
		while ((len=in.read(buf))!=-1){
			fos=new FileOutputStream(new File(dir, fileName+(index++)+".part"));
			BufferedOutputStream bos=new BufferedOutputStream(fos);
			bos.write(buf, 0, len);
			bos.close();
			fos.close();
		}
		fis.close();
		in.close();
	}
}
注意:对于输出流,如果加了缓冲流要先关缓冲流再关字节流或其他流;对于输入流,若加了缓冲流则先关字节流或其他再关缓冲流。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值