使用 http 客户端时流关闭
Stream closed when using http client
当使用 httpclient 获取响应时,我收到一个在线错误
out.write(EntityUtils.toString(resEntity));
// 这是 java 代码中的第 70 行
为什么会这样?
CloseableHttpClient httpClient = HttpClients.custom().setUserAgent("Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0").build();
HttpResponse response = httpClient.execute(new HttpGet(searchLink.toString()));
HttpEntity resEntity = response.getEntity();
System.out.println(EntityUtils.toString(resEntity));
PrintWriter out = new PrintWriter(new File("searchResult.xml"));
out.write(EntityUtils.toString(resEntity));
out.flush();
out.close();
httpClient.close();
错误是
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) java.io.IOException: Stream closed
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at java.util.zip.GZIPInputStream.ensureOpen(GZIPInputStream.java:61)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:112)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at org.apache.http.client.entity.LazyDecompressingInputStream.read(LazyDecompressingInputStream.java:74)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at java.io.InputStreamReader.read(InputStreamReader.java:184)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at java.io.Reader.read(Reader.java:140)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at org.apache.http.util.EntityUtils.toString(EntityUtils.java:244)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at org.apache.http.util.EntityUtils.toString(EntityUtils.java:288)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at mainThread.Search.doRequest(Search.java:70)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at mainThread.Search.search(Search.java:29)
...
同时在线成功接收到来自请求的响应
System.out.println(EntityUtils.toString(resEntity));
您不能读取响应流两次,这是您通过有效调用 EntityUtils.toString(resEntity)
两次所做的。
System.out.println(EntityUtils.toString(resEntity)); // once
// ...
out.write(EntityUtils.toString(resEntity)); // twice
当你到达第 2 次时,响应流已经没有更多的数据可以读取了。
在这种情况下,只需确保通过将结果字符串分配给变量来读取响应流一次。然后,您可以根据需要安全地多次使用该字符串变量。
String resEntityToString = EntityUtils.toString(resEntity);
System.out.println(resEntityToString);
// ...
out.write(resEntityToString);
当使用 httpclient 获取响应时,我收到一个在线错误
out.write(EntityUtils.toString(resEntity));
// 这是 java 代码中的第 70 行
为什么会这样?
CloseableHttpClient httpClient = HttpClients.custom().setUserAgent("Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0").build();
HttpResponse response = httpClient.execute(new HttpGet(searchLink.toString()));
HttpEntity resEntity = response.getEntity();
System.out.println(EntityUtils.toString(resEntity));
PrintWriter out = new PrintWriter(new File("searchResult.xml"));
out.write(EntityUtils.toString(resEntity));
out.flush();
out.close();
httpClient.close();
错误是
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) java.io.IOException: Stream closed
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at java.util.zip.GZIPInputStream.ensureOpen(GZIPInputStream.java:61)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at java.util.zip.GZIPInputStream.read(GZIPInputStream.java:112)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at org.apache.http.client.entity.LazyDecompressingInputStream.read(LazyDecompressingInputStream.java:74)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
2015/08/07 13:03:12,887 ERROR [stderr] (Thread-101) at java.io.InputStreamReader.read(InputStreamReader.java:184)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at java.io.Reader.read(Reader.java:140)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at org.apache.http.util.EntityUtils.toString(EntityUtils.java:244)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at org.apache.http.util.EntityUtils.toString(EntityUtils.java:288)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at mainThread.Search.doRequest(Search.java:70)
2015/08/07 13:03:12,888 ERROR [stderr] (Thread-101) at mainThread.Search.search(Search.java:29)
...
同时在线成功接收到来自请求的响应
System.out.println(EntityUtils.toString(resEntity));
您不能读取响应流两次,这是您通过有效调用 EntityUtils.toString(resEntity)
两次所做的。
System.out.println(EntityUtils.toString(resEntity)); // once
// ...
out.write(EntityUtils.toString(resEntity)); // twice
当你到达第 2 次时,响应流已经没有更多的数据可以读取了。
在这种情况下,只需确保通过将结果字符串分配给变量来读取响应流一次。然后,您可以根据需要安全地多次使用该字符串变量。
String resEntityToString = EntityUtils.toString(resEntity);
System.out.println(resEntityToString);
// ...
out.write(resEntityToString);