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  存在。)

  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/aukle/p/3215050.html
Copyright © 2011-2022 走看看