当前位置: 首页 > 面试题库 >

java.io.IOException:尝试从关闭的流读取

和丰羽
2023-03-14
问题内容

我使用Apache HTTP Client进行HTTPPost调用,然后尝试使用Jackson响应创建一个对象。这是我的代码:

private static final Logger log = Logger.getLogger(ReportingAPICall.class);
ObjectMapper mapper = new ObjectMapper();

public void makePublisherApiCall(String jsonRequest)
{
    String url = ReaderUtility.readPropertyFile().getProperty("hosturl");
    DefaultHttpClient client = new DefaultHttpClient();
    try {
        HttpPost postRequest = new HttpPost(url);
        StringEntity entity = new StringEntity(jsonRequest);
        postRequest.addHeader("content-type", "application/json");
        log.info("pub id :"+ExcelReader.publisherId);
        postRequest.addHeader("accountId", ExcelReader.publisherId);
        postRequest.setEntity(entity);
        HttpResponse postResponse = client.execute(postRequest);
        log.info(EntityUtils.toString(postResponse.getEntity()));

    //  Response<PublisherReportResponse> response = mapper.readValue(postResponse.getEntity().getContent(), Response.class);
    //  log.info("Reponse "+response.toString());
    } catch (UnsupportedEncodingException ex) {
        log.error(ex.getMessage());
        log.error(ex);
        Assert.assertTrue(false, "Exception : UnsupportedEncodingException");
    } catch (ClientProtocolException ex) {
        log.error(ex.getMessage());
        log.error(ex);
        Assert.assertTrue(false, "Exception : ClientProtocolException");
    } catch (IOException ex) {
        log.error(ex.getMessage());
        log.error(ex);
        Assert.assertTrue(false, "Exception : IOException");
    }

方法makePublisherApiCall()将在一个循环中被调用,该循环运行100次。当我取消注释该行时,基本上会出现问题:

//  Response<PublisherReportResponse> response = mapper.readValue(postResponse.getEntity().getContent(), Response.class);
//  log.info("Reponse "+response.toString());

取消注释后,我得到异常:

Attempted read from closed stream.
17:26:59,384 ERROR com.inmobi.reporting.automation.reportingmanager.ReportingAPICall - java.io.IOException: Attempted read from closed stream.

否则,它将正常工作。有人可以让我知道我在做什么错。


问题答案:

什么是EntityUtils.toString(postResponse.getEntity())与响应实体呢?我会怀疑它正在消耗实体的内容流。该HttpClient的javadoc的状态,只有实体,这是重复的,可以多次消费。因此,如果实体不可重复,则无法将内容流再次提供给映射器。为避免这种情况,您只应让映射器使用流-
如果需要记录内容,则记录已解析的Response对象。



 类似资料:
  • 问题内容: 很多人问这样的问题,但这个问题有些不同。这是代码: 程序运行时方法被多次调用。第二个呼叫原因。我不明白:为什么会这样呢?每次我们声明新的。所以必须也是新的。或不? 如果没有,我应该如何组织我的程序,以便在所有调用之后和程序结束后关闭读者? 问题答案: 因为是相同( 的两个方法类) 调用 使用,在一种方法闭会自动关闭用于其它方法。一旦调用完成,您应该从 外部 关闭该方法( 如我所见),这

  • 问题内容: 我正在尝试下载一个zip文件,但出现了 Stream Closed Exception 。当我使用Swing GUI时,会出现此错误,但是如果我使用控制台,则不会有问题。为什么会出现此异常?我该如何解决? 这是我的代码: 这是堆栈跟踪 问题答案: 此异常通常表示连接突然关闭。我将查看服务器上的日志,看看是否有错误。

  • 问题内容: 我想在finally块中关闭流,但是它抛出一个,因此看来我必须在块中嵌套另一个块才能关闭流。这是正确的方法吗?似乎有点笨拙。 这是代码: 问题答案: 似乎有点笨拙。 它是。至少java7尝试使用资源可以解决该问题。 在java7之前,您可以创建一个吞咽它的函数: 或将try …最终放入try catch中: 它比较冗长,并且finally中的异常会在try中隐藏一个,但从语义上讲它更接

  • 我有一个外部OPC UA服务器,我想从中读取数据。我使用用户名和密码身份验证,因此我的客户端初始化如下: 客户的要求如下: 初始化客户端并将其连接到服务器后,我从main方法调用此请求: 但是,此代码不起作用(尝试从服务器读取信息时会话关闭)。我得到以下输出: Bad_SessionClosed(CompletableFuture.java:1999) atcom.mycompany.opcua.

  • 我将OkHttp网络库用于我的Android项目。 它也给出了我应该如何做的例子(通过使用AutoCloseable接口和Try的语法): 还有: “这个类(ResponseBody)和Response都实现了Closeable。关闭一个Response只会关闭它的Response Body。” 然而: 如果我尝试运行这段代码,我得到: 不兼容的类型。 但第2部分: 如果我在OKHTTP的文档中查

  • 问题内容: 如何在Node.js中关闭可读流? 这会比以下更好: 但这不会停止阅读过程… 问题答案: 调用。它不在文档中,但是 https://github.com/joyent/node/blob/cfcb1de130867197cbc9c6012b7e84e08e53d032/lib/fs.js#L1597-L1620 显然可以完成这项工作:)它实际上所做的事情与您的相似。 EDIT 2015