Android 下載文件 顯示進度條 || 下載的文件,提示“文件格式不對或者文件已損壞”


主要參考文章AAndroid 下載文件 顯示進度條,並做了部分修改。

使用文章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的字節進去,所以格式不對。 

 

 

參考

Android 下載文件 顯示進度條

java IO流下載.docx文件時報文件損壞的錯誤,求解?

 

進度條:

Android 進度條     .xml設置進度條  <ProgressBar     />     已使用

Android開發之進度條ProgressBar

Android ProgressBar進度條,以及自定義顯示   進度條,進度顏色自定義

Android那些事兒之自定義進度條   溯源

Android 常見進度條---合集 LProgressView    看起來不錯   Android實現百分比下載進度條效果    自定義進度條

 

其他

Android的Message機制(簡單小結)

 

Java URL處理

JAVA基礎知識之FileOutputStream流

byte[] buffer=new byte[1024]

只是在內存中開辟塊緩沖區而已。大小隨便寫,只要不超過你實際可用內存大小就好。
不過太大或者太小都會對性能有影響。
所以通常采用 4 的倍數,或者 1K 的倍數作為buffer,有利於較少內存碎片

bytes=new Byte[1024]: 緩沖器的作用原理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM