java实现目录复制

最近安排任务写一个目录的复制,即将源文件或者文件夹中的内容复制到目标文件夹中。首先我们要区分几个名词:

目录和文件:比如一个文件夹就是一个目录,而一个 .txt 就是文件。

在JAVA中,File类提供了管理文件和目录的方法.先介绍一下用到的方法。

(1)file类的构造方法:

File(String pathname) :

File(String parent,String child)

File(File parent,String child)    // 注意是根目录的对象

(2)判断是文件还是目录

public boolean isFile()       // 判断是否是文件

public boolean isDirectory()    //  是否是目录

(3)public boolean mkdirs();   // 当File实例所表示的目录不存在时,建立新的目录以及父路径中各级原先不存在的父目录,并返回true.

mkdir() 是在该实例所表示的目录不存在,新建一个目录并返回true.

大概就这些需要强调,接下来就要看一下代码。有两种思路的代码实现判断文件和目录

先看一下测试类

public class FileTest {
	private static String inputPath = "G:/filetest/input/";   //源目录的路径
	private static String outputPath = "G:/filetest/output";  //目标目录的路径
	public static void main(String[] args){
		MyFile myFile = new MyFile();
		myFile.copyDir(inputPath, outputPath);
		System.out.println("文件的大小:"+myFile.getLength(inputPath));
	}
}
接下来是最重要的类 MyFile.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class MyFile {
	
	private int fileSum = 0;   //记录目录的大小
	
	//判断是目录还是文件
	public void copyDir(String source,String dist){
		File inputFile = new File(source);
		File outputFile = new File(dist);
		// 获取该目录中所有目录或者文件的file对象
		// 这里就要注意 listFiles()方法和list()方法的区别   
		// listFiles()返回的是这些文件和子目录的File实例。
//		list()返回的是File实例所表示目录中的所有文件和子目录的名字
		File[] fileArray = inputFile.listFiles();   
		for(int i  = 0;i<fileArray.length;i++){
			File partFile = new File(outputFile,fileArray[i].getName());
//			是目录
			if(fileArray[i].isDirectory()){
				partFile.mkdirs();
//				递归调用
				copyDir(source+"/"+fileArray[i].getName(), partFile.getPath());
			}else{
//				复制内容 注意改变源路径和目标路径,在复制之前,该文件要在目录中创建,否则会报异常,总之还是要想清楚路径。
				copy((new File(source,fileArray[i].getName())).getPath(),partFile.getPath());
			}
		}
	}	

	public void copy(String source,String dist) {
		int read = 0;
		byte[] buffer = new byte[1024];    //从输入流读出多个字节到该数组中
		try {
//			采用字节流。
			FileInputStream inputStream = new FileInputStream(new File(source));
			FileOutputStream outputStream = new FileOutputStream(new File(dist));
//			判断是否结束
			while ((read = inputStream.read(buffer)) != -1) {
				outputStream.write(buffer, 0, read);
			}
//			一定要关闭输入输出流
			inputStream.close();
			outputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (Exception e) {
		}
	}
//	计算传入目录的大小,就是文件夹中所有文件的大小
	public long getLength(String path) {
		File file = new File(path);
		int read = 0;
		byte[] buffer = new byte[1024];
		if (file.isDirectory()) {
			String[] arr = file.list();
			for (int i = 0; i < arr.length; i++) {
				getLength(new File(path, arr[i]).getPath());
			}
		} else {    //是文件
			try {
				FileInputStream inputStream = new FileInputStream(file);
//				从输入流中读出,并计算大小
				while ((read = inputStream.read(buffer)) != -1) {
					fileSum = fileSum + read;
				}
				inputStream.close();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return fileSum;
	}

}

要注意的地方已经在代码中标注,copyDir()函数还有另一种写法

public void copyDir(String inputPath, String outputPath) {
	File inputFile = new File(inputPath);
	File outputFile = new File(outputPath);

	if (inputFile.isDirectory()) {
		outputFile = new File(outputFile, inputFile.getName());
		System.out.println("文件夹路径 = " + inputFile.getAbsolutePath());
		outputFile.mkdirs();
		String[] fileArray = inputFile.list();
		for (int i = 0; i < fileArray.length; i++) {
			copyDir(new File(inputFile, fileArray[i]).getPath(),
					outputFile.getPath());
		}
	} else {
		File partOutputFile = new File(outputFile.getPath(),
				inputFile.getName());
		System.out.println("文件路径=" + inputFile.getAbsolutePath());
		try {
			partOutputFile.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}
		copy(inputFile.getPath(),partOutputFile.getPath());
	}
}

这个是 我最初的写的,但是因为一些意外,重写了一下,这两种方法都是正确的,就个人可以理解哪一种。

其实主要对输入输出流这一章各个函数的用法有一定的了解,写起来并不困难。还是要先看书,有思路在写。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值