假设 TCP 服务器的要求是它连接到单个客户端并且它写入和读取序列化的完整对象。读写频率高。鉴于需求,将代码从 java IO 移植到 java NIO 有什么优势?
当前代码是这样的。一个专用线程用于从套接字读取对象,一个专用线程用于将对象写入套接字。有一个单一的对象输入/输出流,对象正在被写入/读取。
// Reading from socket
private SomeObject readObject() throws IOException, ClassNotFoundException {
Object object = oiStream.readObject();
if (object != null && object instanceof SomeObject) {
SomeObject someObject = (SomeObject) object;
return someObject;
}
return null;
}
// Writing to socket
public void writeToSocket(SomeObject someObject) throws IOException {
if (isSocketOpen()) {
ooStream.writeObject(someObject);
ooStream.flush();
}
}
考虑到只有一个客户端连接服务器这一事实,NIO 的等价物是什么?它的优势是什么?请不要讨论 Channels/Selectors/Buffers,而是根据给定的要求比较这两个库。
最佳答案
对象序列化比 IO 和 NIO 之间的区别贵得多,您不太可能注意到其中的区别。特别是序列化是为与 IO 一起工作而设计的。
如果你想提高速度我建议你尝试优化序列化。
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
http://vanillajava.blogspot.com/2011/10/serialization-using-bytebuffer-and.html
如果序列化不是问题,使用阻塞 NIO 比阻塞 IO 可以更快地传输数据。
http://vanillajava.blogspot.com/2010/07/java-nio-is-faster-than-java-io-for.html
关于如果只有一个客户端并且需要完整的对象读取,Java NIO 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8963465/