1 package day01;
2
3 import java.io.File;
4 import java.io.FileFilter;
5 import java.io.IOException;
6 import java.io.RandomAccessFile;
7 import java.util.ArrayList;
8 import java.util.List;
9
10 public class FileUtils {
11 /**
12 * 列出指定目录下(包括其子目录)的所有文件
13 *
14 * @param dir
15 * @throws IOException
16 */
17 public static void listDirectory(File dir) {
18 if (!dir.exists()) {
19 throw new IllegalArgumentException("目录:" + dir + "不存在");
20 }
21 if (!dir.isDirectory()) {
22 throw new IllegalArgumentException(dir + "不是目录");
23 }
24 File[] subs = dir.listFiles();
25 if (subs != null && subs.length > 0) {
26 for (File sub : subs) {
27 if (sub.isDirectory()) {
28 listDirectory(sub);
29 } else {
30 System.out.println(sub);
31 }
32 }
33 }
34 }
35
36 /**
37 * 删除指定目录及其包含的所有内容
38 *
39 * @param dir
40 * @throws IOException
41 */
42 public static void deleteDirectory(File dir) throws IOException {
43 if (!dir.exists()) {
44 throw new IllegalArgumentException("目录:" + dir + "不存在");
45 }
46 if (!dir.isDirectory()) {
47 throw new IllegalArgumentException(dir + "不是目录");
48 }
49 File[] subs = dir.listFiles();
50 if (subs != null && subs.length > 0) {
51 for (File sub : subs) {
52 if (sub.isDirectory()) {
53 deleteDirectory(sub);
54 } else {
55 System.out.println(sub);
56 if (!sub.delete()) {
57 throw new IOException("无法删除文件:" + sub);
58 }
59 }
60 }
61 }
62 System.out.println(dir);
63 if (!dir.delete()) {
64 throw new IOException("无法删除目录:" + dir);
65 }
66 }
67
68 /**
69 * 列出指定目录下指定扩展名的所有文件
70 *
71 * @param dir
72 * @param extensions
73 * @param recursive
74 * @return
75 */
76 public static List<File> listFile(File dir, final String[] extensions,
77 boolean recursive) {
78 if (!dir.exists()) {
79 throw new IllegalArgumentException("目录:" + dir + "不存在");
80 }
81 if (!dir.isDirectory()) {
82 throw new IllegalArgumentException(dir + "不是目录");
83 }
84 FileFilter ff = null;
85 if (extensions == null || extensions.length == 0) {
86 ff = new FileFilter() {
87 @Override
88 public boolean accept(File pathname) {
89 return true;
90 }
91 };
92 } else {
93 ff = new FileFilter() {
94 @Override
95 public boolean accept(File pathname) {
96 if (pathname.isDirectory())
97 return true;
98 String name = pathname.getName();
99 for (String ext : extensions) {
100 if (name.endsWith(ext)) {
101 return true;
102 }
103 }
104 return false;
105 }
106 };
107 }
108 return listFile(dir, ff, recursive);
109 }
110
111 public static List<File> listFile(File dir, final String filename,
112 boolean recursive) {
113 if (!dir.exists()) {
114 throw new IllegalArgumentException("目录:" + dir + "不存在");
115 }
116 if (!dir.isDirectory()) {
117 throw new IllegalArgumentException(dir + "不是目录");
118 }
119 FileFilter ff = null;
120 if (filename == null || filename.length() == 0) {
121 ff = new FileFilter() {
122 @Override
123 public boolean accept(File pathname) {
124 return true;
125 }
126 };
127 } else {
128 ff = new FileFilter() {
129 @Override
130 public boolean accept(File pathname) {
131 if (pathname.isDirectory())
132 return true;
133 String name = pathname.getName();
134 if (name.indexOf(filename) != -1)
135 return true;
136 else
137 return false;
138 }
139 };
140 }
141 return listFile(dir, ff, recursive);
142 }
143
144 private static List<File> listFile(File dir, FileFilter ff,
145 boolean recursive) {
146 List<File> list = new ArrayList<File>();
147 File[] subs = dir.listFiles(ff);
148 if (subs != null && subs.length > 0) {
149 for (File sub : subs) {
150 if (sub.isFile()) {
151 list.add(sub);
152 } else if (recursive) {
153 list.addAll(listFile(sub, ff, true));
154 }
155 }
156 }
157 return list;
158 }
159 public static void copyFile(File srcFile, File destFile) throws IOException {
160 if (!srcFile.exists()) {
161 throw new IllegalArgumentException("文件:" + srcFile + "不存在");
162 }
163 if (!srcFile.isFile()) {
164 throw new IllegalArgumentException(srcFile + "不是文件");
165 }
166 RandomAccessFile srcRaf = new RandomAccessFile(srcFile, "r");
167 if (!destFile.exists()) {
168 if (!destFile.createNewFile())
169 throw new IOException("无法创建文件:" + destFile);
170 }
171 RandomAccessFile destRaf = new RandomAccessFile(destFile, "rw");
172 byte[] buffer = new byte[8 * 1024];
173 int len = -1;
174 while ((len = srcRaf.read(buffer)) != -1) {
175 destRaf.write(buffer, 0, len);
176 }
177 srcRaf.close();
178 destRaf.close();
179 }
180
181 public static void copyDirectory(File srcDir, File destDir)
182 throws IOException {
183 if (!srcDir.exists()) {
184 throw new IllegalArgumentException("文件:" + srcDir + "不存在");
185 }
186 if (!srcDir.isDirectory()) {
187 throw new IllegalArgumentException(srcDir + "不是目录");
188 }
189 if (!destDir.exists()) {
190 if (!destDir.mkdir())
191 throw new IOException("无法创建目录:" + destDir);
192 }
193 File[] subs = srcDir.listFiles();
194 if (subs != null && subs.length > 0) {
195 for (File sub : subs) {
196 if (sub.isFile()) {
197 copyFile(sub, new File(destDir, sub.getName()));
198 } else if (sub.isDirectory()) {
199 copyDirectory(sub, new File(destDir, sub.getName()));
200 }
201 }
202 }
203 }
204 }