需求:将指定目录复制到指定路径下。
1、复制时目录内的子目录以及子文件的结构和内容与源目录相同。
2、目录名与源目录名可能相同,也可能不同。
分析:
假设源目录为:D:\dir 目标目录为:E:\copy
目标目录与源目录名不同时的复制情况:
目标目录与源目录名相同时的复制情况:
复制一个目录时,要先确认好目标目录是否存在,如果不存在则将目标目录创建好,之后遍历源目录下的所有文件和子目录,将这些文件与子目录复制下来
复制子目录时,同上。所以,这里要用到递归,在复制目录的方法里遍历源目录,判断所遍历到的是目录时,再次调用复制目录的方法
复制文件时用字节流将源文件中的数据写入到目标文件中
代码实现:
复制目录(与源目录名不同)
//复制目录
public static void copyDirectory(File in, File out){
//判断目标目录是否存在
if (!out.exists()) {
//目标目录不存在,创建此目录
out.mkdir();
}
//获取目标目录绝对路径
String path = out.getPath();
//获取源目录下的所有目录、文件,并遍历
File[] inFiles = in.listFiles();
for (File file : inFiles) {
//更改目标路径
out = new File(path, file.getName());
//判断file是否为目录,
//如果是目录则复制此目录,如果不是则复制此文件
if (file.isDirectory()) {
copyDirectory(file, out);
} else {
copyFile(file, out);
}
}
}
复制目录(与源目录名相同)
//复制目录
public static void copyDirectory(File in, File out){
//获取目标目录绝对路径
String path = out.getPath();
//更改目标路径
out = new File(path, in.getName());
//判断目标目录是否存在
if (!out.exists()) {
//目标目录不存在,创建此目录
out.mkdir();
}
//获取源目录下的所有目录、文件,并遍历
File[] inFiles = in.listFiles();
for (File file : inFiles) {
//判断file是否为目录,
//如果是目录则复制此目录,如果不是则复制此文件
if (file.isDirectory()) {
copyDirectory(file, out);
} else {
File outFile = new File(out, file.getName());
copyFile(file, outFile);
}
}
}
复制文件
//复制文件
public static void copyFile(File in, File out){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//创建输入输出流
fis = new FileInputStream(in);
fos = new FileOutputStream(out);
//复制文件————读取源文件数据,写入到目标文件
byte[] data = new byte[1024];
int len;
while ((len = fis.read(data)) != -1) {
fos.write(data, 0, len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
//关闭流
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
主函数
public static void main(String[] args) {
File in = new File("源目录");
File out = new File("目标目录");
copyDirectory(in, out);
}