`

Java实现分类文件拷贝1

    博客分类:
  • Java
阅读更多
在Java中对文件进行分类

如果你是个Java程序员,也许你对Java的文件组织已经非常清楚,例如你知道你们项目组是如何把众多的Java文件进行分类,组成整个项目工程.通常你们可能会根据业务来分组.有时候,我们作为项目成员,就会把自己的Java文件根据分组来进行分类的.下面,给出个例子:
某项目ProjectX要给某家名叫comX的商业公司做的信息系统,根据业务需要分为,a,b,c,d四组,采用典型的三层结构,其中,工程中的文件分为前台部分和后台部分.经过分析,该项目最后把文件组织成这样的结构:
a组写的前台文件所在的包为com.comX.foreg.a,相对应的后台文件放在com.comX.backg.a中
b组写的前台文件所在的包为com.comX.foreg.b,相对应的后台文件放在com.comX.backg.b中
c组写的前台文件所在的包为com.comX.foreg.c,相对应的后台文件放在com.comX.backg.c中
d组写的前台文件所在的包为com.comX.foreg.d,相对应的后台文件放在com.comX.backg.d中
当然,这只是我的一种简化的模型,实际上的项目由于业务交叉,综合复杂度等等因素应该比这样的结构复杂的多.象上面这样的工程,最后所有的代码放在文件夹"D:\ProjectX\src\"下面,而下面的文件组织和Java包路径可能又不一样.
现在,我描述一下,我要阐述的问题,当这个工程已经基本完成之后,各个小组都出现了修改,集成发布人员,给项目组开了一个ftp,ftp文件结构正好和原来的结构一样,a组的程序员修改了某个文件后,按照他所在的位置,重新上传.这样,通常会有人把代码传错了位置,最后编译的时候出现错误,对于及其复杂,各组有所交叉的组织来说,编译的时候查错,都很困难.

现在要做的是,让修改后的文件全部都传到一个文件夹中,通过程序把这些文件分发到他们应该在的位置.

好,如何来作?
思路很简单:每个文件都有他们的包路径,既然我们已经有了完整的文件结构,我们就能知道每一个包路径所对应的文件组织中的路径,如有一个文件ClassX.java,我们通过读取他的包路径为com.comX.foreg.a.a1,a1为a组的一个用例,但是它实际所在的位置为:
d:\ProjectX\src\business_1\com\comX\foreg\a\a1\ClassX.java,我们另外一个文件CalssY.java,他的包为com.comX.foreg.a.a2,它是a组的第二个用例,但他的实际存放路径为:d:\ProjectX\src\business_2\com\comX\foreg\a\a2\ClassY.java,
我们就可以根据事先指定的src目录找到他的合适位置.
我所作的是为本项目组的程序员上传文件提供方便,他们把要上传的文件上传到一个文件夹,然后通过这个程序拷贝到正确的位置即可.下面是我实现的一些模块,你可以根据自己的特殊情况来做修改或扩展.

0.处理这个问题需要设置一些类变量:
private String filePath="D:\\Work\\upload"; //文件上传路径,直接指向你的ftp目录吧
private String configeFile="packageConfig.cxh"; //路径配置文件,后面会专门讲到
private String objPath="D:\\Work\\gdlt\\src"; //目标文件路径,你可以指定任意,但要和配置文件一致
private PrintStream ps=null; //输出消息重定向,用于处理过程中的信息输出定向
private ArrayList lines=null; //保存配置文件
String[] heads=null; //保存每条配置的头
String globalLine; //记录一条配置信息

1.传入一个Java文件,返回该Java文件的包路径,如上面的ClassX.java,返回com.comX.foreg.a
/**
* 读取一个java文件,返回他的package信息取出来
* @param file 文件句柄
* @return 返回包路径
*/
private String readPac(File file){
String pac=null;
try{
BufferedReader fr=new BufferedReader(new FileReader(file)); //读取器
String line=fr.readLine();
while(line!=null){ //逐行处理
//处理当前行
line.trim();
if(line.startsWith("package")){ //找到包信息了
pac=line.substring(7,line.length()-1).trim();
break;
}
line=fr.readLine();
}
} catch(IOException ie){
pac=null;
ie.printStackTrace();
}
return pac;
}

2.根据上面返回的包路径,返回该文件应该在的实际位置,例如上面的ClassX.java,返回d:\ProjectX\src\business_2\com\comX\foreg\a\
/**
*
* 通过package信息把该文件应该在的位置取出来
* @param pack 包路径
* @return 返回该文件应该在的路径 返回null表示识别失败,需要读入 比如sbzs
* 并智能的更新配置文件
*/
private String parsePac(String pack,File cfgFile){
String path=null;
String line=null;
try{
for(int i=0;i<heads.length;i++){
line=(String)lines.get(i);
if(line.indexOf(pack)>0){ //找到了
return heads[i];
}
}
//没有找到,进行询问
ps.print("请输入包 "+pack+" 所在的路径:(例如:sbzs)");
DataInputStream dis=new DataInputStream(System.in);
path=dis.readLine().trim().toLowerCase();
dis.close();
if(path==null||path.length()==0){
ps.println("没有输入有效的包所在位置");
} else{ //得到名字,写入
int i;
for(i=0;i<heads.length;i++){
if(path.equals(heads[i])){ //找到了目标,把该包加入
String tmp=(String)lines.get(i)+"|"+pack;
lines.set(i,tmp); //更新
break;
}
}
if(i==heads.length){ //目前还没有这个位置,加入并更新
lines.add(path+":"+pack);
String[] tmp=new String[heads.length+1];
System.arraycopy(heads,0,tmp,0,heads.length);
tmp[heads.length]=path;
heads=tmp;
}
}
} catch(IOException ie){
path=null;
ie.printStackTrace();
}
return path;
}

3.根据上面返回的实际位置,就可以把该文件拷贝到适合的位置.成功返回true
/**
* 把该文件拷贝到完整的路径中去
* @param file 文件句柄
* @param path 文件目标的绝对路径
* @return
*/
private boolean copy(File file,String fullPath){
ps.println("开始拷贝文件....");
ps.println("源文件:"+file.getName());
ps.println("目标文件在:"+fullPath);
String fileName=file.getName();
int pos=fileName.lastIndexOf(File.separator);
if(pos>0){
fileName=fileName.substring(pos+1,fileName.length());
}
String lastPath=fullPath+File.separator+fileName;
File objFile=new File(lastPath);
if(objFile.exists()&&!objFile.delete()){ //如果存在则删除
ps.println("删除目标文件失败");
return false;
}
//开始拷贝
try{
objFile.createNewFile();
FileInputStream fis=new FileInputStream(file);
FileOutputStream fos=new FileOutputStream(objFile);
byte[] buf=new byte[1024];
int i=0;
while((i=fis.read(buf))!=-1){
fos.write(buf,0,i);
}
fis.close();
fos.close();
} catch(IOException ie){
ie.printStackTrace();
return false;
}
return true;
}

到目前为止你可能都已经注意到了,这一切都非常简单,模块的思路也非常清楚.当然你肯定也注意到了,其中最重要的一个角色就是配置文件,如果没有这个,你可以看到在parsePac方法中,会要求你控制台输入某个文件对应的目标路径,这是对于新文件(即原来目标目录中没有的文件,新添的),
分享到:
评论

相关推荐

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

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

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

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

    Java面试资料之IO相关

    1. 流的分类 Java 中有两种类型的流:输入流(inputStream)和输出流(outputStream)。输入流用于从外部读取数据,而输出流用于将数据写入到外部。按照实现功能分,流可以分为节点流和处理流。节点流可以从或向一...

    JAVA基础课程讲义

    JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...

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

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

    java初学者必看

    第1章 Java概述 1.1 Java的发展史 1.1.1 Java起源 1.1.2 Java发展 1.2 Java是什么 1.2.1 Java语言 1.2.2 Java平台 1.2.3 Java网络操作系统 1.3 Java的特点 1.4 Java程序类型 1.5 JDK与JRE 1.5.1 Java开发...

    Java语言基础下载

    第一章:Java开始 1 学习目标 1 Java历史 2 Java技术概述 3 Java技术的优点 3 Java虚拟机 4 类加载器 6 Windows环境变量 8 内容总结 13 独立实践 14 第二章: 面向对象概述 15 学习目标 15 面向对象(Object Oriented...

    Java企业进销存管理系统源码+mysql文件+使用说明文档.zip

    (1)将TM\01\Database文件夹中的扩展名为db_JXC_Data.MDF和db_JXC_Log.LDF的两个文件拷贝到SQL Server安装路径下的Data文件夹中。 (2)打开SQL Server 2000中的“企业管理器”,然后展开本地服务器,在“数据库”...

    java学习笔记 初学者必读

    1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 2.1. 配置环境 2-4 2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 3.1. 注释的三种形式 3-5 3.2. Java代码中的“;”、“{}...

    corejava培训文档

    1. 前言 1.1. JAVA特点 1.2. 运行原理 1.3. JAVA目录 2. 一 基础知识 2.1. 配置环境 2.2. Java中基本概念 3. 二 定义,关键字和类型 3.1. 注释的三种形式 3.2. Java代码中的“;”、“{}”、“ ” 3.3. 标识符 3.4...

    JavaMail 配置文档

    要安装 JavaMail,需要将 mail.jar 文件添加到系统环境变量 CLASSPATH 中,或将其拷贝到 %JAVA_HOME%\jre\lib\ext 目录下。 ### JavaMail API 的分类及体系结构 JavaMail API 可以划分为以下三大类: 1. 创建和...

    Java管理系统之企业进销存管理系统源码.zip

    (1)将TM\01\Database文件夹中的扩展名为db_JXC_Data.MDF和db_JXC_Log.LDF的两个文件拷贝到SQL Server安装路径下的Data文件夹中。 (2)打开SQL Server 2000中的“企业管理器”,然后展开本地服务器,在“数据库”...

    进销存系统Java客户端

    (1)将TM\01\Database文件夹中的扩展名为db_JXC_Data.MDF和db_JXC_Log.LDF的两个文件拷贝到SQL Server安装路径下的Data文件夹中。 (2)打开SQL Server 2000中的“企业管理器”,然后展开本地服务器,在“数据库”...

    corejavaNoteBook

    1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 2.1. 配置环境 2-4 2.2. Java中基本概念 2-5 3. 二•定义,关键字和类型 3-5 3.1. 注释的三种形式 3-5 3.2. Java代码中的“;”、“{}...

    网管教程 从入门到精通软件篇.txt

    JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JAR:Java档案文件(一种用于applet和相关文件的压缩文件) JAVA:Java源文件 JFF,JFIF,JIF:JPEG文件 JPE,JPEG,JPG:JPEG图形...

    Python 核心编程 第二版

    全书分为两个部分:第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、 Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和...

    完整的基于JSP的博客网

    (1)将TM\10\ Database文件夹中的扩展名为db_BlodMay_Data.MDF和db_BlodMay_Log.LDF的两个文件拷贝到SQL Server安装路径下的Data文件夹中。 (2)打开SQL Server 2000中的“企业管理器”,然后展开本地服务器,在...

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    jboss-as-7.1.1.Final

    1、新建一个普通Java Project工程: 2、加入JBOSS运行库,及jboss\bin\client下的jboss-client.jar包 3、把EJB的接口拷贝到该工程内: 4、新建一个客户端类:类名(ClientTest) 代码如下: import java.util....

Global site tag (gtag.js) - Google Analytics