Java NIO.2 —— 文件或目录拷贝操作

  拷贝整个文件树是可以递归每个目录和文件调用 Files.copy()方法。在使用的时候有一下注意事项。

  • 在往目录拷贝文件之前,首先要保证目录已经存在。拷贝源目录(不论是否为空)都会生成目标目录。整个任务一定在preVisitDirectory()方法中执行。
  • visitFile()方式用来拷贝每个文件最佳的方法。
  • 在你拷贝目录或文件时,你需要决定是否要使用REPLACE_EXISTINGCOPY_ATTRIBUTES 选项。
  • 如果你想保存要拷贝的目录的属性,你需要在postVisitDirectory()方法中做此操作。
  • 如果你使用FOLLOW_LINKS选项,而在你的目录树中存在循环的链接指向父目录,这个循环将会在visitFileFailed()方法中抛出FileSystemLoopException异常。
  • 如果文件不允许访问,可以根据你自己的决定来返回FileVisitResult.CONTINUE或TERMINATE
  • 如果你指定FOLLOW_LINKS选项,则可以跟踪符号链接文件。

  下面的例子使用C:\rafaelnadal 目录拷贝到C:\rafaelnadal_copy

import java.nio.file.FileSystemLoopException;
 import java.nio.file.attribute.FileTime;
 import java.io.IOException;
 import java.nio.file.FileVisitOption;
 import java.nio.file.FileVisitResult;
 import java.nio.file.FileVisitor;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.EnumSet;
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;

class CopyTree implements FileVisitor {

   private final Path copyFrom;
    private final Path copyTo;

   public CopyTree(Path copyFrom, Path copyTo) {
         this.copyFrom = copyFrom;
         this.copyTo = copyTo;
     }

   static void copySubTree(Path copyFrom, Path copyTo) throws IOException {
         try {
             Files.copy(copyFrom, copyTo, REPLACE_EXISTING, COPY_ATTRIBUTES);
         } catch (IOException e) {
             System.err.println("Unable to copy " + copyFrom + " [" + e + "]");
         }

    }

   @Override
    public FileVisitResult postVisitDirectory(Object dir, IOException exc)
                                                                     throws IOException {
         if (exc == null) {
             Path newdir = copyTo.resolve(copyFrom.relativize((Path) dir));
             try {
                 FileTime time = Files.getLastModifiedTime((Path) dir);
                 Files.setLastModifiedTime(newdir, time);
             } catch (IOException e) {
                 System.err.println("Unable to copy all attributes to: " + newdir+" ["+e+ "]");
             }
         } else {
             throw exc;
         }

        return FileVisitResult.CONTINUE;
     }

    @Override
     public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)
                                                                      throws IOException {
         System.out.println("Copy directory: " + (Path) dir);
         Path newdir = copyTo.resolve(copyFrom.relativize((Path) dir));
         try {
             Files.copy((Path) dir, newdir, REPLACE_EXISTING, COPY_ATTRIBUTES);
         } catch (IOException e) {
             System.err.println("Unable to create " + newdir + " [" + e + "]");
             return FileVisitResult.SKIP_SUBTREE;
         }

        return FileVisitResult.CONTINUE;
     }

    @Override
     public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)
                                                                      throws IOException {
         System.out.println("Copy file: " + (Path) file);
         copySubTree((Path) file, copyTo.resolve(copyFrom.relativize((Path) file)));
         return FileVisitResult.CONTINUE;
     }

    @Override
     public FileVisitResult visitFileFailed(Object file, IOException exc)
                                                                     throws IOException {
         if (exc instanceof FileSystemLoopException) {
             System.err.println("Cycle was detected: " + (Path) file);
         } else {
             System.err.println("Error occurred, unable to copy:" +(Path) file+" ["+ exc + "]");
         }

        return FileVisitResult.CONTINUE;
     }
 }

class Main {

    public static void main(String[] args) throws IOException {

        Path copyFrom = Paths.get("C:/rafaelnadal");
         Path copyTo = Paths.get("C:/rafaelnadal_copy");

        CopyTree walk = new CopyTree(copyFrom, copyTo);
         EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);

        Files.walkFileTree(copyFrom, opts, Integer.MAX_VALUE, walk);
     }
 } 
时间: 2024-08-25 10:01:48

Java NIO.2 —— 文件或目录拷贝操作的相关文章

Java NIO.2 —— 文件或目录删除操作

文件删除 删除单个文件的操作很简单,如果要删除一个目录树的话,需要实现FileVisitor 接口然后递归地调用delete() 或deleteIfExists()方法.在看代码之前,需要注意一下问题. 在删除一个目录之前,要先删除里面的文件. visitFile()方式是执行删除每个文件最好的方式. 因为只有在目录为空的情况下才可以删除,所以建议在postVisitDirectory()方法中删除目录操作. 如果文件不允许访问,你可以根据自己的决定使用visitFileFailed()方法来返

12 hdfs常用文件、目录拷贝操作、删除操作

package com.da.hbase.tool.utils; import com.da.hbase.tool.common.Const; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.h

Java IO和Java NIO在文件拷贝上的性能差异分析 (转)

1.       在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取 到用户空间的缓冲区.参看read(byte b[])方法的源码,可知,它会在内部再调用readBytes(b, 0, b.length)方法,而且readBytes(b, 0, b.length)方法是一个native方法(即本地方法),最终通过这个本地方法来发起一次系统调用,即调用系统内核的read()

使用Java NIO监视文件

通过优锐课的java小课中学习到了很多重点,一起来看看了解有关使用Java NIO观看文件的更多信息. 该??java.nio.file??包提供了一个文件更改通知API,被称为??手表服务API.它使我们能够在监视服务中注册文件夹.注册时,我们告诉服务我们感兴趣的事件类型是:文件创建,文件修改或文件删除. 当服务检测到感兴趣的事件时,会将其转发到注册的进程并根据需要进行处理.基本上是这样的: 1.第一步是WatchService?使用类的newWatchService()?方法创建一个新??的

Java字节流实现文件夹的拷贝

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; /** · java字节流实现文件夹的拷贝 · 拷贝文件夹,其中文件夹中又有多个文件 · 1.先遍历这个文件夹,判断是否是目录 · 2.创建文件夹 · 3.拷

Java中移动文件或目录的方法盘点

本文不再更新,可能存在内容过时的情况,实时更新请移步原文地址:Java中移动文件或目录的方法盘点: import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class M

python 文件与目录的操作   未完善 需要重新学习

文件与目录的操作:    -文件读写:python进行文件读写的函数是open或file file_handler = open(filename,mode) mode, 模式 说明 r 只读 r+ 读写 w 写入,先删除原文件,在重新写入,如果文件没有则 创建 w+ 读写,先删除原文件,在重新写入,如果文件没有则创建(可以写入输出) 读范例: >>> fo  = open('/tools/123/test.log')                                   

Java IO和Java NIO在文件拷贝上的性能差异分析

1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区.参看read(byte b[])方法的源码,可知,它会在内部再调用readBytes(b, 0, b.length)方法,而且readBytes(b, 0, b.length)方法是一个native方法(即本地方法),最终通过这个本地方法来发起一次系统调用,即调用系统内核的read()方法,内核从

Java NIO 读取文件、写入文件、读取写入混合

前言 Java NIO(new/inputstream outputstream)使用通道.缓冲来操作流,所以要深刻理解这些概念,尤其是,缓冲中的数据结构(当前位置(position).限制(limit).容量(capacity)),这些知识点要通过写程序慢慢体会. NIO vs  传统IO NIO是面向缓冲.通道的:传统IO面向流 通道是双向的既可以写.也可以读:传统IO只能是单向的 NIO可以设置为异步:传统IO只能是阻塞,同步的 缓冲区结构图 NIO是面向缓冲区的,缓冲区可以理解为一块内存