当前位置: 代码迷 >> J2SE >> java将一个文件夹下所有文件(递归)的后缀名写入到一个txt中,如何就是去不了重,还请大神给看看
  详细解决方案

java将一个文件夹下所有文件(递归)的后缀名写入到一个txt中,如何就是去不了重,还请大神给看看

热度:17   发布时间:2016-04-23 20:38:30.0
java将一个文件夹下所有文件(递归)的后缀名写入到一个txt中,怎么就是去不了重,还请大神给看看
本帖最后由 u012526168 于 2014-06-15 03:57:59 编辑
package lcj;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Houzhui {
public static int k = 0;
public static String a[] = new String[100];  
public static void main(String args[]) throws IOException{
FindFile("d:/test");
}
public static void FindFile(String path) throws IOException{  
int j;
File file = new File(path); 
File[] list = file.listFiles(); 
String tmp;
FileWriter out = new FileWriter("d:/out.txt");
try{     
for (int i = 0;i < list.length;i++){        
if(list[i].isFile()){    
tmp=list[i].getPath();
a[k] = tmp.substring(tmp.lastIndexOf(".") + 1);
for( j = 0; j < k; j++){
if(a[j].equals(a[k])){  //这有问题啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
k--;
break;
}
}
if(k == j){
System.out.println(a[k]);
out.write(a[k]);
out.flush();
}
k++;
}       
else{       
FindFile(list[i].getPath());       
}    
}
}catch(NullPointerException ne){   
System.out.println("找不到指定路径!");
}
out.close();
}
}
问题之处如何更改啊?

------解决方案--------------------
去重用TreeSet,HashSet之类的,尽量不要用List自己判断
------解决方案--------------------
引用:
在你写有问题的那一行的下一行:
k--;

的下面再加一行:
j--;

或者把上面说的:
k--;

这一行去掉,然后将下面:

if (k == j) {
    System.out.println(a[k]);
    out.write(a[k]);
    out.flush();
}
k++;

改成

if (k == j) {
    System.out.println(a[k]);
    out.write(a[k]);
    out.flush();
    k++;
}

最后再提个建议,你这个面对两个后缀名字母一样但大小写不一样的时候会判断成不同的后缀名,按理说应该是相同的。以上。

另外,当文件没有后缀名的时候,你的程序会直接把绝对路径输出,这也是不合适的;
还有,FileWriter对象应该这样创建:
FileWriter out = new FileWriter("d:/out.txt", true);
第二个参数表示再次打开文件写入时是在文件后添加。否则在递归过程中文件被重复打开,照你的写法out.txt将只会保留最后的一次输入。建议把FileWriter对象创建放到main方法里面去,然后作为参数传给FindFile()方法,一来避免重复创建流,二来可以解决上述问题,因为文件只打开一次,所以FileWriter对象就可以像你写的那样创建FileWriter out = new FileWriter("d:/out.txt");
最后就是建议用PrintWriter替代FileWriter,这样可以用PrintWriter的println()方法轻松做到文件中的换行。以上。
  相关解决方案