`

一个关于SequenceInputStream和ByteArrayOutputStream的小例子

    博客分类:
  • io
 
阅读更多

需求:

      编写一个小程序,将一个目录以及其子目录下所有的txt文件中的内容合并到若干个txt当中,当第一个文本文件的内容

达到1M时,将剩余内容存储到下个文件当中,依此类推,产生的新文件名为1.txt,2.txt......

 

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**递归查找一个目录下所有指定文件名的文件
 * @author leter
 *
 */
public class FindFiles {

	private List<File> files = new ArrayList<File>();
	
	public List<File> find(File dir,String regExp){
		files.clear();
		get(dir,regExp);
		return files;
	}
	
	private void get(File dir,String regExp){
		for(File item : dir.listFiles()){
			if(item.isDirectory()){
				get(item,regExp);
			}else if(item.getName().matches(regExp)){
				files.add(item);
			}
		}
	}
}

  

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.List;

/**实现了Enumeration接口的类,可以当作构造参数传入到SequenceInputStream
 * @author leter
 *
 */
public class InputStreamEnumeration implements Enumeration {
	private List<File> list = null;
	private int index = -1;
	public InputStreamEnumeration(List<File> list){
		this.list = list;
		System.err.println(list.size());
	}
	public boolean hasMoreElements() {
		// TODO Auto-generated method stub
		return index < list.size() - 1;
	}

	public InputStream nextElement() {
		// TODO Auto-generated method stub
		if(++index < list.size()){
			System.out.println("^");
			try {
				return new FileInputStream(list.get(index));
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return null;
	}

}

 

 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.List;

public class SequenceInputStreamDemo {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		FindFiles f = new FindFiles();
		//找出D:\\opt目录下所有的txt文件
		List<File> files = f.find(new File("D:\\opt"), ".+\\.txt");
		if(!files.isEmpty()){
			//将包装类InputStreamEnumeration传递给SequenceInputStream以合并所有txt文件的输入流
			SequenceInputStream sis = new SequenceInputStream(new InputStreamEnumeration(files));
			//添加输入流的缓存输入功能
			BufferedInputStream bis = new BufferedInputStream(sis);
			//刚好1M的字节数组
			byte[] b = new byte[1048576];
			int len = 0;
			File newFile = getNewFile();
			BufferedOutputStream os = null;
			/*将所有的输入流写入到ByteArrayOutputStream内,注意这里用到ByteArrayOutputStream
			的原因是因为SequenceInputStream虽然是合并了文件集的输入流,但是它并不是真正意义的
			完全合并,每个输入流还是有分隔的,我读取的时候只有读完了第一个输入流才能读第二个输入流,
			只相当于是一个流的集合而已,而ByteArrayOutputStream是一个完整的字节数组。比如:
			SequenceInputStream是将1,2,3放进一个容量为3的数组,而ByteArrayOutputStream则是将
			它变成一个123的字符串。*/
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			while((len = bis.read(b))!=-1){
				bos.write(b, 0, len);
			}
			bos.close();
			//创建一个以所有文件输出流为参数的输入流缓冲区
			ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
			try {
				os = new BufferedOutputStream(new FileOutputStream(newFile));
				//一次写一个1M的文件
				while((len = bais.read(b))!=-1){
						os.write(b, 0, len);
						os.close();
						//假如数组中还有可读字节,则创建一个新的文件
						if(bais.available() > 0){
						  os = new BufferedOutputStream(new FileOutputStream(getNewFile()));
						}
				}
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				try {
					if(bais != null){
						bais.close();
					}
				} catch (Exception e) {
					// TODO: handle exception
				}
				
			}
			
		}
		
		
	}
	
	static int index = 0;
	//在D:\NewFile\下创建一个新文件的txt文本文件并返回
	public static File getNewFile(){
		File f = new File("D:\\NewFile\\"+(++index)+".txt");
		try {
			f.createNewFile();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return f;
	}

}

 

纯属练手之作。。。

分享到:
评论

相关推荐

    深刻理解java io

    5) SequenceInputStream:把多个InputStream合并为一个InputStream 2) Out stream 1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:实现...

    教你彻底明白Java的IO系统

    5) SequenceInputStream:把多个InputStream合并为一个InputStream 2. Out stream 1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:实现...

    Java程序设计语言期末试题

    5) SequenceInputStream:把多个InputStream合并为一个InputStream 2) Out stream 1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:实现...

    Java之IO流学习总结

    SequenceInputStream 可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从IO 包中去除,还完全不影响IO 包的结构,却让其更“纯洁”――纯洁的Decorator 模式。 PrintStream 也可以认为...

    JAVA IO流缓冲字节流缓冲字符流等流经典代码示例加注释总结.rar

    2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...

    IO体系.java

    InputStream ... |--ByteArrayOutputStream/:实现了一个输出流,其中的数据写入到一个byte数组。 | 使用toByteArray()和toString()获取数据。关闭无效,依然可以调用。不会产生任何IOException异常。

    java IO章节的总结

    以上能够直接对数据进行读和写的流叫节点流,但是直接用这些来操作是比较麻烦的,而且一个字节一个字节的对文件处理,对硬盘的读取和存入对硬盘的损伤是很大的,因此需要对这些节点流进行包装,即外套一些处理流来...

    PCMAudioPlayerDemo:使用 AudioTrack 播放 PCM 音频文件

    PCMAudioPlayerDemothis project Using AudioTrack play PCM audio files##chinese这里要感谢...##说明该demo实现将多个pcm的音频文件合并到一个流中(合并主要用的是SequenceInputStream),通过用AudioTrack进行播放。

Global site tag (gtag.js) - Google Analytics