首页 > 代码库 > JAVA实现复制文件夹

JAVA实现复制文件夹

  1 package com.filetest;  2   3 import java.io.BufferedInputStream;  4 import java.io.BufferedOutputStream;  5 import java.io.File;  6 import java.io.FileInputStream;  7 import java.io.FileOutputStream;  8 import java.io.IOException;  9 import java.util.Scanner; 10  11 public class copyfile { 12  13     public static void main(String args[]) throws IOException{ 14          15         copy();            //调用复制函数 16         System.out.println("复制完成!");    //提示复制完成 17     } 18  19     private static void copy() throws IOException { 20          21         System.out.println("输入你要复制的文件路径及名称:"); 22         Scanner scanner=new Scanner(System.in); 23         String oldpath=scanner.next();        //接收原文件夹路径及名称 24          25         File ofile=new File(oldpath);     26         if((!ofile.exists()||!ofile.isDirectory())){    //判断源文件夹路径是否存在 27              28             if(oldpath.equals("end"))                    //路径不存在则进入判断内,如果输入的不是end则递归调用重新输入 29             { 30                 System.out.println("程序结束,感谢使用!"); 31                 System.exit(-1); 32             } 33             else 34             { 35                 System.out.println("输入的源文件夹路径不存在,请重新输入!(输入end退出程序)"); 36                 copy(); 37             } 38                          39         } 40          41         System.out.println("输入你要复制该文件到哪个路径:"); 42         String newpath=scanner.next();        //接收目标文件夹路径及名称 43          44         File nfile=new File(newpath); 45         if(!nfile.isAbsolute()){    //判断目标文件夹路径是否为目录 46             if(newpath.equals("end"))                    //路径不存在则进入判断内,如果输入的不是end则递归调用重新输入 47             { 48                 System.out.println("程序结束,感谢使用!"); 49                 System.exit(-1); 50             } 51             else 52             { 53                 System.out.println("输入的目标文件夹目录格式不正确,请重新输入!(输入end退出程序)"); 54                 copy(); 55             } 56                          57         } 58          59         //截取源文件夹路径最后的名字 60         String laststr  = oldpath.substring(oldpath.lastIndexOf("/"), oldpath.length()); 61         copyDirectiory(oldpath,newpath+"/"+laststr);  //将原路径文件夹名称和目标路径文件夹名称传递给复制文件夹函数 62          63          64     } 65      66      67     //用缓冲流复制文件函数 68     public static void copyFile(File sourceFile,File targetFile)    69             throws IOException{   70                     // 新建文件输入流并对它进行缓冲    71                     FileInputStream input = new FileInputStream(sourceFile);   72                     BufferedInputStream inBuff=new BufferedInputStream(input);   73                74                     // 新建文件输出流并对它进行缓冲    75                     FileOutputStream output = new FileOutputStream(targetFile);   76                     BufferedOutputStream outBuff=new BufferedOutputStream(output);   77                        78                     int len;   79                     while ((len =inBuff.read()) != -1)  80                     {   81                         outBuff.write(len);   82                     }   83                     // 刷新此缓冲的输出流    84                     outBuff.flush();   85                        86                     //关闭流    87                     inBuff.close();   88                     outBuff.close();   89                     output.close();   90                     input.close();   91                 }   92      93      94     // 复制文件夹函数 95     public static void copyDirectiory(String sourceDir, String targetDir)   96                         throws IOException {                              97                           98                         File aimfile=new File(targetDir); 99                         if(!(aimfile).exists()){    //查看目录是否存在,不存在则新建100                              aimfile.mkdirs();   101                         }102                         103                         if(sourceDir.equals(targetDir)){    //如果文件路径及文件名相同则覆盖104                             System.out .println("文件已存在,是否覆盖(N退出/任意键继续)?");105                             Scanner scanner=new Scanner(System.in);106                             String NY=scanner.next();107                             if(NY.equalsIgnoreCase("n")){    //如果不想覆盖 可退出程序108                                 System.out.println("程序结束,感谢使用!");109                                 System.exit(-1);110                             }111 112                         }113                     114                         // 获取源文件夹下的文件或目录   115                         File oldfile=new File(sourceDir);116                         File[] file=oldfile.listFiles();  117         118                         for(int i=0;i<file.length;i++)119                         {  120                             121                             if (file[i].isFile()) //如果是文件,传递给copyFile()函数进行复制122                                 {   123                                     //目标文件  124                                     File aim=new File(targetDir);  125                                     File targetFile=new File(aim.getAbsolutePath()+"/"+file[i].getName());  126                                     copyFile(file[i],targetFile);  127                                 }  128                             if (file[i].isDirectory()) //如果是文件夹,则递归调用129                                 {  130                                     // 要递归复制的源文件夹   131                                     String soursefiles=sourceDir + "/" + file[i].getName(); 132                                     133                                     // 要递归复制的目标文件夹   134                                     String aimfiles=targetDir + "/"+ file[i].getName();135                                     136                                     copyDirectiory(soursefiles, aimfiles);  137                                 }  138                         }  139                 }  140         }


其实在复制单个文件的时候可以优化一下  用FileChannel比缓冲复制效率高三分之一。仅供大家参考。