利用Java復制文件到處都可以用到,這里總結了一個類供大家參考。里面總共有兩個方法:
1
2
|
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.swing.JOptionPane; /** * 復制文件或文件夾 * * zww */ public class CopyFileUtil { private static String MESSAGE = "" ; /** * 復制單個文件 * * @param srcFileName * 待復制的文件名 * @param descFileName * 目標文件名 * @param overlay * 如果目標文件存在,是否覆蓋 * @return 如果復制成功返回true,否則返回false */ public static boolean copyFile(String srcFileName, String destFileName, boolean overlay) { File srcFile = new File(srcFileName); // 判斷源文件是否存在 if (!srcFile.exists()) { MESSAGE = "源文件:" + srcFileName + "不存在!" ; JOptionPane.showMessageDialog( null , MESSAGE); return false ; } else if (!srcFile.isFile()) { MESSAGE = "復制文件失敗,源文件:" + srcFileName + "不是一個文件!" ; JOptionPane.showMessageDialog( null , MESSAGE); return false ; } // 判斷目標文件是否存在 File destFile = new File(destFileName); if (destFile.exists()) { // 如果目標文件存在并允許覆蓋 if (overlay) { // 刪除已經存在的目標文件,無論目標文件是目錄還是單個文件 new File(destFileName).delete(); } } else { // 如果目標文件所在目錄不存在,則創建目錄 if (!destFile.getParentFile().exists()) { // 目標文件所在目錄不存在 if (!destFile.getParentFile().mkdirs()) { // 復制文件失敗:創建目標文件所在目錄失敗 return false ; } } } // 復制文件 int byteread = 0 ; // 讀取的字節數 InputStream in = null ; OutputStream out = null ; try { in = new FileInputStream(srcFile); out = new FileOutputStream(destFile); byte [] buffer = new byte [ 1024 ]; while ((byteread = in.read(buffer)) != - 1 ) { out.write(buffer, 0 , byteread); } return true ; } catch (FileNotFoundException e) { return false ; } catch (IOException e) { return false ; } finally { try { if (out != null ) out.close(); if (in != null ) in.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 復制整個目錄的內容 * * @param srcDirName * 待復制目錄的目錄名 * @param destDirName * 目標目錄名 * @param overlay * 如果目標目錄存在,是否覆蓋 * @return 如果復制成功返回true,否則返回false */ public static boolean copyDirectory(String srcDirName, String destDirName, boolean overlay) { // 判斷源目錄是否存在 File srcDir = new File(srcDirName); if (!srcDir.exists()) { MESSAGE = "復制目錄失敗:源目錄" + srcDirName + "不存在!" ; JOptionPane.showMessageDialog( null , MESSAGE); return false ; } else if (!srcDir.isDirectory()) { MESSAGE = "復制目錄失敗:" + srcDirName + "不是目錄!" ; JOptionPane.showMessageDialog( null , MESSAGE); return false ; } // 如果目標目錄名不是以文件分隔符結尾,則加上文件分隔符 if (!destDirName.endsWith(File.separator)) { destDirName = destDirName + File.separator; } File destDir = new File(destDirName); // 如果目標文件夾存在 if (destDir.exists()) { // 如果允許覆蓋則刪除已存在的目標目錄 if (overlay) { new File(destDirName).delete(); } else { MESSAGE = "復制目錄失敗:目的目錄" + destDirName + "已存在!" ; JOptionPane.showMessageDialog( null , MESSAGE); return false ; } } else { // 創建目的目錄 System.out.println( "目的目錄不存在,準備創建。。。" ); if (!destDir.mkdirs()) { System.out.println( "復制目錄失敗:創建目的目錄失敗!" ); return false ; } } boolean flag = true ; File[] files = srcDir.listFiles(); for ( int i = 0 ; i < files.length; i++) { // 復制文件 if (files[i].isFile()) { flag = CopyFileUtil.copyFile(files[i].getAbsolutePath(), destDirName + files[i].getName(), overlay); if (!flag) break ; } else if (files[i].isDirectory()) { flag = CopyFileUtil.copyDirectory(files[i].getAbsolutePath(), destDirName + files[i].getName(), overlay); if (!flag) break ; } } if (!flag) { MESSAGE = "復制目錄" + srcDirName + "至" + destDirName + "失敗!" ; JOptionPane.showMessageDialog( null , MESSAGE); return false ; } else { return true ; } } public static void main(String[] args) { String srcDirName = "C:/test/test0/test1" ; String destDirName = "c:/ttt" ; CopyFileUtil.copyDirectory(srcDirName, destDirName, true ); } } |
不考慮多線程優化,單線程文件復制最快的方法是(文件越大該方法越有優勢,一般比常用方法快30+%):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
private static void nioTransferCopy(File source, File target) { FileChannel in = null ; FileChannel out = null ; FileInputStream inStream = null ; FileOutputStream outStream = null ; try { inStream = new FileInputStream(source); outStream = new FileOutputStream(target); in = inStream.getChannel(); out = outStream.getChannel(); in.transferTo( 0 , in.size(), out); } catch (IOException e) { e.printStackTrace(); } finally { close(inStream); close(in); close(outStream); close(out); } } |
如果需要監測復制進度,可以用第二快的方法(留意buffer的大小,對速度有很大影響):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
private static void nioBufferCopy(File source, File target) { FileChannel in = null ; FileChannel out = null ; FileInputStream inStream = null ; FileOutputStream outStream = null ; try { inStream = new FileInputStream(source); outStream = new FileOutputStream(target); in = inStream.getChannel(); out = outStream.getChannel(); ByteBuffer buffer = ByteBuffer.allocate( 4096 ); while (in.read(buffer) != - 1 ) { buffer.flip(); out.write(buffer); buffer.clear(); } } catch (IOException e) { e.printStackTrace(); } finally { close(inStream); close(in); close(outStream); close(out); } } |
常用的方法1是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
private static void customBufferBufferedStreamCopy(File source, File target) { InputStream fis = null ; OutputStream fos = null ; try { fis = new BufferedInputStream( new FileInputStream(source)); fos = new BufferedOutputStream( new FileOutputStream(target)); byte [] buf = new byte [ 4096 ]; int i; while ((i = fis.read(buf)) != - 1 ) { fos.write(buf, 0 , i); } } catch (Exception e) { e.printStackTrace(); } finally { close(fis); close(fos); } } |
常用的方法2是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
private static void customBufferStreamCopy(File source, File target) { InputStream fis = null ; OutputStream fos = null ; try { fis = new FileInputStream(source); fos = new FileOutputStream(target); byte [] buf = new byte [ 4096 ]; int i; while ((i = fis.read(buf)) != - 1 ) { fos.write(buf, 0 , i); } } catch (Exception e) { e.printStackTrace(); } finally { close(fis); close(fos); } } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。