如果文本文件不存在则创建一个文本文件,如果存在则使用 Java BufferedWriter 附加到它
Create a text file if it doesn't exist and append to it if it does using Java BufferedWriter
这对于 gun Java 程序员来说可能简单得可笑,但事实上我(Java 的相对新手)找不到一个简单、直接的例子来说明如何做这意味着我将使用 self-answer 选项来希望防止其他人遇到类似的挫折。
我需要将错误信息输出到一个简单的文本文件中。这些操作很少见且很小(有时根本不需要),因此没有必要为文件保持打开的流;文件在一次操作中打开、写入和关闭。
与我遇到的其他 "append" 问题不同,这个问题要求在第一次调用 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 方法应该足以表明我想追加内容,对吧?
但事实并非如此;每次调用过程时,文件只包含最近一次调用的字符串。
答案是调用newBufferedWriter方法时也需要指定开启选项。得到的是文档中指定的默认参数:
If no options are present then this method works as if the CREATE,
TRUNCATE_EXISTING, and WRITE options are present.
具体来说,是 TRUNCATE_EXISTING 导致了问题:
If the file already exists and it is opened for WRITE access, then its
length is truncated to 0.
那么解决办法就是改变
bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog);
到
bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog,StandardOpenOption.CREATE, StandardOpenOption.APPEND);
对于长期 Java 的编码人员来说可能很明显,但对于新手来说就不太明显了。希望这能帮助人们避免撞头。
你也可以试试这个:
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();
}
这对于 gun Java 程序员来说可能简单得可笑,但事实上我(Java 的相对新手)找不到一个简单、直接的例子来说明如何做这意味着我将使用 self-answer 选项来希望防止其他人遇到类似的挫折。
我需要将错误信息输出到一个简单的文本文件中。这些操作很少见且很小(有时根本不需要),因此没有必要为文件保持打开的流;文件在一次操作中打开、写入和关闭。
与我遇到的其他 "append" 问题不同,这个问题要求在第一次调用 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 方法应该足以表明我想追加内容,对吧?
但事实并非如此;每次调用过程时,文件只包含最近一次调用的字符串。
答案是调用newBufferedWriter方法时也需要指定开启选项。得到的是文档中指定的默认参数:
If no options are present then this method works as if the CREATE, TRUNCATE_EXISTING, and WRITE options are present.
具体来说,是 TRUNCATE_EXISTING 导致了问题:
If the file already exists and it is opened for WRITE access, then its length is truncated to 0.
那么解决办法就是改变
bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog);
到
bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog,StandardOpenOption.CREATE, StandardOpenOption.APPEND);
对于长期 Java 的编码人员来说可能很明显,但对于新手来说就不太明显了。希望这能帮助人们避免撞头。
你也可以试试这个:
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();
}