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