私は、ネットワークを介して情報を送信するために、いくつかのソケットプログラミングを行ってきました。DataOutputStream.writeUTF()で問題が発生しました。最大64kの文字列を許可しているようですが、これを乗り越えることができる状況がいくつかあります。より大きな文字列をサポートする良い代替手段はありますか、それとも自分でロールする必要がありますか?
3 に答える
文字列を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");
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 バイトのストリーム ヘッダーが自動的に書き込まれることですが、通常はかなりのペナルティが発生します。
UTF-8エンコーディングでOutputStreamWriterを使用できるはずです。明示的なwriteUTFメソッドはありませんが、コンストラクターで文字セットを設定できます。試す
Writer osw = new OutputStreamWriter(out, "UTF-8");
out
現在ラップしているOutputStreamはどこにありますか。