Java:将字符串与ByteBuffer相互转换以及相关问题

我正在使用Java

NIO进行套接字连接,并且我的协议是基于文本的,因此我需要能够将字符串转换为ByteBuffer,然后再将其写入SocketChannel,并将传入的ByteBuffer转换回String。目前,我正在使用以下代码:

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对象每次转换完成时间。我需要同步这些方法吗?在字符串和ByteBuffer之间进行转换的更好方法?谢谢!

回答:

查看CharsetEncoderCharsetDecoderAPI描述-

您应该按照 以避免出现此问题。例如,对于CharsetEncoder

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

顺便说一句,这是我在NIO上使用的相同方法,尽管我的一些同事在知道仅使用ASCII的情况下将每个char直接转换为一个字节,我想这可能更快。

以上是 Java:将字符串与ByteBuffer相互转换以及相关问题 的全部内容, 来源链接: utcz.com/qa/418968.html

回到顶部