1. 程式人生 > >java檔案複製之根據檔案大小複製

java檔案複製之根據檔案大小複製

在java開發中,經常會碰到檔案複製的問題。最常用的方式是利用byte陣列來完成,如下:

final intMAX_BUFFER_LENGTH = 1024;

FileOutputStream fos = new FileOutputStream(destFile);

FileInputStream fis = new FileInputStream(srcFile);

byte[] bytes = new byte[MAX_BUFFER_LENGTH];
int len = 0;

try{

while((len = fis.read(bytes)) != -1){
fos.write(bytes, 0, length);

}

}catch(Eception e){

System.out.println("複製檔案失敗!" + e.printStackTrace());}finally{

fos.close();

}

這種方式看似簡單實用,其實不然。原因在於:

len = fis.read(bytes),它表示從fis中讀取bytes大小的內容。如果迴圈的最後一次複製fis中並沒有足夠的內容,那麼bytes陣列中剩下的內容肯定為null,可怕的是這些null也會被複制到fos中。所以這種方式複製檔案就相當於最終得到的檔案大小一定是bytes陣列大小(MAX_BUFFER_LENGTH)的整數倍,可能無意間增加了複製內容

不過還好有另一種經常使用的檔案複製方式可以解決這一問題-----FileChannel

FileChannel inputChannel = null;

FileChannel outputChannel = null;

try{

outputChannel = new FileOutputStream(destFile).getChannel(); outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); }finally{    inputChannel.close();    outputChannel.close();

} inputChannel = new FileInputStream(file).getChannel(); 這種方式是根據inputChannel的大小來複制檔案,避免了複製的內容無意增多的問題。這種問題一般情況下沒有 影響,但是如果複製過去的檔案是需要給程式處理的,這就有可能造成無法解析的現象。 當然,java中對檔案的複製方式不止這兩種,這篇文章的目的在於提出上訴問題,以免在今後的編碼過程中再次 出現同樣的問題!