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之间进行转换的更好方法?谢谢!
回答:
查看CharsetEncoder
和CharsetDecoder
API描述-
您应该按照 以避免出现此问题。例如,对于CharsetEncoder
:
- 通过
reset
方法重置编码器,除非以前未使用过; encode
只要可能有其他输入可用,就调用该方法零次或多次,并false
为endOfInput自变量传递并填充输入缓冲区,并在两次调用之间刷新输出缓冲区;encode
最后一次调用该方法,传递true
给endOfInput参数。然后- 调用该
flush
方法,以便编码器可以将任何内部状态刷新到输出缓冲区。
顺便说一句,这是我在NIO上使用的相同方法,尽管我的一些同事在知道仅使用ASCII的情况下将每个char直接转换为一个字节,我想这可能更快。
以上是 Java:将字符串与ByteBuffer相互转换以及相关问题 的全部内容, 来源链接: utcz.com/qa/418968.html