- package cn.itcast_05;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- /*
- * 需求:复制多极文件夹
- *
- * 数据源:G:\Java\demos
- * 目的地:G:\\
- *
- * 分析:
- * A:封装数据源File
- * B:封装目的地File
- * C:判断该File是文件还是文件夹
- * a:是文件夹
- * 就在目的地目录下创建该文件夹
- * 获取该File对象下的所有文件或者文件夹File对象
- * 遍历得到每一个File对象
- * 回到C
- * b:是文件
- * 就复制(字节流)
- */
- public class copyFolderDemo {
- public static void main(String[] args) throws IOException {
- // 封装数据源
- File srcFolder = new File("D:\\a\\demos");
- // 封装目的地
- File destFolder = new File("D:\\");
- // 复制文件夹功能
- copyFolder(srcFolder, destFolder);
- }
- /**
- * 复制文件夹方法
- *
- * @param srcFolder
- * 数据源
- * @param destFolder
- * 目的地
- */
- public static void copyFolder(File srcFolder, File destFolder)
- throws IOException {
- // 判断该File是文件还是文件夹
- if (srcFolder.isDirectory()) {
- // 文件夹
- File newFolder = new File(destFolder, srcFolder.getName());
- newFolder.mkdir();
- // 获取该File对象下的所有文件或者文件夹File对象
- File[] fileArray = srcFolder.listFiles();
- // 遍历得到每一个File对象
- for (File file : fileArray) {
- copyFolder(file, newFolder);
- }
- } else {
- // 文件
- File newFile = new File(destFolder, srcFolder.getName());// G:\d.txt
- // 复制文件功能
- copyFile(srcFolder, newFile);
- }
- }
- /**
- * 复制文件方法
- *
- * @param srcFolder
- * 数据源
- * @param newFile
- * 目的地
- */
- public static void copyFile(File srcFolder, File newFile)
- throws IOException {
- // 封装数据源
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
- srcFolder));
- // 封装目的地
- BufferedOutputStream bos = new BufferedOutputStream(
- new FileOutputStream(newFile));
- // 读写数据
- byte[] bys = new byte[1024];
- int len = 0;
- while ((len = bis.read(bys)) != -1) {
- bos.write(bys, 0, len);
- bos.flush();
- }
- // 释放资源
- bos.close();
- bis.close();
- }
- }
从控制台获取输入的文件目录然后将该目录(包含子目录)下的.java文件复制到D:/java文件夹中,并统计java文件的个数.
提示:如果有相同的名称的文件,如果两个Test01.java,则拷贝到目标文件夹时只能有一个Test01.java,另一个Test01.java要修改为另一个名称:该名称可随机生成,只要不重复即可.
package cn.itcast.demo;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.Scanner;
public class Test02 {
	static int count = 0;
	public static void main(String[] args) throws IOException {
		// 获得源文件夹
		File srcDir = inputFile();
		// 创建目标文件夹对象
		File destDir = new File("d:/java");
		destDir.mkdirs();
		// 拷贝Java文件
		copyJavaFile(srcDir, destDir);
		System.out.println("count = " + count);
	}
	/*
	 * 将srcDir文件夹下的所有.Java文件拷贝到destDir文件夹下
	 */
	public static void copyJavaFile(File srcDir, File destDir)
			throws IOException {
		// 获得源文件夹下所有的.java文件和子文件夹
		File[] files = srcDir.listFiles(new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				if (pathname.isDirectory()
						|| pathname.getName().endsWith(".java"))
					return true;
				return false;
			}
		});
		// 遍历文件数组
		for (File file : files) {
			// 判断file是否是文件夹
			if (file.isDirectory()) {
				// 递归调用当前方法
				copyJavaFile(file, destDir);
			} else { // 如果是文件,拷贝到目标文件夹destDir下
				// 获得要拷贝的文件名
				String fileName = file.getName();
				// 在目标文件夹destDir下创建一个同名文件名
				File destFile = new File(destDir, fileName);
				// 判断目标文件是否存在
				while (destFile.exists()) {
					// 重命名目标文件名
					destFile = new File(destDir, new Random().nextInt(100000)
							+ fileName);
				}
				System.out.println(destFile);
				copyFile(file, destFile);
			}
		}
	}
	/*
	 * 字节流缓冲区流读写字节数组
	 */
	private static void copyFile(File srcFile, File destFile)
			throws IOException {
		// 计数器加一
		count++;
		// 创建字节缓冲输入流
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				srcFile));
		// 创建字节缓冲输出流
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(destFile));
		int len = 0;
		byte[] buffer = new byte[1024];
		// 循环读取数据
		while ((len = bis.read(buffer)) != -1) {
			// 利用输出流往输出目的写数据
			bos.write(buffer, 0, len);
		}
		// 关闭资源
		bis.close();
		bos.close();
	}
	/*
	 * 根据用户输入的路径字符串创建文件对象
	 */
	private static File inputFile() {
		// 创建键盘输入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个文件夹路径:");
		// 接收用户输入的路径
		String filePath = sc.nextLine();
		// 根据路径字符串创建文件对象
		File dir = new File(filePath);
		if (!dir.exists())
			throw new RuntimeException("你输入的文件路径不存在!!!");
		// 判断是否是文件夹
		if (!dir.isDirectory()) {
			throw new RuntimeException("输入的路径不是文件夹路径!!!");
		}
		return dir;
	}
}