黑马程序员24-1:SuffixFilter扩展名过滤器,根据配置文件,文件切割/合并,SequenceInputStream 顺序流...

[align=center]------- [url=http://edu.csdn.net/heima]android培训 [/url]、[url=http://edu.csdn.net/heima]java培训[/url]、期待与您交流!------- [/align]


package cn.itcast.io.p1.splitfile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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 {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {

File dir = new File("c:\\partfiles");

mergeFile_2(dir);
}
//根据配置文件合并分割文件
public static void mergeFile_2(File dir) throws IOException {

/*
* 获取指定目录下的配置文件对象。
*/
//自定义扩展名过滤器,实现了FilenameFilter
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=0; x<partFiles.length; x++){

al.add(new FileInputStream(partFiles[x]));
}



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

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

byte[] buf = new byte[1024];

int len = 0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}

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

}

public static void mergeFile(File dir) throws IOException{


ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();

for(int x=1; x<=3 ;x++){
al.add(new FileInputStream(new File(dir,x+".part")));
}

Enumeration<FileInputStream> en = Collections.enumeration(al);
SequenceInputStream :x sis = new SequenceInputStream(en);

FileOutputStream fos = new FileOutputStream(new File(dir,"1.bmp"));

byte[] buf = new byte[1024];

int len = 0;
while((len=sis.read(buf))!=-1){
fos.write(buf,0,len);
}

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

}

}



package cn.itcast.io.p1.splitfile;

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;

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {

File file = new File("c:\\aa.mp3");

splitFile_2(file);
}

private static void splitFile_2(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");

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

}

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;

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();
fis.close();

}

}



package cn.itcast.io.p1.splitfile;

import java.io.File;
import java.io.FilenameFilter;

public class SuffixFilter implements FilenameFilter {

private String suffix;

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

@Override
public boolean accept(File dir, String name) {

return name.endsWith(suffix);
}

}


[align=center]------- [url=http://edu.csdn.net/heima]android培训 [/url]、[url=http://edu.csdn.net/heima]java培训[/url]、期待与您交流!------- [/align]

[align=center]详细请查看:[url=http://edu.csdn.net/heima]http://edu.csdn.net/heima [/url]------- [/align]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值