-3

我想让你思考一个使用 printStackTrace(PrintWriter s) 方法的小问题。我需要在附加模式下使用它。

以下示例解释了我的意思:

try {

    } catch (Exception e) {
        try {
            e.printStackTrace(new PrintWriter(new FileWriter("mylog.txt", true)));        
        } catch (IOException ioe) {
            System.out.println("I can't open the file mylog.txt");
        }
    }

注意

new FileWriter("mylog.txt", true);

是我以附加模式打开文件(并第一次创建它,因为它不存在)的方式。

结果是文件中只有最后一个异常,而不是一系列异常。有一次,该方法打开了一个没有写入任何内容的文件。我怎么解决这个问题?

谢谢你。

4

2 回答 2

1

添加到krzyk提到的内容

每个OutputStreamWriter.close():关闭流,首先刷新它。一旦流被关闭,进一步的 write() 或 flush() 调用将导致抛出 IOException。关闭以前关闭的流没有效果。

如前所述,如果您不调用 close 并且此 try{}catch 被频繁触发,则您不会将内容刷新到文件中。{}

它应该写成

try {

} catch (Exception e) {
    try {
        FileWriter fw = new FileWriter("mylog.txt", true)
        e.printStackTrace(new PrintWriter(fw));
        fw.close();
    } catch (IOException ioe) {
        System.out.println("I can't open the file mylog.txt");
    }
}

更好的方法是

FileWriter fw = new FileWriter("mylog.txt", true);
PrintWriter pw = new PrintWriter(fw);
try {

} catch (Exception e) {
    try {
        e.printStackTrace(pw);
    } catch (IOException ioe) {
        System.out.println("I can't open the file mylog.txt");
    }
}finally {
     pw.close();
     fw.close();
}
于 2016-06-14T17:18:02.263 回答
0

您应该关闭 created Writers,不关闭它可能会导致您描述的问题。

try (PrintWriter writer = new PrintWriter(new FileWriter("mylog.txt", true))) {
    e.printStackTrace(writer);
}
于 2016-06-14T17:04:03.220 回答