6

HTTP リクエストとレスポンスを読み取って解析するクラスを作成しようとしています。ヘッダーは通常のテキストであるため、BufferedReaderreadLineメソッドを使用して読み取るのが最も簡単なようです。データ本体はバイナリである可能性があるため、これは明らかに機能しません。そのため、ヘッダーが読み取られた後に生のバイトを読み取るように切り替えたいと思います。

今、私は次のようなことをしています:

InputStream input=socket.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(input));
BufferedInputStream binstream=new BufferedInputStream(input);

問題は、BufferedReaderが先読みして、binstream で取得する機会を得る前に、ストリームからすべてのバイナリ データを取得していることです。

readLineへの呼び出しごとに改行を超えて読み取らないようにする方法はありますか? または、生のバイナリ データに続く ASCII テキストの 1 行を読み取るためのより良い方法はありますか?

4

3 に答える 3

5

Java には、HTTP 要求と応答を処理するためのクラスが既に存在します。自分で応答を解析しようとする代わりに、それを使用する必要があります。HTTP 応答の解析は、対処しなければならないさまざまなエンコード方法があるため、思っているよりも困難です。応答ペイロードの生のバイナリ データではありません。HttpURLConnection クラスはヘッダーを解析し、ペイロードの InputStream を提供します。

http://download.oracle.com/javase/1.4.2/docs/api/java/net/HttpURLConnection.html

于 2011-02-15T00:21:29.273 に答える
5

Konstantin が提案したような既製の HTTP クライアント/サーバー実装を使用したくない場合は、DataInputStream にreadLineメソッドがあります。適切な変換 (ほとんどの場合、直接のバイト -> char キャスト変換) を行っていないため、非推奨ですが、純粋な ASCII ヘッダー行の場合は適切であると思います。

(readLine は各バイトを個別に読み取るため、DataInputStream の下に BufferedInputStream を配置する必要があります。)

于 2011-02-15T00:49:52.377 に答える
2

commons-httpclient を使用すると、ここでの作業を大幅に節約できます。

于 2011-02-15T01:11:08.823 に答える