Я використовую Java NIO для своїх сокетних з'єднань, і мій протокол базується на тексті, тому мені потрібно мати можливість перетворити рядки в ByteBuffers перед тим, як записати їх у SocketChannel, і перетворити вхідні ByteBuffers назад у рядки. В даний час я використовую цей код:
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;
}
Це працює більшу частину часу, але я сумніваюся, чи це найкращий (чи найпростіший) спосіб зробити кожен напрямок цього перетворення, чи є інший спосіб спробувати. Іноді, здавалося б , і у випадковому порядку, заклики до encode()
і decode()
викине
java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
виняток, або подібне, навіть якщо я використовую новий об'єкт ByteBuffer кожен раз , коли перетворення зроблено. Чи потрібно синхронізувати ці методи? Будь-який кращий спосіб конвертувати між рядками та ByteBuffers? Дякую!