有没有理由不使用 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?的主要内容,如果未能解决你的问题,请参考以下文章