5

現在、次の関数を使用して単純な HTTP GET を実行しています。

public static String download(String url) throws java.io.IOException {
    java.io.InputStream s = null;
    java.io.InputStreamReader r = null;
    //java.io.BufferedReader b = null;
    StringBuilder content = new StringBuilder();
    try {
        s = (java.io.InputStream)new URL(url).getContent();

        r = new java.io.InputStreamReader(s);
        //b = new java.io.BufferedReader(r);

        char[] buffer = new char[4*1024];
        int n = 0;
        while (n >= 0) {
            n = r.read(buffer, 0, buffer.length);
            if (n > 0) {
                content.append(buffer, 0, n);
            }
        }
    }
    finally {
        //if (b != null) b.close();
        if (r != null) r.close();
        if (s != null) s.close();
    }
    return content.toString();
}

BufferedReaderすべてを順番にダウンロードするだけなので、を使用する理由はありません。BufferedReaderこの場合、の使用はないと考えるのは正しいですか?

4

4 に答える 4

5

この場合、私はあなたがしているのと同じようにします (ストリーム バッファの 1 つではなく、バッファリングにバイト配列を使用します)。

ただし、例外もあります。バッファ (今回の出力) が見られる場所の 1 つは、サーブレット API です。flush()が呼び出されるまでデータは基になるストリームに書き込まれないため、出力をバッファリングできますが、エラーが発生した場合はバッファをダンプし、代わりにエラー ページを書き込むことができます。mark(int)reset()を使用して再読み込みのためにストリームをリセットする必要がある場合は、入力をバッファリングすることがあります。たとえば、ストリームを渡すコンテンツ ハンドラーを決定する前に、ファイル ヘッダーを調べます。

関係ありませんが、ストリーム処理を書き直す必要があると思います。このパターンは、リソース リークを回避するのに最適です。

    InputStream stream = new FileInputStream("in");
    try { //no operations between open stream and try block
        //work
    } finally { //do nothing but close this one stream in the finally
        stream.close();
    }

複数のストリームを開く場合は、try/finally ブロックをネストします。

コードが行っているもう 1 つのことは、返されたコンテンツが VM の既定の文字セットでエンコードされていることを前提としていることです (ただし、ユース ケースによっては、それで十分な場合もあります)。

于 2008-08-28T15:03:31.053 に答える
1

InputStreamReaderのread()メソッドの1つを呼び出すたびに、基になるバイト入力ストリームから1つ以上のバイトが読み取られる場合があります。バイトから文字への効率的な変換を可能にするために、現在の読み取り操作を満たすために必要な数よりも多くのバイトが、基になるストリームから先に読み取られる場合があります。

于 2010-01-18T17:11:41.060 に答える
1

HTTP コンテンツとヘッダーの読み取りに BufferedReader を使用する場合、InputStreamReader が必要になるため、バイト単位で読み取ることができます。

このシナリオの BufferedReader は時々奇妙なことをします...特に HTTP POST ヘッダーの読み取りに関しては、POST データを読み取ることができない場合があります.InputStreamReader を使用すると、コンテンツの長さを読み取ってそのバイト数を読み取ることができます.. .

于 2008-08-28T00:16:40.937 に答える
0

私の直感では、既にバイト配列を使用してバッファリングを実行しているため、BufferedReader を使用するのは冗長です。

于 2008-08-28T00:18:03.023 に答える