一、文件或目录的拷贝
此次程序里面涉及到了IO流,运用到了IO流中的字节流(FileInputStream,FilOutputSream),流的学习其实是很有规律的,一般都是成对出现,有输入流就有对应的输出流(特别提示,这里打印流是列外),这里既然是文件的拷贝,肯定也涉及到了File类的一般常用方法的调用。
注意在本次程序中,用到了一个非常实用的方法,就是方法的回调(个人理解,比较像循环语句一样,一直循环使用,达到了某个条件就结束循环一样)话不多说,上图。
运行完毕之后没有任何报错:这里我是将D盘的javacode文件夹下的内容,拷贝到E盘下的javacode1文件夹下。
效果:
这是D盘里的文件
这是E盘里的文件:
二、代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Objects;
public class Test2 {
public void findAll(File source, File target) {
File[] file = source.listFiles();
if (Objects.nonNull(file)) {
for (int i = 0; i < file.length; i++) {
File sour = file[i];
File tar = new File(target, sour.getName());//考虑容错问题
// if(!tar.exists()){
// if(!tar.mkdir()){
// System.out.println("失败失败");
// }
// }
if (sour.isFile()) {
copy(sour, tar);
} else {
tar.mkdir();
findAll(sour, tar);
}
}
}
}
public void copy(File source, File target) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(source);
fos = new FileOutputStream(target);
byte[] b = new byte[1024];
int len = 0;
while ((len = fis.read(b)) != -1) {
fos.write(b, 0, len);
}
} catch (Exception e) {
} finally {
if (fis != null) {
try {
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
File f1 = new File("D:\\javacode");
File f2 = new File("E:\\javacode1");
new Test2().findAll(f1, f2);
}
}
三、总结
在实现这个文件拷贝之前,我是将之前所学的,File类, 字节流,联系到一起,这个方法可能不是最佳写法,建议可以考虑文件的容错问题(比如文件已存在怎么处理),实现原理基本一致,做这个方法之前,一定要在脑海有IO流的一个整体框架图,做起来才可能事半功倍!