Java太多打开文件异常

时间:2018-05-24 11:23:54

标签: java

我的代码有问题;基本上我有一个包含一些键的数组:

String[] ComputerScience = { "A", "B", "C", "D" };

等等,包含40个条目。

我的代码从与ComputerScience的每个元素对应的40个文件夹中读取900 pdf,操作提取的文本并将输出存储在名为A.txt,B.txt,ecc ...的文件中

每个文件夹" A"," B",ecc包含900 pdf。

经过大量文档,异常"太多打开的文件"被扔了。 我假设我正在关闭文件处理程序。

 static boolean writeOccurencesFile(String WORDLIST,String categoria, TreeMap<String,Integer> map) {
    File dizionario = new File(WORDLIST);
    FileReader fileReader = null;
    FileWriter fileWriter = null;

    try {

        File cat_out = new File("files/" + categoria + ".txt");
        fileWriter = new FileWriter(cat_out, true);
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        fileReader = new FileReader(dizionario);
    } catch (FileNotFoundException e) { }

    try {
        BufferedReader bufferedReader = new BufferedReader(fileReader);

        if (dizionario.exists()) {

            StringBuffer stringBuffer = new StringBuffer();
            String parola;
            StringBuffer line = new StringBuffer();
            int contatore_index_parola = 1;

            while ((parola = bufferedReader.readLine()) != null) {

                if (map.containsKey(parola) && !parola.isEmpty()) {
                    line.append(contatore_index_parola + ":" + map.get(parola).intValue() + " ");
                    map.remove(parola);
                }
                contatore_index_parola++;
            }

            if (! line.toString().isEmpty()) {
                fileWriter.append(getCategoryID(categoria) + " " + line + "\n"); // print riga completa documento N x1:y x2:a ...
            }



        } else { System.err.println("Dictionary file not found."); }

        bufferedReader.close();
        fileReader.close();
        fileWriter.close();


    } catch (IOException e) { return false;}
    catch (NullPointerException ex ) { return false;}
    finally {
        try {
            fileReader.close();
            fileWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    return true;
}

但错误仍然存​​在。 (它被抛出:)

 try {
    File cat_out = new File("files/" + categoria + ".txt");
    fileWriter = new FileWriter(cat_out, true);
} catch (IOException e) {
    e.printStackTrace();
}

谢谢。

编辑:已解决 我找到了解决方案,在调用writeOccurencesFile的main函数中,创建了RandomAccessFile并且没有关闭它的另一个函数。 调试器是Exception在writeOccurencesFile中抛出的,但是使用Java Leak Detector我发现pdf已经打开,在解析为纯文本后没有关闭。

谢谢!

3 个答案:

答案 0 :(得分:0)

尝试使用专门为此目的设计的this实用程序。

此Java代理是一个实用程序,用于跟踪JVM中打开文件的位置/时间/人员。您可以让代理跟踪这些操作以了解访问模式或处理泄漏,并转储当前打开的文件列表以及打开它们的位置/时间/人员。

发生异常时,此代理将转储列表,以便您查找正在使用大量文件描述符的位置。

答案 1 :(得分:0)

我尝试过使用try-with资源;但问题仍然存在。 在系统macos内置控制台中运行也会在FileWriter文件行中打印出FileNotFound异常fileWriter = ...

 static boolean writeOccurencesFile(String WORDLIST,String categoria, TreeMap<String,Integer> map) {
    File dizionario = new File(WORDLIST);


    try (FileWriter fileWriter = new FileWriter( "files/" + categoria + ".txt" , true)) {

        try (FileReader fileReader = new FileReader(dizionario)) {

            try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {

                if (dizionario.exists()) {

                    StringBuffer stringBuffer = new StringBuffer();
                    String parola;
                    StringBuffer line = new StringBuffer();
                    int contatore_index_parola = 1;

                    while ((parola = bufferedReader.readLine()) != null) {

                        if (map.containsKey(parola) && !parola.isEmpty()) {
                            line.append(contatore_index_parola + ":" + map.get(parola).intValue() + " ");
                            map.remove(parola);
                        }
                        contatore_index_parola++;
                    }

                    if (!line.toString().isEmpty()) {
                        fileWriter.append(getCategoryID(categoria) + " " + line + "\n"); // print riga completa documento N x1:y x2:a ...
                    }


                } else {
                    System.err.println("Dictionary file not found.");
                }

            }

        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return true;
}

这是我现在使用的代码,虽然Exception的管理不好,为什么文件似乎没有关闭?

现在我正在使用文件检漏仪进行测试

答案 2 :(得分:-2)

也许您的代码会引发另一个您未处理的异常。在finally块

之前尝试添加catch(异常e)

你也可以将BufferedReader声明移出try并在finally

中关闭它