`

一个关于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流例子

    - `PipedInputStream`和`PipedOutputStream`允许在不同的线程之间创建管道进行数据传输,而`SequenceInputStream`则可以将多个输入流串联起来作为一个单一的输入源。 7. **内存流**: - `ByteArrayInputStream`和...

    JAVA-IO详解,方法和例子

    JAVA-IO详解主要涉及到Java平台中的输入...Java-IO是一个强大且灵活的系统,提供了丰富的类和接口,满足不同场景下的输入输出需求。通过理解这些基础知识,开发者可以有效地处理数据读写、网络通信、文件操作等问题。

    java序列号流基础入门.docx

    Java序列化流(SequenceInputStream)是Java I/O流中的一个重要概念,它允许程序将多个输入流串联起来,形成一个逻辑上的连续输入流。这在处理多个数据源合并或连续读取时非常有用。在给定的示例代码中,我们可以...

    彻底明白 Java 语言中的IO系统

    * SequenceInputStream:把多个 InputStream 合并为一个 InputStream * ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 * FileOutputStream:把信息存入文件中 * PipedOutputStream:实现了 pipe 的概念,...

    多文件输入流类的使用

    在这个例子中,我们首先创建了两个`FileInputStream`对象,然后用`ArrayList`和`Collections.enumeration()`方法将其转换为枚举,最后通过`SequenceInputStream`将两个文件合并成一个流进行读取。 **2. 文件写入的...

    jAVA程序设计基础PPT教案学习.pptx

    ByteArrayInputStream、ByteArrayOutputStream、FileInputStream、FileOutputStream、FilterInputStream、SequenceInputStream等都是流类的子类,每个子类都提供了不同的流处理功能。 通过这份PPT教案学习,学生...

    java io一些探讨

    Java IO 支持文件锁定机制,通过`FileLock`类可以防止多个进程同时修改同一个文件,从而保证数据的一致性和完整性。 #### 六、后续可以探讨的问题 - 如何有效地处理大文件的读写操作? - 如何利用NIO的新特性来...

    java序列号流基础入门.pdf

    Java序列号流(SequenceInputStream)是Java I/O流中的一个类,它允许我们将多个输入流连接在一起,就像一个单一的输入流一样进行操作。这在处理多个文件合并或者需要顺序读取不同源的数据时非常有用。 在示例代码...

    java学习大纲java学习大纲.doc

    位元串流还包括SequenceInputStream、PrintStream、ByteArrayInputStream和ByteArrayOutputStream等。字元串流如Reader和Writer处理字符流,例如InputStreamReader和OutputStreamWriter,FileReader和FileWriter,...

    JavaIO系统基础知识.pdf

    - `SequenceInputStream`允许将多个输入流合并为一个流。 对于字符流: - `FileReader`和`FileWriter`分别用于读写文件中的字符。 - `InputStreamReader`和`OutputStreamWriter`是字符流和字节流之间的适配器,它们...

    资料课件\JAVA 上课幻灯\

    `SequenceInputStream`:允许将多个输入流连接在一起,如同一个连续的流。 `PushbackInputStream`:提供了“回推”功能,可以将已读取但还未处理的字节放回流的开头。 9.2.3 字符流类 字符流主要涉及`Reader`和`...

    Input和Output.pdf

    - SequenceInputStream:将多个InputStream组合成一个流。 相对应的OutputStream负责输出字节数据,包括: - ByteArrayOutputStream:将数据写入内存缓冲区。 - FileOutputStream:将数据写入文件。 - ...

    Io框架与类图

    总结来说,Java的IO框架是一个强大的工具,它通过提供不同类型的流来处理各种数据输入和输出。无论是处理文本还是二进制数据,字符流还是字节流,开发者都可以找到合适的方法来实现数据的读取、写入和转换。了解并...

    common.io详细说明

    - **SequenceInputStream**:将多个输入流合并成一个输入流。 - **OutputStream**:表示向目的地写入数据的流。 - **ByteArrayOutputStream**:向一个字节数组写入数据。 - **FileOutputStream**:向一个文件写入...

    java数据流操作PPT学习教案.pptx

    此外,还有`ByteArrayInputStream`和`ByteArrayOutputStream`,它们允许在字节数组中读写数据,适用于小规模的数据操作。对于提高效率,Java还提供了缓冲流,如`BufferedInputStream`和`BufferedOutputStream`,它们...

    IO流面试题共5页.pdf.zip

    8. **多路复用流**:PipedInputStream和PipedOutputStream用于线程间的通信,而SequenceInputStream可以将多个输入流合并为一个。 9. **内存流**:ByteArrayInputStream和ByteArrayOutputStream可以在内存中创建...

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

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

Global site tag (gtag.js) - Google Analytics