我一直在做一些套接字编程,以便通过网络传输信息。我遇到了DataOutputStream.writeUTF()的问题。它似乎允许高达64k的字符串,但我有一些情况,我可以跑过这个。有没有什么好的替代品可以支持更大的字符串,还是我需要自己动手?
答案 0 :(得分:16)
在使用将每个字符压缩为一个,两个或三个字节的算法之前,它实际上使用两个字节来写入字符串的长度。 (请参阅有关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");
答案 1 :(得分: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字节的流标题,但它通常会付出相当小的代价。
答案 2 :(得分:1)
您应该能够将OutputStreamWriter与UTF-8编码一起使用。没有明确的writeUTF方法,但您可以在构造函数中设置charset。尝试
Writer osw = new OutputStreamWriter(out, "UTF-8");
其中out
是您现在正在包装的任何OutputStream。