package file; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileSplit { public static void main(String\[\] args) { // TODO Auto-generated method stub File fileInput = new File("/Users/apple/Desktop/數學指南.pdf"); //先把源文件所在的位置,建立成一個對象 File fileOut = new File("/Users/apple/Desktop/Result"); //目標文件存放的位置建立成另外一個對象 if(!fileOut.exists()) { fileOut.mkdirs(); } //先查一下目標文件存放的位置是否存在,若是不存在則建立一個 int size = 102400; byte\[\] a = new byte\[size\]; //把每次要拆分的文件大小先定好,由於byte在java當中表明1個字節,也就是8位,每1024字節爲1kb,因此102400爲100kb //這裏必定要注意,byte是字節,不是比特,比特是bit,因此byte自己就是8個bit int number = 0; //先設定一個文件編號,從0開始 int len = -1; //這個len很重要,設定的目的是爲了記錄每次在讀取文件的時候,究竟讀了多長 try { FileInputStream fis = new FileInputStream(fileInput); //先把輸入流設置好 try { while((len = fis.read(a)) != -1) { //每次從輸入流讀取100kb試一下,若是不等於-1,表明後續還有,就接着讀 //每次用read方法讀過來的長度,都記錄在len的數據中,剛開始都是同樣的,關鍵是文件末端,讀過來的數據直接關係數據是否有偏差 System.out.println("-----" + number + "-----"); File fileNumber = new File(fileOut + File.separator + "eclipse.exe-" + number); //每次讀取一次,拆分紅一個小文件,因而把這個文件編輯成對象,並編號數字 FileOutputStream fos = new FileOutputStream(fileNumber); //給這個編號的對象接上輸出流 fos.write(a,0,len); //把這拿到的100kb寫入輸出流,並放置在目標位置,造成一個單獨的文件 //原來的時候用的是fos.write(a),這樣每次無論讀了多少,寫入都是整個a數組,這樣到了文件末端,若是長度不足a數組,而所有寫入,就會出現一部分垃圾數據 //因此用fos.write(a,0,len)就能夠保證最後寫入的時候,跟讀過來的長度是同樣的,保證數據的純淨。 number++; //編號數字再加1 fos.close(); //由於下一次再輸出,要改變文件夾的名稱,因此已經完成的輸出流要做廢,因此關閉 } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }