复制单级文件夹

把/test文件夹(包含文件夹里面的内容)复制到模块目录下

思路:

  1. 创建数据源目录File对象,路径是:/test
  2. 获取数据源目录File对象的名称(test)
  3. 创建目的地目录File对象,路径名是模块名+test组成(file-class/test)
  4. 判断目的地的目录对应的File是否存在,如果不存在,就创建
  5. 获取数据源目录下所有文件的File数组
  6. 遍历File数组,得到每一个File对象,该File对象,其实就是数据源文件
    • 数据源文件:/test/image.jpg
  7. 获取数据源文件File对象的名称(image.jpg)
  8. 创建目的地文件File对象,路径名是目的地目录+image.jpg组成(file-class/test/image.jpg)
  9. 复制文件
    • 由于文件不仅仅是文本文件,还有图片,视频等文件,所以采用字节流复制文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.demo.cases;

import java.io.*;

/**
* @author jingLv
* @date 2020/12/17
*/
public class CopyFolderDemo {
public static void main(String[] args) throws IOException {
// 1. 创建数据源目录File对象,路径是:/test
File srcFolder = new File("");
// 2. 获取数据源目录File对象的名称(test)
String srcFolderName = srcFolder.getName();
// 3. 创建目的地目录File对象,路径名是模块名+test组成(file-class/test)
File destFolder = new File("java-file-class", srcFolderName);
// 4. 判断目的地的目录对应的File是否存在,如果不存在,就创建
if (!destFolder.exists()) {
destFolder.mkdir();
}
// 5. 获取数据源目录下所有文件的File数组
File[] listFiles = srcFolder.listFiles();
// 6. 遍历File数组,得到每一个File对象,该File对象,其实就是数据源文件 - 数据源文件:/test/image.jpg
for (File file : listFiles) {
// 7. 获取数据源文件File对象的名称(image.jpg)
String fileName = file.getName();
// 8. 创建目的地文件File对象,路径名是目的地目录+image.jpg组成(file-class/test/image.jpg)
File destFile = new File(destFolder, fileName);
// 9. 复制文件 - 由于文件不仅仅是文本文件,还有图片,视频等文件,所以采用字节流复制文件
copyFile(file, destFile);
}
}

/**
* 复制文件
*
* @param file
* @param destFile
*/
private static void copyFile(File file, File destFile) throws IOException {
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destFile));

byte[] bytes = new byte[1024];
int len;
while ((len = bufferedInputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes, 0, len);
}
bufferedInputStream.close();
bufferedOutputStream.close();
}
}

复制多级文件夹

把/test文件夹(包含文件夹里面的内容及子目录和子目录下的所有内容)复制到/test_copy目录下

思路:

  1. 创建数据源File对象:路径:/test
  2. 创建目的地File对象,路径:/test_copy
  3. 写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
  4. 判断数据源是否是目录
    • 是:
      • 在目的地下创建和数据源File名称一样的目录
      • 获取数据源File下所有文件或目录的File数组
      • 遍历该File数组,得到每一个File对象
      • 把改File作为数据源File对象,递归调用复制文件夹的方法
    • 说明是文件,直接复制,使用字节流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.demo.cases;

import java.io.*;
import java.util.Objects;

/**
* @author jingLv
* @date 2020/12/21
*/
public class CopyFoldersDemo {
public static void main(String[] args) throws IOException {
// 1. 创建数据源File对象:路径:/test
File srcFile = new File("");
// 2. 创建目的地File对象,路径:/test_copy
File destFile = new File("");
// 3. 写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
copyFolder(srcFile, destFile);
}

/**
* 复制文件夹
*
* @param srcFile 数据源File对象
* @param destFile 目的地File对象
*/
private static void copyFolder(File srcFile, File destFile) throws IOException {
// 4. 判断数据源是否是目录
if (srcFile.isDirectory()) {
// 在目的地下创建和数据源File名称一样的目录
String srcFileName = srcFile.getName();
// 在目的地目录下,创建于源目录同名的文件夹
File newFolder = new File(destFile, srcFileName);
if (!newFolder.exists()) {
newFolder.mkdir();
}
// 获取数据源File下所有文件或目录的File数组
File[] files = srcFile.listFiles();
// 遍历该File数组,得到每一个File对象
for (File file : Objects.requireNonNull(files)) {
// 把改File作为数据源File对象,递归调用复制文件夹的方法
copyFolder(file, newFolder);
}
} else {
// 说明是文件,直接复制,使用字节流
File newFile = new File(destFile, srcFile.getName());
copyFile(srcFile, newFile);
}
}

/**
* 复制文件
*
* @param file 数据源File对象
* @param destFile 目的地File对象
*/
private static void copyFile(File file, File destFile) throws IOException {
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(destFile));

byte[] bytes = new byte[1024];
int len;
while ((len = bufferedInputStream.read(bytes)) != -1) {
bufferedOutputStream.write(bytes, 0, len);
}
bufferedInputStream.close();
bufferedOutputStream.close();
}
}