Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

时间:2021-08-14 21:40:01

  这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码:

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Scanner;

//从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
public class Demo1 {
    public static void main(String[] args) throws IOException {
        Path path1=getPath();    //获取源文件夹路径
        Path path2=getPath();   //获取目的文件夹路径
        Path path=path1.getFileName();    //获取源文件的最后一个文件名
        path2=path2.resolve(path);     //在目的文件中建立文件夹存储源文件的内容
        copy(path1,path2); 
    }

    public static void copy(Path path1, Path path2) throws IOException {
        Files.walkFileTree(path1, new SimpleFileVisitor<Path>() {
            //在访问文件夹前执行的操作
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path p1=path1.relativize(dir);   //获取文件夹相对路径
                Path p2=path2.resolve(p1);    //在目的文件夹中建立路径
                Files.createDirectories(p2);   //建立文件夹.
                return FileVisitResult.CONTINUE;    //继续访问.
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Path p1=path1.relativize(file);     //获取文件相对于源文件的相对路径
                Path p2=path2.resolve(p1);      //获取文件在目的文件中的路径位置
                Files.copy(file, p2);         //利用Files类的copy功能复制文件
                return FileVisitResult.CONTINUE;     //继续访问.
            }

            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                return FileVisitResult.CONTINUE;     //访问失败,继续访问.
            }
             
        });
    }

    public static Path getPath() {
        System.out.println("请输入一个文件夹!");
        String str=null;
        Scanner sc=new Scanner(System.in);
        str=sc.nextLine();
        Path path=Paths.get(str);        //获取路径
        if(!Files.exists(path)) {
            System.out.println("请输入一个存在的文件夹");
            getPath();
        }
        if(Files.isRegularFile(path)) {
            System.out.println("请输入文件!");
            getPath();
        }
        return path;
    }
}