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