SequenceInputStream类(对包含多个对象内的文件连续进行读取)

来源:互联网 发布:快速排序算法 图解 编辑:程序博客网 时间:2024/05/23 00:24

SequenceInputStream类的相关使用

    SequenceInputStream类允许连接多个InputStream对象。SequenceInputStream对象的构造函数与其他所有InputStream对象都不同。SequenceInputStream构造函数使用一对

InputStream对象或InputStream对象的一个Enumeration对象作为参数:

 SequenceInputStream(InputStream first,InputStream second)

 SequenceInputStream(Enumeration<? extends InputStream>  streamEnum)

    在操作上,该类从第一个InputStream对象进行读取,直到读取完全部内容,然后切换到第二个InputStream对象。对于使用Enumeration对象的情况,该类持续读取所有InputStream对象中的内容,直到到达最后一个InputStream对象的末尾为止。当到达每个文件的末尾时,与之关联的流就会被关闭。关闭通过SequenceInputStream创建的流,会导致关闭所有未关闭的流。

    下面是一个简单的例子,该例使用SequenceInputStream对象输出两个文件中的内容,使用传统的关闭方式(也可使用带资源的try语句进行关闭)。

import java.io.*;import java.util.*;class InputStreamEnumerator implements Enumeration<FileInputStream>{private Enumeration<String> files;public InputStreamEnumerator(Vector<String> files){this.files=files.elements();//Vector类与ArrayList类似 但Vector是同步的   并遗留了方法Enumeration<String> elements()//用于返回向量元素中的一个枚举}public boolean hasMoreElements(){return files.hasMoreElements();}public FileInputStream nextElement(){try{return new FileInputStream(files.nextElement().toString());}catch(IOException e){return null;}}}class SequenceInputStreamDemo {public static void main(String[] args){int c;Vector<String> files=new Vector<String>();files.addElement("c:file1.txt");files.addElement("c:file2.txt");files.addElement("c:file3.txt");InputStreamEnumerator ise=new InputStreamEnumerator(files);InputStream input=new SequenceInputStream(ise); //SequenceInputStream类为InputStream子类//所以可以转化为InputStream的引用InputStreamReader reader=new InputStreamReader(input);//将字节流转化为字符流try{while((c=reader.read())!=-1)System.out.print((char)c);}catch(NullPointerException e){System.out.println("Error opening File.");}catch(IOException e){System.out.println("I/O Error: "+e);}finally{try{reader.close();}catch(IOException e){System.out.println("Error Closing SequenceInputStream");}}}}

  这个例子创建了一个Vector对象,然后为其添加了三个文件。将这个向量的名称传递给InputStreamEnumerator类,使用它们的名称打开FileInputStream对象,设计InputStreamEnumerator的目的是为向量提供一个封装器,该封装器传递进去Vector对象

参数,返回元素而不是文件名。SequenceInputStream对象依次打开每个文件,并且以上程序输出文件内容。

  注意在nextElement()方法中,如果不能打开文件,就返回null。这会导致NullPointerException异常,可以在main()方法中捕获该异常。


0 0
原创粉丝点击