我之前在这里问过这个问题,但我的代码中根本没有看到问题:
public static void append(String text) {
try (FileWriter fileWriter = new FileWriter("Output.txt", true);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
PrintWriter out = new PrintWriter(bufferedWriter);) {
out.println(text);
} catch (IOException e) {
e.printStackTrace();
}
}
由于我使用的是try-with-resources语句,因此应自动关闭打开的文件。
我也用老式的方式尝试过,但仍然犯了同样的错误:
public static void append(String text) {
try {
FileWriter fileWriter = new FileWriter("Output.txt", true);
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
PrintWriter out = new PrintWriter(bufferedWriter);
out.println(text);
out.close();
bufferedWriter.close();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我不想增加打开的文件限制,因为此代码无论如何都不应该打开多个文件。我的程序中没有多线程顺便说一句。
答案 0 :(得分:0)
“打开的文件太多”,所以在Unix用语中基本上都是-EMFILE
。
我们将在这里假设Java 7+。而你的第一个问题是你没有正确处理你的资源关闭,所以我们将转换你的代码,以便它使用java.nio.file,再加上try-with-resources:
public static void append(final String text)
{
final Path path = Paths.get("Output.txt");
try (
final BufferedWriter writer = Files.newBufferedWriter(path,
StandardCharsets.UTF_8, StandardOpenOption.APPEND);
) {
writer.write(text);
writer.newLine();
}
}
另外,为什么每次附加一行都会打开一个新的文件描述符?也就是说,我认为是主要问题。
答案 1 :(得分:0)
您的第一个代码段没有任何内容,它应该有效。 我最好的猜测是您的JVM没有足够的权限来访问相关文件。如果您通过shell脚本启动程序,请检查启动位置,也许您对该目录没有rw权限只执行权限。通常答案也就是它所说的,也许在这台代码运行的机器上还有其他密集的进程,所以也许尝试在其他地方运行它并检查。