Pat*_*tze 5 java sockets nio bytebuffer
我正在寻找一种使用 Java NIO 从套接字通道读取字节的有效方法。任务很简单,我有一个解决方案,但我正在寻找一种更清洁、更有效的方法来解决这个问题。这是场景:
我的解决方案读取每个字节的数据字节并将每个字节与我的标记(在 UTF-8 代码页中的值为 10)进行比较。这是代码:
ByteBuffer res = ByteBuffer.allocate(512);
boolean completed = false;
try {
while (true) {
ByteBuffer tmp = ByteBuffer.allocate(1);
if(soc.read(tmp) == -1) {
break;
}
// set marker back to index 0
tmp.rewind();
byte cur = tmp.get();
res.put(cur);
// have we read newline?
if (cur == 10) {
doSomething(res);
res.clear();
}
}
} catch(Exception ex) {
handle(ex);
}
Run Code Online (Sandbox Code Playgroud)
即使这样做可以完成工作,也可能有更好的方法,即不需要在每次迭代后进行每字节比较。
谢谢你的帮助!
我的方法是读取尽可能多的可用数据,例如 32 KB,读完后,将数据逐字节复制到另一个缓冲区,例如 StringBuilder。如果缓冲区中还有上次读取后的数据,您可以继续使用缓冲区,直到全部消耗完,此时您可以读取更多数据。
注意:每个系统调用都很昂贵。可能需要 2-5 微秒。这听起来并不算多,除非您调用它数百万次,并且读取 1 MB 时会增加几秒的时间。