IO流之文件切割,文件合并 Java
现有一要求,将桌面的一个指定PPT按照大小为1MB进行切割,将切割完的文件及配置文件放在一个目录中
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; public class test { public static void main(String[] args) throws IOException { File file=new File("C:\\Users\\fan\\Desktop\\product.PPT"); splitFile(file); } public static void splitFile(File file) throws IOException { //byte数组长度为1024*1024,数组装满后大小就为1MB final int size=1024*1024; //将配置信息放入properties容器中 Properties pro=new Properties(); //用读取流关联源文件 FileInputStream fis=new FileInputStream(file); //自定义缓冲数组 byte[] buf=new byte[size]; //创建目的 FileOutputStream fos=null; int len=0; int count=1; //声明一个用于存放切割文件的目录 File dir=new File("c:\\users\\fan\\desktop\\partfiles"); //若目录不存在,创建之 if(!dir.exists()) dir.mkdirs(); while((len=fis.read(buf))!=-1) { fos=new FileOutputStream(new File(dir,(count++)+".part")); fos.write(buf,0,len); fos.close(); } pro.setProperty("partcount",count+""); pro.setProperty("filename",file.getName()); fos=new FileOutputStream(new File(dir,count+".properties")); pro.store(fos,"save"); fos.close(); fis.close(); } }
将文件切割了,那怎么吧切割完的文件合并呢?下面代码实现了将切割文件合并的功能
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.SequenceInputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.Properties; public class MergeFile { public static void main(String[] args) throws IOException { File dir=new File("C:\\Users\\fan\\Desktop\\partfiles"); mergeFile(dir); } public static void mergeFile(File dir) throws IOException { //获取指定目录下的配置文件 File[] confiles=dir.listFiles(new nameFilter("properties")); if (confiles.length!=1) throw new RuntimeException("配置文件不唯一,不能合并"); File confile=confiles[0]; FileInputStream fis=new FileInputStream(confile); Properties pro=new Properties(); pro.load(fis); fis.close(); int clipFileCount=Integer.parseInt(pro.getProperty("partcount")); String filename=pro.getProperty("filename"); //获取该目录下所有碎片文件 File[] clipFile=dir.listFiles(new nameFilter("part")); if(clipFileCount-1!=clipFile.length) throw new RuntimeException("碎片文件个数不对,无法合并"); //用集合吧获取到的碎片文件装起来 ArrayList<FileInputStream> al=new ArrayList<>(); for(int i=0;i<clipFileCount-1;i++) al.add(new FileInputStream(clipFile[i])); //声明一个枚举 Enumeration<FileInputStream> en=Collections.enumeration(al); SequenceInputStream sis=new SequenceInputStream(en); //读取序列流中的数据 byte[] buf=new byte[1024]; int len=0; //将读到的数据写入目的文件 FileOutputStream fos=new FileOutputStream(new File(dir,filename)); while((len=sis.read(buf))!=-1) { fos.write(buf, 0, len); }
sis.close();
fos.close();
} } //过滤器 class nameFilter implements FilenameFilter { private String suffix; public nameFilter(String suffix) { this.suffix=suffix; } @Override public boolean accept(File dir, String name) { // TODO Auto-generated method stub return name.endsWith(suffix); } }