1

Apache HttpClient 4.2 (Java) を使用して、一連の Web ページを取得しようとしています。問題は、一連の HttpEntities の一部に空のコンテンツがあることです。つまり、次のようになります。

is = new ByteArrayInputStream(EntityUtils.toByteArray(entity))
System.out.println(response.getStatusLine());
System.out.println(is.available());

HTTP/1.1 200 OK と 0 を示します。その他の場合は、HTTP/1.1 200 OK と 64344 などを示します。コードを再起動すると、シリーズの別の HttpEntities が空になる場合があります。コンテンツがゼロ以外になるまで、同じプログラムで Web ページを取得する再帰を行いました。いくつかの呼び出しの後、取得しました... Win'XP でプログラムを実行しています。

コード自体 (再帰なし):

public InputStream loadURL(String url) throws IOException {
    PoolingClientConnectionManager connManager = new PoolingClientConnectionManager();
    DefaultHttpClient httpclient = new DefaultHttpClient(connManager);
    InputStream is = null;
    try {
        HttpGet httpget = new HttpGet(url);
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            try {
                System.out.println("========================================");
                is = new ByteArrayInputStream(EntityUtils.toByteArray(entity));
                System.out.println(is.available());
                System.out.println(response.getStatusLine());
                System.out.println("========================================");
            } catch (IOException ex) {
                throw ex;
            } catch (RuntimeException ex) {
                httpget.abort();
                throw ex;
            }
        }
    } catch (ClientProtocolException ex) {
        throw ex;
    } finally {
        httpclient.getConnectionManager().shutdown();
    }
    return is;
}

InputStream は外部コードで閉じられています。

4

1 に答える 1

1

available()エンティティが空かどうかを に依存している場合は、それを誤用しています。ブロックせずに読み取ることができるバイト数を返します。Javadoc を確認してください。Javadoc を使用して受信データの全長を予測することに対する具体的な警告が記載されています。それはそのためではありません。

于 2012-08-05T10:06:12.560 に答える