有没有理由不使用 BufferedReader 包装 InputStreamReader?

Posted

技术标签:

【中文标题】有没有理由不使用 BufferedReader 包装 InputStreamReader?【英文标题】:Is there ever a reason not to wrap InputStreamReader with BufferedReader? 【发布时间】:2017-11-10 11:26:16 【问题描述】:

我有以下代码可以从 CSV 中读取:

InputStream inp = getClass().getResourceAsStream(filename);
InputStreamReader r = new InputStreamReader(inp);
BufferedReader reader = new BufferedReader(r);

关于已回答的问题: Java BufferedReader, Convert InputStream to BufferedReader, What is the difference between Java's BufferedReader and InputStreamReader classes?

BufferedReader[BR] 和 InputStreamReader[ISR] 都实现了相同的接口。 BR 拥有 ISR 拥有的所有方法以及其他方法,包括非常有用的 readLine() 方法和不太有用但仍然相关的 skip() 方法。您不一定需要 BR 来读取单个字符,尽管在这方面 BR 可以比 ISR 更有效地做到这一点。唯一显着的区别是 FileReader 是 ISR 的子类,但不是 BR,尽管我在这个网站上的消息来源说 FileReader 由于替代品而不再真正使用。

我的研究表明,ISR 可以做的所有事情都被 BR 做得更好。我是一名年轻的开发人员,所以每个定义或导入的类对我来说似乎都是相关的。我想了解的是,如果某些类不再使用,是否会被新版本或框架取代。我想知道更有经验的开发者怎么说。那么,在使用 ISR 时是否有理由不使用 BR?

API 快速链接:BufferedReaderInputStreamReader


【问题讨论】:

好吧,如果你想实现自己的 BufferedReader... ISR 用于从 InputStream 中读取。 BR 从另一个阅读器读取。因此,如果您想在从流中读取时进行缓冲(通常是这种情况),您可以同时使用两者。如果您从内存中的字节/字符读取,或者从已经缓冲的输入流中读取,或者如果您知道要读取的字符数并一次读取它们,则不需要缓冲 在尝试提出更多问题之前,请阅读What types of questions should I avoid asking?。 【参考方案1】:

我在您的帖子中看到一些关于 ISR 和 BR 的混淆。

1) 你说的是

我的研究表明,ISR 可以做的所有事情都被 BR 做得更好

但是让我们看看它们每个的 JavaDoc:

ISR

公共类 InputStreamReader 扩展 Reader

InputStreamReader 是从字节流到字符的桥梁 流:

BR

从字符输入流中读取文本,缓冲字符,以便 提供字符、数组和行的高效读取。

如您所见,ISR 将字节转换为字符。 BR 另一方面需要字符。这就是为什么BR需要使用ISR来读取InputStream

2) 至于最初的问题,为什么不只使用 ISR。您绝对可以这样做,但为了获得性能,您需要使用 BR。你可能会问为什么 ISR 没有使用缓冲来实现?因为 ISR 旨在做一件好事,那就是读取字节并将其转换为字符。缓冲部分被移动到装饰器类中,即 BR。这样做是为了能够向任何 Reader 添加缓冲功能,而不仅仅是 ISR。

【讨论】:

以上是关于有没有理由不使用 BufferedReader 包装 InputStreamReader?的主要内容,如果未能解决你的问题,请参考以下文章

有没有理由为啥 Web 开发人员不使用 CSRF 作为登录页面

我可以偷看 BufferedReader 吗?

有没有理由不使用OrderedDict?

R 的优化包

BufferedReader 没有读取过去的空行 [关闭]

URL 的 bufferedReader 抛出 IOException