据我所知,ReadableByteChannel
包中的WritableByteChannel
和nio
可以被视为旧版InputStream
和OutputStream
的替代io
1}}包。事实上,它们可用于执行相同的I / O操作等。
尽管如此,它们似乎仍未被广泛使用。此外,他们对流行图书馆的支持很差。例如,Guava团队甚至是thinking about dropping it。
是否有任何理由让新代码处理I / O以使用Streams相对于Channels?
答案 0 :(得分:3)
有一个不容忽视的历史背景。当NIO被引入时(早在Java 1.4中),很多功能都缺失了,并且承诺将在以后交付它们很长时间。回想一下,在Java 1.4中,获取FileChannel
的方法是首先创建FileInputStream
,FileOutputStream
或RandomAccessFile
并在其上调用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可以很方便。