1. 程式人生 > >使用位元組流複製檔案過程中容易導致複製的檔案無法使用(如MP3檔案比原來大了一千多倍且音樂無法播放)很嚴重的一個bug

使用位元組流複製檔案過程中容易導致複製的檔案無法使用(如MP3檔案比原來大了一千多倍且音樂無法播放)很嚴重的一個bug

使用BufferedInputStream和BufferedOutputStream複製檔案,相信大家都已經遊刃有餘了,但是有一個

很嚴重的bug不容小覷,如以下程式碼:

package com.yeshide_02;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyMp3 {

public static void main(String[] args) throws IOException {


BufferedInputStream bis = null;
BufferedOutputStream bos = null;
bis = new BufferedInputStream(new FileInputStream("D:\\b\\a\\任賢齊 - 花好月圓.mp3"));

bos = new BufferedOutputStream(new FileOutputStream("D:\\music\\任賢齊 - 花好月圓.mp3"));

byte[] bytes = new byte[1024];

int len;
while((len = bis.read()) != -1) {
bos.write(bytes, 0, len);
}
bis.close();
bos.close();
}
}

以上程式碼也能複製檔案,但是有一個很嚴重的問題在於使用bis讀取檔案的時候bis.read()括號裡面少寫了

一個bytes,此時程式不會報錯,但是會導致新複製的檔案比原來大1024倍並且新複製的檔案也無法被播

放器識別。出現的現象如下所述:


原因分析:

一、沒有把定義的陣列引數傳進讀取檔案的程式碼小括號中,導致寫檔案時寫了1024次,故新複製的檔案

比原來的大了1024倍。

二、計算機內部儲存的是二進位制數字,原因分析一的讀把錯誤的二進位制讀進來,導致二進位制翻譯成十進

制寫出來過程中出錯,最終導致檔案出錯無法開啟。

複製其他檔案格式的檔案也類同,最後把bytes補上括號裡面就可以正常複製檔案了。