gpt4 book ai didi

java - 读取所有字符时是否有理由使用 BufferedReader 而不是 InputStreamReader?

转载 作者:搜寻专家 更新时间:2023-10-31 19:59:12 27 4
gpt4 key购买 nike

我目前使用以下函数来执行简单的 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 没有用吗?

最佳答案

在这种情况下,我会像您一样做(使用字节数组进行缓冲,而不是流缓冲区之一)。

不过也有异常(exception)。您看到缓冲区(这次是输出)的一个地方是在 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 block 。

您的代码正在做的另一件事是假设返回的内容是使用 VM 的默认字符集编码的(尽管这可能就足够了,具体取决于用例)。

关于java - 读取所有字符时是否有理由使用 BufferedReader 而不是 InputStreamReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com