如何选择java nio vs io?

时间:2012-10-15 09:15:45

标签: java nio

正如我们所知,如果我们想使用传统的IO构建服务器,它必须阻塞某个地方,所以我们不得不使用循环或一个线程一个套接字模式,所以nio似乎是更好的选择。所以我想知道nio永远是更好的选择吗?

7 个答案:

答案 0 :(得分:17)

恕我直言,阻止IO通常是最简单的使用,除非你有一个特定的要求,要求你的系统更多,你应该坚持使用最简单的选项。

下一个最简单的选项是阻止NIO,如果我想要比IO更高效或更有效的控制,我通常会更喜欢。它仍然相对简单,但允许您使用ByteBuffers。例如ByteBuffers支持小端。

常见的选择是使用非阻塞NIO和选择器。这引入的大部分复杂性可以通过Netty或Mina等框架来处理。如果你需要非阻塞IO,我建议你使用这样的库,例如因为每台服务器有数千个并发连接。恕我直言你有成千上万的连接,你应该考虑拥有更多的服务器,除非每个连接做的事情是非常微不足道的。 AFAIK谷歌为每台服务器提供更多服务器而非数千名用户。

更极端的选择是使用NIO2。这比非阻塞NIO写得更复杂,更冗长。我不知道任何支持这个的框架。即你做的时候实际上更快。 AFAIK如果你有Infiniband(这是它的设计支持),这似乎值得使用,但如果你有以太网可能不值得使用。

答案 1 :(得分:11)

如果你想要非阻塞IO,那么NIO不​​是更好的选择 - 它是Java中唯一的选择。请记住,人们仍然经常使用旧的IO,因为它更容易编码。 NIO API非常原始,与客户端API相比,它更像是一种低级技术。我建议通过API使用NIO,它为使用非阻塞IO解决的问题提供更简单的接口。

答案 2 :(得分:2)

有点晚了,但就个人而言,我甚至为普通人每天都使用NIO"文件处理。所以,我使用的东西是:

 1. if(Files.notExists(path)) { } 
 2. Files.createDirectory(path);
 3. Files.newInputStream(path) targetPath.resolve("somefile.txt");
 4. Files.newBufferedWriter(path, charset);
 5. DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);

它对我来说很好。我更喜欢Path而不是旧文件,因为像relativize或resolveSibling这样的方法。

没有比IO更复杂的打击我。

答案 3 :(得分:1)

除非您要创建“超级快速”服务器,否则您可以使用其中任何一种。

当然,这里的一个好方法是使用nio,因为它是为高吞吐量任务编写多客户端服务器的新方法。

答案 4 :(得分:1)

如果能够证明它引入的不可避免的复杂性,那么你只能使用NIO。如果您在预期负载方面没有任何指导,并且在产品/项目是否有资源维护相关代码方面,那么您应该谨慎行事并使用IO。

为了给我的答案一些权重,我花了三个月的时间维护并修复了一个集成层,其中使用了原始Java NIO(即没有使用总体框架)。实质上,该设计基于客户端线程,将消息添加到队列和少量工作线程执行其NIO魔术,然后以基于事件的方式将回复传递回客户端线程。回想起来,我无法证明使用NIO的最初决定是正确的,因为它会分散注意力,而这会占用应该用于更高级别业务逻辑的大量时间。

答案 5 :(得分:0)

传统IO是简单易用的代码,NIO更复杂但更灵活。 在我的情况下,我更喜欢使用IO来实现小型流媒体和NIO用于大型流媒体,但是nio实际上更复杂

使用NIO我必须创建一个完整的软件包来管理它而不是我直接使用代码段

的软件包

答案 6 :(得分:0)

与用于处理文件的旧版java.io.File类相比,NIO.2 API的某些优势:

  • 支持文件系统相关的属性。
  • 允许您直接遍历目录树。
  • 支持符号链接。

有关特定用例和更多详细信息,请参见this文章