这个题目用传统的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; } }
时间: 2024-10-27 13:59:51