超級檔案分割《合併》機(分割大檔案)

YX_blog發表於2015-08-17

需求:現在檔案的大小越來越大,很多移動裝置無法一次把檔案一次全部拷貝完全,這種情況就需要把檔案分割小點,分幾次傳送,然後,合併起來,這樣就實現了大檔案的拷貝功能

介紹:我的這個用的是吧檔案分割成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();
		}
}
	}

部分介面截圖



相關文章