這個工具類,用線程的方式實現文件的複製,效果勉強還算可以。功能不夠完善。 根據兩個路徑字元串(文件路徑或文件夾路徑),實現文件的複製,具體用的方法,註釋還算清楚。 不能在構造方法里拋出異常,好難受。 ...
這個工具類,用線程的方式實現文件的複製,效果勉強還算可以。功能不夠完善。
根據兩個路徑字元串(文件路徑或文件夾路徑),實現文件的複製,具體用的方法,註釋還算清楚。
1 package cn.util; 2 3 import java.io.*; 4 5 /** 6 * 線程的方式實現文件的複製(內部類不能實現繼承和實現,匿名內部類又不能新增方法)。 7 * 8 * @version 1 9 * @author JXLYS 10 */ 11 public class FileUtil extends Thread { 12 13 static class FileUtilHelp { 14 private static FileUtil[] farr = new FileUtil[5];// 線程數量(java預設線程最多10) 15 16 public static void createThread(File f1, File f2) { 17 int i = 0; 18 for (FileUtil f : farr) { 19 if (f == null || !f.isAlive()) { 20 farr[i] = new FileUtil().copyThread(f1, f2); 21 farr[i].start(); 22 } 23 i++; 24 } 25 } 26 27 } 28 29 private FileUtil() { 30 } 31 32 // 創建路徑 33 private static void createMkdirs(String path) { 34 35 File f = new File(path); 36 if (!f.exists()) { 37 f.mkdirs(); 38 } 39 } 40 41 /** 42 * 複製文件到指定路徑(可創建路徑) 43 * 44 * @param fileName 45 * 文件名 46 * @param path 47 * 路徑 48 * @param override 49 * 覆蓋 50 * @return 51 */ 52 public static boolean copyFileToPath(String fileName, String path, boolean override) { 53 File f1 = new File(fileName); 54 if (f1.exists()) { 55 createMkdirs(path); 56 createFileAndCopy(f1, new File(path, f1.getName()), override); 57 return true; 58 } 59 return false; 60 } 61 62 /** 63 * 複製指定路徑下所有文件到指定路徑(建議大文件不要太多) 64 * 65 * @param path1 66 * 路徑1 67 * @param path2 68 * 路徑2 69 * @return 70 */ 71 public static boolean copyPathToPath(String path1, String path2, boolean override) { 72 File f1 = new File(path1); 73 if (f1.exists() && f1.isDirectory()) { 74 createMkdirs(path2); 75 File[] farr = f1.listFiles(); 76 for (File f : farr) { 77 try { 78 Thread.sleep(10);// 一次性複製超過5個,五個線程頂不住,不想讓主線程等待則可以刪除這等待。 79 } catch (InterruptedException e) { 80 e.printStackTrace(); 81 } 82 copyFileToPath(f.getAbsolutePath(), path2, override); 83 } 84 return true; 85 } 86 return false; 87 } 88 89 // 創建文件並複製 90 private static void createFileAndCopy(File f1, File f2, boolean b) { 91 92 if (!f2.exists()) { 93 try { 94 f2.createNewFile(); 95 } catch (IOException e) { 96 e.printStackTrace(); 97 } 98 } else { 99 if (!b) 100 return; 101 } 102 FileUtilHelp.createThread(f1, f2); 103 } 104 105 /** 106 * 複製文件1到文件2(可以創建路徑) 107 * 108 * @param fileName 109 * 文件1 110 * @param fileName2 111 * 文件2 112 * @param override 113 * 是否覆蓋 114 * @return 115 */ 116 public static boolean copyFile(String fileName, String fileName2, boolean override) { 117 File f1 = new File(fileName); 118 if (f1.exists()) { 119 File f2 = new File(fileName2); 120 createMkdirs(f2.getParent()); 121 createFileAndCopy(f1, f2, override); 122 return true; 123 } 124 return false; 125 } 126 127 public static void main(String[] args) { 128 FileUtil.copyPathToPath("./1", "./2", true); 129 } 130 131 private File f1; 132 private File f2; 133 134 public FileUtil copyThread(File f1, File f2) { 135 this.f1 = f1; 136 this.f2 = f2; 137 return this; 138 } 139 140 public void run() { 141 BufferedInputStream bis = null; 142 BufferedOutputStream bos = null; 143 try { 144 bis = new BufferedInputStream(new FileInputStream(f1)); 145 bos = new BufferedOutputStream(new FileOutputStream(f2)); 146 byte[] barr = new byte[1024]; 147 int len = 0; 148 while ((len = bis.read(barr)) != -1) { 149 bos.write(barr, 0, len); 150 } 151 } catch (IOException e) { 152 e.printStackTrace(); 153 } finally { 154 if (bis != null) 155 try { 156 bis.close(); 157 } catch (IOException e) { 158 e.printStackTrace(); 159 } 160 if (bos != null) 161 try { 162 bos.close(); 163 } catch (IOException e) { 164 e.printStackTrace(); 165 } 166 } 167 } 168 }
不能在構造方法里拋出異常,好難受。