zoukankan      html  css  js  c++  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<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("分割完成");
        }
    }




  • 相关阅读:
    深度剖析Byteart Retail案例
    REVIT使用中遇到的各种问题汇总
    常用设计规范
    编程修养
    Linux、Windows静态编译ffmpeg 4.4.1、x264、x265等编解码库的脚本
    程序员的灯下黑:重知识轻技术
    GitHub 公布 2021 Top 10 博文「GitHub 热点速览」
    狠人!标星 3.4 万的项目说删就删,几行代码搞崩数万个开源项目
    重装系统前备份fstab
    Ubuntu系统下制作U盘启动盘
  • 原文地址:https://www.cnblogs.com/jiangu66/p/2996642.html
Copyright © 2011-2022 走看看