私はクラスプロジェクトのマーシャリング/アンマーシャリングルーチンをいくつか書いていますが、この場合のJavaのデフォルトの動作に少し戸惑っています。バイトストリームとの間で文字列を読み書きするための「ナイーブな」サブルーチンは次のとおりです。
protected static void write(DataOutputStream dout, String str)
throws IOException{
dout.writeInt(str.length());
dout.writeChars(str);
}
protected static String readString(DataInputStream din)
throws IOException{
int strLength = 2*din.readInt(); // b/c there are two bytes per char
byte[] stringHolder = new byte[strLength];
din.read(stringHolder);
return new String(stringHolder);
}
残念ながら、これは単に機能しません。文字はデフォルトでUTF-16形式で書き込まれますが、String(byte[])
各バイトに文字が含まれると想定しているようです。また、UTF-16ではASCII文字はすべて0バイトで始まるため、コンストラクターはあきらめて空を返すように見えます。ストリング。readString
解決策は、 UTF-16エンコーディングを使用する必要があることを指定するように変更することです。
protected static String readString(DataInputStream din)
throws IOException{
int strLength = 2*din.readInt();
byte[] stringHolder = new byte[strLength];
din.read(stringHolder);
return new String(stringHolder, "UTF-16");
}
私の質問は、なぜこれが必要なのかということです。Javaはデフォルトで文字列にUTF-16を使用するので、バイトから文字を読み取るときにUTF-16が使用されていると想定しないのはなぜですか?または、代わりに、デフォルトで文字を最初にバイトとしてエンコードしないのはなぜですか?writeChars()
つまり、メソッドとString(byte[])
コンストラクターのデフォルトの動作が互いに並行していないのはなぜですか?