您的位置:首页 > 产品设计 > UI/UE

Java的IO操作(四) - SequenceInputStream类,实例:一个文件分割、合并工具

2013-04-02 22:14 921 查看
SequenceInputStream可以看做是多个InputStream对象的有序集合。当一个InputStream对象的数据读取完后,它会自动取出下一个InputStream对象进行读取,直到所有的InputStream对象都读取完为止。

利用这个特点,我们来编写一个文件分割、合并工具。

使用说明:

SequenceDemo [Option] [filePath] [number]

Option:

-c : 表示要合并文件

-s : 表示要分割文件

filePath:

指定一个文件路径

number:

指定单个文件大小或文件数量

如:

java cls.SequeceDemo -s F:\QQ.exe 102400

表示将QQ.exe分割成多个文件大小为102400字节的小文件。

java cls.SequeceDemo -m F:\QQ.exe 13

表示将已经被分割好的13个QQ.exe文件合并成一个整文件。

注意,构造SequenceOutputStream对象时需要一个Enumeration对象的引用做为参数。Enumeration是一个接口,我们必须实现这个接口中的hasMoreElements()方法和nextElement()方法。

完整代码:

package cls;

import java.io.*;
import java.util.*;

public class SequenceStreamDemo
{
public static void main(String[] args) throws Exception
{
switch(args[0].charAt(1))
{
case 's': // 分割文件
{
SequenceStreamDemo.seperate(args[1],Long.parseLong(args[2]));
break;
}
case 'm': // 合并文件
{
SequenceStreamDemo.merge(args[1],Integer.parseInt(args[2]));
break;
}
default: // 参数输入错误
{
System.out.println("非法参数");
break;
}
}
}

/* 合并文件
* fileName : 文件名
* amount : 要合并的小文件的数量
**/
public static void merge(String fileName,int amount) throws Exception
{
// 创建合并后的文件
File file = new File(fileName);
FileOutputStream fis = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fis);

// 将多个小文件对象保存在List中
List<InputStream> list = new ArrayList<InputStream>();
for(int i = 0 ; i < amount ; ++i)
{
File f = new File(fileName + "_" + i);
list.add(new FileInputStream(f));
}

final Iterator<InputStream> it = list.iterator();

// 构建Enumeration对象
Enumeration<InputStream> em = new Enumeration<InputStream>()
{
public boolean hasMoreElements()
{
return it.hasNext();
}
public InputStream nextElement()
{
return it.next();
}
};

// 使用SequenceInputStream合并文件
BufferedInputStream bis = new BufferedInputStream(new SequenceInputStream(em),8192);
int data;

while((data = bis.read()) != -1)
{
bos.write(data);
}

bis.close();
bos.flush();
bos.close();

System.out.println("合并完成");
}
/* 分割文件
* fileName : 文件名
* size : 单个文件的大小
**/
public static void seperate(String fileName,long size) throws Exception
{
File file = new File(fileName);
long number;

// 计算分割后的文件数量
if(0 == file.length() % size)
{
number = file.length() / size;
}
else
{
number = file.length() / size + 1;
}

FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);

// 开始分割
byte[] buf = new byte[1];
for(int i = 0 ; i < number ; ++i)
{
FileOutputStream fos = new FileOutputStream(new File(fileName + "_" + i));
BufferedOutputStream bos = new BufferedOutputStream(fos);

long curSize = 0L;
while(bis.read(buf) != -1)
{
bos.write(buf);

curSize++;
if(curSize == size) // 已经分割成了一个小文件
{
bos.flush();
bos.close();
break;
}
}
if(curSize < size) // 打包剩下的数据
{
bos.flush();
bos.close();
break;
}

}

System.out.println("分割完成");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐