イベント データ (購入ボタンのクリックなど) を受信し、そのデータを HDFS に書き込む Java REST-API を作成しました。基本的に、データを (JSON で) 送信しているすべてのホストのストリームを開くか、既存のホストを使用して、タイムスタンプ、イベント名、およびホスト名でデータを強化し、(FS)DataOutputStream に書き込みます。
1 public synchronized void writeToFile(String filename, String hostname, String content) throws IOException {
2 FSDataOutputStream stream = registry.getStream(filename, hostname);
3 stream.writeBytes(content);
4 stream.hflush();
5 }
まず、stream.writeChars(content)
3 行目で使用した結果、次のようなファイルが作成
.{.".m.e.s.s.a.g.e.".:.".h.e.l.l.o.".}
されました。わかりません。
次にstream.writeUTF(content)
、3 行目で試してみると、ファイルの見た目はずっと良くなりまし
.W{"message":"hello"}
た。コードを見ると、 writeUTF(String s) は最初に s のバイト数を送信し、次に文字列自体を送信します。イベント データのバイト数を表します。これ.W
は、イベント データの長さを変えると、ファイル内の先頭の文字が異なる場合に証明されます。
だから私の最後の手段、stream.writeBytes(content)
. ここではすべて問題ないように見えました:
{"message":"hello"}
特殊文字が登場するまで:
{"message":"hallöchen"}
になりまし{"message":"hall.chen"}
た。writeBytes は、文字を書き込む前に先頭の 8 ビットをカットします。これらの文字を正しく書き込むには、UTF-8 機能が必要だと思います。
だから、今、私はちょっと迷っています。どうすれば解決できますか?