Estoy usando Java NIO para mis conexiones de socket, y mi protocolo está basado en texto, por lo que necesito poder convertir Strings en ByteBuffers antes de escribirlos en SocketChannel, y convertir los ByteBuffers entrantes de nuevo en Strings. Actualmente, estoy usando este código:
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;
}
Esto funciona la mayor parte del tiempo, pero me pregunto si es la forma preferida (o la más sencilla) de realizar cada dirección de esta conversión, o si hay otra forma de intentarlo. De vez en cuando, y aparentemente de forma aleatoria, las llamadas encode()
y decode()
arrojarán una
java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
excepción, o similar, incluso si estoy usando un nuevo objeto ByteBuffer cada vez que se realiza una conversión. ¿Necesito sincronizar estos métodos? ¿Alguna mejor manera de convertir entre cadenas y ByteBuffers? ¡Gracias!