zoukankan      html  css  js  c++  java
  • Java学习笔记——SequenceInputStream类合并文件的综合举例分析

    SequenceInputStream 介绍

    SequenceInputStream 类表示其他输入流的逻辑串联,即文件的合并。

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

    合并两个文件

    SequenceInputStream 类提供了两个构造函数。我们先来看第一个。
     所用的构造函数:
     SequenceInputStream(InputStream s1, InputStream s2) 

    通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),

     以提供从此 SequenceInputStream 读取的字节。 即将文件 file1 和文件 file2 合并至文件 file3 中。

    代码如下:

    	public static void SequenceTest1(String file1, String file2,String file3){
    		try {
    			FileInputStream iStream1 = new FileInputStream(new File(file1));
    			FileInputStream iStream2 = new FileInputStream(new File(file2));
    			FileOutputStream iStream3 = new FileOutputStream(new File(file3));
    			InputStream si = new SequenceInputStream(iStream1, iStream2);
    			byte[] arr = new byte[1024*20];
    			int len = 0;
    			while ((len = si.read(arr))!=-1) {
    				iStream3.write(arr,0,len);
    				iStream3.flush();//刷新此缓冲的输出流。
    			}
    			si.close();
    			iStream3.close();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}

    合并三个文件

    如果要用SequenceInputStream实现三个文件的合并,有两种方法:
    一、通过合并两个文件是上述方法,嵌套使用,则可以实现三个文件的合并。在此不赘述。
    二、使用SequenceInputStream类的第二个构造方法SequenceInputStream(Enumeration<? extends InputStream> e) 。

    方法二是通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。

    通过集合类的方式来传递文件的地址参数。

    Java代码:

    	public static void SequenceTest3(String file1, String file2,String file3,String file4){
    		SequenceInputStream iStream = null;
    		BufferedOutputStream bStream = null;
    		Vector<InputStream >vector = new Vector<InputStream>();
    		try {
    			vector.addElement(new FileInputStream(new File(file1)));
    			vector.addElement(new FileInputStream(new File(file2)));
    			vector.addElement(new FileInputStream(new File(file3)));
    			
    			Enumeration<InputStream>enumeration = vector.elements();
    			iStream = new SequenceInputStream(enumeration);
    			bStream = new BufferedOutputStream(new FileOutputStream(new File(file4)));
    			byte[] arr = new byte[1024*20];
    			int len = 0;
    			while ((len = iStream.read(arr))!=-1) {
    				bStream.write(arr, 0, len);
    				bStream.flush();//刷新此缓冲的输出流。
    			}
    			iStream.close();
    			bStream.close();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}


    上述代码是将 file1、 file2、 file3 的路径文件合并至 file4 的路径下。

    合并多个文件(推荐使用)

    以上虽然实现了多个文件的合并,但是,传递的参数太多,而且,不具有灵活性。
    调用方法的时候,参数个数必须满足足够的要求。
    下面,我们 通过字符串数组的方式来传递文件的地址参数,来对上面的方法进行 改进

    Java代码:
    	public static void SequenceTest4(String[] filesrc,String fileresult){
    		SequenceInputStream iStream = null;
    		BufferedOutputStream bStream = null;
    		Vector<InputStream >vector = new Vector<InputStream>();
    		try {
    			for (int i = 0; i < filesrc.length; i++) {
    				vector.addElement(new FileInputStream(new File(filesrc[i])));
    			}
    			Enumeration<InputStream>enumeration = vector.elements();
    			iStream = new SequenceInputStream(enumeration);
    			bStream = new BufferedOutputStream(new FileOutputStream(new File(fileresult)));
    			byte[] arr = new byte[1024*20];
    			int len = 0;
    			while ((len = iStream.read(arr))!=-1) {
    				bStream.write(arr, 0, len);
    				bStream.flush();//刷新此缓冲的输出流。
    			}
    			iStream.close();
    			bStream.close();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}

    调用举例:

    		String[] arr = {"1.txt", "2.txt","33.txt","333.txt"};
    		SequenceTest4(arr, "w.txt");

    以上代码是将 1.txt、2.txt、33.txt、333.txt  中的文件合并至 文件 w.txt 中。
    (调用时必须保证  1.txt、2.txt、33.txt、333.txt  存在。)

  • 相关阅读:
    在Ubuntu中通过update-alternatives切换软件版本
    SCons: 替代 make 和 makefile 及 javac 的极好用的c、c++、java 构建工具
    mongodb 的使用
    利用grub从ubuntu找回windows启动项
    How to Repair GRUB2 When Ubuntu Won’t Boot
    Redis vs Mongo vs mysql
    java script 的工具
    python 的弹框
    how to use greendao in android studio
    python yield的终极解释
  • 原文地址:https://www.cnblogs.com/aukle/p/3215050.html
Copyright © 2011-2022 走看看