这个例子算是java Io流当中较为经典的例子,值得细细去品味,代码我也是敲了两边,详细的注释都在代码上面,可以仔细看代码去体会这个过程
觉得最难的就是:
一:面向对象思想的训练以及培养,降低程序的耦合度
二:获取了源目标的文件(里面可能包含目录,以及文件),获取到目录和文件容易,可是怎么在指定文件夹下新建这个目录,
三:递归的应用,获取的如果是目录,就自身调用自身在去获取这个目录下的文件的绝对路径,如果是文件,就结束
四:涉及到字符串的拼接,要把源路径的一部分截取,作为指定路径的一部分
下面直接上代码:
一:面向对象思想的培养,给一个拷贝源,一个拷贝目标,调用拷贝方法完成拷贝
public class CopyAll {
public static void main(String[] args) {
//拷贝源
File srcFile=new File("D:\\练习java源文件");
//拷贝目标
File destFile=new File("C:\\");
//拷贝方法
copyDir(srcFile,destFile);
}
进行拷贝:
/**
*
* @param srcFile 拷贝源
* @param destFile 拷贝目标
*/
private static void copyDir(File srcFile, File destFile) {
//判断是否是一个文件,
// 是文件的话结束就可以了,
// 不是文件的话往下执行,查到这个目录下的所有子目录,在递归调用
if (srcFile.isFile()){
//是文件的时候需要拷贝
//一边读一边写
FileInputStream in=null;
FileOutputStream out=null;
try {
//读这个文件
in=new FileInputStream(srcFile);
//写到这个文件当中
String path= (destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath():destFile.getAbsolutePath()+"\\")+srcFile.getAbsolutePath().substring(3);
out=new FileOutputStream(path);
byte[] bytes=new byte[1024*1024];//一兆
int readCount=0;
while ((readCount=in.read(bytes))!=-1){
out.write(bytes,0,readCount);
}
//刷新流
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
//关闭流
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭流
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return;
}
//程序执行到此处,说明不是一个文件,是一个目录,
//获取源目标下的所有子目录
File[] files= srcFile.listFiles();
//获取到的file可能是一个文件,也可能是一个目录
for (File file:files){
//获取文件(包括目录和文件)的绝对路径
//System.out.println(file.getAbsoluteFile());
//如果,获取的file是一个目录的话,就在拷贝目标新建一个对应的目录
if (file.isDirectory()){
//源目录
String srcDir=file.getAbsolutePath();
//目标目录
//如果目录是以\结尾的,就不加,不是以\结尾的,通过字符串拼接加上去
String distDir=(destFile.getAbsolutePath().endsWith("\\") ? destFile.getAbsolutePath():destFile.getAbsolutePath()+"\\")+srcDir.substring(3);
System.out.println(distDir);
//新建拷贝目录
File newFile=new File(distDir);
//如果这个目录不存在
if (!newFile.exists()){
//就以 多重目录的形式新建出来
newFile.mkdirs();
}
}
//递归调用。
copyDir(file,destFile);
}
}
}
以上就完成了对文件目录的拷贝,一起加油!