使用IO流实现对特殊文件及文件夹中文件拷贝到指定文件中

本程序可以实现将自己指定的文件类型的文件拷贝到自己想放的文件中,比如一个文件夹中有很多文件,那么我们想把所有的TXT文件拷贝到自己指定的文件中。(靠背笔记)

package com.blueZhang;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/*SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 

SequenceInputStream(Enumeration<? extends InputStream> e) 
          通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。 
public SequenceInputStream(Enumeration<? extends InputStream> e)通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。将按顺序读取由该枚举生成的输入流,以提供从此 SequenceInputStream 读取的字节。在用尽枚举中的每个输入流之后,将通过调用该流的 close 方法将其关闭。 

参数:
e - 输入流的一个枚举。

SequenceInputStream(InputStream s1, InputStream s2) 
          通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),以提供从此 SequenceInputStream 读取的字节。 
使用的时候就要先使用Collection的方法创建一个存储输入流的枚举类型的List然后定义一个BufferedWriter 包装:
SequenceInputStream sis = new SequenceInputStream(
				Collections.enumeration(list));
		BufferedReader br = new BufferedReader(new InputStreamReader(sis));

写入的时候就是用BuffrededWriter写入数据
static <T> Enumeration<T> 
 enumeration(Collection<T> c) 
          返回一个指定 collection 上的枚举。 
enumeration
public static <T> Enumeration<T> enumeration(Collection<T> c)返回一个指定 collection 上的枚举。此方法提供与遗留 API 的互操作性,遗留 API 需要一个枚举作为输入。 

参数:
c - 将返回其枚举的 collection。 
返回:
指定 collection 上的一个枚举。


*/
/**
 * @author blueZhang
 * @version 1.0
 * <a href = "blogcsdn.com/blueZhangfun"></a>
 * 
 * */

public class Demo18 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("输入目录或文件");
		String filePath = "C:\\Documents and Settings\\Administrator\\桌面\\08_17_08_23\\0817_13"; // sc.next();
		System.out.println("请输入目的目录");
		String fileDes = "C:\\Documents and Settings\\Administrator\\桌面\\08_17_08_23\\0817_13\\老师代码总结0817_13.txt";// sc.next();
		// 建立需要写入的文件
		File des = new File(fileDes);
		// 建立ArrayList 存储InputStream流 因为创建序列化流需要一个输入流类型的List
		ArrayList<InputStream> list = new ArrayList<InputStream>();
		try {
			// 获取文件目录集合并生成相应的以文件目录名为标准的输入流
			list = getList(list, new File(filePath));
			// 开始进行拷贝
			fileCopy(des, list);
		} catch (FileNotFoundException e) {// 捕获FileNotFoundException

			e.printStackTrace();
		}

	}

	/**
	 * 本方法通过递归实现从文件夹或者文件中获得".java"类型的文件的绝对路径,这样
	 * 就能够根据相应的路径创建InputStream流。从而将InputStream流添加到List中
	 * 
	 * @param list
	 *            接收InputStream输入流的集合
	 * @param file
	 *            用于获取路径的文件
	 * @return list 返回经过处理的ArrayList<InputStream>
	 * 
	 * 
	 * 
	 * */
	public static ArrayList<InputStream> getList(ArrayList<InputStream> list,
			File file) throws FileNotFoundException {
		File[] files = file.listFiles();
		for (File f : files) {
			if (!f.isDirectory()) {
				if (f.getName().endsWith("java")) {
					System.out.println(f.getAbsolutePath());
					FileInputStream fis = new FileInputStream(
							f.getAbsoluteFile());
					list.add(fis);
				}
			} else {
				getList(list, f);
			}
		}
		return list;

	}
	/**
	 * 本方法通过所给定的目标文件和输入流集合创建可序列化输入流SequenceInputStream
	 * 使用InputStreamReader将字节流转换成字符流。写入文件中,可以实现对List集合中存储
	 * 的所有的输入流进行写入
	 * @param des 目标文件
	 * @param list 输入流集合
	 * 
	 * 
	 * */

	public static void fileCopy(File des, ArrayList<InputStream> list) {

		// FileInputStream fis =null;
		// FileOutputStream fos = null;
		// BufferedInputStream bis = null;
		// BufferedOutputStream bos = null;

		SequenceInputStream sis = new SequenceInputStream(
				Collections.enumeration(list));
		BufferedReader br = new BufferedReader(new InputStreamReader(sis));

		try {
			// fis= new FileInputStream(src);
			// bis = new BufferedInputStream(fis);
			// fos = new FileOutputStream(des);
			// bos = new BufferedOutputStream(fos);
			// 创建输出流 读取合并流
			String line = "";
			BufferedWriter be = new BufferedWriter(new FileWriter(des));
			while ((line = br.readLine()) != null) {
				be.write(line);
				be.newLine();
			}
			be.flush();
			if (be != null) {
				be.close();
				br.close();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}


你可能感兴趣的:(java,IO,IO流)