3

當讀取HttpURLConnection的InputStream時,是否有任何理由使用下列其中之一:我見過兩個例子。閱讀HttpURLConnection InputStream - 手動緩衝區或BufferedInputStream?

手工緩衝:

while ((length = inputStream.read(buffer)) > 0) { 
    os.write(buf, 0, ret); 
} 

的BufferedInputStream

is = http.getInputStream(); 
bis = new BufferedInputStream(is); 
ByteArrayBuffer baf = new ByteArrayBuffer(50); 

int current = 0; 
while ((current = bis.read()) != -1) { 
    baf.append(current); 
} 

編輯我還是新來的HTTP一般,但我想到的一個考慮是,如果我使用持久的HTTP連接,我不能只讀直到輸入流是空的嗎?在那種情況下,我不需要讀取消息長度,只需讀取輸入流的長度?

同樣,如果沒有使用持久連接,我認爲在正確讀取數據流方面100%的好處包括了哪些代碼?

+0

什麼是'ByteArrayBuffer'?但是當你可以處理字節數組時,從來沒有任何理由處理單個字節。 – EJP 2017-09-29 11:12:20

回答

-1

只有在您使用BufferedInputStream特定的方法。

+0

對問題添加了進一步的說明。 – stormin986 2010-05-08 06:34:20

+0

'BufferedInputStream'特定的方法如什麼?它不會導出除InputStream定義的方法之外的任何方法。 – EJP 2017-09-29 11:06:24

1

關於持久HTTP連接,它恰恰相反。你應該從輸入流讀取所有內容。否則,Java HTTP客戶端不知道HTTP請求已完成,並且可以重新使用套接字連接。

http://java.sun.com/javase/6/docs/technotes/guides/net/http-keepalive.html

你能做些什麼來幫助保活?

不要放棄連接 忽略響應正文。這樣做 可能會導致空閒的TCP連接。 當他們不再被引用時,需要垃圾收集 。

如果getInputStream()成功返回 ,則讀取整個響應 正文。

5

我在一篇關於在an​​droid中使用JSON的文章中談論了一種在博客上做的好方法。 http://blog.andrewpearson.org/2010/07/android-why-to-use-json-and-how-to-use.html。我會後下面的相關文章的相關部分(該代碼是很普及):

InputStream in = null; 
String queryResult = ""; 
try { 
    URL url = new URL(archiveQuery); 
    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 
    HttpURLConnection httpConn = (HttpURLConnection) urlConn; 
    httpConn.setAllowUserInteraction(false); 
    httpConn.connect(); 
    in = httpConn.getInputStream(); 
    BufferedInputStream bis = new BufferedInputStream(in); 
    ByteArrayBuffer baf = new ByteArrayBuffer(50); 
    int read = 0; 
    int bufSize = 512; 
    byte[] buffer = new byte[bufSize]; 
    while(true){ 
      read = bis.read(buffer); 
      if(read==-1){ 
       break; 
      } 
      baf.append(buffer, 0, read); 
    } 
    queryResult = new String(baf.toByteArray()); 
    } catch (MalformedURLException e) { 
      // DEBUG 
      Log.e("DEBUG: ", e.toString()); 
    } catch (IOException e) { 
      // DEBUG 
      Log.e("DEBUG: ", e.toString()); 
    } 
} 
+1

有一個確定但要解決的問題:您應該始終指定用於將字節轉換爲字符串的編碼(新字符串(baf.toByteArray(),「UTF-8」))。 – StaxMan 2010-10-20 16:06:35

0

使用前者 - 後者在第一個沒有實際利益,而且是有點慢;即使經過緩衝,逐字節地讀取數據也是低效的(儘管在沒有緩衝的情況下速度很慢)。這種閱讀方式與C一起流行;儘管在需要查找某種結束標記的情況下可能會有用。