0%

Java复制文件或目录

利用java复制文件或目录,要么使用递归的方法,要么使用walkFileTree的方法。大家可以比较一下。

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package gy.finolo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

import static java.nio.file.FileVisitResult.CONTINUE;

public class CopyUtils {

public static void copy2Directory(Path inPath, Path outDirPath) throws IOException {

// 确保输出目录存在, 如果inPath是File的话, 这里就执行一次, 所以不用写到copyFile2Diretory()方法里
if (!Files.exists(outDirPath)) {
Files.createDirectories(outDirPath);
}

if (Files.isDirectory(inPath)) {
copyFilesInDirectory2Directory(inPath, outDirPath);
} else {
copyFile2Directory(inPath, outDirPath);
}


}

private static void copyFilesInDirectory2Directory(Path inDirPath, Path outDirPath) throws IOException {
DirectoryStream<Path> paths = Files.newDirectoryStream(inDirPath);
for (Path path : paths) {

if (Files.isDirectory(path)) {
Path subOutDirPath = outDirPath.resolve(inDirPath.relativize(path));
// 确保输出目录存在
if (!Files.exists(subOutDirPath)) {
Files.createDirectories(subOutDirPath);
}
copyFilesInDirectory2Directory(path, subOutDirPath);
} else {
Path subOutDirPath = outDirPath.resolve(inDirPath.relativize(path.getParent()));
copyFile2Directory(path, subOutDirPath);
}
}
}

private static void copyFile2Directory(Path inFilePath, Path outDirPath) throws IOException {
Path fileName = inFilePath.getFileName();
Path outFilePath = outDirPath.resolve(fileName);

int bufSize = 8 * 1024;
byte[] buffer = new byte[bufSize];
int len;

try (InputStream is = Files.newInputStream(inFilePath);
OutputStream os = Files.newOutputStream(outFilePath, StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE,
StandardOpenOption.CREATE)) {
while ((len = is.read(buffer)) > 0) {
os.write(buffer, 0, len);
}
}
}

/**
* 注意: visitFile方法中, 每次需要做一个if (inPath.equals(file))的判断,
* 如果inPath是文件, 那返回为true, 如果inPath为目录, 那永远返回false
* 我是为了统计, 才在里面加了一个判断, 在实际运用中, 有了这个判断效率就不高了。
* @param inPath
* @param outDirPath
* @throws IOException
*/
public static void copy2DirectoryV2(Path inPath, Path outDirPath) throws IOException {
// 确保输出目录存在
if (!Files.exists(outDirPath)) {
Files.createDirectories(outDirPath);
}

Files.walkFileTree(inPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
System.out.println("processing DIR: " + dir);
Path subOutDirPath = outDirPath.resolve(inPath.relativize(dir));

if (!Files.exists(subOutDirPath)) {
Files.createDirectories(subOutDirPath);
}
return CONTINUE;
}

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
System.out.println("processing FILE: " + file);
Path outPath;
if (inPath.equals(file)) {
// 说明source是一个文件, 只需要单独复制一个文件即可
outPath = outDirPath.resolve(file.getFileName());
} else {
outPath = outDirPath.resolve(inPath.relativize(file));
}
Files.copy(file, outPath);
return CONTINUE;
}
});
}

public static void main(String[] args) {

Path inPath = Paths.get("/usr/local");
Path outDirPath = Paths.get("/opt");

try {
// CopyUtils.copy2Directory(inPath, outDirPath);
CopyUtils.copy2DirectoryV2(inPath, outDirPath);
} catch (IOException e) {
e.printStackTrace();
}

}
}