【问题标题】:Create a text file if it doesn't exist and append to it if it does using Java BufferedWriter如果不存在则创建一个文本文件,如果存在则使用 Java BufferedWriter 附加到它
【发布时间】:2015-08-15 21:55:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java file bufferedwriter


    【解决方案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 的程序员来说可能很明显,对于新手来说则不太明显。希望这能帮助人们避免头疼。

    【讨论】:

    • 有用的帖子。正如您所做的那样,同时使用 CREATE 和 APPEND 选项很重要。仅使用 APPEND 时,如果文件不存在,则会出现异常,但这在 API 文档中没有明确提及。顺便说一句,您会发现使用 PrintWriter 比使用 BufferedWriter 容易得多。甚至只使用 Files.write()。
    【解决方案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();
        }
    

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 2020-07-12
      相关资源
      最近更新 更多