您的位置:首页 > 编程语言 > Java开发

一个Java版的目录拷贝程序

2006-07-06 16:26 369 查看
一个Java版的目录拷贝程序

/**
E:/j2sdk1.4.2_09/bin/javac E:/java_s/DirCopyUtil.java
set classpath=E:/java_s
java DirCopyUtil
*/

import java.io.*;
import java.lang.*;

public class DirCopyUtil {

public static void main( String[] args){
if(args.length < 2)
{
System.out.println("usage: DirCopyUtil srcFile dstFile extention");
return;
}
java.io.File src = new java.io.File(args[0]);
java.io.File dst = new java.io.File(args[1]);

try{ DirCopyUtil.copy(src,dst);}
catch(Throwable ex){ex.printStackTrace();}
}

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;
static ExtensionFileFilter filt = new ExtensionFileFilter();

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(filt);
//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();
}
}

public static class ExtensionFileFilter implements FileFilter {

String extension;

public ExtensionFileFilter(String extension) {
this.extension = extension;
}

public ExtensionFileFilter() {
System.out.println("please input extention:");

try{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
extension = br.readLine();
}catch(Throwable ex)
{
ex.printStackTrace();
}

}

public boolean accept(File file) {
if(extension == "*.*")
return true;

if(file.isDirectory()){
return true;
}

String name = file.getName();
// find the last
int index = name.lastIndexOf(".");
if(index == -1) {
return false;
} else {
return this.extension.equals(name.substring(index+1));
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐