初学java,利用下递归找到文件夹下的想同类型的文件。代码如下:
import java.io.*;
import java.util.ArrayList;
public class changeFile {
public static void main(String[] args) {
File file = new File("D://git_Tcode//node");
File[] filess = file.listFiles();
try {
ArrayList<File> arrayList = new ArrayList<File>();
if (filess != null) {
ArrayList<File> files = files(filess, arrayList);
//复制操作
for (File f : files) {
if (!f.getPath().contains("sson")) {
copyfile(f, f);
} else {
if (new File(f.getParent() + ".md").exists()) {
System.out.println("文件已存在");
} else {
File F1 = new File(f.getParent() + ".md");
copyfile(f, F1);
}
}
}
}
} catch (Exception e) {
System.out.println(e);
}
}
/**
* @param files 寻找.md类型文件
*/
public static ArrayList files(File[] files, ArrayList<File> arrayList) {
for (int i = 0; i < files.length; i++) {
if (files[i].listFiles() != null) {
files(files[i].listFiles(), arrayList);
} else {
if (files[i].getName().contains(".md")) {
arrayList.add(files[i]);
}
}
}
return arrayList;
}
/**
* 复制文件
*/
public static void copyfile(File inA, File outB) {
try {
FileInputStream inS = new FileInputStream(inA);
FileOutputStream outP = new FileOutputStream(outB);
byte[] a = new byte[8];
int c;
while ((c = inS.read(a)) > 0) {
outP.write(a, 0, c);
}
System.out.println("复制完成");
outP.flush();
inS.close();
outP.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
总结:在
for (File f : files)
这里不能用iterator遍历器,iterator线程不安全,调试中如果需要运用iterator.next元素属性,则会发生指针异常的不同步的问题。
总结:递归本质就是自调用,需要循环跳出条件,否则容易死循环