如果文件不存在则创建一个文本文件,并在其后追加内容,使用Java中的BufferedWriter。

16

对于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方法应该足以表明我想要追加内容,对吗?

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

2个回答

29
答案是在调用newBufferedWriter方法时,您还需要指定打开选项。文档中指定了默认参数,这可能会让您感到困惑:

如果没有提供选项,则此方法的行为就好像存在CREATE、TRUNCATE_EXISTING和WRITE选项。

具体来说,是TRUNCATE_EXISTING选项导致了问题:

如果该文件已经存在且以写入方式打开,则其长度将被截断为0。

因此,解决方法是更改:

bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog);

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

对于长期编写Java代码的开发人员来说,这可能很明显,但对于新手来说则不是那么明显。希望这篇文章能够帮助某些人避免一些头疼的问题。


4
有用的文章。像您所做的那样,使用CREATE和APPEND选项很重要。仅使用APPEND选项,如果文件不存在,则会引发异常,但API文档中没有明确说明。顺便说一句,您会发现使用PrintWriter比使用BufferedWriter更容易。甚至可以直接使用Files.write()。 - Klitos Kyriacou

5

您也可以尝试以下方法:

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

不再有效2023年 - undefined
@user1034912 你使用的是哪个版本的Java? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接