第一次用java遍历一大堆xml文件并检索需要的标签,有点小激动啊,记录一下:
package com.wjl.arrangeDoc;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class ArrangeDoc {
/**
* 主方法
*/
public static void main(String[] args) {
Long startTime = System.currentTimeMillis();
String dicPath = "D:\\saveDir\\2015";//告知从哪个文件夹下取文件
String copyPath = "D:\\temp\\2015";
arrangeDoc(dicPath,copyPath,"TONGZHISMC","错误文件");
Long endTime = System.currentTimeMillis();
Long time = (endTime-startTime)/1000;
System.out.println("用时:"+time+"秒");
}
/**
* 该方法用来遍历指定目录下的文件夹并将符合条件的文件复制到指定目录
* @param dicPath:遍历该目录下的文件进行查询
* @param copyPath:将符合条件的文件夹复制到该文件夹下
* @param sign:要查找的标签
* @param mistakeName:错误文件文件夹集合
* */
public static void arrangeDoc(String dicPath,String copyPath,String sign,String mistakeName){
try{
File root = new File(dicPath);
File[] files = root.listFiles();//获取当前目录下的所有文件(包括文件夹)
String fPath = null,dicName="",copyDicPath="";
File cFile = null;
File[] childFile=null;
int flag=0;//0-表示错误文件 1-正常文件
String[] name=null;
for(File f:files){
if(f.isDirectory()){//说明是个文件夹,那么再次遍历下面的文件
fPath = f.getAbsolutePath();
// System.out.println(f.getName()+"\n"+fPath);
cFile = new File(fPath);
dicName="";
copyDicPath="";
childFile = cFile.listFiles();
if(childFile!=null && childFile.length>0){//说明有文件信息
for(File cf:childFile){//获取二级目录下的文件
if(!cf.isDirectory() && cf.getName().trim().equalsIgnoreCase("list.xml")){//非文件夹且是list.xml文件
name=getSignText(cf,sign);
if(name!=null && name.length>1){//说明至少有2个数据
dicName = name[1];
flag = new Integer(name[0]);
break;
}
}else{
dicName="list.xml文件不存在";
flag=0;
}
}
}else{
dicName="空文件夹";
}
//根据文件名称新建文件夹
if(flag==1){copyDicPath = copyPath+java.io.File.separator+dicName;
}else{copyDicPath = copyPath+java.io.File.separator+mistakeName+java.io.File.separator+dicName;}
// System.out.println("********************\n"+copyDicPath+"\n********************************");
//将当前文件夹拷贝到指定目录
org.apache.commons.io.FileUtils.copyDirectoryToDirectory(f,mkdirDic(copyDicPath));
}
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 该方法用来遍历指定的xml文件中的标签
* @param xmlFile:要遍历的文件
* @param sign:要查找的标签
* @return 标签内容
* */
public static String[] getSignText(File xmlFile,String sign){
String result[] = new String[2];
result[0]="0";//1-正常文件 0-错误文件
//1、判断给定的文件是否存在
if(!xmlFile.exists()){
result[1]="list.xml文件不存在";
return result;//直接返回空
}
//2、遍历指定的xml文件
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(xmlFile);//读取文件
Element root = document.getRootElement();//获取根目录
List nodeList = root.selectNodes("//"+sign);
if(nodeList!=null && nodeList.size()>0){
if(nodeList.size()>1){//说明有多个标签
result[1]="list.xml中有多个"+sign+"标签";
return result;//直接返回空
}
Node node = ((Node)nodeList.get(0));
String nodeText = node.getText();
if(nodeText!=null && nodeText.trim().length()>0){
result[0]="1";
result[1]=nodeText;
return result;
}else{
result[1]="list.xml的"+sign+"标签中的值为空";
return result;
}
}else{
result[1]="list.xml中没有"+sign+"标签";
return result;
}
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
/**
* 该方法用来创建文件夹
* @param copyPath:需要创建的目录(该目录用来保存拷贝的文件)
* */
public static File mkdirDic(String copyPath){
//判断指定目录是否存在
// System.out.println(copyPath);
File copyDic = new File(copyPath);
if(copyDic.isDirectory()){//说明是目录且存在
}else{//不是目录或不存在
copyDic.mkdirs();//新建
}
return copyDic;
}
}
测试了下,400个文件夹(差不多4000个文件)差不多3秒, 三倍之后不知道为什么陡增到19秒了,得考虑考虑优化问题。