2008-08-28 95 views
5

我目前使用下面的函数来做一个简单的HTTP GET。在读取所有字符时,是否有理由在InputStreamReader上使用BufferedReader?

public static String download(String url) throws java.io.IOException { 
    java.io.InputStream s = null; 
    java.io.InputStreamReader r = null; 
    //java.io.BufferedReader b = null; 
    StringBuilder content = new StringBuilder(); 
    try { 
     s = (java.io.InputStream)new URL(url).getContent(); 

     r = new java.io.InputStreamReader(s); 
     //b = new java.io.BufferedReader(r); 

     char[] buffer = new char[4*1024]; 
     int n = 0; 
     while (n >= 0) { 
      n = r.read(buffer, 0, buffer.length); 
      if (n > 0) { 
       content.append(buffer, 0, n); 
      } 
     } 
    } 
    finally { 
     //if (b != null) b.close(); 
     if (r != null) r.close(); 
     if (s != null) s.close(); 
    } 
    return content.toString(); 
} 

我没有理由使用BufferedReader,因为我只是要按顺序下载所有东西。在这种情况下,我认为BufferedReader没有用吗?

回答

4

在这种情况下,你正在做的,我会做(用于缓冲的字节数组,而不是流缓冲区之一)。

但也有例外。一个你看到缓冲区(这次是输出)的地方在servlet API中。直到调用flush()才允许数据写入底层流,从而允许您缓冲输出,但如果发生错误则转储缓冲区,而不是写入错误页面。如果你需要的流重置使用马克(INT)复位()重读你可能会缓冲输入。例如,也许你会在决定将流传递给哪个内容处理程序之前检查文件头。

无关,但我认为你应该重写你的流处理。此模式最适合避免资源泄漏:

InputStream stream = new FileInputStream("in"); 
    try { //no operations between open stream and try block 
     //work 
    } finally { //do nothing but close this one stream in the finally 
     stream.close(); 
    } 

如果您打开多个流,请尝试/ finally块。

另一件事你的代码做的是使返回的内容是在你的虚拟机的默认字符集编码(尽管这可能是适当的,这取决于使用情况)的假设。

1

你是正确的,如果你使用的BufferedReader读取HTTP内容和标题,你会想InputStreamReader的,所以你可以为字节读取字节。

在这种情况下,BufferedReader有时候会出现奇怪的现象...特别是当读到HTTP POST头时,有时你将无法读取POST数据,如果你使用InputStreamReader你可以读取内容长度并读取多少字节......

0

我的直觉告诉我,因为你已经使用的字节数组进行缓冲,这是多余的使用BufferedReader。

1

)一个InputStreamReader的读取中的一个(方法可能会导致一个或多个字节中的每一个调用,以从底层字节输入流中读取。为了能够有效地将字节转换为字符,可以从基础流中读取比满足当前读取操作所需的字节更多的字节。

相关问题