如果文本文件不存在,则创建一个文本文件,如果使用 Java BufferedWriter,则将其追加到该文件

2022-09-03 12:15:55

对于枪手Java程序员来说,这可能非常简单,但是我(Java的相对新手)找不到一个简单,直接的例子来说明如何做到这一点,这意味着我将使用自我回答选项来希望防止其他人经历类似的挫折。

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

与我遇到的其他“追加”问题不同,这个问题要求在 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方法应该足以表明我想追加内容,对吧?

但事实并非如此。每次调用该过程时,文件都只包含最近调用的字符串。


答案 1

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

如果不存在任何选项,则此方法的工作方式就像存在 CREATE、TRUNCATE_EXISTING 和 WRITE 选项一样。

具体来说,是TRUNCATE_EXISTING导致了这个问题:

如果该文件已存在,并且已打开以进行 WRITE 访问,则其长度将截断为 0。

因此,解决方案是改变

bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog);

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

对于长期的Java程序员来说可能很明显,而对于新程序员来说则不那么明显。希望这将有助于某人避免一些头部撞击。


答案 2

你也可以试试这个:

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