我心飞翔
慢慢的度过
BlogJava
首页
新随笔
联系
聚合
管理
随笔-200 评论-148 文章-15 trackbacks-0
使用java进行文件夹的拷贝
I have to say this is a very poor written OOP code. No wonder most people are doing Micrsoft ASP(because it is not OOP at all!). Here is the version I cooked for about 10-15 min of my time.
public class DirCopyUtil {
public static void copy(File src, File dest) throws IOException {
getCopyable(src).copy(dest);
}
//this is the factory pattern.
public static Copyable getCopyable(File src) {
//if the source if file then return a file copier
if (src.isFile()) {
return new FileCopier(src);
}
/*else it has to be a directory copier, we could also enhance it to be other type of copier such as httpcopier etc...*/
return new DirCopier(src);
}
interface Copyable {
void copy(File dest) throws IOException;
}
static class DirCopier implements Copyable {
File srcDir;
public DirCopier(File srcDir) {
if (!srcDir.isDirectory()) {
throw new IllegalArgumentException("passed in paremter has to be directory" + srcDir);
}
this.srcDir = srcDir;
}
/**
* copy current directory content under 'destRoot' directory
* @param destRoot the destination root directory, all the file and sub directory will be copied under this
* destRoot directory, if destRoot doesn't exist, this will create the directory.
* @throws IOException
*/
public void copy(File destRoot) throws IOException {
// 1) if destRoot is not exist it will create it
if (!destRoot.exists()) {
if (!destRoot.mkdirs()) {
throw new IOException("unable to create dir:" + destRoot);
}
}
if (!destRoot.isDirectory()) {
throw new IllegalArgumentException("passed in paremter has to be directory" + destRoot);
}
File[] dirContents = srcDir.listFiles();
//we know dirContents can not be null since only file will return null, so no need to check null
for (int i = 0; i < dirContents.length; i++) {
File _srcFile = dirContents[i];
String _srcPath = _srcFile.getCanonicalPath();
/*now I need to get the relative path
question here is c:\abc\ cannonicalpath return "c:\abc" or "c:\\abc\\"? the answer is "c:\\abc"
so the following statement never executed, but I am just playing safe here since I don't know if
every JVM implementation will behave the same as my XP machine and Sun 1.4 */
if (_srcPath.endsWith(File.separator)) { //the endswith has subtle bug, but it should not matter
_srcPath = _srcPath.substring(0, _srcPath.length() - File.separator.length());
}
File dest = new File(destRoot, _srcPath.substring(_srcPath.lastIndexOf(File.separatorChar) + 1));
//here I wire back to the factory method.
getCopyable(dirContents[i]).copy(dest);
}
}
}
static class FileCopier implements Copyable {
File src;
public FileCopier(File src) {
if (!src.isFile()) {
throw new IllegalArgumentException("passed in paremter has to be file" + src);
}
this.src = src;
}
/**
* Copy the current file to the dest file, if the dest file doesn't exist it will be created.
* @param dest the destination file
* @throws IOException
*/
public void copy(File dest) throws IOException {
if (!dest.exists()) {
dest.createNewFile();
}
if (!dest.isFile()) {
throw new IllegalArgumentException("passed in paremter has to be file" + dest);
}
//do straight file copy
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest);
byte[] buffer = new byte[1024 * 4]; //4k buffer
int len = 0;
while ((len = in.read(buffer, 0, buffer.length)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
}
posted on 2008-07-22 17:01
无声
阅读(372)
评论(0)
编辑
收藏
所属分类:
职场生活
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
kettle ETL java 调用 kettle job 或 transfer
转win8 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法
Java 获取当前日期和时间
清除目录下的SVN信息
Linux下使用gzip压缩与解压文件
Linux 下ftp自动登录
struts1.x防止重复提交
C#正则表达式小结
jbpm4 java.lang.LinkageError: loader constraint violation 包冲突
c#web定时任务
道可道非常道,名可名非常名
<
2008年7月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(5)
给我留言
查看公开留言
查看私人留言
我参与的团队
JLive开发团队(0/0)
随笔分类
(174)
回归自然(9)
职场生活(165)
随笔档案
(200)
2014年3月 (2)
2014年1月 (1)
2013年9月 (2)
2013年2月 (1)
2013年1月 (2)
2012年8月 (1)
2012年6月 (1)
2012年1月 (1)
2011年12月 (1)
2010年12月 (3)
2010年11月 (10)
2010年10月 (12)
2010年9月 (3)
2010年8月 (5)
2010年7月 (3)
2010年6月 (3)
2010年5月 (1)
2010年4月 (1)
2010年2月 (2)
2010年1月 (2)
2009年11月 (1)
2009年8月 (1)
2009年3月 (3)
2009年2月 (7)
2008年12月 (1)
2008年11月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (4)
2008年6月 (8)
2008年5月 (4)
2008年4月 (4)
2008年2月 (2)
2008年1月 (9)
2007年12月 (11)
2007年11月 (1)
2007年10月 (6)
2007年9月 (1)
2007年8月 (2)
2007年7月 (1)
2007年6月 (1)
2007年5月 (6)
2007年4月 (6)
2006年12月 (9)
2006年11月 (7)
2006年10月 (9)
2006年9月 (5)
2006年7月 (12)
2006年6月 (14)
文章分类
(20)
AJAX(3)
Ant(1)
Delphi(1)
Eclipse(1)
Hibernate(3)
java共享代码(5)
JBOSS(1)
JSF
linux(4)
Oracle(1)
Spring
sqlserver2000
Struts
Tapestry
webspehre
文章档案
(15)
2007年6月 (2)
2006年11月 (1)
2006年10月 (5)
2006年6月 (7)
收藏夹
共享代码
开源网站
ajax中国
finereport
hibernate
Java开源大全
java技术论坛
java论坛
java论坛
用户名parable
linux伊甸园
luanyong
oracle下载
oracle资源
Struts插件
这个插件功能强大,包括JSF,struts,hibernate等
unix论坛
开源力量社区
源程序网站
资料中心
资源网站
parable
朋友博客
东东男
我的博客
最新随笔
1. kettle ETL java 调用 kettle job 或 transfer
2. etl一个例子
3. 论坛
4. Spring 3.2.4源码编译
5. 转win8 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法
6. crontab配置详解
7. 将JSON转换成MAP的工具类
8. Java 获取当前日期和时间
9. 清除目录下的SVN信息
10. Symantec 卸载密码方法
搜索
最新评论
1. re: 拦截器底层实现原理
政治
--ttt
2. re: js动态修改表格
454545
--35454
3. re: ajax局部刷新
jkkhhhl
--34
4. re: 将JSON转换成MAP的工具类
v instanceof JSONArray 这段代码有问题
需要对
List<String>做处理
--丹丹
5. re: 将JSON转换成MAP的工具类
评论内容较长,点击标题查看
--丹丹
阅读排行榜
1. OGNL表达式struts2标签“%,#,$”(78758)
2. linux 设置系统语言(44860)
3. Java 获取当前日期和时间(40379)
4. Linux下使用gzip压缩与解压文件(30893)
5. 将JSON转换成MAP的工具类(22044)
评论排行榜
1. RHEL 5 Install Number(16)
2. ajax局部刷新(8)
3. RHEL4-U3-i386-AS下载地址(7)
4. 将JSON转换成MAP的工具类(7)
5. OGNL表达式struts2标签“%,#,$”(6)