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

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()方法中捕获该异常。


你可能感兴趣的:(SequenceInputStream类(对包含多个对象内的文件连续进行读取))