Закрытое исключение потока java происходит во время метода записи File Writer - PullRequest
0 голосов
/ 18 февраля 2019

Код, который я сейчас использую, как показано ниже, используется для написания ответа, и недавно я получаю java.io.IOException: поток часто закрывается из-за ошибки, даже несмотря на то, что я правильно закрыл File Writer, не зная, почему какое-либо тело, пожалуйста, помогите мне в этом.

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);
                }
            }
}

Любая вещь, которую я пропустил в коде или я хочу создать новый экземпляр FileWriter в методе Write.Пожалуйста, помогите в этом.Заранее спасибо

1 Ответ

0 голосов
/ 18 февраля 2019

Поток уже закрыт, когда входит в метод write ().Я бы посоветовал вам напечатать 3 разных отладочных оператора, чтобы определить проблему.1 при открытии / создании стримера, 2 при его закрытии и 3 при попытке записи в него, чтобы вы могли видеть порядок операций.Кроме того, посмотрите здесь: исключение Java IO: поток закрыт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...