15

java.io.DataOutputStream.writeUTF(String str)メソッドには、UTF-8 でエンコードされた文字列のサイズを65535バイトに制限する奇妙な制限があります。

    if (utflen > 65535)
        throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

次の理由から、それは奇妙です。

  1. このメソッドの JavaDoc には、この制限に関する情報はありません
  2. static int writeUTF(String str, DataOutput out) この制限は、このクラスの内部メソッドをコピーして変更することで簡単に解決できます
  3. 逆の方法ではそのような制限はありませんjava.io.DataInputStream.readUTF()

上記によると、このwriteUTF方法でそのような制限の目的を理解できません。私は何を見逃したり誤解したりしましたか?

4

1 に答える 1

17

状態のJavadocDataOutputStream.writeUTF :

最初に、後続のバイト数を指定するメソッドによって行われたかのように、 2 バイトが出力ストリームに書き込まれ ます。writeShortこの値は、文字列の長さではなく、実際に書き出されたバイト数です。

2 バイトは 16 ビットを意味します: 16 ビットでエンコードできる最大整数は2^16== 65535 です。 DataInputStream.readUTF最初に消費する UTF-8 バイト数を 2 バイト整数の形式で読み取るため、まったく同じ制限があります。これも最大値 65535 しか持てません。


writeUTFwriteShort最初に長さで 2 バイトを書き込みます。これは、長さで呼び出してから UTF エンコードされたバイトを書き込むのと同じ結果になります。writeUTFは実際には呼び出しません- 2 バイト長と UTF バイトの両方でwriteShortシングルを構築します。byte[]しかし、それがJavadocが単に「メソッドによる」ではなく「メソッドによるかのように」と言っている理由ですwriteShortwriteShort

于 2014-03-30T07:51:06.937 に答える