天天看点

超级文件分割《合并》机(分割大文件)

需求:现在文件的大小越来越大,很多移动设备无法一次把文件一次全部拷贝完全,这种情况就需要把文件分割小点,分几次传送,然后,合并起来,这样就实现了大文件的拷贝功能

介绍:我的这个用的是吧文件分割成1M大小的文件,当然,可以改成很大的容量,这个只要改变下就行了。合并也可以的。

package cn.hncu.IO;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class GraphFileSplit extends JFrame implements ActionListener{
	JButton btnsplit,btnmerge;
	String filename;
	static JTextField tf;
	
		public GraphFileSplit(){
			setTitle("文件分割器");
			this.setLayout(new FlowLayout());//采用流布局方式
			this.setDefaultCloseOperation(EXIT_ON_CLOSE);
			this.setBounds(100, 100,400, 500);//设置边界
			JLabel lb=new JLabel("请选择类型");//标签
			btnsplit= new JButton("分割文件");
			btnmerge=new JButton("合并文件");//按钮
			btnsplit.addActionListener(this);
			JLabel  lb2=new JLabel("文件分割后存放在当前目录下的“Split”\r\n");
			JLabel  lb3=new JLabel("请注意: 文件合并后的文件存放在你电脑E盘的的ex目录下\r\n");
			 tf=new JTextField(30);
			 
			 //添加组件
			btnmerge.addActionListener(this);
			this.getContentPane().add(lb);
			this.getContentPane().add(btnsplit);
			this.getContentPane().add(btnmerge);
			this.getContentPane().add(lb2);
			this.getContentPane().add(lb3);
			this.getContentPane().add(tf);
			this.setResizable(false);
			this.setVisible(true);
		}
	
	public static void main(String[] args) {
		new GraphFileSplit(); //主函数,new 对象
	}

	@Override
	public void actionPerformed(ActionEvent e)  {
		if(e.getSource()==btnsplit){//对分割按钮进行监听
			JFileChooser jf=new JFileChooser();//文件选择器
			int resout=jf.showOpenDialog(null);
			if(resout==JFileChooser.APPROVE_OPTION){
				File file=jf.getSelectedFile();
				filename=file.getName();
//				System.out.println(file.getAbsolutePath());//这样包含有文件名;C:\Users\xinxin\Documents\Beyond - 光辉岁月.mp3
//				System.out.println(file.getParent());//C:\Users\xinxin\Documents
//				System.out.println(file.getName());//Beyond - 光辉岁月.mp3
//				System.out.println(file);
				File des=new File(file.getParent(),"fileSplit");//file.getParent()可以得到文件名之前的绝对路径
				try {
					Split(file,des);
				} catch (IOException e1) {
					throw new RuntimeException("分割出现错误");
				}
			}
		}
		if(e.getSource()==btnmerge){
			File[] file;//将选中的文件有文件数组装
			JFileChooser jf=new JFileChooser();
			jf.setMultiSelectionEnabled(true);
			int resout=jf.showOpenDialog(null);
			if(resout==JFileChooser.APPROVE_OPTION){
				file =jf.getSelectedFiles();
				if(file.length==0){
					throw new RuntimeException("文件不存在");
				}
				try {
					merge(file,filename);
				} catch (IOException e1) {
					e1.printStackTrace();
				}
	}
		}
	}

	private void merge(File[] file,String filename) throws IOException {//合并的时候用到合并流
		ArrayList<FileInputStream> alist=new ArrayList<FileInputStream>();
		for(int i=0;i<file.length;i++){
//			System.out.println(file[i].getParent());//分割后输出文件路径
				alist.add(new FileInputStream(new File( file[i].getParent(),file[i].getName())));
		}
		Enumeration<FileInputStream> en =Collections.enumeration(alist);
		SequenceInputStream se =new SequenceInputStream(en);
		String paht="e:\\ex\\";//只能合并后的存储路径,告诉用户路径
		File file0=new File(paht);
		if(!file0.exists()){
			file0.mkdirs();//文件不存在就创建一个
		}
//		System.out.println(filename+"11111111");
//		System.out.println(file0+ filename+"fileoasdasdsasdas");
		if(filename==null){
			filename="split.txt";
		}
		 FileOutputStream out =new FileOutputStream(file0+ "\\"+filename);
		 tf.setText("合并的文件存放在"+file0+"\\"+filename);
		 int len =0;
		 byte []b=new byte[1024*1024];//开始合并
		 while((len=se.read(b))!=-1){
			 out.write(b, 0, len);
		 }
		 out.close();
		 se.close();
}
	


	//分割核心代码
	private  static void Split(File file, File des) throws IOException {
		FileInputStream in =new FileInputStream(file);//分割必须先读进数组,数组空间开1M大小
		FileOutputStream out=null;
		int count=1;
		if(!des.exists()){
			des.mkdirs();
		}
		byte a[]=new byte[1024*1024];//大小为1M
		int len=0;
		while((len=in.read(a))!=-1){
			String desrc=file.getName()+(count++);
			File f=new File(des,desrc);
			out =new FileOutputStream(f);
			tf.setText("分割完成后,文件放在"+f.getParent());
			out.write(a,0,len);
			out.close();
		}
}
	}
           

部分界面截图

超级文件分割《合并》机(分割大文件)
超级文件分割《合并》机(分割大文件)
超级文件分割《合并》机(分割大文件)
超级文件分割《合并》机(分割大文件)

继续阅读