问题描述
packagecom.lk.example;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.io.SequenceInputStream;importjava.util.ArrayList;importjava.util.Enumeration;importjava.util.Iterator;importorg.omg.CORBA.Environment;publicclassSplitFileDemo{publicstaticvoidmain(String[]args)throwsIOException{Filefile=newFile("D:\demo.JPG");FilefileOne=newFile("D:\demo_one.JPG");//splitFile(file);toOne(fileOne);}/*定义一个将单文件切割成多个碎片文件的方法*/publicstaticvoidsplitFile(Filefile)throwsIOException{FileInputStreamfi=newFileInputStream(file);FileOutputStreamfo=null;byte[]buf=newbyte[1024*1024];intcount=0;intlen=0;while((len=fi.read(buf))!=-1){count++;//Stringname=count+".part";fo=newFileOutputStream("D:\"+count+".part");fo.write(buf,0,len);}fi.close();fo.close();}/*定义一个将多个碎片文件转化成一个文件的方法*/publicstaticvoidtoOne(Filefile)throwsIOException{ArrayList<FileInputStream>ne=newArrayList<FileInputStream>();for(intx=1;x<3;x++){ne.add(newFileInputStream("D:\"+x+".part"));}Iterator<FileInputStream>it=ne.iterator();BufferedOutputStreambo=newBufferedOutputStream(newFileOutputStream(file));BufferedInputStreamsq=newBufferedInputStream(newSequenceInputStream(newEnumeration<FileInputStream>(){@OverridepublicbooleanhasMoreElements(){//TODOAuto-generatedmethodstubreturnit.hasNext();}@OverridepublicFileInputStreamnextElement(){//TODOAuto-generatedmethodstubreturnit.next();}}));intco=0;while((co=sq.read())!=-1){bo.write(co);}bo.close();sq.close();}}每次切割都是成功的,但是为何合并的时候,文件总是比原文件要小,而且图片能显示却不完整-。-
解决方案
解决方案二:
for(intx=1;x<3;x++){ne.add(newFileInputStream("D:\"+x+".part"));}这里说明只合并两个文件,所以如果被分割的文件过大,被分割成了超过2个碎片,合成的时候自然变小了。byte[]buf=newbyte[1024*1024];intcount=0;intlen=0;while((len=fi.read(buf))!=-1){count++;//Stringname=count+".part";fo=newFileOutputStream("D:\"+count+".part");fo.write(buf,0,len);}从上面代码看出来如果文件大于2M,将被分割成至少3个碎片
解决方案三:
代码没有问题,问题可能出在for(intx=1;x<3;x++){ne.add(newFileInputStream("D:\"+x+".part"));}你这里写死了是不是少一块另外finalIterator<FileInputStream>it=ne.iterator();内部类引用外部变量,外部变量必须是final的
解决方案四:
你为何不看看for(intx=1;x<3;x++)这个呢?不一定是分割成两个子文件的。