利用Java复制文件到处都可以用到,这里总结了一个类供大家参考。里面总共有两个方法:
public static boolean copyFile(String srcFileName, String destFileName,boolean overlay);
public static boolean copyDirectory(String srcDirName, String destDirName,boolean overlay) ;
其中:
srcFileName 待复制的文件名
descFileName 目标文件名
overlay 如果目标文件存在,是否覆盖
如果复制成功返回true,否则返回false
代码:
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8.
9. import
10.
11. /**
12. * 复制文件或文件夹
13. *
14. * zww
15. */
16. public class
17.
18. private static String MESSAGE = "";
19.
20. /**
21. * 复制单个文件
22. *
23. * @param srcFileName
24. * 待复制的文件名
25. * @param descFileName
26. * 目标文件名
27. * @param overlay
28. * 如果目标文件存在,是否覆盖
29. * @return 如果复制成功返回true,否则返回false
30. */
31. public static boolean
32. boolean
33. new
34.
35. // 判断源文件是否存在
36. if
37. "源文件:" + srcFileName + "不存在!";
38. null, MESSAGE);
39. return false;
40. else if
41. "复制文件失败,源文件:" + srcFileName + "不是一个文件!";
42. null, MESSAGE);
43. return false;
44. }
45.
46. // 判断目标文件是否存在
47. new
48. if
49. // 如果目标文件存在并允许覆盖
50. if
51. // 删除已经存在的目标文件,无论目标文件是目录还是单个文件
52. new
53. }
54. else
55. // 如果目标文件所在目录不存在,则创建目录
56. if
57. // 目标文件所在目录不存在
58. if
59. // 复制文件失败:创建目标文件所在目录失败
60. return false;
61. }
62. }
63. }
64.
65. // 复制文件
66. int byteread = 0; // 读取的字节数
67. null;
68. null;
69.
70. try
71. new
72. new
73. byte[] buffer = new byte[1024];
74.
75. while ((byteread = in.read(buffer)) != -1) {
76. 0, byteread);
77. }
78. return true;
79. catch
80. return false;
81. catch
82. return false;
83. finally
84. try
85. if (out != null)
86. out.close();
87. if (in != null)
88. in.close();
89. catch
90. e.printStackTrace();
91. }
92. }
93. }
94.
95. /**
96. * 复制整个目录的内容
97. *
98. * @param srcDirName
99. * 待复制目录的目录名
100. * @param destDirName
101. * 目标目录名
102. * @param overlay
103. * 如果目标目录存在,是否覆盖
104. * @return 如果复制成功返回true,否则返回false
105. */
106. public static boolean
107. boolean
108. // 判断源目录是否存在
109. new
110. if
111. "复制目录失败:源目录" + srcDirName + "不存在!";
112. null, MESSAGE);
113. return false;
114. else if
115. "复制目录失败:" + srcDirName + "不是目录!";
116. null, MESSAGE);
117. return false;
118. }
119.
120. // 如果目标目录名不是以文件分隔符结尾,则加上文件分隔符
121. if
122. destDirName = destDirName + File.separator;
123. }
124. new
125. // 如果目标文件夹存在
126. if
127. // 如果允许覆盖则删除已存在的目标目录
128. if
129. new
130. else
131. "复制目录失败:目的目录" + destDirName + "已存在!";
132. null, MESSAGE);
133. return false;
134. }
135. else
136. // 创建目的目录
137. "目的目录不存在,准备创建。。。");
138. if
139. "复制目录失败:创建目的目录失败!");
140. return false;
141. }
142. }
143.
144. boolean flag = true;
145. File[] files = srcDir.listFiles();
146. for (int i = 0; i < files.length; i++) {
147. // 复制文件
148. if
149. flag = CopyFileUtil.copyFile(files[i].getAbsolutePath(),
150. destDirName + files[i].getName(), overlay);
151. if
152. break;
153. else if
154. flag = CopyFileUtil.copyDirectory(files[i].getAbsolutePath(),
155. destDirName + files[i].getName(), overlay);
156. if
157. break;
158. }
159. }
160. if
161. "复制目录" + srcDirName + "至" + destDirName + "失败!";
162. null, MESSAGE);
163. return false;
164. else
165. return true;
166. }
167. }
168.
169. public static void
170. "C:/test/test0/test1";
171. "c:/ttt";
172. true);
173. }
174. }
不考虑多线程优化,单线程文件复制最快的方法是(文件越大该方法越有优势,一般比常用方法快30+%):
Java代码
1. private static void
2. null;
3. null;
4. null;
5. null;
6. try
7. new
8. new
9. in = inStream.getChannel();
10. out = outStream.getChannel();
11. 0, in.size(), out);
12. catch
13. e.printStackTrace();
14. finally
15. close(inStream);
16. close(in);
17. close(outStream);
18. close(out);
19. }
20. }
如果需要监测复制进度,可以用第二快的方法(留意buffer的大小,对速度有很大影响):
C-sharp代码
1. private static void
2. in = null;
3. out = null;
4. null;
5. null;
6. try
7. new
8. new
9. in
10. out
11. ByteBuffer buffer = ByteBuffer.allocate(4096);
12. while (in.read(buffer) != -1) {
13. buffer.flip();
14. out.write(buffer);
15. buffer.clear();
16. }
17. catch
18. e.printStackTrace();
19. finally
20. close(inStream);
21. in);
22. close(outStream);
23. out);
24. }
25. }
常用的方法1是:
C-sharp代码
1. private static void
2. null;
3. null;
4. try
5. new BufferedInputStream(new
6. new BufferedOutputStream(new
7. byte[] buf = new byte[4096];
8. int
9. while
10. fos.write(buf, 0, i);
11. }
12. }
13. catch
14. e.printStackTrace();
15. finally
16. close(fis);
17. close(fos);
18. }
19. }
常用的方法2是:
C-sharp代码
1. private static void
2. null;
3. null;
4. try
5. new
6. new
7. byte[] buf = new byte[4096];
8. int
9. while
10. fos.write(buf, 0, i);
11. }
12. }
13. catch
14. e.printStackTrace();
15. finally
16. close(fis);
17. close(fos);
18. }
19. }