主要參考文章A:Android 下載文件 顯示進度條,並做了部分修改。
使用文章A的代碼,運行后,下載的文件,在手機上提示“文件格式不對或者文件已損壞”,
造成該問題的代碼段:
1 /* 2 * 向SD卡中寫入文件,用Handle傳遞線程 3 */ 4 Message message=new Message(); 5 try { 6 outputStream=new FileOutputStream(file); 7 byte [] buffer=new byte[1024*4]; 8 FileLength=connection.getContentLength(); 9 message.what=0; 10 handler.sendMessage(message); 11 while (DownedFileLength<FileLength) { 12 outputStream.write(buffer); //!!!!!! 13 DownedFileLength+=inputStream.read(buffer); 14 Log.i("-------->", DownedFileLength+""); 15 Message message1=new Message(); 16 message1.what=1; 17 handler.sendMessage(message1); 18 }
修改為:
1 /* 向SD卡中寫入文件,用Handle傳遞線程 2 */ 3 Message message=new Message(); 4 try { 5 outputStream=new FileOutputStream(file); //寫入文件;文件字節輸出流,專用於輸出原始字節流如圖像數據等 6 byte [] buffer=new byte[1024*4];//1024*4 //定義一個字節數組,相當於緩存 7 FileLength=connection.getContentLength(); 8 message.what=0; 9 handler.sendMessage(message); 10 //System.out.println("FileLength:"+FileLength); 11 int count=0; //得到實際讀取到的字節數 讀到最后返回-1 12 while ((count = inputStream.read(buffer)) > 0) {//DownedFileLength<FileLength 把inputStream里的東西讀到bytes數組里去 13 //outputStream.write(buffer); 14 //System.out.println("len:"+len); 15 outputStream.write(buffer,0,count); 16 DownedFileLength+=count; //inputStream.read(buffer) 17 Log.i("---DownedFileLength--->", DownedFileLength+" >"); 18 Message message1=new Message(); 19 message1.what=1; 20 handler.sendMessage(message1); 21 }
outputStream.write(buffer,0,count); 讀多少位寫多少。不會出現文件損壞的情況!!!
原因:
----每次填充往緩沖數組中填充1024字節,當循還到最后一次的時候流中已經沒有1024個字節了,比如最后一次只有100個了,那么會填充緩沖數組的前100個位置字節,那么100以后位置的字節就是保留了上一次的字節,所以寫入文件的時候,字節已經錯亂了,所以你打開的時候就報錯了。
----outputStream.write(buffer, 0, len);這個的意思是將buffer里面0~len的字節寫到輸出流里面,下載的文件轉換成字節流的字節數一般是不能被1024整除的,當輸出最后一部分字節的時候,可能沒有1024個字節,那么buffer字節數組里多出來的位置就是初始值0,這些也寫到輸出流里面去了,也就是多寫了很多個值為0的字節進去,所以格式不對。
參考
java IO流下載.docx文件時報文件損壞的錯誤,求解?
進度條:
Android 進度條 .xml設置進度條 <ProgressBar /> 已使用
Android ProgressBar進度條,以及自定義顯示 進度條,進度顏色自定義
Android 常見進度條---合集 LProgressView 看起來不錯 Android實現百分比下載進度條效果 自定義進度條
其他
只是在內存中開辟塊緩沖區而已。大小隨便寫,只要不超過你實際可用內存大小就好。
不過太大或者太小都會對性能有影響。
所以通常采用 4 的倍數,或者 1K 的倍數作為buffer,有利於較少內存碎片
bytes=new Byte[1024]: 緩沖器的作用原理