要說到文件拷貝,我們最先想到的估計就是,使用Java原生的InputStream和OutputStream了,實現一邊讀取一邊拷貝。下面就來實現以下。流操作均使用try-with-resource,讓Java自己去關閉流的連接。
1、Java原生實現
聲明一點:什麼叫做追加,下面是我個人通過試驗,得出的自我理解:追加是指io流關閉之後再啓動一個io往裏寫纔算追加
。可以使用小的緩衝字節數組進行驗證。
@Test
public void fileCopy(){
try(InputStream is = new FileInputStream("src.txt");
OutputStream os = new FileOutputStream("dest.txt", true)){ //注意OS的第二參數,是否追加。
byte[] buffer = new byte[1024];
int len = 0;
while ((len=is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
System.out.println("拷貝完成");
} catch (IOException e) {
e.printStackTrace();
}
}
2、使用apache的commons-io工具類
這個工具類跟我一開始的想法很吻合,就應該是直接用輸入流懟
輸出流上這樣多符合我們生活中常識啊。我一開始想着Java自己應該實現這個功能了吧,找了一圈發現自己天真了。不過還好別人幫我們實現了,也一樣。
下面這個方法只能拷貝2G以內的文件。它會首先判斷你這個文件是否大於2G,如果大於就不進行後續的拷貝了,直接返回-1。小於2G就去拷貝,並返回我們這個文件的大小。
@Test
public void fileCopy(){
try(InputStream in = new FileInputStream("src.txt");
OutputStream out = new FileOutputStream("dest.txt", true)){
int count = IOUtils.copy(in, out); //嘖嘖,這多和諧啊。
System.out.println(count);
System.out.println("拷貝完成");
} catch (IOException e) {
e.printStackTrace();
}
}
只能拷貝2G太不爽了,我一個小電影就3G多,你這個方法有點遜啊。
2.1 大文件的拷貝
能拷貝大文件首先你名字就要有大的樣子,確實copy大文件的名字就比copy多了一個large,把名字換成copyLarge
就可以了,什麼都不用動。返回值也是文件的大小。
copy
和copyLarge
有很多重載的方法,不過就這兩個就夠用了。
3、使用Java的java.nio
原來Java還真實現了,看來我只真的天真了。
@Test
public void fileCopy(){
try(FileChannel in = new FileInputStream("src.txt").getChannel();
FileChannel out = new FileOutputStream("dest.txt", true).getChannel()){
out.transferFrom(in, 0, in.size());
System.out.println("拷貝完成");
} catch (IOException e) {
e.printStackTrace();
}
}
Java的FIles類實現
@Test
public void fileCopy(){
try {
Files.copy(Paths.get("src.txt"), Paths.get("dest.txt")); //如果dest文件存在就會報錯
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("拷貝完成");
}
4、怎麼能少了我們的Guava呢
4.1 文件對文件,不支持追加
我們不用擔心文件存不存在,如果文件不存在的話,他會幫我們創建
@Test
public void fileCopy(){
File src = new File("src.txt");
File dest = new File("dest.txt");
try {
Files.copy(src, dest);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("拷貝完成");
}
4.2支持追加,文件對字節輸出流OutputStream
@Test
public void fileCopy(){
File src = new File("src.txt");
try (OutputStream out = new FileOutputStream("dest.txt", true)){
Files.copy(src, out);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("拷貝完成");
}