读取HttpURLConnection InputStream - 手动缓冲区还是BufferedInputStream?

时间:2010-05-08 06:26:59

标签: buffer inputstream httpurlconnection bufferedinputstream

当读取H​​ttpURLConnection的InputStream时,是否有任何理由使用以下哪一个而不是另一个?我见过两个例子都用过。

手动缓冲区:

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%好?

4 个答案:

答案 0 :(得分: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 :(得分:2)

关于持久性HTTP连接,恰恰相反。您应该读取输入流中的所有内容。否则,Java HTTP客户端不知道HTTP请求已完成,并且可以重用套接字连接。

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

  

你可以做些什么来帮助Keep-Alive?

     

不要放弃连接   无视响应机构。这样做   可能会导致空闲的TCP连接。   这需要垃圾收集   当它们不再被引用时。

     

如果getInputStream()成功   返回,阅读整个回复   体。

答案 2 :(得分:0)

使用前者 - 后者与第一个相比没有任何实际好处,并且有点慢;即使缓冲,逐字节读取也是低效的(尽管在未缓冲时非常慢)。这种阅读输入风格与C无关;虽然在需要找到某种结束标记的情况下可能很有用。

答案 3 :(得分:-1)

仅当您使用BufferedInputStream特定方法。