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



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

我正在调用返回流的 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();的情况下避免出现此异常

堆栈跟踪:

    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

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

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

BufferedReader br = new BufferedReader(new     
InputStreamReader((response.getEntity().getContent())));
String response = br.readLine();
System.out.println("response" + response );

这段代码对我有用。

相关内容

  • 没有找到相关文章

最新更新