Tôi đang sử dụng Java NIO cho các kết nối socket của mình và giao thức của tôi là dựa trên văn bản, vì vậy tôi cần có thể chuyển đổi Chuỗi thành ByteBuffers trước khi ghi chúng vào SocketChannel và chuyển đổi ByteBuffers đến trở lại Strings. Hiện tại, tôi đang sử dụng mã này:
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;
}
Điều này hầu hết đều hoạt động, nhưng tôi đặt câu hỏi liệu đây có phải là cách ưa thích (hoặc đơn giản nhất) để thực hiện từng hướng chuyển đổi này hay không, hay có cách nào khác để thử không. Đôi khi, và dường như ngẫu nhiên, các lệnh gọi đến encode()
và decode()
sẽ ném ra một
java.lang.IllegalStateException: Current state = FLUSHED, new state = CODING_END
ngoại lệ hoặc tương tự, ngay cả khi tôi đang sử dụng đối tượng ByteBuffer mới mỗi khi thực hiện chuyển đổi. Tôi có cần đồng bộ hóa các phương pháp này không? Có cách nào tốt hơn để chuyển đổi giữa Strings và ByteBuffers không? Cảm ơn!