我有一个应用程序需要只读取文本文件中的特定内容。我必须从文件夹中排列的10,000个不同文本文件中读取文本,并且必须将所有这些文本文件中的内容填充到单个CSV文件中。
我的应用程序运行正常,但它只读取文件号999。没有错误,但是在999之后没有读取文件。
有什么想法吗?
public void calculate(String location) throws IOException{
String mylocation = location;
File rep = new File(mylocation);
File f2 = new File (mylocation + "\\" + "metricvalue.csv");
FileWriter fw = new FileWriter(f2);
BufferedWriter bw = new BufferedWriter (fw);
if(rep.exists() && rep.isDirectory()){
File name[] = rep.listFiles();
for(int j = 0; j < name.length; j++){
if(name[j].isFile()){
String filename = name[j].getPath();
String nameinfo = name[j].getName();
File f1= new File (filename);
FileReader fr = new FileReader(f1);
BufferedReader br = new BufferedReader (fr);
String line = null;
while((line = br.readLine()) != null){
if(line.contains(" | @1 @2 % Correct")){
bw.write(nameinfo + ",");
while((line=br.readLine()) != null) {
if((line.indexOf("#" ) != -1)){
String info[] = line.split("\\s+");
String str = info[2] + "," + info[3] + ",";
bw.write(str);
}
}
}
}
bw.newLine();
br.close();
}
}
}
bw.close();
}
答案 0 :(得分:1)
您平台的文件系统仅限于999个打开的文件。您可能需要明确地增加限制或close()
FileReader
:
fr.close();
答案 1 :(得分:0)
如何调试:
在File name[] = rep.listFiles();
当Eclipse暂停时打开变量并检查您的数组是否包含所需的所有文件名。这将告诉您问题是否存在或解析中。
答案 2 :(得分:0)
您需要调试代码。以下是一些可以帮助您入门的指示:
File name[] = rep.listFiles();
for(int j =0;j<name.length; j++) {
if(name[j].isFile()) {
阵列的大小是多少?想办法。如果数组中有10000个元素,那么循环将执行多少次迭代,没有其他方法。只是添加
System.out.println(name.length)
会为您回答这个问题
如果数组小于10000,这就是你的答案,你只是错误地计算了你的文件。如果不是,那么你的问题必须是其中一个“文件”实际上不是一个文件(并且if
语句的测试失败)。向其中添加else
语句,并打印出名称......或者更好的是,删除此if
(通常,避免嵌套条件包含外部结构的整个主体,尤其是像这样的巨大的,它使你的代码脆弱,逻辑很难遵循),并用
if(!name[j].isFile()) {
System.out.println("Skipping " + name[j] + " because it is not a plain file.");
continue;
}
这将告诉您正在跳过的10000个文件中的哪一个。如果它没有打印任何东西,那就意味着你确实读了所有10000个文件,正如你所期望的那样,导致你正在调查的症状的实际问题在其他地方。