ReadableByteChannel和WritableByteChannel是InputStream和OutputStream的替代品吗?

时间:2014-06-24 13:16:56

标签: java io nio

据我所知,ReadableByteChannel包中的WritableByteChannelnio可以被视为旧版InputStreamOutputStream的替代io 1}}包。事实上,它们可用于执行相同的I / O操作等。

尽管如此,它们似乎仍未被广泛使用。此外,他们对流行图书馆的支持很差。例如,Guava团队甚至是thinking about dropping it

是否有任何理由让新代码处理I / O以使用Streams相对于Channels?

3 个答案:

答案 0 :(得分:3)

有一个不容忽视的历史背景。当NIO被引入时(早在Java 1.4中),很多功能都缺失了,并且承诺将在以后交付它们很长时间。回想一下,在Java 1.4中,获取FileChannel的方法是首先创建FileInputStreamFileOutputStreamRandomAccessFile并在其上调用getChannel。因此,如果不使用旧的IO /流API,就无法使用NIO /通道编写代码。

第一个提供create a FileChannel without using the old API方法的Java版本是 Java 7 。这也是为目录扫描,更改通知和高级文件属性提供NIO API的第一个版本。

因此,对于这些功能,NIO API可以被认为是非常新的,并且开发人员采用NIO API需要一些时间并不令人惊讶。顺便说一句,这种采用可能包括删除实用程序方法,这些方法对于新API而言就像您已链接的提案一样。据我所知,它实际上意味着只删除四种方法,这些方法在使用最新的API时功能微不足道。

显然,当您想使用其中一个较新的功能(如内存映射或上面提到的Java 7功能)时,您必须使用NIO API。另一方面,当你想使用Serialization或Zip / GZip(de)压缩时,Java提供的唯一渠道支持就是将你的频道包装成一个流......

答案 1 :(得分:0)

这实际上取决于你在做什么。如果直接处理文件和/或套接字,使用nio有很多好处。在某些情况下(特别是在套接字周围),新功能仅通过nio公开/显示。如果您还压缩或加密数据,其中一些优点是静音的,其中大多数api仅支持流。从历史上看,servlet-api规范都基于流。但是,在该空间中对nio的支持也越来越多。

答案 2 :(得分:0)

使用ByteBuffers的NIO频道可以获得直接的性能优势。此外,如果你需要阻止多项事情Selectors可以很方便。