2008-11-07 5 views
7

के साथ बड़े तारों को लिखना मैं तार में जानकारी संचारित करने के लिए कुछ सॉकेट प्रोग्रामिंग कर रहा हूं। मैंने DataOutputStream.writeUTF() के साथ एक समस्या में भाग लिया है। ऐसा लगता है कि 64k तक की तारों की अनुमति है लेकिन मेरे पास कुछ स्थितियां हैं जहां मैं इसे चला सकता हूं। क्या कोई अच्छा विकल्प है जो बड़े तारों का समर्थन करता है या मुझे अपना खुद का रोल करने की ज़रूरत है?डेटाऑटपुटस्ट्रीम

उत्तर

15

यह वास्तव में एक एल्गोरिदम का उपयोग करने से पहले स्ट्रिंग की लंबाई लिखने के लिए दो बाइट्स का उपयोग करता है जो इसे प्रति, दो या तीन बाइट प्रति वर्णित करता है। (Java.io.DataOutput पर प्रलेखन देखें) यह यूटीएफ -8 के करीब है, लेकिन ऐसा होने के बावजूद, संगतता समस्याएं हैं। यदि आप डेटा की मात्रा के बारे में बहुत चिंतित नहीं हैं, तो आप पहले स्ट्रिंग की लंबाई लिखकर और फिर GetBytes विधि का उपयोग करके स्ट्रिंग का कच्चा डेटा लिखकर आसानी से लिख सकते हैं।

// Write data 
String str="foo"; 
byte[] data=str.getBytes("UTF-8"); 
out.writeInt(data.length); 
out.write(data); 

// Read data 
int length=in.readInt(); 
byte[] data=new byte[length]; 
in.readFully(data); 
String str=new String(data,"UTF-8"); 
+0

उम्मीद कर रहा था कि इसके लिए एक एपीआई था लेकिन यह मूल रूप से पुष्टि करता है कि मैं क्या सोच रहा था। – Glen

2

आप यूटीएफ -8 एन्कोडिंग के साथ OutputStreamWriter का उपयोग करने में सक्षम होना चाहिए। कोई स्पष्ट writeUTF विधि नहीं है, लेकिन आप निर्माता में वर्णमाला सेट कर सकते हैं।

Writer osw = new OutputStreamWriter(out, "UTF-8"); 

प्रयास करें जहां out जो कुछ OutputStream आप अब लपेटकर रहे हैं।

7

ObjectOutputStream.writeObject() ठीक से लंबे तार (स्रोत कोड देख द्वारा सत्यापित) संभालती है।

ObjectOutputStream oos = new ObjectOutputStream(out); 
... other write operations ... 
oos.writeObject(myString); 
... other write operations ... 

यह इस तरह से पढ़ें:: स्ट्रिंग बाहर इस तरह से लिखें

ObjectInputStream ois = new ObjectInputStream(in); 
... other read operations ... 
String myString = (String) ois.readObject(); 
... other read operations ... 

DataOutputStream साथ एक और अंतर यह जब instantiated कि ObjectOutputStream का उपयोग कर स्वचालित रूप से एक 4-बाइट धारा हैडर लिखते हैं, लेकिन इसके आमतौर पर करने के लिए जा रहा है भुगतान करने के लिए एक बहुत छोटा जुर्माना हो।