我的代码有问题;基本上我有一个包含一些键的数组:
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已经打开,在解析为纯文本后没有关闭。
谢谢!
答案 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
中关闭它