Java中的Apache HttpClient,instream.toString=org.Apache.http.conn.EofSensorInputStream

Java中的Apache HttpClient,instream.toString=org.Apache.http.conn.EofSensorInputStream,java,httpclient,inputstream,http-get,Java,Httpclient,Inputstream,Http Get,我正在使用ApacheHttpClient获取一个页面,我想将服务器应答的http正文存储到一个字符串中,这样我就可以处理这个字符串并将其打印到控制台 不幸的是,在运行此方法时,我收到了以下消息: 17:52:01,862 INFO Driver:53 - fetchPage STARTING 17:52:07,580 INFO Driver:73 - fetchPage ENDING, took 5716 org.apache.http.conn.EofSensorInputStream@

我正在使用ApacheHttpClient获取一个页面,我想将服务器应答的http正文存储到一个字符串中,这样我就可以处理这个字符串并将其打印到控制台

不幸的是,在运行此方法时,我收到了以下消息:

17:52:01,862  INFO Driver:53 - fetchPage STARTING
17:52:07,580  INFO Driver:73 - fetchPage ENDING, took 5716
org.apache.http.conn.EofSensorInputStream@5e0eb724
fetchPage类:

public String fetchPage(String part){
    log.info("fetchPage STARTING");
    long start = System.currentTimeMillis();

    String reply;

    String searchurl = URL + URL_SEARCH_BASE + part + URL_SEARCH_TAIL;

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(searchurl);
    HttpResponse response;
    try {
        response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            int l;
            byte[] tmp = new byte[2048];
            while ((l = instream.read(tmp)) != -1) {
            }
            long elapsedTimeMillis = System.currentTimeMillis()-start;
            log.info("fetchPage ENDING, took " + elapsedTimeMillis);
            reply = instream.toString();
            System.out.println(reply);
            return reply;
        }
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;
}

您正在调用
InputStream
上的
toString
,它已经读取完毕。您需要从字节数组创建字符串。获取内容的字符串版本的更简单方法是使用

具体实现如下所示:

import org.apache.http.util.EntityUtils;

public String fetchPage(String part){
    log.info("fetchPage STARTING");
    long start = System.currentTimeMillis();

    String reply;

    String searchurl = URL + URL_SEARCH_BASE + part + URL_SEARCH_TAIL;

    HttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet(searchurl);
    HttpResponse response;
    try {
        response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            return EntityUtils.toString(entity);
        }
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;
}

这里要理解的关键是
InputStream
上的
toString()
不是将其内容作为
字符串读取的方法,而是获取对象本身的简单字符串表示。通常(包括在本例中),
InputStream
没有它可以提供的有用的字符串表示形式,因此它只使用默认的
Object.toString()
返回EntityUtils.toString(实体)之前的右键如果我在
String result=EntityUtils.toString(entity)之后停止时间,则过程的运行时间约为1300ms
然后
返回结果
大约需要5500毫秒。你知道为什么吗?@Jack:可能是因为客户端不必在获取实体的位置接收服务器发送的所有数据。创建字符串需要实际读取服务器发送的所有内容。@Jack Murphy:EntityUtils.toString(实体)正在读取流。客户尚未收到所有数据。您将希望后者捕获传输的时间量。