1

[Input|Output]Streams从 JDK1.0 开始存在,而它们的字符对应Readers|Writers从 JDK1.1 开始存在。

大多数概念看起来都很相似,除了一个例外:的基类声明了一个一次处理一个字节的抽象方法而基本读取器/写入器类声明了一个处理整个char数组的抽象方法。

因此,假设我理解正确,每个重写的流类都仅限于处理单个字节(从而为每个字节执行至少一个方法调用!),而重写的读取器/写入器只需要每个数组(-缓冲区)的方法调用。

这不是一个巨大的性能问题吗?

流可以实现为InputStreamor的子类OutputStream,但仍然基于byte-arrays?

4

5 回答 5

6

实际上,InputStream 的子类必须重写一次读取单个字节的方法,但也可以重写其他读取字节数组的方法。我认为大多数输入/输出流实际上就是这种情况。

因此,在我看来,这不是什么性能问题,是的,您可以扩展输入/输出流并基于字节数组。

于 2010-09-04T10:17:02.083 回答
3

单字节读取几乎总是一个巨大的性能问题。但是如果你阅读 InputStream 的 API 文档,你会发现你必须重写 read(),但也应该重写 read(byte[],int,int)。大多数使用任何类型 InputStream 的代码无论如何都会调用数组样式方法,但该函数的默认实现只是通过为每个字节调用 read() 来实现,因此会对性能产生负面影响。

对于 OutputStream 也是如此。

于 2010-09-04T10:22:14.657 回答
1

正如丹尼尔所说,你必须覆盖read(),因为客户可能会直接使用它,但你也应该覆盖read (byte[],int,int)

但是,我怀疑您是否应该关注性能,因为 jvm 可以并且将为您内联该方法。最重要的是,这对我来说似乎不是问题。

此外,大多数读者在幕后使用一些底层输入流,因此在任何情况下,这些基于字符数组的方法最终都会调用read(byte[],int,int),甚至read()直接调用。

于 2010-09-04T10:35:27.790 回答
1

请注意,Readers/Writers用于读取可以由多个字节组成的字符,例如 unicode 字符。另一方面,当您处理非字符串(二进制)数据时,流更适合。

除此之外,InputStream还有OutputStream读取/写入整个字节数组的方法。

于 2010-09-04T19:39:36.237 回答
0

性能方面,如果你用 BufferedInputStream 包装它,JVM 应该能够优化单字节读取方法调用的开销,即它就像你自己做缓冲一样快。

于 2010-09-04T19:31:55.677 回答