【问题标题】:java Stream closed exception occurs during File Writer write methodFile Writer写入方法期间发生java Stream closed异常
【发布时间】:2019-02-18 17:45:58
【问题描述】:

我目前拥有的代码如下用于编写响应,最近我经常收到 java.io.IOException: Stream closed 错误,即使我正确关闭了文件编写器也不知道为什么有人请帮我解决这个问题。

Exception:
Caused by: java.io.IOException: Stream closed
    at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:26)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:99)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190)
    at com.test.resp.RespWriter.write(RespWriter.java:150)
    at com.ctc.wstx.sw.BufferingXmlWriter.flushBuffer(BufferingXmlWriter.java:1103)
    at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:213)
    at com.ctc.wstx.sw.BufferingXmlWriter.close(BufferingXmlWriter.java:194)
    at com.ctc.wstx.sw.BaseStreamWriter.finishDocument(BaseStreamWriter.java:1690)

我在下面的地方得到异常的地方

fileWriter.write(buff, off, len);这是我得到异常的地方

public void write(char[] buff, int off, int len) throws IOException {
            printWriter.write(buff, off, len);
            if(count < FILE_SIZE) {                
                fileWriter.write(buff, off, len); Here is the place I am getting Exception 
                count+=len;
            }
}

代码:

public RespWriter(RequestHeader header, PrintWriter printWriter)
 throws InitializationException {
  isClosed = false;
    if(StringUtil.isEmpty(FILE_PATH) || printWriter == null) {
        throw new InitializationException(
            InitializationException.ERR_CODE);
    } else {
        this.header = header;


        File responseFolder = new File(FILE_PATH.concat(
            "/".concat(header.getUserId())));

        boolean dirCreated = responseFolder.mkdir();            

        if(responseFolder.exists() && responseFolder.isDirectory()) {
            responseFile = new File(responseFolder,
                "R"+header.getId()+FILE_EXTENSION);
        } else {
            throw new InitializationException(
                InitializationException.ERR_CODE,
                "response folder does not exist");
        }
    this.printWriter = printWriter;
        try {
            fileWriter = new FileWriter(responseFile);
        } catch (IOException e) {
            log.error("FileWriter could not be created", e);
        }

        writeHeaderToFile();
    }
}

private void writeHeaderToFile() {
        String headerStr = "\nRequest Header:\nnull\n";
        try {
            if(header!=null) {
                headerStr="\n"+Thread.currentThread().getName()
                    +" Request Header:\n" + header.toString() + "\n";
            }
            fileWriter.write(headerStr, 0, headerStr.length());
            fileWriter.write("Date:");
            fileWriter.write(new Date().toString()+"\n");
            fileWriter.write("Response:\n"+Thread.currentThread().getName()+": ");
            fileWriter.flush();

        } catch (IOException e) {
            log.error("IOException occurred writing header to file", e);
        }
}

      @Override
    public void close() throws IOException {

        if(!isClosed) {
            try {
                if(fileWriter!=null) {
                    try {
                        fileWriter.close();
                    } catch(IOException e) {
                        log.error("IOException", e);
                    }
                }
                if(printWriter!=null) {
                    try {
                        printWriter.close();
                    } catch(IOException e) {
                        log.error("IOException", e);
                    }
                }
            } finally {
                isClosed = true;
            }
        }
}
public void flush() throws IOException {
            if(printWriter!=null) {
                try {
                    printWriter.flush();
                } catch(IOException e) {
                    log.error("IOException", e);
                }
            }
            if(fileWriter!=null) {
                try {
                    fileWriter.flush();
                } catch(IOException e) {
                    log.error("IOException", e);
                }
            }
}

我在代码中遗漏的任何内容,或者我想在 Write 方法中创建新的 FileWriter 实例。请帮助解决这个问题。提前致谢

【问题讨论】:

  • FileWriter 已关闭。为什么在创建FileWriter 时忽略异常是一个谜。额外的PrintWriter 的用途是另一个,为什么在包裹它的PrintWriter 之前关闭FileWriter 是另一个。
  • 嗨,我抛出异常,我没有粘贴代码,请在下面找到 if(StringUtil.isEmpty(FILE_PATH) || printWriter == null) { throw new InitializationException( InitializationException.ERR_CODE);上面的代码是关闭 PrintWriter 的原因
  • 我要先关闭FileWriter再关闭PrintWriter。或者我可以在 Write 方法中创建一个新的 FileWriter 实例请建议
  • 所以这不是真正的代码。那么到底有什么意义呢?
  • 这只是真正的代码,但我经常在这个地方出错。

标签: java exception stream


【解决方案1】:

进入 write() 方法时,流已经关闭。我建议您 println 3 个不同的调试语句来发现问题。 1 打开/创建流媒体,2 关闭它,3 尝试写入它,因此您可以看到操作顺序。另外,请看这里:java IO Exception: Stream Closed

【讨论】:

  • 你提供的链接很清楚,但仍然不确定我需要做什么改变
  • 所需的更改是修复错误:)。抱歉,我无法调试您的代码。同样在堆栈跟踪中,它提到了我在发布的代码中看不到的第 150 行。 com.test.resp.RespWriter.write(RespWriter.java:150)
  • Respwriter是附上的代码,写的方法也附上
猜你喜欢
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2014-05-18
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多