黑马程序员技术交流社区
标题:
练习:复制文件和文件夹到目标文件夹(保持原有目录层次)
[打印本页]
作者:
itheima_casper
时间:
2015-10-12 04:07
标题:
练习:复制文件和文件夹到目标文件夹(保持原有目录层次)
/**
* 实现功能:将文件或文件夹,按照原有目录层次复制到目标文件夹
*
*/
package jiangliang;
import java.util.*;
import java.io.*;
class CopyAllFiles{
public static void main(String[] args) throws Exception{
copy("c:\\aaa","d:\\");//测试
}
/**
* 将getFiles() 和 copyFromArray() 组合,并且复制的可以是文件或文件夹
* @param srcPath
* @param tarPath
* @throws IOException
*/
public static void copy(String srcPath,String tarPath) throws IOException{
File srcFile = new File(srcPath);
ArrayList<String> ar = new ArrayList<>();
if(srcFile.isFile()){
ar.add(srcPath);
copyFromArray(ar,tarPath);
}
else {
getFiles(new File(srcPath),ar);
copyFromArray(ar,tarPath);
}
}
/**
* 遍历一个存放文件路径的ArrayList集合,逐个复制套目标文件夹
* @param ar:存放文件路径的ArrayList集合
* @param toPath:目标文件夹路径
* @throws IOException
*/
public static void copyFromArray(ArrayList<String> ar,String toPath) throws IOException{
//replaced:获取要复制文件的父文件夹路径,这个父路径字符串替换成目标文件夹路径,就是集合中每个
// 文件和文件夹路径将要复制到的目标路径
String replaced = new File(ar.get(0)).getParent();
for(String s:ar){
File file = new File(s);
File toFile = new File(s.replace(replaced, toPath));//根据源文件路径,计算 目标文件路径
if(file.isDirectory())
toFile.mkdirs();
else{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(toFile));
byte[] b = new byte[1024];
int len = 0;
while((len = bis.read(b))!=-1){
bos.write(b,0,len);
bos.flush();
}
bis.close();
bos.close();
}
}
}
/**
* 遍历文件夹,返回所有子文件及文件夹路径
* @param file:要拷贝的文件夹(必须是文件夹)
* @param ar:返回的ArrayList<String>
*/
public static void getFiles(File file,ArrayList<String> ar){
File[] files = file.listFiles();
ar.add(file.getAbsolutePath());
for(File f:files){
if(f.isDirectory())
getFiles(f,ar);
else
ar.add(f.getAbsolutePath());
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2