---------------------- android培训、java培训、期待与您交流! ----------------------
本节实现整个文件夹的拷贝
前面我们具体介绍了单个文件的拷贝,下面我们接着讲一下整个文件夹的拷贝。文件夹的拷贝要用到Flie类中的相应方法,在具体拷贝时,我们还要采用递归等方法。
下面就是一个具体文件夹拷贝的实现。程序已经考虑到源文件的是否存在问题,以及目标文件的是否存在问题。
同时,文件拷贝时,采用了管道传输,以提高传输效率
//实现如下:
package javaCopy;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
public class TestCopy2 {
/**
* Java中实现拷贝文件夹
* 拷贝一个文件的算法比较简单,当然,可以对它进行优化,比如使用管道,提高读写数据的效率等。
* 但是在拷贝文件夹时,则需要利用Flie类在目标文件夹中创建相应的目录,并且使用递归方法。
*
*/
/**
* 用到的方法列表如下
*public boolean exists()测试此抽象路径名表示的文件或目录是否存在。
*public boolean delete()删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。
*public boolean mkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。注意,此操作失败时也可能已经成功地创建了一部分必
需的父目录。
*public File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
*public static final String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即
separatorChar。
*public String getName()返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。如果路径名名称序列为空,
则返回空字符串。
*
* */
/**
*注意复制文件的方法和复制目录的方法中传入的内容是不同的恶,前者是以文件传入的,后者是以字符串传入的
*当然也可以将前者改成传入字符串
* */
// 源文件夹
static String url1 = "f:/photos";
// 目标文件夹
static String url2 = "g:/tempPhotos";
public static void main(String args[]) throws IOException {
// 判断源文件是否存在
if (!(new File(url1)).exists()) {
System.out.println("源文件:" + url1 + "不存在!");
System.exit(0);
}
// 判断目标文件是否存在
if ((new File(url2)).exists()) {
// 删除已经存在的目标文件,无论目标文件是目录还是单个文件
(new File(url2)).delete();
} else {
// 如果目标文件所在目录不存在,则创建目录
boolean i=(new File(url2)).mkdirs();
if (i==false) {
System.out.println("复制文件失败:创建目标文件所在目录失败");
System.exit(0);
}
}
// 获取源文件夹当前下的文件或目录
File[] file = (new File(url1)).listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isFile()) {
// 复制文件
copyFile(file[i],new File(url2+File.separator+file[i].getName()));
}else
if (file[i].isDirectory()) {
// 复制目录
String sourceDir=url1+File.separator+file[i].getName();
String targetDir=url2+File.separator+file[i].getName();
copyDirectiory(sourceDir, targetDir);
}
}
}
//复制文件
public static void copyFile(File sourceFile,File targetFile)throws IOException{
// 新建文件输入流
FileInputStream ips = new FileInputStream(sourceFile);
// 新建文件输出流
FileOutputStream ops = new FileOutputStream(targetFile);
FileChannel fc1=ips.getChannel();
FileChannel fc2=ops.getChannel();
fc2.transferFrom(fc1, 0, fc1.size());
//关闭流
fc1.close();
fc2.close();
ips.close();
ops.close();
}
// 复制文件夹
/**
* 下面方法用到递归方法,
* 首先创建该目录
* 判断该目录下是文件还是目录,如果是文件,则调用函数copyFile(File sourceFile,File targetFile)进行复制
* 如果是目录,则调用copyDirectiory(dir1, dir2),程序再次回到copyDirectiory(String sourceDir, String targetDir)
* 创建子目录,然后进行判断。
* 如果是空目录,那么(new File(sourceDir)).listFiles()获得的是0,不进行for循环,退出该函数
*
* */
public static void copyDirectiory(String sourceDir, String targetDir)throws IOException {
// 新建目标目录
(new File(targetDir)).mkdirs();
// 获取源文件夹当前下的文件或目录
File[] file = (new File(sourceDir)).listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isFile()) {
// 源文件
File sourceFile=file[i];
// 目标文件
File targetFile=new File((new File(targetDir)).getAbsolutePath()+File.separator+file[i].getName());
copyFile(sourceFile,targetFile);
} else
if (file[i].isDirectory()) {
// 准备复制的源文件夹
//String dir1=sourceDir + "/" + file[i].getName();
String dir1=sourceDir + File.separator + file[i].getName();
// 准备复制的目标文件夹
// String dir2=targetDir + "/"+ file[i].getName();
String dir2=targetDir + File.separator+ file[i].getName();
copyDirectiory(dir1, dir2);
}
}
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.youkuaiyun.com/heima