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

Ala*_*n K 9 java file bufferedwriter

对于枪支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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ala*_*n K 14

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

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

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

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

那么,解决方案就是改变

bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog);
Run Code Online (Sandbox Code Playgroud)

bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog,StandardOpenOption.CREATE, StandardOpenOption.APPEND);
Run Code Online (Sandbox Code Playgroud)

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

  • 有用的帖子.正如您所做的那样,同时使用CREATE和APPEND选项非常重要.仅使用APPEND,如果文件不存在,则会出现异常,但API文档中未明确提及此情况.顺便说一句,你会发现使用PrintWriter比使用BufferedWriter要容易得多.甚至只需使用Files.write(). (3认同)

Abh*_*pta 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();
    }
Run Code Online (Sandbox Code Playgroud)