gpt4 book ai didi

java - 从边界对齐可能不完美的 ByteArray 流中读取字符

转载 作者:行者123 更新时间:2023-11-30 06:19:36 24 4
gpt4 key购买 nike

我在 JVM 上处理异步 IO,其中偶尔会从传入的套接字中传递一个字节数组。这些字节数组串联起来形成一个流,我的总体目标是根据给定字符的实例将其拆分为字符串,无论是换行符、NUL 还是更深奥的东西。

我无法保证这些连续字节数组的边界不是通过多字节字符的一部分。

通读 java.nio.CharBuffer 的文档, 我没有看到任何关于如何处理尾随部分多字节字符的明确语义。

给定一系列 ByteBuffer s,从中获取(完整)字符的最佳方法是什么,了解一个字符可能跨越两个连续的 ByteBuffers 之间的间隙?

最佳答案

使用 CharsetDecoder :

final Charset charset = ...
final CharsetDecoder decoder = charset.newDecoder()
.onUnmappableCharacter(CodingErrorAction.REPORT)
.onMalformedInput(CodingErrorAction.REPORT);

我的一个项目中确实有这个问题,here我就是这样处理的。

注意第 258 行:如果结果是格式错误的输入序列,那么它可能是一个不完整的读取;在那种情况下,我将最后一个好的偏移量设置为最后一个解码字节,然后从该偏移量重新开始。

如果在下一次读取时,我再次读取失败并且 byte 偏移量相同,那么这是永久性失败(第 215 行)。 p>

但是你的情况有点不同,因为你不能“回溯”;你需要填写一个新的 ByteBuffer与先前缓冲区的其余部分和新缓冲区一起从那里开始(将 oldBuf.remaining() + bufsize.put()oldBuf 分配到新缓冲区中)。在我的例子中,我的后端是一个文件,所以我可以 .map()从我想要的任何地方。

所以,基本上:

  • 如果你有一个不可映射的字符,这是一个永久性的失败(你的编码不​​能处理你的字节序列);
  • 如果你已经成功读取了完整的字节序列,你的CharBuffer会有buf.position()其中的字符;
  • 如果您的输入格式不正确,可能意味着您的字节序列不完整(例如,使用 UTF-8,您有一个三字节序列中的一个字节),但是您需要在下一次迭代中确认这一点。

请随时挽救您认为必要的任何代码!它是免费的;)


最后说明,因为我认为这很重要:String.getBytes(*)字节数组的方法和构造函数有一个默认值 CodingErrorActionREPLACE !

关于java - 从边界对齐可能不完美的 ByteArray 流中读取字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22917492/

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