2009-12-21 98 views
2

我面臨與問題有關的Http連接。 我的代碼:Http URL連接無法完全讀取

URL url = null; 
try { 
    url = new URL(_url); 
} catch (MalformedURLException e) { 
} 

if (url != null) { 
    HttpURLConnection urlConn = null; 
    InputStreamReader isr = null; 
    try { 
     urlConn = (HttpURLConnection)url.openConnection(); 
     urlConn.setRequestMethod("GET"); 
     urlConn.setConnectTimeout(45000); 

     if(response == HttpURLConnection.HTTP_OK) { 
      StringBuffer readData = new StringBuffer(""); 
      int size = 1024; 
      char[] buffer = new char[size]; 
      int len; 
      isr = new InputStreamReader(urlConn.getInputStream()); 
      while ((len = isr.read(buffer, 0, size)) > 0) { 
       readData.append(buffer, 0, len); 
      } 
     } 
    } 
    catch(Exception e) { 
    } 
    finally { 
     if(urlConn != null) { 

     try { 
      urlConn.disconnect(); 
     } catch(Exception e) {    
     } 
    } 
    if(isr != null) { 
     try { 
      isr.close(); 
     } catch(Exception e) {     
     }    
    } 
} 

此代碼無法完全下載數據。 例如: 總大小爲:13901個字節 上面的代碼可以讀取大小:12937個字節

這裏有什麼問題?

請諮詢傢伙。

+0

你怎麼知道它是13901字節?這是在HTTP內容長度標題中還是在查看您在磁盤上提供的文件? – Paolo 2009-12-21 08:50:31

+0

文檔說明,當您到達流的末尾時返回-1,而不是0.即使有這種修復,我也認爲Ramp的回覆可能是您遇到問題的原因。 http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStreamReader.html#read%28char[],%20int,%20int%29 – rui 2009-12-21 09:53:39

+0

那麼,InputStream是不允許的如果至少需要1個字節,則返回0,因此檢查'if(count> 0)'實際上是否正確。 – StaxMan 2010-10-19 16:24:41

回答

3

我檢查了你的代碼,它似乎沒問題。但是你必須記住你正在讀取字符(2字節類型) - 所以你的readData.length()將顯示字符數,而不是字節數。我做了一個測試,並將您的InputStreamReader更改爲BufferedInputStream,並將緩衝區類型更改爲byte []。代碼完全讀取我期望的字節數。
Regads!

+0

雖然有關字符轉換的基本要點是有效的,但您對字符佔用2個字節的評論通常不正確 - 只有UTF-16/UCS-2具有固定的每字節2字節編碼,並且它們不常用網絡服務器。 UTF-8是一種可變長度編碼(每個Java字符1 - 3個字節); Latin-1每個字符固定1個字節,依此類推。 – StaxMan 2010-10-19 16:28:00

0

此外還要添加到接受的答案:我會考慮代碼錯誤,因爲它沒有指定使用哪種字符編碼InputStreamReader - 它是平臺的默認值,它可能與資源使用的不同。因此,請始終指定編碼以明確使用(「UTF-8」),或者使用執行此操作的庫。