繁体   English   中英

读取所有字符时,是否有理由在InputStreamReader上使用BufferedReader?

[英]Is there a reason to use BufferedReader over InputStreamReader when reading all characters?

我目前使用以下功能来执行简单的HTTP GET。

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顺序下载所有内容。 我是否认为在这种情况下BufferedReader没有用?

在这种情况下,我将按照您的方式做(使用字节数组进行缓冲,而不要使用流缓冲区之一)。

但是也有例外。 Servlet API中是您看到缓冲区(这次输出)的一个地方。 在调用flush()之前,不会将数据写入底层流,这使您可以缓冲输出,但是如果发生错误,则转储缓冲区,而改写错误页面。 如果需要使用mark(int)reset()重置流以进行重新读取,则可以缓冲输入。 例如,在决定将流传递到哪个内容处理程序之前,您可能会检查文件头。

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

    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();
    }

如果要打开多个流,请嵌套try / finally块。

您的代码正在做的另一件事是假设返回的内容已编码为VM的默认字符集(尽管根据使用情况这可能就足够了)。

InputStreamReader的read()方法之一的每次调用都可能导致从基础字节输入流中读取一个或多个字节。 为了实现字节到字符的有效转换,与满足当前读取操作所需的字节数相比,可以从基础流中提前读取更多字节。

没错,如果您使用BufferedReader读取HTTP内容和标头,则需要InputStreamReader以便逐字节读取字节。

在这种情况下,BufferedReader有时会做一些奇怪的事情……尤其是在读取HTTP POST标头时,有时您将无法读取POST数据,如果使用InputStreamReader,则可以读取内容长度并读取那么多字节。 。

我的直觉告诉我,由于您已经在使用字节数组执行缓冲,因此使用BufferedReader是多余的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM