使用java进行文件夹的拷贝

在csdn看到java对于文件夹拷贝的讨论,搬回blog,做一个备份。有空再写写中文注释。:)

javarule ( 2003-07-18)
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();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值