使用字節流複製文件過程中容易導致複製的文件無法使用(如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補上括號裏面就可以正常複製文件了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章