文件切割器和文件合并器

一、文件切割器

import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Properties;

public class SplitFileDemo{
 private static final int SIZE = 1024*1024;
 public static void main(String[] args) throws IOException{
 File file = new File("0.mp3" );
 splitFile(file);
 }

 public static void splitFile(File file) throws IOException {
 //用读取流关联源文件
 FileInputStream fis = new FileInputStream(file);

 //定义一个1M的缓冲区

 byte[] buf = new byte[SIZE];

 //创建目的
 FileOutputStream fos = null;

 int len = 0;
 int count = 1;

 //切割文件时,必须记录住被切割文件的名称,以及切割出来碎片文件的个数,以方
便于合并。
//这个信息为了进行描述,使用键值对的方式,用到了properties对象。

 Properties prop = new Properties();
 File dir = new File("c:\\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();
 }

 //将被切割文件的信息保存到prop集合中
 prop.setProperty( "partcount",count + "" );
 prop.setProperty( "filename",file.getName());

 fos = new FileOutputStream(new File(dir,count + ".properties" ));

 //将prop集合中的数据存储到文件中
 prop.store(fos, "save file info");

 fis.close();
 fos.close();
 }
 }

二 、文件合并器


 import java.io.File;
 import java.io.FileInputStream;
 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.Iterator;
 import java.util.Properties;

 public class MergeFile{
 public static void main(String[] args) throws IOException {
 File dir = new File("c:\\partFiles" );
 mergeFile(dir);
 }

 public static void mergeFile(File dir) throws IOException {

 //获取指定目录下的配置文件对象
 File[] files = dir.listFiles( new SuffixFilter(".properties" ));

 if(files.length!=1)
 throw new RuntimeException(dir + ",该目录下没有properties扩
展名的文件或者不唯一" );

 //记录配置文件对象
 File confile = files[0];

 //获取该文件中的信息
 Properties prop = new Properties();
 FileInputStream fis = new FileInputStream(confile);

 prop.load(fis);

 String filename = prop.getProperty( "filename");

 int count = Integer.parseInt(prop.getProperty("partcount"));

 //获取该目录下的所有碎片文件
 File[] partFiles = dir.listFiles( new SuffixFilter(".part" ));

 if(partFiles.length != (count - 1)){
throw new RuntimeException("碎片文件不符合要求,个数不对!应该
是" + count + "个");
 }

 //将碎片文件和流对象关联并存储到集合中
 ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();

 for(int x = 1; x <= partFiles.length; x++){
 al.add( new FileInputStream(partFiles[x-1]));
 }

 final Iterator<FileInputStream> it = al.iterator();

 //将多个流合并成一个序列流
 Enumeration<FileInputStream> en = Collections.enumeration(al);

 SequenceInputStream sis = new SequenceInputStream(en);

 FileOutputStream fos = new FileOutputStream(new
File(dir,filename));

 byte[] buf = new byte[1024*1024];
 int len = 0;
 while((len = sis.read(buf)) != -1){
 fos.write(buf,0,len);
 }

 fos.close();
 sis.close();
 }
 }

 class SuffixFilter implements FilenameFilter{
 private String suffix;

 public SuffixFilter(String suffix){
 super();
 this.suffix = suffix;
 }

 public boolean accept(File dir,String name){
return name.endsWith(suffix);
 }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值