1 packagecn.util;2
3 import java.io.*;4
5 /**
6 * 线程的方式实现文件的复制。7 文件的复制需要四个参数:1,路径或文件),2路径或文件,3,是否覆盖,4,是否追加,8 多文件复制还需要加时间参数(毫秒).9 * 以及File类实例的简单创建,10 *11 *@version212 *@authorJXLYS13 */
14 public class FileUtil extendsThread {15
16 static class FileUtilHelp {//辅助类
17
18 private static FileUtil[] farr = new FileUtil[5];//线程数量(java默认线程最多10)19
20 //创建文件并复制
21 private static void createFileAndCopy(File f1, File f2, boolean override, booleanappend) {22 if (!f2.exists()) {23 createFile(f2, override);24 } else{25 if (!override)26 return;27 else{28 append = false;//覆盖必然不会追加
29 }30 }31 FileUtilHelp.createThread(f1, f2, append);32 }33
34 private static voidcreateCopy(InputStream is, OutputStream os) {35 int i = 0;36 for(FileUtil f : farr) {37 if (f == null || !f.isAlive()) {38 farr[i] = newFileUtil();39 farr[i].setInputStreamAndOutputStream(is, os);40 farr[i].start();41 }42 i++;43 }44 }45
46 //创建路径
47 private static voidcreateMkdirs(String path) {48 File f = newFile(path);49 if (!f.exists()) {50 f.mkdirs();51 }52 }53
54 //开始线程
55 private static void createThread(File f1, File f2, booleanappend) {56 int i = 0;57 for(FileUtil f : farr) {58 if (f == null || !f.isAlive()) {59 farr[i] = newFileUtil();60 farr[i].copyThread(f1, f2, append);61 farr[i].start();62 }63 i++;64 }65 }66
67 }68
69 /**
70 * 复制文件1到文件2(可以创建路径)71 *72 *@paramf173 * 文件对象74 *@paramf275 * 文件对象76 *@paramoverride77 * 是否覆盖78 *@paramappend79 * 是否追加文件内容80 */
81 public static void copyFile(File f1, File f2, boolean override, booleanappend) {82 if(exists(f1)) {83 FileUtilHelp.createMkdirs(parent(f2));84 FileUtilHelp.createFileAndCopy(f1, f2, override, append);85 }86 }87
88 /**
89 * 复制文件1到文件2(可以创建路径)90 *91 *@paramfileName92 * 文件193 *@paramfileName294 * 文件295 *@paramoverride96 * 是否覆盖97 */
98 public static void copyFile(String fileName, String fileName2, boolean override, booleanappend) {99 copyFile(newFile(fileName), newFile(fileName), override, append);100 }101
102 /**
103 * 复制文件到指定路径(可创建路径)104 *105 *@paramf1106 * 文件107 *@paramf2108 * 文件夹109 *@paramoverride110 * 是否覆盖111 *@paramappend112 * 是否追加113 *@return
114 */
115 public static void copyFileToPath(File f1, File f2, boolean override, booleanappend) {116 copyFile(f1, newFile(f2.getAbsolutePath(), f1.getName()), override, append);117 }118
119 /**
120 * 根据流来复制。121 *122 *@paramis123 * 输入流124 *@paramos125 * 输出流126 */
127 public static voidcopyFile(InputStream is, OutputStream os) {128 FileUtilHelp.createCopy(is, os);129 }130
131 /**
132 * 复制文件到指定路径(可创建路径)133 *134 *@paramfileName135 * 文件名136 *@parampath137 * 路径138 *@paramoverride139 * 覆盖140 *@paramappend141 * 是否追加142 */
143 public static void copyFileToPath(String fileName, String path, boolean override, booleanappend) {144 copyFileToPath(newFile(fileName), newFile(path), override, append);145 }146
147 /**
148 * 复制指定路径下所有文件到指定路径(建议大文件不要太多)149 *150 *@paramf1151 * 文件对象152 *@paramf2153 * 文件对象154 *@paramoverride155 * 是否覆盖156 *@paramappend157 * 是否追加158 *@paramtime159 * 复制每个文件的间隔160 */
161 public static void copyPathToPath(File f1, File f2, boolean override, boolean append, longtime) {162 if (exists(f1) &&isDirectory(f1)) {163 File[] farr =f1.listFiles();164 for(File f : farr) {165 try{166 Thread.sleep(time);//一次性复制超过5个,线程支持不住,慢点也不影响性能。
167 } catch(InterruptedException e) {168 e.printStackTrace();169 }170 copyFileToPath(f, f2, override, append);171 }172 }173 }174
175 /**
176 * 复制指定路径下所有文件到指定路径(大文件需要更多时间。)177 *178 *@parampath1179 * 路径180 *@parampath2181 * 路径182 *@paramoverride183 * 是否覆盖184 *@paramappend185 * 是否追加186 *@paramtime187 * 复制每个文件的间隔188 */
189 public static void copyPathToPath(String path1, String path2, boolean override, boolean append, longtime) {190 copyPathToPath(newFile(path1), newFile(parent(newFile(path1)), path2), override, append, time);191 }192
193 /**
194 * 创建目录195 *196 *@paramf197 */
198 public static voidcreateDire(File f) {199 FileUtilHelp.createMkdirs(f.getAbsolutePath());200 }201
202 /**
203 * 根据路径创建目录204 *205 *@parampath206 */
207 public static voidcreateDire(String path) {208 createDire(newFile(path));209 }210
211 /**
212 * 不覆盖的创建文件213 *214 *@paramf215 */
216 public static voidcreateFile(File f) {217 createFile(f, false);218 }219
220 /**
221 * 创建文件222 *223 *@paramf224 * 文件对象225 *@paramoverride226 * 是否覆盖227 */
228 public static void createFile(File f, booleanoverride) {229 FileUtilHelp.createMkdirs(parent(f));230 if(override) {231 f.delete();232 }233 if (!exists(f)) {234 try{235 f.createNewFile();236 } catch(IOException e) {237 e.printStackTrace();238 }239 }240 }241
242 /**
243 * 不覆盖的创建文件244 *245 *@paramf246 */
247 public static voidcreateFile(String fileName) {248 createFile(fileName, false);249 }250
251 /**
252 * 创建文件253 *254 *@paramfileName255 * 创建文件256 *@paramoverride257 * 是否覆盖258 */
259 public static void createFile(String fileName, booleanoverride) {260 createFile(newFile(fileName), override);261 }262
263 /**
264 * 检测文件对象是否存在265 *266 *@paramf267 */
268 public static booleanexists(File f) {269 return f.exists() ? true : false;270 }271
272 /**
273 * 检测路径是否存在274 *275 *@paramf276 */
277 public static booleanexists(String fileName) {278 return exists(newFile(fileName));279 }280
281 /**
282 * 检测文件对象是否目录283 *284 *@paramf285 */
286 public static booleanisDirectory(File f) {287 returnf.isDirectory();288 }289
290 /**
291 * 检测路径是否目录292 *293 *@paramf294 */
295 public static booleanisDirectory(String fileName) {296 returnisDirectory(newFile(fileName));297 }298
299 /**
300 * 检测文件对象是否文件301 *302 *@paramf303 */
304 public static booleanisFile(File f) {305 returnf.isFile();306 }307
308 /**
309 * 获取文件的后缀名310 *311 *@paramfileName312 *@return
313 */
314 public staticString suffixName(String fileName) {315 returnsuffixName(newFile(fileName));316 }317
318 /**
319 * 获取不带后缀名的文件名字符串320 *321 *@paramfileName322 *@return
323 */
324 public staticString getNoSuffixName(String fileName) {325 returngetNoSuffixName(newFile(fileName));326 }327
328 /**
329 * 获取不带后缀名的文件名字符串330 *331 *@paramf332 *@return
333 */
334 public staticString getNoSuffixName(File f) {335 return f.getName().substring(0, f.getName().lastIndexOf("."));336 }337
338 /**
339 * 重命名340 *341 *@paramfileName1342 * 路径343 *@paramfileName2344 * 路径345 */
346 public static voidrename(String fileName1, String fileName2) {347 rename(newFile(fileName1), newFile(fileName2));348 }349
350 /**
351 * 重命名352 *353 *@paramf1354 *@paramf2355 */
356 public static voidrename(File f1, File f2) {357 f1.renameTo(f2);358 }359
360 /**
361 * 修改指定路径的文件后缀名。362 *363 *@paramfileName364 * 路径365 *@paramsuffix366 * 后缀名367 */
368 public static voidreplaceSuffixName(String fileName, String suffix) {369 replaceSuffixName(newFile(fileName), suffix);370 }371
372 /**
373 * 修改文件后缀名374 *375 *@paramfile376 * 对象,377 *@paramsuffix378 * 后缀379 */
380 public static voidreplaceSuffixName(File file, String suffix) {381 StringBuilder name = newStringBuilder();382 name.append(getNoSuffixName(file));383 name.append(".");384 name.append(suffix);385 rename(file, newFile(parent(file), name.toString()));386 }387
388 /**
389 * 获取文件的后缀名390 *391 *@paramf392 *@return
393 */
394 public staticString suffixName(File f) {395 String[] sarr = f.getName().split("\\.");396 return sarr.length > 1 ? sarr[sarr.length - 1] : null;397 }398
399 /**
400 * 检测路径是否文件401 *402 *@paramf403 */
404 public static booleanisFile(String fileName) {405 returnisFile(newFile(fileName));406 }407
408 /**
409 * 根据路径创建文件对象,410 *411 *@paramfileName412 *@return
413 */
414 public staticFile newFile(String fileName) {415 return newFile(fileName);416 }417
418 /**
419 * 创建路径和文件名创建文件对象420 *421 *@parampath422 * 路径423 *@paramfileName424 * 文件名字425 *@return
426 */
427 public staticFile newFile(String path, String fileName) {428 return newFile(path, fileName);429 }430
431 /**
432 * 返回对象的父目录433 *434 *@paramf435 *@return
436 */
437 public staticString parent(File f) {438 String str =f.getName();439 String abso =f.getAbsolutePath();440 return abso.substring(0, abso.length() -str.length());441 }442
443 /**
444 * 根据文件和样式获取文件大小的字符串445 *446 *@paramfile447 * 根据文件路径448 *@paramsize449 * 文件大小样式(KB或MB或GB)450 *@return
451 */
452 public staticString size(File file, String size) {453 long len =file.length();454 double d = 0;455 StringBuilder sb = newStringBuilder();456 switch(size) {457 case "k":458 case "K":459 case "kb":460 case "Kb":461 case "KB":462 case "kB":463 d = 1.0 * len / 1024;464 sb.append(String.format("%.3f", d));465 sb.append("MB");466 break;467 case "m":468 case "M":469 case "mb":470 case "MB":471 case "mB":472 case "Mb":473 d = 1.0 * len / 1024 / 1024;474 sb.append(String.format("%.3f", d));475 sb.append("MB");476 break;477 case "g":478 case "G":479 case "gb":480 case "GB":481 case "Gb":482 case "gB":483 d = 1.0 * len / 1024 / 1024 / 1024;484 sb.append(String.format("%.3f", d));485 sb.append("GB");486 break;487 default:488 sb.append(len);489 sb.append("B");490 }491 returnsb.toString();492 }493
494 /**
495 * 根据路径和样式获取文件大小的字符串496 *497 *@paramfileName498 * 根据文件路径499 *@paramsize500 * 文件大小样式(KB或MB或GB)501 *@return
502 */
503 public staticString size(String fileName, String size) {504 returnsize(newFile(fileName), size);505 }506
507 privateInputStream is;508 privateOutputStream os;509
510 privateFileUtil() {511 }512
513 private voidsetInputStreamAndOutputStream(InputStream is, OutputStream os) {514 this.is =is;515 this.os =os;516 }517
518 private void copyThread(File f1, File f2, booleanappend) {519 try{520 is = newFileInputStream(f1);521 } catch(FileNotFoundException e1) {522 e1.printStackTrace();523 }524 try{525 os = newFileOutputStream(f2, append);526 } catch(FileNotFoundException e) {527 e.printStackTrace();528 }529 }530
531 public voidrun() {532 BufferedInputStream bis = null;533 BufferedOutputStream bos = null;534 try{535 bis = newBufferedInputStream(is);536 bos = newBufferedOutputStream(os);537 byte[] barr = new byte[1024];538 int len = 0;539 while ((len = bis.read(barr)) != -1) {540 bos.write(barr, 0, len);541 }542 } catch(IOException e) {543 e.printStackTrace();544 } finally{545 if (bis != null)546 try{547 bis.close();548 } catch(IOException e) {549 e.printStackTrace();550 }551 if (bos != null)552 try{553 bos.close();554 } catch(IOException e) {555 e.printStackTrace();556 }557 }558 }559 }