【问题标题】:BufferedReader java.io.IOException: stream is closedBufferedReader java.io.IOException:流已关闭
【发布时间】:2018-03-09 19:08:08
【问题描述】:

我正在调用 BufferedReader 来获取 HTTP 响应正文(如果存在)并将其粘贴到一个长字符串变量中。有时当我尝试这样做时,有时会在下面的while 循环开始执行时收到错误java.io.IOException: stream is closed。我不明白为什么。我想确保对象不为空,并且在读入对象之前有一个响应体。

        BufferedReader readBuffer = null;
        if (connection.getResponseCode() >= 200 && connection.getResponseCode() <= 299) {
            readBuffer = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        } else {
            readBuffer = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
        }

        if(readBuffer != null) {
          // Get the response body output from the server
          StringBuilder calculatedOutput = new StringBuilder();
          String rawOutputLine;
          while ((rawOutputLine = readBuffer.readLine()) != null) {
              calculatedOutput.append(rawOutputLine);
          }

          Logger.debug(String.format("BODY: %s", calculatedOutput.toString()));
          readBuffer.close();

【问题讨论】:

  • 可能连接的另一端已经关闭了 Stream。
  • 如果我们能看到更多代码可能会有所帮助

标签: java stream bufferedreader


【解决方案1】:

试试这个来阅读响应:

    BufferedReader readBuffer = null;

    try {
        if (connection.getResponseCode() >= 200 && connection.getResponseCode() <= 299) {
            readBuffer = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        } else {
            readBuffer = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
        }
        // Get the response body output from the server
        StringBuilder calculatedOutput = new StringBuilder();
        String rawOutputLine;
        while ((rawOutputLine = readBuffer.readLine()) != null) {
            calculatedOutput.append(rawOutputLine);
        }
        Logger.debug(String.format("BODY: %s", calculatedOutput.toString()));
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            readBuffer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

【讨论】:

  • 另外,我认为您可以检查 BufferedReader 的 ready() 功能,这对您的情况会有所帮助。
  • @dan 这个问题解决了你的问题还是给解决方案添加了提示?
【解决方案2】:

试试这个代码:

   BufferedReader readBuffer = null;
    if (connection.getResponseCode() >= 200 && connection.getResponseCode() <= 299) {
        readBuffer = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    } else {
        readBuffer = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
    }

    if(readBuffer != null) {
      // Get the response body output from the server
      StringBuilder calculatedOutput = new StringBuilder();
      String rawOutputLine;
      if(readBuffer.ready()) {
          while ((rawOutputLine = readBuffer.readLine()) != null) {
              calculatedOutput.append(rawOutputLine);
          }
      }
      Logger.debug(String.format("BODY: %s", calculatedOutput.toString()));
      readBuffer.close();

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 2023-03-11
    • 2019-06-09
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多