使用DataOutputStream编写大字符串

我一直在做一些套接字编程来通过线路传输信息。 我遇到了DataOutputStream.writeUTF()的问题。 它似乎允许高达64k的字符串,但我有一些情况,我可以跑过这个。 是否有任何好的替代方案支持更大的字符串或我需要自己滚动?

在使用将每个字符压缩为一个,两个或三个字节的算法之前,它实际上使用两个字节来写入字符串的长度。 (请参阅有关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"); 

ObjectOutputStream.writeObject()正确处理长字符串(通过查看源代码进行validation)。 以这种方式写出字符串:

 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字节的流标头,但它通常会付出相当小的代价。

您应该能够使用带有UTF-8编码的OutputStreamWriter 。 没有明确的writeUTF方法,但您可以在构造函数中设置charset。 尝试

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

out是你现在正在包装的任何OutputStream。