7

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

4

3 回答 3

18

它实际上使用两个字节来写入字符串的长度,然后使用将其压缩为每个字符一个、两个或三个字节的算法。(请参阅 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");
于 2008-11-07T00:59:33.707 回答
8

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处是 usingObjectOutputStream在实例化时自动写入一个 4 字节的流标头,但通常需要支付相当小的代价。

于 2012-01-31T02:22:02.390 回答
1

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

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

out您现在包装的 OutputStream 在哪里。

于 2008-11-07T00:54:43.823 回答