Ich verwende Java NIO für meine Socket-Verbindungen und mein Protokoll basiert auf Text. Daher muss ich in der Lage sein, Strings in ByteBuffers zu konvertieren, bevor ich sie in den SocketChannel schreibe, und die eingehenden ByteBuffers wieder in Strings konvertieren. Derzeit verwende ich diesen 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;
}
Dies funktioniert die meiste Zeit, aber ich frage mich, ob dies der bevorzugte (oder einfachste) Weg ist, um jede Richtung dieser Konvertierung durchzuführen, oder ob es einen anderen Weg gibt, es zu versuchen. Gelegentlich und scheinbar zufällig, um Anrufe encode()
und decode()
eine werfen
java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
Ausnahme oder ähnliche, auch wenn ich eine Umwandlung eines neues ByteBuffer Objekt jedes Mal bin mit gemacht wird . Muss ich diese Methoden synchronisieren? Gibt es eine bessere Möglichkeit, zwischen Strings und ByteBuffers zu konvertieren? Vielen Dank!