2008-11-07 52 views
7

我一直在做一些套接字編程來通過線路傳輸信息。我遇到了DataOutputStream.writeUTF()的問題。它似乎允許高達64K的字符串,但我有幾種情況可以在這裏運行。是否有任何支持更大字符串的好選擇,還是需要自己推出?用DataOutputStream編寫大字符串

回答

15

實際上它使用兩個字節來寫入字符串的長度,然後使用一種算法將其壓縮爲每個字符一個,兩個或三個字節。 (請參閱關於java.io.DataOutput的文檔)它接近於UTF-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

希望有一個API,但基本上證實了我的想法。 – Glen 2008-11-07 02:01:49

2

您應該可以使用帶有UTF-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另一個區別是實例化時使用ObjectOutputStream自動寫入一個4字節流標頭,但它通常會是一個相當小的罰款來支付。