您的位置:首页 > 编程语言 > Java开发

Java实现分类文件拷贝2

2008-10-31 19:13 411 查看
对于对老文件的修改,我们都可以在配置文件中得到目标路径.下面我们看看配置文件如何得到.在这各之前,我们提到几个工具方法:

1.取文件名的扩展名,传入文件名,返回扩展名.

/**

*

* @param fileName

* @return

*/

private String getExt(String fileName){

int pos=fileName.lastIndexOf(".");

if(pos>0){

return fileName.substring(pos+1,fileName.length());

}

return null;

}

2.判断一个目录是否有子目录,传入一个目录,判断有没有子目录,没则有返回true,有子目录返回false

/**

* 判断一个目录是否有子目录,没有返回true

* @param dir

* @return

*/

private boolean hasNoSub(String directory){

File dir=new File(directory);

if(!dir.isDirectory()){ //当前不是目录,肯定没有子目录

return true;

}

String[] subs=dir.list();

for(int i=0;i<subs.length;i++){ //对每个子元素进行判断,有目录就直接返回false

File tmp=new File(dir+File.separator+subs[i]);

if(tmp.isDirectory()){

return false;

}

}

return true;

}

那么我们的配置文件记录什么,什么样的格式?假设我们指定我们的目标路径,类变量objPath=d:\ProjectX\src

那么我们的配置生成象这样:

business_1:com.comX.foreg.a.a1

business_2:com.comX.foreg.a.a2

如果a组的另外一个用例a3在business_1文件夹下,则配置文件的第一条配置信息为:

business_1:com.comX.foreg.a.a1|com.comX.foreg.a.a3

依次类推,通过文件的包信息与每条配置信息进行匹配,得知它所在的文件夹,当然如果objPath设置为d:\projectX\的话,那么配置信息的:前面部分为src/business_1.就这样,我们得到了可以使用的配置文件.下面我们看看配置文件相关的模块.

1.给定配置文件,把配置信息读入到类变量lines,它的每一个元素就是一条配置信息(配置文件的一行),同时把配置信息中:号前面的部分,我们称之为配置信息头(如business_1或src/business_1),取到我们的类变量heads中,它的作用就是为了提高处理效率,使得我们不用每次都配置信息中取头信息.

/**

* 读取配置文件,到ArrayList和heads

* @return

*/

private boolean readCfg(File cfgFile){

try{

BufferedReader fr=new BufferedReader(new FileReader(cfgFile));

String line=fr.readLine();

while(line!=null){

//处理当前行

line.trim();

lines.add(line);

line=fr.readLine();

}

int size=lines.size();

heads=new String[size];

for(int i=0;i<size;i++){

line=(String)lines.get(i);

heads[i]=getHead(line);

}

fr.close();

} catch(IOException ie){

ie.printStackTrace();

return false;

}

return true;

}

2.把一条配置信息的头解析出来,就是上面方法出现的getHead

/**

* 取得一条配置文件的头 例如business_1:

* @param line 一条配置文件

* @return

*/

private String getHead(String line){

int pos=line.indexOf(":");

if(pos==-1){

ps.println("配置文件有错");

return "";

}

return line.substring(0,pos);

}

3.该方法的作用就是,把我们的类变量lines的信息写入到配置文件中,因为可能有新添加的文件,用户输入了新的配置信息,或者在交互时,某些配置信息发生了变化.

/**

* 写入配置文件

* @return

*/

private boolean saveCfg(File cfgFile){

if(lines==null||lines.size()==0){

return false;

}

try{

cfgFile.delete();

cfgFile.createNewFile();

BufferedWriter bw=new BufferedWriter(new FileWriter(cfgFile));

int size=lines.size();

for(int i=0;i<size;i++){

bw.write((String)lines.get(i));

bw.newLine();

}

bw.flush();

bw.close();

} catch(IOException ie){

ie.printStackTrace();

return false;

}

return true;

}

上面的方法都是我们和配置文件的交互的一个过程,我们下一个问题时,如何初始化生成这个配置文件,基本上有下面几个模块:

1.这就是我们生成配置文件的根本,实际上就是到目标路径中收集结构信息的过程,其中可能调用一些工具方法.

/**

* 生成配置文件

* @param pac 包路径

* @param path 文件路径

* @return 返回保存是否正确

*/

public boolean createCfg(){

File dir=new File(objPath); //到目标路径中去收集信息

String[] dirs=dir.list();

String curDir;

char sep=File.separatorChar;

String line;

for(int i=0;i<dirs.length;i++){ //到每一个子元素(文件或目录)下工作

if(!new File(objPath+sep+dirs[i]).isDirectory()){ //当前元素不是目录,做下一个

continue;

}

globalLine=null;

curDir=objPath+sep+dirs[i]+sep+"src";

getPath(curDir,null); //到当前目录下继续搜寻信息,getPath.

line=dirs[i]+":"+globalLine;

lines.add(line);

}

File cfgFile=new File(filePath+sep+configeFile);

saveCfg(cfgFile); //保存配置信息

return true;

}

其中curDir =...那一行是当前路径,其中的"src"因为我所在项目的子文件下还有一个src目录,但他不是包信息包含的,就像是我们的business_1下面为src/com/comX/...等等,所以就直接加上了.

明眼人一眼就能看出,关键方法是getPath,他是递归的,就像这样:

2.当前子目录下递归收集信息,对于每一条路径,我们只保存最长的,因为短的是可以在长的路径匹配得到的.

/**

* 递归收集

* @param root 上一级目录

* @param pack 当前已经收集到的信息

*/

private void getPath(String root,String pack){

if(hasNoSub(root)){ //如果没有了子目录

if(globalLine==null){

globalLine=pack;

} else{

globalLine+="|"+pack;

}

return;

}

File dir=new File(root);

char sep=File.separatorChar;

String[] subs=dir.list();

for(int i=0;i<subs.length;i++){

String curPath=root+sep+subs[i];

File tmp=new File(curPath);

if(tmp.isDirectory()){

if(pack==null){ //如果是目录,则递归

getPath(curPath,subs[i]);

} else{

getPath(curPath,pack+"."+subs[i]);

}

}

}

}

其中用到了类变量globalLine,它最终在调用完成的时候,会返回一条完整的配置信息.

好了,我就讲这么多了,不知道有没有讲明白,希望对你有所帮助,谢谢,最后一个方法是excute方法,就是执行这个完整的分类拷贝文件的工作.我把完整的类放在下面,就不另外写了.(这个类带有我本身项目的痕迹,不过不多,稍改即可)

import java.io.BufferedReader;

import
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: