java的递归遍历
package com.ghl.demo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
/**
* 递归遍历目录下面的所有文件。并对文件进行操作
* 本代码实现的功能:遍历所有的xml文件(很多的文件夹下都有xml文件),
* 并根据自己的需要替换相应的值 例如:将xml中jueyuanzi_1 替换为 jueyuanzi
* 同时根据递归后的文件夹在生成相应的文件夹
* 1)首先我们要确定原始文件的路径和修改后文件的路径
* C:\\Users\\TZTX\\Desktop\\annotation\\110kV\7C2\000000\\000000_detection.xml :原始xml存放的路径
* C:\\Users\\TZTX\\Desktop\\annotation1\\ :修改后xml存放的路径 annotation1是我在桌面上新建的文件夹
* 2)大家可以看到这两个路径唯一不同的就是最顶层目录,一个是annotation一个是annotation1,都存放在桌面上,然后我想要110kV\7C2\000000\\000000_detection.xml,在我的annotation1中自动给我创建出来
* 3)按照自己的想法,截取字符串的路径
* if (file.isFile()) {//如果当前file是文件,
String absoluteFile = file.getAbsolutePath();拿到当前文件的绝对路径
String filename = file.getName();//获得当前文件的名字
int indexOf = absoluteFile.indexOf("annotation")+10; //indexOf方法是返回当前字符首次出现的位置,所以我加10就可以拿到annotation\\后面的字符,\\算一个字符
String sub = absoluteFile.substring(indexOf);//然后按照索引来截取 截取结果:\\110kV\7C2\000000\\000000_detection.xml
sub=sub.substring(0,sub.lastIndexOf(filename));//然后再按照文件名来截取:\\ 110kV\7C2\000000\\
System.out.println("截取后"+sub);
File fileDir = new File("D:\\annotation1"+sub); //然后拼接字符串成为一个完整的路径 ,如果该路径不存在就创建
if(!fileDir.exists()) {
boolean mkdirs = fileDir.mkdirs();
if(mkdirs) {
System.out.println("mkdirs"+mkdirs);
}
}
*
*解决办法:
*1、因为我们要改的是xml文件中某一个节点对应的值,只是把这个值替换成我们想要的值,所以我们完全可以把xml文件当成一个文本文件进行操作
*2、如何实现递归查询所有文件夹下的xml?
*
*/
public class FileDirectory {
public static void isDirectory(File file) throws Exception {
if (file.exists()) {//判断当前文件或目录是否存在
if (file.isFile()) {//如果当前file是文件,
String absoluteFile = file.getAbsolutePath();
String filename = file.getName();
System.out.println(filename);
int indexOf = absoluteFile.indexOf("annotation")+10;
String sub = absoluteFile.substring(indexOf);
sub=sub.substring(0,sub.lastIndexOf(filename));
System.out.println("截取后"+sub);
StringBuffer buffer=new StringBuffer();
buffer.append("C:\\Users\\TZTX\\Desktop\\annotation1").append(sub);
File fileDir = new File(buffer.toString());
if(!fileDir.exists()) {
boolean mkdirs = fileDir.mkdirs();
if(mkdirs) {
System.out.println("mkdirs"+mkdirs);
}
}
BufferedReader br=new BufferedReader(new FileReader(file));//缓冲字符输入流
BufferedWriter bw =new BufferedWriter(new FileWriter(fileDir+filename));
String line = "";
while ((line = br.readLine()) != null) {
if(line.contains("jueyuanzi_1")) {
line = line.replace("jueyuanzi_1", "jueyuanzi");
}
bw.write(line);
bw.newLine();
}
bw.close();
br.close();
} else {
File[] list = file.listFiles();//拿到当前文件夹下的所有文件和目录
if (list.length == 0) {
System.out.println(file.getAbsolutePath() + " 为空");
} else {
//遍历File数组 拿到每一个文件或目录
for (int i = 0; i < list.length; i++) {
isDirectory(list[i]);
}
}
}
} else {
System.out.println("目录不存在");
}
}
public static void main(String[] args) throws Exception {
isDirectory(new File("C:\\Users\\TZTX\\Desktop\\annotation\\"));//路径可根据自己的要求做修改
}
}