import java.io.*;
public class IorepeatCopy {
/**
* 递归拷贝实例代码
* @throws IOException
*/
public static void main(String[] args) throws IOException {
//copyFile("C:\\Users\\zyj\\Desktop\\java.txt","C:\\Users\\zyj\\Desktop\\1.txt");
copyDirectory("E:\\1456","C:\\Users\\zyj\\Desktop");
}
/*
* 拷贝单个文件
* */
public static void copyFile(String srcFileName,String targetFileName){
//1判断文件是否存在
File srcFile = new File(srcFileName);
if(!srcFile.exists()){
return ;
}
//准备输入流
FileInputStream fis = null;
//准备输出流
FileOutputStream fos = null;
//中转站
byte[] buffer = new byte[1024];//1kb
int len = 0;
try {
fis = new FileInputStream(srcFileName);
fos = new FileOutputStream(targetFileName);// 创建一个向具有指定名称的文件中写入数据的输出文件流
do {
len = 0;
len = fis.read(buffer); //从此输入流中将最多buffer.length 个字节的数据读入一个 byte 数组中
if(len==-1){如果没有读到数据则退出循环
break;
}
fos.write(buffer,0,len);// 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。
fos.flush();//刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标
} while (true);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fis!=null){fis.close();}
if(fos!=null){fos.close();}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*
* 目录拷贝
* 递归拷贝
* */
public static void copyDirectory(String srcDir,String targetDir)
throws IOException{ // d:\\a\\a11 e:\\a\\a11
File srcFile = new File(srcDir);
if(!srcFile.exists()){
return ;
}
copyDirectory(srcFile,new File(targetDir));
}
/**
* 递归拷贝函数
* */
public static void copyDirectory(File srcDir,File targetDir)
throws IOException{
//如果目标目录不存在则主动创建
if(!targetDir.exists()){
targetDir.mkdirs();
}
//拷贝目录下的有目录|拷贝原目录下的所有文件
for(File item:srcDir.listFiles()){
if(item.isDirectory()){
//调用自己,
copyDirectory(item,new File(targetDir.getParent()+"\\"+item.getName()));
}else if(item.isFile()){
//调用单个文件拷贝
copyFile(item.getPath(),targetDir.getPath()+"\\"+item.getName());
}
}
}
}