java 文件复制工具类_Java的的简单线程复制文件工具类FileUtil2.0

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值