现在的位置: 首页 > 综合 > 正文

SequenceInputStream类合并文件的综合举例分析 【Java】SequenceInputStream类合并文件的综合举例分析

2017年09月29日 ⁄ 综合 ⁄ 共 3904字 ⁄ 字号 评论关闭
 

【Java】SequenceInputStream类合并文件的综合举例分析

分类: Java笔记 459人阅读 评论(0) 收藏 举报

目录(?)[+]

SequenceInputStream 介绍

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

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

合并两个文件

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

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

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

代码如下:

[java] view
plain
copy

  1. public static void SequenceTest1(String file1, String file2,String file3){  
  2.     try {  
  3.         FileInputStream iStream1 = new FileInputStream(new File(file1));  
  4.         FileInputStream iStream2 = new FileInputStream(new File(file2));  
  5.         FileOutputStream iStream3 = new FileOutputStream(new File(file3));  
  6.         InputStream si = new SequenceInputStream(iStream1, iStream2);  
  7.         byte[] arr = new byte[1024*20];  
  8.         int len = 0;  
  9.         while ((len = si.read(arr))!=-1) {  
  10.             iStream3.write(arr,0,len);  
  11.             iStream3.flush();//刷新此缓冲的输出流。  
  12.         }  
  13.         si.close();  
  14.         iStream3.close();  
  15.     } catch (Exception e) {  
  16.         // TODO Auto-generated catch block  
  17.         e.printStackTrace();  
  18.     }  
  19. }  

合并三个文件

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

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

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

Java代码:

[java] view
plain
copy

  1. public static void SequenceTest3(String file1, String file2,String file3,String file4){  
  2.     SequenceInputStream iStream = null;  
  3.     BufferedOutputStream bStream = null;  
  4.     Vector<InputStream >vector = new Vector<InputStream>();  
  5.     try {  
  6.         vector.addElement(new FileInputStream(new File(file1)));  
  7.         vector.addElement(new FileInputStream(new File(file2)));  
  8.         vector.addElement(new FileInputStream(new File(file3)));  
  9.           
  10.         Enumeration<InputStream>enumeration = vector.elements();  
  11.         iStream = new SequenceInputStream(enumeration);  
  12.         bStream = new BufferedOutputStream(new FileOutputStream(new File(file4)));  
  13.         byte[] arr = new byte[1024*20];  
  14.         int len = 0;  
  15.         while ((len = iStream.read(arr))!=-1) {  
  16.             bStream.write(arr, 0, len);  
  17.             bStream.flush();//刷新此缓冲的输出流。  
  18.         }  
  19.         iStream.close();  
  20.         bStream.close();  
  21.     } catch (Exception e) {  
  22.         // TODO Auto-generated catch block  
  23.         e.printStackTrace();  
  24.     }  
  25. }  

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

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

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

  1. public static void SequenceTest4(String[] filesrc,String fileresult){  
  2.     SequenceInputStream iStream = null;  
  3.     BufferedOutputStream bStream = null;  
  4.     Vector<InputStream >vector = new Vector<InputStream>();  
  5.     try {  
  6.         for (int i = 0; i < filesrc.length; i++) {  
  7.             vector.addElement(new FileInputStream(new File(filesrc[i])));  
  8.         }  
  9.         Enumeration<InputStream>enumeration = vector.elements();  
  10.         iStream = new SequenceInputStream(enumeration);  
  11.         bStream = new BufferedOutputStream(new FileOutputStream(new File(fileresult)));  
  12.         byte[] arr = new byte[1024*20];  
  13.         int len = 0;  
  14.         while ((len = iStream.read(arr))!=-1) {  
  15.             bStream.write(arr, 0, len);  
  16.             bStream.flush();//刷新此缓冲的输出流。  
  17.         }  
  18.         iStream.close();  
  19.         bStream.close();  
  20.     } catch (Exception e) {  
  21.         // TODO Auto-generated catch block  
  22.         e.printStackTrace();  
  23.     }  
  24. }  

调用举例:

[java] view
plain
copy

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

以上代码是将 1.txt、2.txt、33.txt、333.txt  中的文件合并至 文件 w.txt 中。

(调用时必须保证  1.txt、2.txt、33.txt、333.txt  存在。)

抱歉!评论已关闭.