2012-12-27 38 views
0

我正在使用以下代碼從套接字讀取圖像文件。它從服務器讀取所有字節,因爲服務器和Android機器上的文件大小相同。當我打開此文件時,它不會打開文件並生成文件已損壞或太大的錯誤。我正在將圖像文件從服務器端傳輸到客戶端,而閱讀圖像文件時,我得到了這個問題

   public Bitmap fileReceived(InputStream is) 
     throws FileNotFoundException, IOException { 

     Bitmap bitmap = null; 
     String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     String fileName = "a.png"; 
     String imageInSD = baseDir + File.separator + fileName; 
      System.out.println(imageInSD); 
     if (is!= null) { 
      FileOutputStream fos = null; 
      BufferedOutputStream bos = null; 
      try { 

       fos = new FileOutputStream(imageInSD); 
       bos = new BufferedOutputStream(fos); 
       byte[] aByte = new byte[1024]; 
       int bytesRead; 

       while (true ) { 
        bytesRead = is.read(aByte); 

        bos.write(aByte, 0, bytesRead); 
       if (is.available()==0) 
        break; 
       } 

       bos.flush(); 
       bos.close(); 
      //  is.reset(); 

     // here it give error i.e --- SkImageDecoder::Factory returned null 
       bitmap = BitmapFactory.decodeFile(imageInSD); 



      } catch (IOException ex) { 
       // Do exception handling 
       Log.i("IMSERVICE", "exception "); 
      } 
     } 

     return bitmap; 
    } 
+0

按字節比較會嘗試一個字節,如果這兩個文件是真的一樣? [在Linux上,我會嘗試在控制檯上的'diff'] – MrSmith42

+0

傳輸圖像的正確方法是什麼?我嘗試了很多不同的方式,但我有問題。我比較它們都相同的字節,但索引有問題。 –

+0

我改變了代碼,我只有一個問題,那就是當我在十六進制編輯器中更改文件的第一個字節時,它會更正文件。 –

回答

0

不要使用available()這個,它不會工作可靠!

的文檔狀態:

[可用()返回可以讀取的字節數的估計 [...]這是從來沒有正確的使用這個方法的返回值分配旨在保存此流中所有數據的緩衝區。

不喜歡它:

while ((bytesRead = is.read(aByte)) > 0) { 
    bos.write(aByte, 0, bytesRead); 
} 
+0

它沒有讀取所有字節,它寫入的文件的大小比原始文件小。 –

+0

並且它也沒有終止循環 –

+0

哦,當然,* server *必須['close()'](http://docs.oracle.com/javase/1.4.2/docs/api/java/net/ Socket.html#close%28%29)完成發送所有數據時的連接,以便客戶端可以實現何時不再需要數據。一旦服務器這樣做,客戶端的'read()'將返回並最終返回'0',表示不再有數據到達。請注意,您可能必須設置['SO_LINGER'](http://docs.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#setSoLinger%28boolean,%20int%29 )套接字選項在服務器端給客戶端足夠的時間來讀取所有數據。 – JimmyB

相關問題