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);
}
}
}
}
相关文章推荐
- Java递归遍历删除拷贝文件以及获取文件夹大小
- Java IO File 通过递归程序完成删除某个文件夹(包括里面所有文件)
- Java 利用递归删除文件以及文件夹
- java递归删除文件夹以及文件
- java递归删除文件以及文件夹
- Java递归-实现阶乘;斐波拉契数列;删除文件夹的文件
- 递归删除文件夹下的文件以及文件夹
- Java删除文件夹以及文件夹下的子目录与文件
- java 的 文件、文件夹 的建立、删除、复制以及移动等功能 操作
- java中文件操作(递归删除空文件夹,删除过期文件)
- java递归删除文件或文件夹
- Java删除文件夹以及文件夹下的子目录与文件
- java单个文件复制,递归删除、复制目录下所有内容,递归创建文件夹,.7z文件解压等
- JAVA 删除文件以及文件夹
- java删除指定路径下所有的文件, 及该文件夹里的所有文件夹,不包括该文件夹
- java 删除指定文件夹 以及文件下下面的所有文件
- java基础之File对象中的FilenameFilter文件过滤以及递归列出指定文件夹路径下的所有文件和所有文件夹
- java学习笔记 使用递归 将文件目录树形结构输出,递归删除目录 文件夹。
- Java中通过递归调用删除文件夹下所有文件
- java删除文件夹(递归删除其子目录的所有文件夹及文件)