【问题标题】:Is there ever a reason not to wrap InputStreamReader with BufferedReader?有没有理由不使用 BufferedReader 包装 InputStreamReader?
【发布时间】: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 快速链接:
BufferedReader
InputStreamReader


【问题讨论】:

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

标签: java io bufferedreader


【解决方案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。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 2012-08-25
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多