需求:
把一个文件夹复制到另一个文件夹下,且保持文件夹内文件(夹)层级不变
示例:F:\5. Eclipse TestFiles\src --> F:\5. Eclipse TestFiles\dest(将src文件夹复制到dest文件夹下)
思路:
1.定义一个方法,用来获取用户录入的文件夹路径
getDirPath();
2.定义一个方法,用来复制文件夹
CopyDirectoryToDirectory();
getDirPath( )方法
作用:实现用户通过键盘录入的文件夹路径的功能;具体代码实现,见下!
copyDirectoryToDirectory()方法
具体的方法实现思路:
1.在目的地文件夹下创建一个与数据源文件夹名称一样的文件夹
注意:如果目的地文件夹下存在同名文件夹,则不需要创建;否则,创建同名文件夹
2.获取数据源文件夹中所有的文件及文件夹
实现方法:File#listFiles()
3.遍历listFiles数组,获取每一个File对象,判断是文件还是文件夹
是文件:就copy
是文件夹:就递归
提示:
copyDirectoryToDirectory( )方法的关键就是:
把 listFiles数组中每一个File对象,复制到 dest文件夹下的新建文件夹src(newDir src)中
copyDirectoryToDirectory( )方法详细代码如下:
//1.在目的地文件夹下创建一个与数据源文件夹名称一样的文件夹
File newDir = new File(dest,src.getName());
if (!newDir.exists()) {
//创建单极文件夹
newDir.mkdir();
}
//2.获取数据源文件夹中所有的文件及文件夹
File[] listFiles = src.listFiles();
//listFiles 就是数据源文件夹下的文件或者文件夹
for (File file : listFiles) {
//3遍历listFiles数组,获取每一个File对象,判断是文件还是文件夹
if (file.isFile()) {//是文件 拷贝
BufferedInputStream bisBufferedInputStream = new BufferedInputStream(new FileInputStream(file));
//注意保持目的地文件名要和数据源文件名一致
File newFile = new File(newDir, file.getName());
FileOutputStream fosFileOutputStream = new FileOutputStream(newFile);
BufferedOutputStream bosBufferedOutputStream = new BufferedOutputStream(fosFileOutputStream);
int length = 0;
byte[] bytes = new byte[1024];
bosBufferedOutputStream.write(bytes, 0, length);
bisBufferedInputStream.close();
bosBufferedOutputStream.close();
}else {//是文件夹 递归
copyDirectoryToDirectory(file, newDir);
}
}
完整代码呈现:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Scanner;
public class CopyDirectoryExample {
public static void main(String[] args) throws Exception {
//F:\5. Eclipse TestFiles\src --> F:\5. Eclipse TestFiles\dest
File src = getDirPath();
System.out.println(src);
File dest = getDirPath();
System.out.println(dest);
copyDirectoryToDirectory(src, dest);
System.out.println("文件夹复制完成,搞定!");
}
/**
* 获取文件夹路径方法:getDirPath()
* @return 用户录入的文件夹路径
*/
public static File getDirPath() {
Scanner scanner = new Scanner(System.in);
System.out.println("请录入文件夹路径:");
while (true) {
String line = scanner.nextLine();
File dirPathFile = new File(line);
if (!dirPathFile.isDirectory()) {
System.out.println("录入有误,请重新录入");
}else {
return dirPathFile;
}
}
}
/**
* 用来复制文件夹的方法 copyDirectoryToDirectory()
* @param src 数据源文件夹
* @param dest 目的地文件夹
* @throws Exception
*/
public static void copyDirectoryToDirectory(File src,File dest) throws Exception {
//1.
File newDir = new File(dest,src.getName());
if (!newDir.exists()) {
//创建单极文件夹
newDir.mkdir();
}
//2
File[] listFiles = src.listFiles();
//listFiles 就是数据源文件夹下的文件或者文件夹
for (File file : listFiles) {
//3
if (file.isFile()) {//是文件 拷贝
BufferedInputStream bisBufferedInputStream = new BufferedInputStream(new FileInputStream(file));
//注意保持目的地文件名要和数据源文件名一致
File newFile = new File(newDir, file.getName());
FileOutputStream fosFileOutputStream = new FileOutputStream(newFile);
BufferedOutputStream bosBufferedOutputStream = new BufferedOutputStream(fosFileOutputStream);
int length = 0;
byte[] bytes = new byte[1024];
bosBufferedOutputStream.write(bytes, 0, length);
bisBufferedInputStream.close();
bosBufferedOutputStream.close();
}else {//是文件夹 递归
copyDirectoryToDirectory(file, newDir);
}
}
}
}