1.将一个完整的文件夹拷贝到目标目录下
2.FileInputStream文件输入流是万能流,可以将任意类型的文件复制(图片,PDF等等都可以复制)
3.原理:首先判断原文件夹下面有没有文件:
######3.1如果没有文件全都是文件夹的话,进入文件夹复制部分,在目标目录下面建立多重文件夹,之后通过递归将原文件的下一级的文件和文件夹拷贝到建立好的文件夹中。
######3.2如果原文件夹下面有文件的话,直接进入文件复制部分,但是因为文件夹未建立,所以文件没有路径可以复制,会报错;这样的话,我们可以先将原文件夹的父目录先建立出来,这样的话就可以将原文件夹下的文件就有路径可去,就可以复制了
String parentI =srcFile.getParentFile().getAbsolutePath().substring(3);
String targerParentdir = ((targetFile.getAbsolutePath().endsWith("\\")?targetFile.getAbsolutePath():targetFile.getAbsolutePath()+"\\")+parentI);
//FileOutputStream(String name)可以传字符串
File parentdir = new File(targerParentdir);
//若是文件夹不存在,就创建文件夹
if(!parentdir.exists()) {
parentdir.mkdirs();
}
以下是完整代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//文件夹拷贝到指定目录下
public class DirectoryCopy {
//srcFile:原文件夹
//targetFile:目标文件夹
public static void copy(File srcFile,File targetFile) {
//文件拷贝
FileInputStream in = null;
FileOutputStream out = null;
if(srcFile.isFile()) {
//如果srcfile是个文件的话,递归结束执行文件复制,接着继续向下运行
//若是原文件夹下面有文件,第一次运行会出现“找不到指定路径的问题”,需要运行两次才能将文件夹彻底复制
//为了避免这种情况,需要将文件的父目录建造出来,用到了方法getParentFile()
//getParentFile:返回此抽象路径名父目录的抽象路径名(File类型)
String parentI =srcFile.getParentFile().getAbsolutePath().substring(3);
String targerParentdir = ((targetFile.getAbsolutePath().endsWith("\\")?targetFile.getAbsolutePath():targetFile.getAbsolutePath()+"\\")+parentI);
//FileOutputStream(String name)可以传字符串
File parentdir = new File(targerParentdir);
//若是文件夹不存在,就创建文件夹
if(!parentdir.exists()) {
parentdir.mkdirs();
}
try {
in = new FileInputStream(srcFile);
//substring:返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾
String targerdir = ((targetFile.getAbsolutePath().endsWith("\\")?targetFile.getAbsolutePath():targetFile.getAbsolutePath()+"\\")+srcFile.getAbsolutePath().substring(3));
out = new FileOutputStream(targerdir);
//设置读取文件的速度
byte[] bytes = new byte[1024*1024];//每次读取1M文件
int readCount = 0;
//read():当文件中没有字节可读的时候,返回-1
while((readCount = in.read(bytes))!= -1) {
//一次向目的地写readCount个字节(读到多少就写多少)
out.write(bytes, 0, readCount);
}
//刷新
out.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(out != null) {
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return ;
}
//############################################################
//文件夹拷贝
//将原目录下的文件和文件夹列出来
File[] bytes1 = srcFile.listFiles();
for(File one:bytes1) {
//若是数组中的内容是文件夹的话
if(one.isDirectory()) {
String srcdir = srcFile.getAbsolutePath().substring(3);
String targetdir =( targetFile.getAbsolutePath().endsWith("\\")?targetFile.getAbsolutePath():targetFile.getAbsolutePath()+"\\")+srcdir;
File target = new File(targetdir);
if(!target.exists()) {
target.mkdirs();
}
}
//通过递归不断地复制
copy(one,targetFile);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
DirectoryCopy file = new DirectoryCopy();
File source = new File("G:\\SoftwareFile\\JavaSoftware\\TenFileDrill");
File targer = new File("F:\\Mubiao");
file.copy(source, targer);
}
}