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