天天看點

java檔案複制中文_Java檔案複制

介紹三種複制檔案的方法:

1. 流。

這種模式就是将檔案讀如到(輸入)流,寫入到byte數組,然後将byte數組寫入到輸出流。

File file= new File("test.txt");

InputStream inputStream= newFileInputStream(file);

OutputStream outputStream= new FileOutputStream("copy.txt");byte[] b = new byte[1024];int read = 0;while((read = inputStream.read(b))>0)

{

outputStream.write(b,0, read);

}

inputStream.close();

outputStream.close();

2. java1.4以後的Channel和Buffer。通過這種方式讀寫檔案與流差不多。輸入流輸出流通過getChannel得到對應的Channel對象,Channel操作的是Buffer。Buffer類似于數組,但是他有個好處就是Buffer對象擁有兩個方法:filp和clear方法。filp會将Buffer中沒有資料的存儲空間“封印”起來,避免Buffer讀到null,為取出資料做準備,clear将指針置為0,為裝入資料做好準備。

File file= new File("test.txt");

@SuppressWarnings("resource")

FileChannel inchannel= newFileInputStream(file).getChannel();

@SuppressWarnings("resource")

FileChannel outchannel= new FileOutputStream("copy.txt").getChannel();

ByteBuffer byteBuffer= inchannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());

outchannel.write(byteBuffer);

inchannel.close();

outchannel.close();

3. Files工具類。Path是java7之後File的取代品。“File類功能有限,方法效率不高,大多數情況下不能傳回異常資訊。”

Files.copy(Paths.get("test.txt"), new FileOutputStream("copy.txt"));

- 總結:第一種方法比較繁瑣,你需要建立輸入流輸出流,存放資料的數組,最後還有記得關閉流(如果使用try{}catch{}則不必)他相較于第二種方法來說,效率不高(每次處理一個位元組),不能異步(阻塞式讀取)。

- 第二種方法的優勢在于,Channel有一個map()方法可以直接将一塊資料映射到記憶體中,效率提高很多,但是如果一次讀入記憶體的檔案過大會引起性能下降。不過Buffer也是支援一次次向Channel取資料的。

- 第三種方法是最快捷的,他隻需要一行代碼即可,至于效率問題我沒做研究。值得一提的是,對于第三種方法,如果test.txt不存在,程式會提示NoSuchFileException異常,但是仍會建立copy.txt,隻是這個copy.txt的大小為0。最後,第三種方法不能用于檔案夾的複制(即使Path可以是一個路徑)。