1. package cn.itcast_05;  
    2.   
    3. import java.io.BufferedInputStream;  
    4. import java.io.BufferedOutputStream;  
    5. import java.io.File;  
    6. import java.io.FileInputStream;  
    7. import java.io.FileOutputStream;  
    8. import java.io.IOException;  
    9.   
    10. /* 
    11.  * 需求:复制多极文件夹 
    12.  *  
    13.  * 数据源:G:\Java\demos 
    14.  * 目的地:G:\\ 
    15.  *  
    16.  * 分析: 
    17.  *      A:封装数据源File 
    18.  *      B:封装目的地File 
    19.  *      C:判断该File是文件还是文件夹 
    20.  *          a:是文件夹 
    21.  *              就在目的地目录下创建该文件夹 
    22.  *              获取该File对象下的所有文件或者文件夹File对象 
    23.  *              遍历得到每一个File对象 
    24.  *              回到C 
    25.  *          b:是文件 
    26.  *              就复制(字节流)     
    27.  */  
    28. public class copyFolderDemo {  
    29. public static void main(String[] args) throws IOException {  
    30. // 封装数据源  
    31. new File("D:\\a\\demos");  
    32. // 封装目的地  
    33. new File("D:\\");  
    34.   
    35. // 复制文件夹功能  
    36.         copyFolder(srcFolder, destFolder);  
    37.     }  
    38.   
    39. /** 
    40.      * 复制文件夹方法 
    41.      *  
    42.      * @param srcFolder 
    43.      *            数据源 
    44.      * @param destFolder 
    45.      *            目的地 
    46.      */  
    47. public static void copyFolder(File srcFolder, File destFolder)  
    48. throws IOException {  
    49. // 判断该File是文件还是文件夹  
    50. if (srcFolder.isDirectory()) {  
    51. // 文件夹  
    52. new File(destFolder, srcFolder.getName());    //拼接目标地址
    53.             newFolder.mkdir();  
    54.   
    55. // 获取该File对象下的所有文件或者文件夹File对象  
    56.             File[] fileArray = srcFolder.listFiles();  
    57. // 遍历得到每一个File对象  
    58. for (File file : fileArray) {  
    59.                 copyFolder(file, newFolder);  
    60.             }  
    61.   
    62. else {  
    63. // 文件  
    64. new File(destFolder, srcFolder.getName());// G:\d.txt  
    65.   
    66. // 复制文件功能  
    67.             copyFile(srcFolder, newFile);  
    68.         }  
    69.     }  
    70.   
    71. /** 
    72.      * 复制文件方法 
    73.      *  
    74.      * @param srcFolder 
    75.      *            数据源 
    76.      * @param newFile 
    77.      *            目的地 
    78.      */  
    79. public static void copyFile(File srcFolder, File newFile)  
    80. throws IOException {  
    81. // 封装数据源  
    82. new BufferedInputStream(new FileInputStream(  
    83.                 srcFolder));  
    84. // 封装目的地  
    85. new BufferedOutputStream(  
    86. new FileOutputStream(newFile));  
    87.   
    88. // 读写数据  
    89. byte[] bys = new byte[1024];  
    90. int len = 0;  
    91. while ((len = bis.read(bys)) != -1) {  
    92. 0, len);  
    93.             bos.flush();  
    94.         }  
    95.   
    96. // 释放资源  
    97.         bos.close();  
    98.         bis.close();  
    99.     }  
    100. }

     

     

     

     

    从控制台获取输入的文件目录然后将该目录(包含子目录)下的.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;
    	}
    }