对于对老文件的修改,我们都可以在配置文件中得到目标路径.下面我们看看配置文件如何得到.在这各之前,我们提到几个工具方法:
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

转载于:https://www.cnblogs.com/earl86/archive/2008/10/31/1666498.html

Java实现分类文件拷贝2相关推荐

  1. Java如何实现文件拷贝操作和如何正确关闭资源

    使用字节流完成文件的拷贝: 使用字节输入流(FileInputStream)将源文件中的数据读进来,同时使用字节输出流(FileOutputStream)将读进来的数据写到目标文件中,即一边读一边写, ...

  2. java 跨服务器 文件拷贝,java拷贝远程服务器上文件

    java拷贝远程服务器上文件 内容精选 换一换 已成功登录Java性能分析.待安装Guardian的服务器已开启sshd.待安装Guardian的服务器已安装JRE,JRE版本要求为Huawei JD ...

  3. 你知道Java文件拷贝有几种方式么?

    作者:不清不慎,目前在杭州蘑菇街公司任职,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! java中的文件拷贝主要有三种方式来实现. 一.使用输入输出流 可以使用java.io包 ...

  4. Java 中按文件名称分类,按文件大小分类,按照文件类型分类,按照最后修改时间分类的工具类

    在此博客中用到了文件操作的工具类,可以连接 Java中实现复制文件到文件,复制文件到文件夹,复制文件夹到文件,删除文件,删除文件夹,移动文件,移动文件夹的工具类 package cn.edu.hact ...

  5. Java有几种文件拷贝方式?哪一种最高效?

    第12讲 | Java有几种文件拷贝方式?哪一种最高效? 我在专栏上一讲提到,NIO 不止是多路复用,NIO 2 也不只是异步 IO,今天我们来看看 Java IO 体系中,其他不可忽略的部分. 今天 ...

  6. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  7. Java实现文件拷贝

    经过一组简单的测试发现JAVA NIO提供的文件内存映射方法实现文件拷贝速度最快,不管是大文件还是小文件,特别是大文件的拷贝速度比普通方法提高20倍,唯一有个前提就是内存需要足够大,否则文件映射肯定失 ...

  8. java 文件 剪切_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 很多朋友在看我的<java IO总结系列>之前觉得创建文件.文件夹删除文件这些基础操作真的是太简单了.但看了我的文章之后,有小 ...

  9. nio java 内核拷贝_大文件拷贝,试试NIO的内存映射

    最近项目里有个需求需要实现文件拷贝,在java中文件拷贝流的读写,很容易就想到IO中的InputStream和OutputStream之类的,但是上网查了一下文件拷贝也是有很多种方法的,除了IO,还有 ...

  10. java的流传输的进度条_JAVA程序设计(17)----- 制作文件拷贝软件 进程 输入流输出流 NIO 进度条 底层拷贝 多线程...

    使用NIO对文件进行底层拷贝(按照字节)多线程技术初级应用 不阻塞程序运行 package com.lovo.homework01; import java.awt.event.ActionEvent ...

最新文章

  1. linux top 历史,阿里工程师眼中的linux top命令
  2. linux 相册管理,图片管理(时间线、相册管理)- 深度看图 -Deepin深度系统用户手册...
  3. 最新图解 FileZilla Server + FlashFXP 快速傻瓜式搭建FTP服务
  4. gradient boosted regression tree
  5. 如何在单个API中支持Java 6、8、9
  6. mysql遇见Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题
  7. 算法入门书籍--2022.04.04
  8. Netty进行文件传输
  9. 详解promise、async和await的执行顺序
  10. python day 02
  11. matlab src,SRC 这是一个利用了稀疏表示方法的MATLAB程序,供大家参考学习。 Special Effects 图形图像处理 256万源代码下载- www.pudn.com...
  12. java如何知道城市是省会_全国各省的省会都是怎么确定的?
  13. android测试基站,Android iPhone 手机查看基站信息
  14. mern技术栈好处?_如何开始使用MERN堆栈
  15. html5 在线视频编辑器,一种基于html5的多轨道视频编辑的方法及系统与流程
  16. 【python--爬虫】千图网高清背景图片
  17. java工程师面试题
  18. 药物从研发到上市需要经历哪些流程?||新药研发
  19. linux做前端的软件,Linux下使用的GCC编译器图形前端软件wxgcc
  20. 带你了解什么是中断以及外部中断案例分析

热门文章

  1. Highway Networks
  2. python 提取指定目录下的图片名称
  3. 深度学习2.0-44.对抗生成网络-GAN
  4. 从程序员到架构师——踏上架构旅途 思考从未止步
  5. 产品管理的工作流程是什么
  6. 盛大“传奇”的网游启示录
  7. 3.6 tensorflow 中LSTM和GRU模块使用意境级讲解
  8. PGM:部分有向模型之条件随机场与链图模型
  9. 两台windows笔记本创建家庭组实现文件共享
  10. pandas及numpy笔记