gpt4 book ai didi

Java:将 String 与 ByteBuffer 相互转换以及相关问题

转载 作者:IT老高 更新时间:2023-10-28 11:46:00 27 4
gpt4 key购买 nike

我使用 Java NIO 进行套接字连接,并且我的协议(protocol)是基于文本的,因此我需要能够在将字符串写入 SocketChannel 之前将它们转换为 ByteBuffer,并将传入的 ByteBuffer 转换回字符串。目前,我正在使用此代码:

public static Charset charset = Charset.forName("UTF-8");
public static CharsetEncoder encoder = charset.newEncoder();
public static CharsetDecoder decoder = charset.newDecoder();

public static ByteBuffer str_to_bb(String msg){
try{
return encoder.encode(CharBuffer.wrap(msg));
}catch(Exception e){e.printStackTrace();}
return null;
}

public static String bb_to_str(ByteBuffer buffer){
String data = "";
try{
int old_position = buffer.position();
data = decoder.decode(buffer).toString();
// reset buffer's position to its original so it is not altered:
buffer.position(old_position);
}catch (Exception e){
e.printStackTrace();
return "";
}
return data;
}

这在大多数情况下都有效,但我质疑这是否是执行此转换的每个方向的首选(或最简单)方法,或者是否有其他方法可以尝试。偶尔,看似随机的,对 encode()decode() 的调用会抛出一个java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END 异常或类似情况,即使每次转换完成时我都使用新的 ByteBuffer 对象。我需要同步这些方法吗?有更好的方法在字符串和字节缓冲区之间进行转换吗?谢谢!

最佳答案

查看 CharsetEncoderCharsetDecoder API 描述 - 您应该遵循特定的方法调用顺序来避免这个问题。例如,对于 CharsetEncoder:

  1. 通过reset方法重置编码器,除非之前没有使用过;
  2. 调用 encode 方法零次或多次,只要有额外的输入可用,为 endOfInput 参数传递 false 并填充输入缓冲区并刷新输出调用之间的缓冲区;
  3. 最后一次调用 encode 方法,为 endOfInput 参数传递 true;然后
  4. 调用 flush 方法,以便编码器可以将任何内部状态刷新到输出缓冲区。

顺便说一句,这与我用于 NIO 的方法相同,尽管我的一些同事知道他们只使用 ASCII 将每个字符直接转换为一个字节,我可以想象这可能更快。

关于Java:将 String 与 ByteBuffer 相互转换以及相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1252468/

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