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

  • 相关阅读:
    采用坐标变换(移动和旋转)画箭头
    学会Func
    一个链接器的实现
    linux内核skb操作
    终于实现samba可写不可删除
    删掉SafeDrv病毒(这个病毒有点意思)
    Writing a ServiceMain Function(使用RegisterServiceCtrlHandler函数)
    利用Winscp,Putty实现Windows下编写Linux程序
    联发科6亿美元将大陆子公司卖给四维图新(180个人价值6亿美元)
    TFTP:简单文本传输协议,BOOTP:引导程序协议
  • 原文地址:https://www.cnblogs.com/aukle/p/3215050.html
Copyright © 2011-2022 走看看