别人写递归,我就就想写非递归实现
讨论讨论, 毕竟递归效率低,这是通过栈技术的深度搜索创建文件夹,创建文件和拷贝文件的
能处理一般遇到的所有文件,考虑了各种意外情况(没注意到的,各位指正哈 )
楼主可以试试噢,有问题,继续交流
直接上代码了:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Stack;
public class Test
{
public static void main(String[] args)
{
String resDir = "C:\\Win-TC";
String desDir = resDir.replaceFirst("C", "E");
//System.out.println(desDir);
boolean isSuccessed = copyDir(desDir, resDir); //提供源文件夹路径, 目标文件夹地址 ,可以为任意
if(isSuccessed)
System.out.println("文件夹复制成功!!");
else
System.out.println("文件夹复制失败!!");
}
public static boolean copyDir(String desDir, String resDir)
{
File file = new File(resDir);
if(resDir == null || (!file.isFile() && !file.isDirectory())) //如果resDir为空或非法则返回false
{
System.out.println("源文件非法");
return false;
}
if(file.isFile()) //如果是文件则直接复制
{
try {
File temp = new File(desDir);
temp.createNewFile();
return copyFile(temp, file);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
//利用深度优先复制文件,
Stack<File> stack = new Stack<File>(); //定义栈,栈中只存放文件夹(目录)
stack.push(file); //将第一个文件夹压栈
while(!stack.isEmpty())
{
File rDir = stack.pop(); // 源文件夹
File dDir = changeResToDes(rDir, desDir, resDir); // 获取源文件夹的绝对路径,并且替换为目的文件夹的路径
if(!dDir.exists()) //若不存在则创建,存在继续
dDir.mkdirs();
for(File f : rDir.listFiles()) //对源文件夹迭代
{
if(f.isFile()) //如果是文件就拷贝
{
boolean isSuccessed = copyFile(changeResToDes(f, desDir, resDir) , f);
if(!isSuccessed) //如果文件复制失败,则直接返回false
return false;
}
else//否则对文件夹进行压栈
stack.push(f);
}
}
return true;
}
public static boolean copyFile(File desPath, File resPath) //对给定的文件进行复制
{
try {
if(!desPath.exists())
desPath.createNewFile();
} catch (Exception e) {
e.printStackTrace();
System.out.println("文件创建失败!!");
return false;
}
byte[] buffer = new byte[8 * 1024];
InputStream in = null;
OutputStream os = null;
try {
in = new FileInputStream(resPath);
os = new FileOutputStream(desPath);
int len = -1;
while((len = in.read(buffer)) != -1)
{
os.write(buffer, 0, len);
}
os.flush();
} catch (Exception e) {
e.printStackTrace();
System.out.println("文件复制失败!");
return false;
}finally{
try {
if(in != null)
in.close();
if(os != null)
os.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return true;
}
public static File changeResToDes(File file ,String desDir, String resDir)// 获取源文件夹的绝对路径,并且替换为目的文件夹的路径
{
File temp = new File(file.getAbsolutePath().replace(resDir, desDir));
//System.out.println("转化文件:"+file.getAbsolutePath()+"到:"+temp.getAbsolutePath());
return temp;
}
}
花了半个小时啊,版主加分啊。。。
|