博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的IO操作(四) - SequenceInputStream类,实例:一个文件分割、合并工具
阅读量:6585 次
发布时间:2019-06-24

本文共 3962 字,大约阅读时间需要 13 分钟。

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

转载于:https://www.cnblogs.com/whongfei/archive/2013/04/02/5246987.html

你可能感兴趣的文章
转:模态对话框的支持 (IE,Firefox,Chrome)
查看>>
关于图片或者文件在数据库的存储方式归纳
查看>>
Project Euler 345: Matrix Sum
查看>>
.htaccess 基础教程(四)Apache RewriteCond 规则参数
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>
BZOJ3668:[NOI2014]起床困难综合症(贪心)
查看>>
LightOJ 1245(Harmonic Number (II))
查看>>
图片转流
查看>>
HTML 标签说明
查看>>
java笔记八:IO流之字符流与字符缓冲流
查看>>
Docker 命令收集
查看>>
iOS App间相互跳转漫谈 part2
查看>>
什么是企业内训
查看>>
深度解析Istio系列之安全模块篇
查看>>
面向对象
查看>>
HDU 1058 Humble Numbers
查看>>
wps10.1中将txt转为excel
查看>>
[BZOJ3312][USACO]不找零(状压DP)
查看>>
gtp转换mbr
查看>>