java文件分割合并学步园,Java的IO操作(四) – SequenceInputStream类,实例:一个文件分割、合并工具 | 学步园...

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 list = new ArrayList();

for(int i = 0 ; i < amount ; ++i)

{

File f = new File(fileName + "_" + i);

list.add(new FileInputStream(f));

}

final Iterator it = list.iterator();

// 构建Enumeration对象

Enumeration em = new Enumeration()

{

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("分割完成");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值