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

Java的copy文件和文件夹以及删除文件夹(包括递归与非递归算法)

2013-07-24 18:34 656 查看

Copy文件算法

/**
*<pre>
*复制文件
*源文件不存在,直接返回
*目标文件不存在时,创建父目录
*</pre>
*
*@paramsrcFile源文件
*@paramdestFile目标文件
*/
publicstaticvoidcopy(FilesrcFile,FiledestFile){
//源文件不存在,直接返回
if(!srcFile.exists()){
logger.info("源文件["+srcFile.getName()+"]不存在");
return;
}
//目标文件不存在时,创建父目录
if(!destFile.exists()){
logger.info("目标文件["+destFile.getName()+"]所在的父目录不存在,创建父目录");
destFile.getParentFile().mkdirs();
}
FileInputStreamfis=null;
BufferedInputStreambis=null;
FileOutputStreamfos=null;
BufferedOutputStreambos=null;
try{
fis=newFileInputStream(srcFile);
bis=newBufferedInputStream(fis);
fos=newFileOutputStream(destFile);
bos=newBufferedOutputStream(fos);
byte[]buffer=newbyte[1024*5];

intlength;
while((length=bis.read(buffer))!=-1){
bos.write(buffer,0,length);
}
bos.flush();

}catch(Exceptione){
logger.error(e.getMessage(),e);
}finally{
try{
if(fis!=null){
fis.close();
}
}catch(Exceptione){
logger.error(e.getMessage(),e);
}
try{
if(fos!=null){
fos.close();
}
}catch(Exceptione){
logger.error(e.getMessage(),e);
}
try{
if(bis!=null){
bis.close();
}
}catch(Exceptione){
logger.error(e.getMessage(),e);
}
try{
if(bos!=null){
bos.close();
}
}catch(Exceptione){
logger.error(e.getMessage(),e);
}
}
}


Copy目录(递归算法)

/**
*复制目录下的所有到另一目录
*@paramsrcDir
*@paramdestDir
*/
publicstaticvoidcopyDir(FilesrcDir,FiledestDir){
//生成目录
if(!destDir.exists()){
destDir.mkdirs();
}
//循环源目录
File[]srcFiles=srcDir.listFiles();
for(inti=0;i<srcFiles.length;i++){
Filesrc=srcFiles[i];
if(src.isFile()){
FiletargetFile=newFile(destDir.getAbsolutePath()+"\\"+src.getName());
copy(src,targetFile);
}else{
copyDir(newFile(srcDir+"\\"+src.getName()),newFile(destDir+"\\"+src.getName()));
}
}
}


Copy目录(非递归算法):

/**
*拷贝目录(非递归)
*@paramsrcDir源目录
*@paramdestDir目标目录
*/
publicstaticvoidcopyDirNonRecursion(FilesrcDir,FiledestDir){
//生成目录
if(!destDir.exists()){
logger.info("目标文件["+destDir.getName()+"]的目录不存在,创建相应目录");
destDir.mkdirs();
}

Stack<File>fileStack=newStack<File>();
fileStack.push(srcDir);
FilecurFile;
FilepreFile=null;
StringparentPath=destDir.getAbsolutePath();
parentPath=parentPath.replaceAll("[\\\\]","/");
StringsrcPath=srcDir.getAbsolutePath();
while(!fileStack.empty()){
curFile=fileStack.peek();
File[]fileLists=curFile.listFiles();
//当前文件为非目录,或者空目录或者前一个文件的父目录为当前文件时
if(curFile.isFile()
||(preFile!=null&&(preFile.getParent().equals(curFile.getAbsolutePath())))
||(fileLists.length==0)){
FilepopFile=fileStack.pop();
StringfilePath=popFile.getAbsolutePath();
if(filePath.equals(srcPath)){
continue;
}
filePath=filePath.replaceAll("[\\\\]","/");
filePath=filePath.substring(srcPath.length()+1);
filePath=parentPath+"/"+filePath;
if(popFile.isFile()){
copy(popFile,newFile(filePath));
}else{
Filedir=newFile(filePath);
dir.mkdirs();
}
preFile=curFile;
}else{
for(Filefile:fileLists){
fileStack.push(file);
}
}
}
}




删除目录(递归算法)

/**
*给入一个目录,删除该目录下的所有文件。
*@paramdir
*/
publicstaticvoiddeleteDir(Filedir){
if(dir.isDirectory()){
File[]listFiles=dir.listFiles();
for(inti=0;i<listFiles.length;i++){
Filef=listFiles[i];
if(f.isFile()){
f.delete();
}elseif(f.isDirectory()){
deleteDir(f);
}
}
//删除当前目录
dir.delete();
}
}


删除目录(非递归算法):

/**
*删除目录(非递归)
*@paramsrcDir源目录
*/
publicstaticvoiddeleteDirNonRecursion(FilesrcDir){
Stack<File>fileStack=newStack<File>();
fileStack.push(srcDir);
FilecurFile;
FilepreFile=null;
while(!fileStack.empty()){
curFile=fileStack.peek();
File[]fileLists=curFile.listFiles();
//当前文件为非目录,或者空目录或者前一个文件的父目录为当前文件时
if(curFile.isFile()
||(preFile!=null&&(preFile.getParent().equals(curFile.getAbsolutePath())))
||(fileLists.length==0)){
FilepopFile=fileStack.pop();
popFile.delete();
preFile=curFile;
}else{
for(Filefile:fileLists){
fileStack.push(file);
}
}
}
}


读取目录(非递归算法):

publicvoidreadFile(FilerootFile){
Stack<File>fileStack=newStack<File>();
fileStack.push(rootFile);
FilecurFile;
FilepreFile=null;
while(!fileStack.empty()){
curFile=fileStack.peek();
File[]fileLists=curFile.listFiles();
if(curFile.isFile()
||(preFile!=null&&(preFile.getParent().equals(curFile.getAbsolutePath())))
||(fileLists.length==0)){
System.err.println(curFile.getAbsolutePath());
fileStack.pop();
preFile=curFile;
}else{
for(Filefile:fileLists){
fileStack.push(file);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: