這個題目用傳統的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; } }