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 inputChannel = null;
FileChannel outputChannel = null;
try{
outputChannel = new FileOutputStream(destFile).getChannel(); outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); }finally{ inputChannel.close(); outputChannel.close();