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;
}
}
















