7

バイナリ ストリームからデータを読み取ろうとしていますが、その一部は UTF-8 として解析する必要があります。

InputStreamバイナリ データに を直接使用し、UTF-8 テキストに をその上に使用すると、最大文字数InputStreamReaderを読み取るように指示されていても、リーダーが先読みして後続のバイナリ データを台無しにするため、機能しません。n

この質問はRead from InputStream in multiple formatsと非常によく似ていることを認識していますが、そこで提案されている解決策は HTTP ストリームに固有のものであり、役に立ちません。

すべてをバイナリデータとして読み取り、関連する部分を後でテキストに変換することを考えました。しかし、文字データの長さ情報はバイト単位ではなく、文字単位しかありません。したがって、エンコーディングを認識するために、ストリームから文字を読み取るものが必要です。

指定された文字数を読み取るために必要な以上に先読みしないように InputStreamReader に指示する方法はありますか? または、エンコーディングを使用してバイナリデータとテキストの両方をサポートし、これらのモードをオンザフライで切り替えることができるリーダーはありますか?

4

2 に答える 2

2

最初にバイナリ部分を読み取る必要があります。UTF-8 デコードが必要なバイトの一部を認識する場合は、それらのバイトを抽出してデコードする必要があります。

DataInputStream dis = 
// read a binary type.
int num = dis.readInt();
int len = dis.readUnsignedShort();
// read a UTF-8 portion.
byte[] bytes = new byte[len];
dis.readFully(bytes);
String text = new String(bytes, "UTF-8");
// read some binary
double d = dis.readDouble();
于 2011-06-30T07:31:34.253 に答える
2

StreamReader を使うべきではないと思います。リーダーはテキストを扱いますが、あなたはテキストとバイナリ データを一緒に扱います。

道はない。バイナリ バッファを読み取り、フォーマットを自分で解釈する必要があります。つまり、テキスト抽出バイトの位置を見つけて、文字列に変換する必要があります。

このタスクを簡素化するために、独自のクラス (ProtocolRecord としましょう) を作成することをお勧めします。すべてのフィールドが含まれます。次の 2 つのオプションがあります。

(1) 単純なもの - Java シリアライゼーション メカニズムを使用します。この場合、ストリームを読み取り用の DataInputStream と書き込み用の DataOutputStream でラップしてから、オブジェクトの読み取り/書き込みを行う必要があります。このアプローチの欠点は、プロトコルを制御できないことです。

(2) メソッド readObject() および writeObject() を自分で実装します。上記で説明したように、DataInputStream と DataOutputStream を使用します。この場合、シリアル化プロトコルを実装する必要がありますが、少なくともそれはクラスにカプセル化されています。

DataInputStream が必要だと思います。

于 2011-06-30T07:18:57.640 に答える