知识点:对输入流,输出流的应用
package yichanglei4;
import java.io.*;
import java.util.Arrays;
public class str {
public static void main(String[] args) {
// TODO Auto-generated method stub
//分解
File f1=new File("D:\\pdf","李航.统计学习方法.pdf");//确定要分解的文档
long L1;
int num=0,i=0,n=0;
int zijie=1024*1024*5;//分解成5M大小的pdf文档
L1=f1.length();
byte[]a = new byte[(int)L1];
byte[]b;
if
(L1%zijie==0)num=(int)L1/zijie;//判断可以分解为几个5M大小的文档
else
num=(int)L1/zijie+1;//不足加一
try{
FileInputStream in=new FileInputStream(f1);//该语句可能会出现错误,
in.read(a); //对目标文件进行读入 //所以应在try语句中
in.close();
for(i=0;i<num;i++)
{
String name=i+1+"-"+"李航.统计学习方法.pdf";
if(i!=num-1)
{
b=new byte[zijie]; //对输出字节数组大小进行定义
b=Arrays.copyOfRange(a,i*zijie,(i+1)*zijie);//复制数组a中该字节数组
} //大小的值
else
{
b=new byte[(int)(L1-(i-1)*zijie)];
b=Arrays.copyOfRange(a,i*zijie,(int)L1);
}
File f2=new File("D:\\splitpdf",name);
FileOutputStream out=new FileOutputStream(f2);//定义输出流
out.write(b); //进行字节数组输出
out.close();
}
}
catch(IOException e1){
System.out.println(e1);
}
//合成
File f3=new File("D:\\splitpdf");
File []splitfile=f3.listFiles(); //该方法返回在f3文件夹下的文件
File f4=new File("D:\\splitpdf","new李航.统计学习方法.pdf");
int t=0;
int sumlength=0;
for(File f5:splitfile)
{
System.out.println(f5.getName());
System.out.println((int)f5.length());
sumlength+=(int)f5.length();
}
try {
FileOutputStream sumout=new FileOutputStream(f4);
for(File f5:splitfile) { //遍历每一个被分解的文档
byte d[]=new byte[(int)f5.length()];
FileInputStream sumin=new FileInputStream(f5);
sumin.read(d); //读入
sumout.write(d); //写入
sumin.close();
}
sumout.close();
}
catch(Exception e2)
{
System.out.println(e2);
}
}}
结果:
对于合成的步骤:
我个人的方法(虽然可以进行文档的和成但是无法对文档重新打开)不同于上面的方法
附上个人代码(虽然和上面大致思路相同)
我的合成过程是分解过程的逆过程
(找到了问题所在,但不知道为什么f4的创建会有大小)
package yichanglei4;
import java.io.*;
import java.util.Arrays;
public class str {
public static void main(String[] args) {
// TODO Auto-generated method stub
//分解
File f1=new File("D:\\pdf","李航.统计学习方法.pdf");
long L1;
int num=0,i=0,n=0;
int zijie=1024*1024*5;
L1=f1.length();
byte[]a = new byte[(int)L1];;
byte[]b;
if
(L1%zijie==0)num=(int)L1/zijie;
else
num=(int)L1/zijie+1;
try{
FileInputStream in=new FileInputStream(f1);
in.read(a);
in.close();
for(i=0;i<num;i++)
{
String name=i+1+"-"+"李航.统计学习方法.pdf";
if(i!=num-1)
{
b=new byte[zijie];
b=Arrays.copyOfRange(a,i*zijie,(i+1)*zijie);
}
else
{
b=new byte[(int)(L1-(i-1)*zijie)];
b=Arrays.copyOfRange(a,i*zijie,(int)L1);
}
File f2=new File("D:\\splitpdf",name);
FileOutputStream out=new FileOutputStream(f2);
out.write(b);
out.close();
}
}
catch(IOException e1){
System.out.println(e1);
}
//合成
File f3=new File("D:\\splitpdf");
File []splitfile=f3.listFiles();
File f4=new File("D:\\splitpdf","new李航.统计学习方法.pdf");
int t=0;
for(File f5:splitfile) //问题在于遍历每个f5的大小(注意f4为什么会有大小)
{
byte c[] = new byte[(int)f5.length()];
byte d[]=new byte[(int)L1]; //数组大小不够
try {
FileInputStream sumin=new FileInputStream(f5);
sumin.read(c);
sumin.close();
}
catch(Exception e2)
{
System.out.println(e2);
}
int L2=0;
System.arraycopy(c, 0, d, L2, (int)f5.length());
L2+=(int)f5.length();
try {
FileOutputStream sumout=new FileOutputStream(f4);
sumout.write(d);
sumout.close();
}
catch(Exception e3)
{
System.out.println(e3);
}
}
}}