2008-11-07 46 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字节流标头,但它通常会是一个相当小的罚款来支付。