Java 使用DataOutputStream写入大字符串

Java 使用DataOutputStream写入大字符串,java,dataoutputstream,Java,Dataoutputstream,我一直在做一些套接字编程来通过网络传输信息。我遇到DataOutputStream.writeUTF()的问题。它似乎允许字符串高达64k,但我有一些情况下,我可以运行这个。有支持更大字符串的好方法吗?或者我需要自己使用吗?您应该能够使用UTF-8编码。没有显式的writeUTF方法,但是可以在构造函数中设置字符集。试一试 Writer osw = new OutputStreamWriter(out, "UTF-8"); 其中,out是您现在包装的任何输出流。它实际上使用两个字节来写入字符串

我一直在做一些套接字编程来通过网络传输信息。我遇到DataOutputStream.writeUTF()的问题。它似乎允许字符串高达64k,但我有一些情况下,我可以运行这个。有支持更大字符串的好方法吗?或者我需要自己使用吗?

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

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

其中,
out
是您现在包装的任何输出流。

它实际上使用两个字节来写入字符串的长度,然后使用算法将其压缩为每个字符一个、两个或三个字节。(请参阅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()
正确处理长字符串(通过查看源代码进行验证)。按以下方式写出字符串:

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 ...
请这样读:

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字节的流头,但这通常是一个非常小的代价。

希望有一个API,但这基本上证实了我的想法。