在File Writer写入方法期间发生java Stream关闭异常

问题描述 投票:-1回答:1

我目前拥有的代码用于编写响应,最近我得到java.io.IOException:流经常关闭错误,即使我正确地关闭了文件编写器,不知道为什么有任何正文请帮助我。

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);这是我得到Exception的地方

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实例。请帮忙。提前致谢

java exception stream
1个回答
2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.