ソケット接続にJavaNIOを使用しており、プロトコルはテキストベースであるため、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;
}
これはほとんどの場合機能しますが、これがこの変換の各方向を実行するための好ましい(または最も簡単な)方法であるかどうか、または別の方法で試すことができるかどうか疑問に思います。変換が行われるたびに新しいByteBufferオブジェクトを使用している場合でも、ときどき、一見ランダムに、例外encode()
などdecode()
を呼び出してスローし
java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
ます。これらのメソッドを同期する必要がありますか?文字列とByteBufferの間で変換するためのより良い方法はありますか?ありがとう!