SocketChannel如何处理ByteBuffer中的cutted UTF-8字符和行

时间:2012-12-09 17:10:11

标签: java nio

我的系统通过SocketChannel接收以0x0D 0x0A结尾的UTF-8线路。我在ByteBuffer中读取数据,如下所示:

final ByteBuffer buffer = ByteBuffer.allocate(bufsize);
final int bytesRead = _mySocket.read(buffer);

缓冲区足够大,可以包含很多行。但我不能有一个足够大的缓冲区来包含所有行,线路会在运行中处理。

缓冲区不能包含所有行,因此可以分割行,一个字节编码的字符也可以被分割。

我想到了一个解决方案:

  1. 通过逐字节分析ByteBuffer来处理我可以提取的所有行(我搜索0x0D 0x0A)
  2. 识别未处理的字节
  3. 将它们存储在临时变量中
  4. 清除ByteBuffer
  5. 将未处理的字节添加到ByteBuffer
  6. 再次阅读SocketChannel。
  7. 重复此操作,直到找到表示收到所有行的行。
  8. java或任何库是否已提供此功能?

    感谢您的回答, 的Mickaël

1 个答案:

答案 0 :(得分:0)

我建议使用java.util.Scanner,它知道如何处理SocketChannel,它知道如何读取行

    Scanner sc = new Scanner(_mySocket);