मैं अपने सॉकेट कनेक्शन के लिए जावा एनआईओ का उपयोग कर रहा हूं, और मेरा प्रोटोकॉल पाठ आधारित है, इसलिए मुझे स्ट्रेट को बाइटबफर्स में बदलने से पहले उन्हें सॉकेटचैनलाइन में लिखने में सक्षम होने की जरूरत है, और आने वाले बाइटबफर्स को स्ट्रिंग्स में वापस कन्वर्ट करने की आवश्यकता है। वर्तमान में, मैं इस कोड का उपयोग कर रहा हूं:
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
अपवाद या इसी तरह फेंक देगा
, भले ही मैं एक नया बाइटबफ़र ऑब्जेक्ट का उपयोग कर रहा हूं, जब हर बार रूपांतरण किया जाता है। क्या मुझे इन विधियों को सिंक्रनाइज़ करने की आवश्यकता है? स्ट्रिंग्स और बाइटबफर्स के बीच बदलने का कोई बेहतर तरीका? धन्यवाद!