介紹三種複制檔案的方法:
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可以是一個路徑)。