java.io.FileNotFoundException:Output.txt(打开的文件太多)

时间:2015-11-08 13:43:02

标签: java

我之前在这里问过这个问题,但我的代码中根本没有看到问题:

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

我不想增加打开的文件限制,因为此代码无论如何都不应该打开多个文件。我的程序中没有多线程顺便说一句。

2 个答案:

答案 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权限只执行权限。通常答案也就是它所说的,也许在这台代码运行的机器上还有其他密集的进程,所以也许尝试在其他地方运行它并检查。