gpt4 book ai didi

java - 从 Java NIO socketchannel 读取字节直到到达标记

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:33 25 4
gpt4 key购买 nike

我正在寻找一种使用 Java NIO 从套接字 channel 读取字节的有效方法。这个任务很简单,我有一个解决方案,尽管我正在寻找一种更清洁、更有效的方法来解决这个问题。这是场景:

  1. 从套接字 channel 读取数据
  2. 这个数据是UTF-8编码的字符串
  3. 每行以\r\n结尾,长度未知
  4. 读完每一行后,我想对消息做点什么

我的解决方案按字节读取数据字节,并将每个字节与我的标记(在 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);
}

即使这样做可以,但可能有更好的方法,不需要在每次迭代后按字节进行比较。

感谢您的帮助!

最佳答案

我会这样做的方法是尽可能多地读取可用的数据,例如 32 KB,一旦你读取了这个,你就将数据逐字节复制到另一个缓冲区,例如一个字符串生成器。如果上次读取时缓冲区中还有数据,您可以继续使用该缓冲区,直到它全部消耗完,此时您可以读取更多数据。

注意:每次系统调用都是昂贵的。这可能需要 2-5 微秒。这听起来并不多,除非您调用它数百万次并且它会增加读取 1 MB 的秒数。

关于java - 从 Java NIO socketchannel 读取字节直到到达标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com