黑马程序员技术交流社区

标题: 练习:复制文件和文件夹到目标文件夹(保持原有目录层次) [打印本页]

作者: itheima_casper    时间: 2015-10-12 04:07
标题: 练习:复制文件和文件夹到目标文件夹(保持原有目录层次)
  1. /**
  2. * 实现功能:将文件或文件夹,按照原有目录层次复制到目标文件夹
  3. *
  4. */
  5. package jiangliang;

  6. import java.util.*;

  7. import java.io.*;

  8. class CopyAllFiles{
  9.        
  10.         public static void main(String[] args) throws Exception{
  11.                
  12.                 copy("c:\\aaa","d:\\");//测试
  13.         }
  14.         /**
  15.          * 将getFiles() 和 copyFromArray() 组合,并且复制的可以是文件或文件夹
  16.          * @param srcPath
  17.          * @param tarPath
  18.          * @throws IOException
  19.          */
  20.         public static void copy(String srcPath,String tarPath) throws IOException{
  21.                
  22.                 File srcFile = new File(srcPath);
  23.                 ArrayList<String> ar = new ArrayList<>();
  24.                
  25.                 if(srcFile.isFile()){
  26.                         ar.add(srcPath);
  27.                         copyFromArray(ar,tarPath);
  28.                 }
  29.                 else {
  30.                         getFiles(new File(srcPath),ar);
  31.                         copyFromArray(ar,tarPath);               
  32.                 }
  33.                        
  34.         }
  35.         /**
  36.          * 遍历一个存放文件路径的ArrayList集合,逐个复制套目标文件夹
  37.          * @param ar:存放文件路径的ArrayList集合
  38.          * @param toPath:目标文件夹路径
  39.          * @throws IOException
  40.          */
  41.         public static void copyFromArray(ArrayList<String> ar,String toPath) throws IOException{
  42.                 //replaced:获取要复制文件的父文件夹路径,这个父路径字符串替换成目标文件夹路径,就是集合中每个
  43.                 //                        文件和文件夹路径将要复制到的目标路径
  44.                 String replaced = new File(ar.get(0)).getParent();
  45.                
  46.                 for(String s:ar){
  47.                         File file = new File(s);       
  48.                         File toFile = new File(s.replace(replaced, toPath));//根据源文件路径,计算 目标文件路径

  49.                         if(file.isDirectory())                               
  50.                                 toFile.mkdirs();                       
  51.                         else{
  52.                                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
  53.                                 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(toFile));
  54.                                 byte[] b = new byte[1024];
  55.                                 int len = 0;
  56.                                 while((len = bis.read(b))!=-1){
  57.                                         bos.write(b,0,len);
  58.                                         bos.flush();
  59.                                 }
  60.                                 bis.close();
  61.                                 bos.close();
  62.                         }
  63.                                
  64.                 }
  65.                
  66.         }
  67.         /**
  68.          * 遍历文件夹,返回所有子文件及文件夹路径
  69.          * @param file:要拷贝的文件夹(必须是文件夹)
  70.          * @param ar:返回的ArrayList<String>
  71.          */
  72.         public static void getFiles(File file,ArrayList<String> ar){
  73.                 File[] files = file.listFiles();
  74.                 ar.add(file.getAbsolutePath());
  75.                 for(File f:files){
  76.                         if(f.isDirectory())
  77.                                 getFiles(f,ar);
  78.                         else
  79.                                 ar.add(f.getAbsolutePath());
  80.                 }
  81.                
  82.         }
  83.        
  84. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2