0

a から最初の x バイトを読み取りたいjava.net.URLConnection(ただし、このクラスを使用する必要はありませんが、他の提案を歓迎します)。

私のコードは次のようになります。

val head = new Array[Byte](2000)  
new BufferedInputStream(connection.getInputStream).read(head)
IOUtils.toString(new ByteArrayInputStream(head), charset)

動作しますが、このコードはネットワークから最初の 2000 バイトだけをロードしますか?

次のトライアル

「JB Nizet」が言ったように、バッファリングされた入力ストリームを使用するのは役に立たないので、次のようにしてみましたInputStreamReader:

val head = new Array[Char](2000)  
new InputStreamReader(connection.getInputStream, charset).read(head)
new String(head)

このコードの方が良いかもしれませんが、ロード時間はほぼ同じです。それで、この手順は転送されるバイト数を制限しますか?

4

2 に答える 2

7

いいえ、そうではありません。最大 8192 バイト (のデフォルトのバッファ サイズBufferedInputStream) を読み取ることができます。read()実際に読み取られ、メソッドによって返されるバイト数をチェックしないため、0 バイト、または 0 から 2000 の間の任意のバイト数を読み取ることもできます。

最後に、charset の値と、HTTP 応答で使用される実際の文字セットによっては、正しくない文字列が返されるか、マルチバイト文字の途中で切り捨てられた文字列が返される可能性があります。テキストを読むには Reader を使用する必要があります。

Java IO チュートリアルを読むことをお勧めします。

于 2013-01-22T12:36:32.230 に答える
5

read(Reader, char[])ApacheCommonsIOから使用できます。2000文字のバッファを渡すだけで、2000文字までのできるだけ多くの文字でバッファがいっぱいになります。

特に、他の回答/コメントの反対意見を理解してください。

  • Buffered...ラッパーは使用しないでください。意図に反します。
  • テキストデータを読み取る場合は、2000バイトを読み取る代わりに、を使用しReaderて2000文字を読み取ります。適切な手順は、応答()のヘッダーから文字エンコードを決定し、そのエンコードをに設定することです。InputStreamContent-TypeInputStreamReader
  • でplainread(char[])を呼び出すReaderと、指定した配列が完全に満たされるわけではありません。配列の大きさに関係なく、1文字まで読み取ることができます。
  • 後でリーダーを閉じることを忘れないでください。

それ以外は、を優先してApacheHttpClientを使用することを強くお勧めしますjava.net.URLConnection。それははるかに柔軟です。


編集:Reader.readとの違いを理解するIOUtils.readには、後者のソースを調べる価値があります:

public static int read(Reader input, char[] buffer,
                       int offset, int length)
    throws IOException
{
    if (length < 0) {
        throw new IllegalArgumentException("Length must not be negative: " + length);
    }
    int remaining = length;
    while (remaining > 0) {
        int location = length - remaining;
        int count = input.read(buffer, offset + location, remaining);
        if (EOF == count) { // EOF
            break;
        }
        remaining -= count;
    }
    return length - remaining;
}

指定された長さよりも少ない文字を読み取ることができるためReader.read(少なくとも1つ、多くても長さであることがわかっているだけです)、必要な量が得られるまで呼び出しを繰り返す必要があります。

于 2013-01-22T17:02:41.890 に答える