如何避免java.io.IOException:尝试读取封闭流

时间:2013-06-14 12:23:41

标签: http rest get stream

我试图找到一种方法来避免与我在封闭流上读取的事实相关的IOException。

我正在调用一个返回Stream的Web服务方法:

      InputStream stream = callRestWebService();
     try {
         parkingState = objectMapper.readValue(stream, ParkingState.class);
      }   catch (IOException e) {
        throw new ParkingMeasurementProviderException("Could not retrieve data.", e);
      } 

然后,我有我的Web服务方法,我关闭了get连接:

public InputStream callRestWebService() {
    int parkingId = 2803;
    String endpointURL = REST_ENDPOINT + URI_INFO_PATH + parkingId + "/parkingState";
    InputStream inputStream = null;

    // Create an instance of HttpClient.
    HttpClient httpclient = new HttpClient();

    // Create a method instance.
    GetMethod getMethod = new GetMethod(endpointURL);
    getMethod.addRequestHeader("accept", "application/json");

    try {
        // Execute the method.
        int statusCode = httpclient.executeMethod(getMethod);
        inputStream = getMethod.getResponseBodyAsStream();

     } catch (IOException e) {
       e.printStackTrace();
    } finally {
        // Release the connection.
        getMethod.releaseConnection();
    }
    return inputStream;
}

有没有办法避免在不删除:getMethod.releaseConnection();

的情况下出现此异常

stacktrace:

    Disconnected from the target VM, address: '127.0.0.1:62152', transport: 'socket'
    at be.ixor.itg.server.service.parking.hermesWS.HermesWSParkingControllerMeasurementProvider.getHermesMechelenData(HermesWSParkingControllerMeasurementProvider.java:126)
    at be.ixor.itg.server.service.parking.hermesWS.Main.main(Main.java:14)
Caused by: java.io.IOException: Attempted read on closed stream.
    at org.apache.commons.httpclient.AutoCloseInputStream.isReadAllowed(AutoCloseInputStream.java:183)
    at org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:86)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2977)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:702)
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:232)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
    at be.ixor.itg.server.service.parking.hermesWS.HermesWSParkingControllerMeasurementProvider.getHermesMechelenData(HermesWSParkingControllerMeasurementProvider.java:116)
    ... 1 more

由于

2 个答案:

答案 0 :(得分:4)

因为您在finally块中调用了releaseConnection(),所以输入流将不再可用。

如果您不希望内容很大,您可以将输入流中的数据读入缓冲区并返回缓冲区而不是输入流。否则,您需要更改代码以允许被调用者在释放连接之前处理输入流中的数据。

答案 1 :(得分:0)

BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity()。getContent()))); 字符串响应= br.readLine(); System.out.println(“ response” + response);

此代码对我有用。