Я использую Java NIO для своих сокетов, а мой протокол основан на тексте, поэтому мне нужно иметь возможность преобразовывать строки в ByteBuffers, прежде чем записывать их в SocketChannel, и конвертировать входящие байтовые байты обратно в строки. В настоящее время я использую этот код:
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 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 каждый раз, когда выполняется преобразование. Нужно ли мне синхронизировать эти методы? Любой лучший способ конвертировать между строками и ByteBuffers? Спасибо!