用java實現檔案的拆分和合並
阿新 • • 發佈:2018-12-01
用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(); } } } }
最後結果圖附上。