`

Java实现分类文件拷贝2

    博客分类:
  • Java
阅读更多
对于对老文件的修改,我们都可以在配置文件中得到目标路径.下面我们看看配置文件如何得到.在这各之前,我们提到几个工具方法:
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
分享到:
评论

相关推荐

    文章分类:Java编程,java面试题2

    - **`.java` 文件:** 包含 Java 源代码的文件。 - **编译:** 使用 `javac` 编译器将 `.java` 文件编译成 `.class` 文件。 - **`.class` 文件:** 包含编译后的字节码,可以被 JVM 执行。 #### 十、Java 标准库 -...

    java笔记 java笔记

    - **跨平台性**:Java的文件操作不受操作系统限制。 - **序列化接口**:用于将对象转换为字节流以便持久化。 - **I/O流基础**:如InputStream、OutputStream等。 - **流的分类**:字节流和字符流。 - **输入输出**:...

    java IO流详解

    下面通过一个具体的例子来说明如何使用Java IO流进行文件拷贝。 ```java public class FileCopy { public void copy(File source, File dir) { InputStream is = null; OutputStream os = null; try { // 获取...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    实现一个拷贝文件的类使用字节流还是字符串.mp4 │ Java面试题13.线程的实现方式 怎么启动线程怎么区分线程.mp4 │ Java面试题14.线程并发库和线程池的作用?.mp4 │ Java面试题15.设计模式和常用的设计模式.mp4 │ ...

    JAVA 重点 难点集锦

    1. 接口:接口是Java实现多继承的方式,了解接口的定义、实现与接口间的继承。 2. 抽象类:理解抽象类的特性,何时使用抽象类,以及抽象方法的定义与实现。 3. 构造器:掌握构造器的作用,深浅拷贝的概念,以及...

    java全集.pdf JAVA全集

    2. 使用Java编译器(javac)将源代码编译成字节码(`.class`文件)。 3. 字节码由Java虚拟机(JVM)解释执行或通过JIT编译器转换为机器码后执行。 **1.3 Java目录** Java开发通常需要设置以下目录结构: - `src`: ...

    opencv_java-jar&dll.zip

    2. **DLL依赖文件**:在Windows系统中,OpenCV的C++接口通常依赖于一系列的动态链接库文件(DLLs)。在"x86"和"x64"目录下的DLL文件是这些依赖项,分别对应32位和64位系统。当Java程序通过JNI(Java Native ...

    Java 基础核心总结 +经典算法大全.rar

    示例:文件拷贝案例 BIO 和 NIO 拷贝文件的区别操作系统的零拷贝 选择器(Selectors) 选择键(SelectionKey) 示例:简易的客户端服务器通信 集合 集合框架总览 -、Iterator Iterable ListIterator 二、Map 和 Collection...

    黑马程序员入学Java精华总结

    - JRE(Java Runtime Environment)包含Java虚拟机、Java核心类库和支持文件,是运行Java程序所必需的环境。 - JDK(Java Development Kit)包含JRE,外加开发工具(如编译器javac、调试器jdb等)和其他开发者工具...

    bbs论坛(java,javaScript,html,sql server,java servlet)

    这个论坛的实现还涉及到MD5加密技术,确保用户数据的安全性。 【描述】提到的"已完成的论坛"意味着该项目已经是一个完整的、功能完善的系统。它展示了如何将不同技术有效地融合在一起,为用户提供了一个交互式的...

    Java面试资料之IO相关

    Java IO 是 Java 语言中的一种基本输入/输出机制,用于实现数据的读取和写入。本文将从流的分类、流的转换、对象序列化、字节流和字符流的区别、对象克隆等方面对 Java IO 进行总结。 1. 流的分类 Java 中有两种...

    java学习笔记整理

    - `java`: Java解释器,用于执行编译后的字节码文件。 ##### 1.4 集成开发环境 集成开发环境(IDE)是集成了代码编辑、编译、调试等功能于一体的开发工具,常用的Java IDE有Eclipse、IntelliJ IDEA等。 - **...

    Java学习笔记-IO篇

    通过这些示例,我们可以看到如何利用Java中的字符流来进行高效的文件读写操作。使用BufferedReader和BufferedWriter等高级流类能够显著提高数据处理的速度和效率,尤其是在处理大量数据时尤为明显。此外,掌握这些...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    实现一个拷贝文件的工具类要使用字节流还是字符串 Java面试题13.线程的的实现方式?怎么启动线程?怎么区分线程? Java面试题14.线程并发库和线程池的作用 Java面试题15.设计模式和常用的设计模式 Java面试题16....

    Java:面试题大全带答案

    - **Serializable接口**:Java通过实现此接口进行序列化和反序列化,可用于实现深拷贝。 面试中,对于以上知识点的深入理解和实际应用能力是评估候选人技能的关键。例如,面试官可能会问到如何优化集合性能,如何...

    CoreJava学习笔记

    2. **面向对象**:Java几乎一切都是对象。面向对象的思想贯穿了整个Java语言设计的核心。 3. **分布式**:Java天生就支持Internet应用的开发,在Internet上创建分布式程序非常容易。 4. **健壮性**:Java尽力避免...

    java精华总结

    当Java程序被编译时,会生成一种名为字节码(.class文件)的中间形式。这种字节码可以被任何平台上的JVM解释执行。JVM负责将字节码转换成本地机器码,从而实现跨平台运行。 ##### 4. JRE和JDK的区别 - **JRE (Java...

    java从0基础学习笔记

    - 文件操作:学习File类,进行文件的创建、读写和删除。 - 缓冲流:理解BufferedReader和BufferedWriter提高读写效率的作用。 - 转换流:学会使用InputStreamReader和OutputStreamWriter在字节流和字符流之间转换...

Global site tag (gtag.js) - Google Analytics