Je suis à l'aide de Java NIO pour mes connexions socket, et mon protocole est en mode texte, donc j'ai besoin d'être en mesure de convertir des Chaînes en ByteBuffers avant de les écrire à la SocketChannel, et le convertir en entrant ByteBuffers retour à Cordes. Actuellement, je suis en utilisant ce code:
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;
}
Cela fonctionne la plupart du temps, mais je me demande si c'est la meilleure (ou la plus simple) de manière à faire de chaque direction de cette conversion, ou si il y a un autre moyen de les essayer. De temps en temps, apparemment au hasard, les appels à l' encode()
et decode()
va lancer une
java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
d'exception, ou similaires, même si je suis en utilisant une nouvelle ByteBuffer objet à chaque fois qu'une conversion est effectuée. Ai-je besoin de synchroniser ces méthodes? Une meilleure façon de faire les conversions entre Chaînes et ByteBuffers? Merci!