7

私は、ネットワークを介して情報を送信するために、いくつかのソケットプログラミングを行ってきました。DataOutputStream.writeUTF()で問題が発生しました。最大64kの文字列を許可しているようですが、これを乗り越えることができる状況がいくつかあります。より大きな文字列をサポートする良い代替手段はありますか、それとも自分でロールする必要がありますか?

4

3 に答える 3

18

文字列を1文字あたり1、2、または3バイトに圧縮するアルゴリズムを使用する前に、実際には2バイトを使用して文字列の長さを書き込みます。(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 ...

とのもう 1 つの違いDataOutputStreamは、 を使用ObjectOutputStreamすると、インスタンス化時に 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 に答える