【006天】 關於整個IO流的練習,以及理解(二)

image.png

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();

        }

    }

  

  

}
相關文章
相關標籤/搜索