疯狂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

  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比缓冲复制效率高三分之一。仅供大家参考。