专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 编程

嘿牛群程序员_成都传智博客_文件的拷贝:实现整个文件夹的拷贝

发布时间:2011-07-01 07:28:04 文章来源:www.iduyao.cn 采编人员:星星草
嘿牛程序员__成都传智博客__文件的拷贝:实现整个文件夹的拷贝

---------------------- android培训、java培训、期待与您交流! ----------------------

微笑本节实现整个文件夹的拷贝
前面我们具体介绍了单个文件的拷贝,下面我们接着讲一下整个文件夹的拷贝。文件夹的拷贝要用到Flie类中的相应方法,在具体拷贝时,我们还要采用递归等方法。
下面就是一个具体文件夹拷贝的实现。程序已经考虑到源文件的是否存在问题,以及目标文件的是否存在问题。
同时,文件拷贝时,采用了管道传输,以提高传输效率
//实现如下:
package javaCopy;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;

public class TestCopy2 {
 /**
  * Java中实现拷贝文件夹
  * 拷贝一个文件的算法比较简单,当然,可以对它进行优化,比如使用管道,提高读写数据的效率等。
  * 但是在拷贝文件夹时,则需要利用Flie类在目标文件夹中创建相应的目录,并且使用递归方法。
  *
  */
 /**
  * 用到的方法列表如下
  *public boolean exists()测试此抽象路径名表示的文件或目录是否存在。
  *public boolean delete()删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。
  *public boolean mkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必

需的父目录。
  *public File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
  *public static final String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即

separatorChar。
  *public String getName()返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,

则返回空字符串。
  * 
  * */
 /**
  *注意复制文件的方法和复制目录的方法中传入的内容是不同的恶,前者是以文件传入的,后者是以字符串传入的
  *当然也可以将前者改成传入字符串
  * */
 // 源文件夹
 static String url1 = "f:/photos";
 // 目标文件夹
 static String url2 = "g:/tempPhotos";
 public static void main(String args[]) throws IOException {
        // 判断源文件是否存在
    if (!(new File(url1)).exists()) {
     System.out.println("源文件:" + url1 + "不存在!");
     System.exit(0);
    }  
    
    // 判断目标文件是否存在
    if ((new File(url2)).exists()) {
     // 删除已经存在的目标文件,无论目标文件是目录还是单个文件
     (new File(url2)).delete(); 
    } else {
        // 如果目标文件所在目录不存在,则创建目录
         boolean i=(new File(url2)).mkdirs();
      if (i==false) {
      System.out.println("复制文件失败:创建目标文件所在目录失败"); 
      System.exit(0);
      }
    } 
  // 获取源文件夹当前下的文件或目录   
     File[] file = (new File(url1)).listFiles();
     for (int i = 0; i < file.length; i++) {
         if (file[i].isFile()) {
             // 复制文件
             copyFile(file[i],new File(url2+File.separator+file[i].getName()));
         }else
             if (file[i].isDirectory()) {
               // 复制目录
               String sourceDir=url1+File.separator+file[i].getName();
               String targetDir=url2+File.separator+file[i].getName();
               copyDirectiory(sourceDir, targetDir);
             }
     }
 }
 //复制文件
 public static void copyFile(File sourceFile,File targetFile)throws IOException{
     // 新建文件输入流
     FileInputStream ips = new FileInputStream(sourceFile);
     // 新建文件输出流
     FileOutputStream ops = new FileOutputStream(targetFile);
     FileChannel fc1=ips.getChannel();
     FileChannel fc2=ops.getChannel();
     fc2.transferFrom(fc1, 0, fc1.size());
     //关闭流
     fc1.close();
     fc2.close();
     ips.close();
     ops.close();
 }
 // 复制文件夹
  /**
     * 下面方法用到递归方法,
     * 首先创建该目录
     * 判断该目录下是文件还是目录,如果是文件,则调用函数copyFile(File sourceFile,File targetFile)进行复制
     * 如果是目录,则调用copyDirectiory(dir1, dir2),程序再次回到copyDirectiory(String sourceDir, String targetDir)
     * 创建子目录,然后进行判断。
     * 如果是空目录,那么(new File(sourceDir)).listFiles()获得的是0,不进行for循环,退出该函数
     *
     * */
 public static void copyDirectiory(String sourceDir, String targetDir)throws IOException {
     // 新建目标目录
     (new File(targetDir)).mkdirs();
     // 获取源文件夹当前下的文件或目录
     File[] file = (new File(sourceDir)).listFiles();
     for (int i = 0; i < file.length; i++) {
         if (file[i].isFile()) {
             // 源文件
            File sourceFile=file[i];
             // 目标文件
            File targetFile=new File((new File(targetDir)).getAbsolutePath()+File.separator+file[i].getName());
            copyFile(sourceFile,targetFile);
         } else
             if (file[i].isDirectory()) {
                // 准备复制的源文件夹
                //String dir1=sourceDir + "/" + file[i].getName();
             String dir1=sourceDir + File.separator + file[i].getName();
                // 准备复制的目标文件夹
                // String dir2=targetDir + "/"+ file[i].getName();
                String dir2=targetDir + File.separator+ file[i].getName();          
                copyDirectiory(dir1, dir2);
             }
     }
 }
}
再见

---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: