欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 选择一个目录 A,将 A 中的文件拷贝到目录 B 中。

程序员文章站 2022-06-16 13:50:06
...

设计要求:
(1) 从控制台输入要复制的源目录的路径,新建文件对象指向源目录的路径。如果源目
录不存在或者输入的文件不是目录,则提示“无效目录!”。
(2)从控制台输入目标目录路径,新建文件对象指向目标目录的路径。如果目标目录不
存在或者输入的文件不是目录,则提示“无效位置!”。
(3)创建复制文件方法。
※ 通过 listFiles()方法获取源目录下所有的子文件目录。
※ new File(目标目录,源目录子文件目录名)创建文件对象,如果当前子文件是
目录,则创建目录,递归调用复制文件方法;否则, 则复制文件到目标路径下。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Scanner;

public class newTest2 {

	public static void main(String[] args) {
		copy();  //main函数直接调用copy
		   //K.kuimeng
	}


public static void copy() {
		// TODO Auto-generated method stub
		
		Scanner scanner=new Scanner(System.in);
		System.out.println("请输入源目录路径:");
		String path1=scanner.next();
		File from=new File(path1);
		System.out.println("请输入目标目录路径:");
		String path2=scanner.next();
		File to=new File(path2);
		/*
		 *  在控制台上输入源目录路径和目标目录路径
		 * K.kuimeng 
		 * */

        if (!from.getPath().equals(to.getPath())) {   //判断两地址是否相同
			if (!from.isDirectory()||!from.exists()||from.isFile()) {
				System.out.println("无效目录!"); //如果from不是目录或不存在或是一个文件,则返回“无效目录!”
			}else {
				recursion(from, to);      //运用递归
				System.out.println("文件拷贝完成!");
			}
			}else {   //K.kuimeng
			System.out.println("所输入地址相同,请核对后重新输入!");  //输入的两条路径重复时输出报错
		}
		if (!to.isDirectory()||!to.exists()||from.isFile()) {
			System.out.println("无效位置!");   //如果to不是目录或不存在或是个文件,则返回“无效位置!”
		}
		}

public static void copyFile(File from,File to) {
		InputStream in=null;
		OutputStream out=null;
		try {
			out=new FileOutputStream(to);
			in=new FileInputStream(from);
			} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		byte[]b=new byte[1024*4];
		int len;
		try {
			while ((len=in.read(b))!=-1) {
				out.write(b, 0, len);   //把读取的信息写入另一个文件中
			} //K.kuimeng
			out.flush();    //刷新
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


public static void recursion(File from,File to) {      //实现递归函数
		if (from.isFile()) {  //如果from是个文件
			File file1=new File(to.getPath()+"/"+from.getName());  
			//在to的地址创建一个和from同名的文件file1
			try {
				file1.createNewFile();  //创建文件
				copyFile(from, file1);  //将from中的信息复制到file1中
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
         }else {  //如果from不是文件,而是一个目录
			to=new File(to.getPath()+"/"+from.getName());   //在to的地址创建一个和from同名的目录
			to.mkdirs();    //创建目录
			for (File files:from.listFiles()) {   //遍历这个from目录中的子文件目录
				recursion(files, to);     //将遍历出的每一个子文件重新带入递归类
			}
		}
		}}