Java文件夹复制操作
字节输入流FileInputStream、字节输出流FileOutputStream
- 通过递归算法将源文件夹的文件及文件夹进行递归遍历
- FileInputStream读取文件,通过FileOutStream将文件写到目标路径中
package IO流;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 复制文件夹
*
* @author hp
*
*/
public class Test3 {
public static void main(String[] args) {
File source = new File("d:/temp");
File target = new File("d:/temp2/Test");
listFiles(source, target);
System.out.println("复制完毕!");
}
/**
* 罗列文件及文件夹
* 递归遍历执行copyFile方法最终实现文件夹复制
* @param source
* @param target
*/
public static void listFiles(File source, File target) {
//定义File数组
File[] files = null;
if (source.exists()) {
//将source路径下的所有文件列出来,通过listFiles方法返回File数组
files = source.listFiles();
}
if(!target.exists()) {
//target目标文件夹不存在时,创建target文件夹
target.mkdirs();
System.out.println("创建一个"+target.getAbsolutePath()+"文件夹");
}
//如果source文件下存在文件及文件夹执行for循环语句
if(files!=null) {
for(int i=0;i<files.length;i++) {
//创建一个File对象
File temp=new File(target,files[i].getName());
//判断是否是文件,false则是文件夹
if(files[i].isFile()) {
//执行copuFile()方法复制文件
copyFile(files[i],temp);
}else {
//当for循环遍历到一个文件夹时,递归调用listFiles()方法
listFiles(files[i],temp);//重要操作!!!
}
}
}
}
/**
* 复制文件
* @param source
* @param target
*/
public static void copyFile(File source, File target) {
// 定义变量
FileInputStream fi = null;
FileOutputStream fo = null;
try {
// 初始化IO流对象
fi = new FileInputStream(source);
fo = new FileOutputStream(target);
// 定义字节数组,用来存放输入流读取的字节
byte[] b = new byte[1024];
// 定义一个整型len,主要用来记录输入流读取字节长度,
// 1 判断文件是否读取完毕 2 确定输出流写入到文件的字节数
int len = 0;
// 输入流读取文件到末尾时,返回-1
while ((len = fi.read(b)) != -1) {
// 输出流将字节数组写入到文件中去
fo.write(b, 0, len);
}
System.out.println(source.getAbsolutePath()+"--->>>"+target.getAbsolutePath()+"复制完成!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭IO流!!!
if (fi != null) {
try {
fi.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fo != null) {
try {
fo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果
创建一个d:\temp2\Test文件夹
d:\temp\44588de6-41d3-4622-b853-0a66396cba39.jpg--->>>d:\temp2\Test\44588de6-41d3-4622-b853-0a66396cba39.jpg复制完成!
创建一个d:\temp2\Test\a文件夹
创建一个d:\temp2\Test\a\a文件夹
创建一个d:\temp2\Test\a\a\a文件夹
创建一个d:\temp2\Test\a\a\a\a文件夹
d:\temp\a\a\a\test2.zip--->>>d:\temp2\Test\a\a\a\test2.zip复制完成!
d:\temp\a\a\test2.zip--->>>d:\temp2\Test\a\a\test2.zip复制完成!
d:\temp\a\test2.zip--->>>d:\temp2\Test\a\test2.zip复制完成!
d:\temp\a\新建位图图像.bmp--->>>d:\temp2\Test\a\新建位图图像.bmp复制完成!
d:\temp\a\新建文本文档.txt--->>>d:\temp2\Test\a\新建文本文档.txt复制完成!
d:\temp\b3d83a8c-1696-427d-b847-bc14509cd276.jpg--->>>d:\temp2\Test\b3d83a8c-1696-427d-b847-bc14509cd276.jpg复制完成!
d:\temp\f0da2deb-5d4f-46ad-bc9a-e9c962360db4.jpg--->>>d:\temp2\Test\f0da2deb-5d4f-46ad-bc9a-e9c962360db4.jpg复制完成!
d:\temp\f151a814-4a98-4e66-9bb3-c8d610975041.jpg--->>>d:\temp2\Test\f151a814-4a98-4e66-9bb3-c8d610975041.jpg复制完成!
创建一个d:\temp2\Test\test文件夹
创建一个d:\temp2\Test\test\e文件夹
d:\temp\test\e\test2.txt--->>>d:\temp2\Test\test\e\test2.txt复制完成!
d:\temp\test\e\test3.txt--->>>d:\temp2\Test\test\e\test3.txt复制完成!
d:\temp\test\e\test4.txt--->>>d:\temp2\Test\test\e\test4.txt复制完成!
d:\temp\test\test2.txt--->>>d:\temp2\Test\test\test2.txt复制完成!
d:\temp\test\test3.txt--->>>d:\temp2\Test\test\test3.txt复制完成!
d:\temp\test\test4.txt--->>>d:\temp2\Test\test\test4.txt复制完成!
d:\temp\test.txt--->>>d:\temp2\Test\test.txt复制完成!
d:\temp\test.xmind--->>>d:\temp2\Test\test.xmind复制完成!
d:\temp\test.zip--->>>d:\temp2\Test\test.zip复制完成!
d:\temp\test2.txt--->>>d:\temp2\Test\test2.txt复制完成!
d:\temp\test2.zip--->>>d:\temp2\Test\test2.zip复制完成!
d:\temp\test3.txt--->>>d:\temp2\Test\test3.txt复制完成!
d:\temp\test4.txt--->>>d:\temp2\Test\test4.txt复制完成!
复制完毕!
-------如果想使用BufferedInputStream、BufferedOutputStream进行文件夹复制操作的话,可以将FileInputStream、FileOutputStream作为节点流操作即可
例如:
BufferedInputStream br=new BufferedInputStream(new FileInputStream);
BufferedOutputStream br=new BufferedOutputStream(new FileOutputStream);