java.io.IOException: Attempted read from closed stream.

来源:互联网 发布:淘宝情侣链接是什么 编辑:程序博客网 时间:2024/05/17 06:56

          今天写了一个爬虫入门程序,写好运行后却出现了流关闭的问题,开始时是百思不得其解后来我的一个同学给我指出了问题,现在我把它写下了,防止以后再犯这样的错误:


String url = "http://www.baidu.com";
HttpClient httpclient = new DefaultHttpClient();

//Prepare a request object
HttpUriRequest httpget = new HttpGet(url);

BufferedInputStream reader = null;
//Execute the request
try {
//get response object
HttpResponse response = httpclient.execute(httpget);

//if network is wrong,it will recover request
// httpget.getParams().setParameter(HttpRequestParser,new DefaultHttpRequestRetryHandler())
HttpEntity entity = response.getEntity();

//get a return code
int resStatu = response.getStatusLine().getStatusCode();

//to determine whether a network connecion is good
if (resStatu == HttpStatus.SC_OK){ //if resStatu equal to 200,it means connection is good
//get hold of the response entity
HttpEntity entity = response.getEntity();
if ( null != entity ) {
//get html code
html = EntityUtils.toString(entity);

BufferedReader reade = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));

  while((str = reade.readLine()) != null){ <<<在这个地方有错,就会跳到catch{}中了 ....
System.out .println(str);
}

reade.close();
}else {
System.out.println("entity is empty!");
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
System.out .println("visiting " +url+" error!");
e.printStackTrace();
throw e;
}finally{
httpclient.getConnectionManager().shutdown();
}
下面显示的错误:
java.io.IOException: Attempted read from closed stream.
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:172)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at JustTest.getHtmlByUrl(JustTest.java:66)
at JustTest.main(JustTest.java:109)
Exception in thread "main" java.io.IOException: Attempted read from closed stream.
at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:172)
at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:138)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at JustTest.getHtmlByUrl(Just)

             好吧!我终于发现问题了,原来是html = EntityUtils.toString(entity);这句导致了后面的写入文件错误.entity所得到的流是不可重复读取的也就是说所得的到实体只能一次消耗完,不能多次读取,所以在执行html = EntityUtils.toString(entity)后,流就关闭了,就导致后面的读和写显示错误.