网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java实现分类文件拷贝     
  文章作者:未知  文章来源:水木森林  
  查看:225次  录入:管理员--2007-11-17  
 
  在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方法中,会要求你控制台输入某个文件对应的目标路径,这是对于新文件(即原来目标目录中没有的文件,新添的),对于对老文件的修改,我们都可以在配置文件中得到目标路径.下面我们看看配置文件如何得到.在这各之前,我们提到几个工具方法:
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.判断一个目录是否有子目录,传入一个目录,判断
 
 
上一篇: java实例 阴阳历算法    下一篇: java使用oracle遇到的最大游标超出问题及其解决方法
  相关文档
linux下apache与tomcat整合的简单方法 11-16
javascript分页 11-17
servlet规范定义的servlet 生命周期 11-17
软件开发规范(1) 11-17
Java参数传递方式 03-25
java开发中使用oracle一点注意事项 11-17
java源码分析:深入探讨iterator模式 03-14
java设计模式之visitor 11-17
j2ee、j2se vs .net、vb.net 11-16
谈模式(singleton pattern)的变形 11-17
有状态会话 bean运行结束时应及时被显示删除 11-17
java企业应用系统框架的比较与选择 11-16
使用java swing 创建一个xml编辑器(二) 11-17
java多线程同步设计中使用metux 11-16
升级到hibernate3.0的理由 11-17
jdom使用指南 11-17
java通过jni调用本地c语言方法 11-16
谨防java网络编程“陷阱” 11-17
java语言深入 java之精髓io流 11-17
走出abstract class与interface的困惑 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息