这个工具类,用线程的方式实现文件的复制,效果勉强还算可以。功能不够完善。
根据两个路径字符串(文件路径或文件夹路径),实现文件的复制,具体用的方法,注释还算清楚。
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 }
不能在构造方法里抛出异常,好难受。