创建一个文本文件(如果它不存在),如果它使用Java BufferedWriter

时间:2015-08-15 21:55:44

标签: java file bufferedwriter

对于枪支Java程序员来说这可能是非常简单的,但是我(Java的相对新手)无法找到一个如何做到这一点的简单明了的例子,这意味着我要去使用self-answer选项可以防止其他人遇到类似的挫败感。

我需要将错误信息输出到简单的文本文件。这些操作不常见且很小(有时根本不需要),因此没有必要为文件打开流;文件在一个动作中打开,写入和关闭。

与其他"追加"不同。我遇到过的问题,这个问题要求在第一次调用Java应用程序运行时的方法时创建文件。该文件在此之前不存在。

原始代码是:

            Path pathOfLog = Paths.get(gsOutputPathUsed + gsOutputFileName);
            Charset charSetOfLog = Charset.forName("US-ASCII");
            bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog);
            bwOfLog.append(stringToWrite, 0, stringToWrite.length());
            iReturn = stringToWrite.length();
            bwOfLog.newLine();
            bwOfLog.close();

以gs开头的变量是显示输出位置的预先填充的字符串变量,stringToWrite是传入的参数。

所以.append方法应该足以表明我想要追加内容,对吧?

但它不是;每次调用该过程时,文件都只包含最近一次调用的字符串。

2 个答案:

答案 0 :(得分:10)

答案是您还需要在调用newBufferedWriter方法时指定打开选项。你得到的是文档中指定的默认参数:

  

如果没有选项,则此方法就像CREATE一样工作   存在TRUNCATE_EXISTING和WRITE选项。

具体来说,导致问题的是TRUNCATE_EXISTING:

  

如果文件已经存在并且打开了WRITE访问权限,那么它就是   长度被截断为0。

然后,解决方案是改变

bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog);

bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog,StandardOpenOption.CREATE, StandardOpenOption.APPEND);

长期以来Java编程人员可能很明显,对新编程人员来说则不那么明显。希望这可以帮助别人避免一些头撞。

答案 1 :(得分:0)

您也可以尝试以下方法:

    Path path = Paths.get("C:\\Users", "textfile.txt");
    String text = "\nHello how are you ?";


    try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.APPEND,StandardOpenOption.CREATE)) {
        writer.write(text);
    } catch (IOException e) {
        e.printStackTrace();
    }