[Java] DataOutputStreamクラスの仕様がおかしい.

Socket通信の際のデータをやりとりには,

出力 : DataOutputStreamクラス
入力 : InputStreamクラス

を使います.

入力に関しては,
InputStreamクラスを基に,

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

みたいにして使えばいいです.

出力に関しては,
DataOutputStreamクラスを直接使うのですが,
このクラスの書き込みメソッドがいくつかあって,
writeByte(Byte byte)
writeBytes(String string)
...

などがあるのですが、
普通にStringを送る事しか考えなかった場合,
writeBytes(String string)に飛びつく訳です.

しかし,この関数のドキュメントをよく読むと

文字列を基本となる出力ストリームに一連のバイトとして書き込みます。文字列中の各文字型データは順番に書き込まれ、このとき上位 8 ビットは無視されます。

大事なのは最後です.

このとき上位 8 ビットは無視されます。

謎です..
日本人の敵としか思えない.


なので,
日本語を送るときは,

writeBytes(String string)

ではなく,

Byte[] bytes = string.getBytes();
for (int i=0;i<bytes.length;i++){
    writeByte(bytes[i]);
}

を使わないと文字化けしてしまいます.