Java文件copy拷貝的4種方式

要說到文件拷貝,我們最先想到的估計就是,使用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就可以了,什麼都不用動。返回值也是文件的大小。

copycopyLarge有很多重載的方法,不過就這兩個就夠用了。

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("拷貝完成");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章