【问题标题】:BufferedWriter closed throws exceptionBufferedWriter 关闭抛出异常
【发布时间】:2015-06-12 23:15:37
【问题描述】:

我已经做了一个方法,可以在 Android 的外部存储中写入日志。

    public int writeLog(String clase, String metodo, Object object){
    try{
        File folder = new File(Environment.getExternalStorageDirectory(), Constants.ROUTE_FILES_TEXT);
        if (!folder.exists()) {
            folder.mkdir();
        }

        FileWriter fw = new FileWriter(folder.toString() + "/log.txt", true);

        BufferedWriter out = new BufferedWriter(fw);
        out.write("Hora: " + TimeService.getCurrentTimeStamp(Constants.TIMESTAMP_PATTERN) + "\n");
        out.write("Clase: " + clase + "\n");
        out.write("Método: " + metodo + "\n");
        out.write("Mensaje: " + object + "\n\n\n");
        out.flush();
        out.close();
        fw.flush();
        fw.close();
    }catch (Exception ex){
        Log.d(TAG, ex.toString());
        return 3;
    }
    return 0;
}

一切正常,但该方法总是抛出异常。例外是:

06-13 01:00:02.043: D/FileService(14439): java.io.IOException: OutputStreamWriter is closed

但是,如果我评论 BufferedWriter 的关闭,那么该方法可以正常工作,并且我的代码中没有任何异常。

    public int writeLog(String clase, String metodo, Object object){
    try{
        File folder = new File(Environment.getExternalStorageDirectory(), Constants.ROUTE_FILES_TEXT);
        if (!folder.exists()) {
            folder.mkdir();
        }

        FileWriter fw = new FileWriter(folder.toString() + "/log.txt", true);

        BufferedWriter out = new BufferedWriter(fw);
        out.write("Hora: " + TimeService.getCurrentTimeStamp(Constants.TIMESTAMP_PATTERN) + "\n");
        out.write("Clase: " + clase + "\n");
        out.write("Método: " + metodo + "\n");
        out.write("Mensaje: " + object + "\n\n\n");
        out.flush();
        //out.close();
        fw.flush();
        fw.close();
    }catch (Exception ex){
        Log.d(TAG, ex.toString());
        return 3;
    }
    return 0;
}

对吗?为什么?

【问题讨论】:

  • 抛出异常,不返回。评论关闭是修复它的原因,而不是同花顺。在关闭之前刷新是多余的。

标签: java android exception bufferedwriter


【解决方案1】:

关闭out 会导致所有底层流和写入器也关闭,因此调用:

fw.flush();
fw.close();

在调用out.close() 之后是多余的,因为此时fw 已经关闭。

这导致了第二个问题,即在 fw 已经关闭时调用 fw.flush()... 在已经关闭的流或写入器上调用“flush()”通常会导致像你这样的异常正在看。

我建议你不要手动关闭fw,而是使用out.close()关闭整个输出链。

【讨论】:

  • 我已经评论了 fw.flush() 和 fw.close() 并且一切正常!!!我的方法创建文件并在其中正确写入!!!谢谢@Mike Laren!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2014-01-17
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多