1. 程式人生 > >用java實現檔案的拆分和合並

用java實現檔案的拆分和合並

用java實現檔案的拆分和合並

找到一個檔案,按照100k為單位,拆分成多個子檔案,並且以編號作為檔名結束。
比如檔案 資訊.xlsx,大小是389k。
拆分之後,成為
資訊.xlsx-0——100k
資訊.xlsx-1——100k
資訊.xlsx-2——100k
資訊.xlsx-3——89k

而後,對拆分的檔案進行合併。
直接上圖:

package IODemo.inputStreamOut;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

import com.sun.tools.javac.code.Attribute.Array;

public class SplitorMergeFiles {

	public static void main(String[] args) {
//		拆分
//		File f = new File("D:\\test\\資訊.xlsx");
//		split(f);
		
		//合併
		File f = new File("D:\\test\\merge");
		File[] fs = f.listFiles();
		for (File file : fs) {
			System.out.println(file);
		}
		
		File newFile = new File("D:\\test\\merge\\newfile");
		
		merge(fs,newFile);
		
		
	}

	// 拆分檔案
	public static void split(File f) {

		byte[] data = new byte[(int) f.length()];
		try {
			FileInputStream fis = new FileInputStream(f);

			fis.read(data);// 讀取檔案到data中
			fis.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println(data.length / 1024 + "k");

		int len = 1024 * 100;
		int n = (int) (f.length() / len);// 拆分為多少100k的資料夾
		int m = (int) (f.length() / len);// 餘數再額外準備一個資料夾
		File[] fs = new File[n + 1];// 設立檔案陣列,用來存放檔案。長度為總共需要生成檔案的個數。

		for (int i = 0; i < n + 1; i++) {

			int start = i * 102400;
			int end = (i + 1) * 102400;
			fs[i] = new File(f + "-" + i);

			if (i < n) {
				byte[] b = Arrays.copyOfRange(data, start, end);

				try {
					FileOutputStream fos = new FileOutputStream(fs[i]);
					fos.write(b);
					fos.close();

				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} else {

				start = i * 102400;
				end = (int) f.length();
				byte[] b = Arrays.copyOfRange(data, start, end);

				try {
					FileOutputStream fos = new FileOutputStream(fs[i]);
					fos.write(b);
					fos.close();
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}

			System.out.println("輸出子資料夾:" + fs[i].getAbsolutePath() 
				+ "  其長度為: " + fs[i].length());
		}
	}

	// 合併檔案
	public static void merge(File[] fs,File newFile) {
		
		int len = 0;
		for (File file : fs) {
			len += file.length(); 
		}
		byte[] b = new byte[len];//構造一個數組,存放合併的資料
		
		int len1 = 0;//初始化複製到目的陣列的起始值
		
		for (File file : fs) {
						
			byte[] bi = new byte[(int) file.length()];
			
			try {
				FileInputStream fis = new FileInputStream(file);
				fis.read(bi);
				fis.close();
				System.out.println(bi.length);
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			System.arraycopy(bi, 0, b, len1, (int) file.length());
			len1 +=file.length();
			
			try {
				FileOutputStream fos = new FileOutputStream(newFile);
				fos.write(b);
				fos.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			 		
		}			
	}
}

最後結果圖附上。最後結果圖附上。