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

        }

    }

  

  

}
相关文章
相关标签/搜索