zoukankan      html  css  js  c++  java
  • SequenceInputStream:序列流

    作用就是将多个读取流合并成一个读取流。实现数据合并。

    表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

    这样做,可以更方便的操作多个读取流,其实这个序列流内部会有一个有序的集合容器,用于存储多个读取流对象。

    该对象的构造函数参数是枚举,想要获取枚举,需要有Vector集合,但不高效。需用ArrayList,但ArrayList中没有枚举,只有自己去创建枚举对象。

    但是方法怎么实现呢?因为枚举操作的是具体集合中的元素,所以无法具体实现,但是枚举和迭代器是功能一样的,所以,可以用迭代替代枚举。

    合并原理:多个读取流对应一个输出流。

    切割原理:一个读取流对应多个输出流。

    import java.io.*;

    import java.util.*;

    class  SplitFileDemo{

        private static final String CFG = ".properties";

        private static final String SP = ".part";

        public static void main(String[] args) throws IOException{

           File file = new File("c:\0.bmp");

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

           meger(dir);

        }

        //数据的合并。

        public static void meger(File dir)throws IOException{

           if(!(dir.exists() && dir.isDirectory()))

               throw new RuntimeException("指定的目录不存在,或者不是正确的目录");

           File[] files = dir.listFiles(new SuffixFilter(CFG));

           if(files.length==0)

               throw new RuntimeException("扩展名.proerpties的文件不存在");

           //获取到配置文件

           File config = files[0];

           //获取配置文件的信息。

           Properties prop = new Properties();

           FileInputStream fis = new FileInputStream(config);

           prop.load(fis);

           String fileName = prop.getProperty("filename");

           int partcount = Integer.parseInt(prop.getProperty("partcount"));

           //--------------------------

           File[] partFiles = dir.listFiles(new SuffixFilter(SP));

           if(partFiles.length!=partcount)

               throw new RuntimeException("缺少碎片文件");

           //---------------------

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

           for(int x=0; x<partcount; x++){

               al.add(new FileInputStream(new File(dir,x+SP)));

           }

           Enumeration<FileInputStream> en = Collections.enumeration(al);

           SequenceInputStream sis = new SequenceInputStream(en);

           File file = new File(dir,fileName);

           FileOutputStream fos = new FileOutputStream(file);

           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 splitFile(File file)throws IOException{

           //用一个读取流和文件关联。

           FileInputStream fis = new FileInputStream(file);

           //创建目的地。因为有多个。所以先创建引用。

           FileOutputStream fos = null;

           //指定碎片的位置。

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

           if(!dir.exists())

               dir.mkdir();

           //碎片文件大小引用。

           File f = null;

           byte[] buf = new byte[1024*1024];

           //因为切割完的文件通常都有规律的。为了简单标记规律使用计数器。

           int count = 0;

           int len = 0;

           while((len=fis.read(buf))!=-1){

               f = new File(dir,(count++)+".part");

               fos = new FileOutputStream(f);

               fos.write(buf,0,len);

               fos.close();

           }

           //碎片文件生成后,还需要定义配置文件记录生成的碎片文件个数。以及被切割文件的名称。

           //定义简单的键值信息,可是用Properties。

           String filename = file.getName();

           Properties prop = new Properties();

           prop.setProperty("filename",filename);

           prop.setProperty("partcount",count+"");

           File config = new File(dir,count+".properties");

           fos = new FileOutputStream(config);

           prop.store(fos,"");

           fos.close();

           fis.close();

        }

    }

    class SuffixFilter implements FileFilter{

        private String suffix;

        SuffixFilter(String suffix){

           this.suffix  = suffix;

        }

        public boolean accept(File file){

           return  file.getName().endsWith(suffix);

        }

    }

  • 相关阅读:
    HTML5 jQuery图片上传前预览
    html5中form表单新增属性以及改良的input标签元素的种类
    PHP邮箱的正则表达式
    PHP手机号码正则表达式
    CSS中设置div垂直居中
    Linux服务器查看内存占用命令
    linux压缩解压文件
    网页是静态还是伪静态?
    帝国cms内容批量替换
    帝国CMS【操作类型】说明详解
  • 原文地址:https://www.cnblogs.com/wqing7/p/5896119.html
Copyright © 2011-2022 走看看