Java Techannel的ReadableByteChannel和WriteByTechannel是InputStream和OutputStream的替代品吗?

Java Techannel的ReadableByteChannel和WriteByTechannel是InputStream和OutputStream的替代品吗?,java,io,nio,Java,Io,Nio,据我所知,nio包中的ReadableByteChannel和writeablebytechannel可以被认为是传统io包中InputStream和OutputStream的替代品。事实上,它们可以用于执行相同的I/O操作等 尽管如此,它们似乎仍然没有太多的使用。此外,他们在大众图书馆的支持也很差。例如,团队是平等的 处理I/O的新代码是否有理由对通道使用流?这实际上取决于您正在做什么。如果您直接处理文件和/或套接字,那么使用nio有许多优点。在某些情况下(特别是在套接字周围),新功能是/仅/

据我所知,
nio
包中的
ReadableByteChannel
writeablebytechannel
可以被认为是传统
io
包中
InputStream
OutputStream
的替代品。事实上,它们可以用于执行相同的I/O操作等

尽管如此,它们似乎仍然没有太多的使用。此外,他们在大众图书馆的支持也很差。例如,团队是平等的


处理I/O的新代码是否有理由对通道使用流?

这实际上取决于您正在做什么。如果您直接处理文件和/或套接字,那么使用
nio
有许多优点。在某些情况下(特别是在套接字周围),新功能是/仅/通过
nio
公开的。如果您还压缩或加密数据(大多数API仅支持流),则其中的一些优势将被削弱。从历史上看,ServletAPI规范都是基于流的。然而,在这一领域,对
nio
的支持也越来越多。

有一个不容忽视的历史背景。当NIO被引入时(回到Java1.4中),很多特性都丢失了,并且承诺稍后提交这些特性的时间也不长。回想一下,在Java 1.4中,获取
FileChannel
的方法是首先创建
FileInputStream
FileOutputStream
RandomAccessFile
并在其上调用
getChannel
。因此,如果不使用旧的IO/流API,就无法使用NIO/通道编写代码

第一个提供了一种方法的Java版本是Java7。这也是为目录扫描、更改通知和高级文件属性提供NIOAPI的第一个版本

因此,关于这些特性,NIOAPI可以被认为是非常新的,开发人员采用它需要一些时间也就不足为奇了。顺便说一句,这种采用可能包括删除实用程序方法,这些方法在像您链接的提案这样的新API中变得不必要。在我看来,这实际上意味着在使用最新的API时只删除四个功能微不足道的方法


显然,当您想要使用一个较新的特性(如内存映射或上面提到的Java7特性)时,您必须使用NIOAPI。另一方面,当您想要使用序列化或Zip/GZip(反)压缩时,Java提供的唯一通道支持是将您的通道包装成一个流…

通过使用具有。此外,如果您需要阻止多个内容,也很方便。

因此,使用流的唯一原因似乎是与遗留代码的兼容性,但这可以通过
通道
实用程序类实现,对吗?可以,这就是为什么我指出这些优势是无效的,而不是丢失的。然而,应该避免的是,对于同一数据源,在通道和流之间来回移动多次。@BrettOkken为什么?他们一定是在开玩笑。你不能只从已发布的产品中删除东西。哈哈哈:)Guava开发者对性能一无所知。频道性能优于流。。。