我目前使用的下列功能做一个简单HTTP得到的。

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 在这种情况下?

有帮助吗?

解决方案

在这种情况下,我会为你做的(使用一个字阵列,用于缓和不一流的缓冲器)。

也有例外,虽然。一个地方,你看到缓冲区(出这个时间)在servlet API。数据没有书面的潜在的流直到 flush() 是称为,允许你来缓冲输出但后来转储的缓冲,如果发生错误和书写错误页,而不是。你可能输入缓冲,如果你需要的重置流为重读使用 标记(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();
    }

如果你开多个流,巢试用/最终区块。

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

其他提示

你是正确的,如果您使用的BufferedReader读HTTP内容和头你会想InputStreamReader这样你就可以阅读字节.

BufferedReader在这种情况有时的确奇怪的事情...escpecially当它涉及到阅读HTTP后标题,有时候,你将无法读取的后的数据,如果使用InputStreamReader你可以读取内容的长度和阅读很多字节...

每个调用的一个 InputStreamReader's read()方法可以使一个或多个字读取的基本字输入流。为使有效转字节的人物,更多字可以读取之前,从基础流不是必要的,以满足当前阅读的操作。

我的直觉告诉我,因为你已经执行的缓冲通过使用本字阵列,这是冗余使用BufferedReader.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top