前言
这两天系统的学习了基于java.io.*;包下的IO流相关的内容。就尝试着自己实现了目录拷贝,测试通过后,迫不及待分享给大家。感兴趣的就往下看吧。
需求分析
其实在使用电脑时,拷贝文件十分常见。可以说就是“Ctrl + c” 再“Ctrl + v” 的事情。其原理其实并不复杂:
1)首先,待拷贝的源文件的部分内容被读取到内存;
2)接着,将内存里的内容读取到目的路径下;
3)然后,判断源文件是否还有内容未读取(拷贝),是则继续拷贝,否则结束。
本次项目的实现主要涉及java.io包下的三个类:
1)FileInputStream
该类可以用来读入任何类型的文件
2)FileOutputStream
该类可以用来输出文件
3)File
该类主要用来处理文件:判断文件是文件夹还是文件、判断文件是不是隐藏文件、获取文件夹下所有文件等
源代码
1)拷贝文件夹(不包括内容)
【CopyMuLu.java】
import java.io.*;
public class CopyMuLu {
public File copymulu(File fileCopy,File f){
File newf = new File(fileCopy.getAbsoluteFile() + "\\" + f.getName());
if(!newf.exists()) {
newf.mkdir();
}
return new File(newf.getAbsolutePath());
}
}
2) 拷贝文件
【CopyFile.java】
import java.io.*;
public class CopyFile {
public void copyfile(File file, File fileCopy, File f){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//拼接源路径、目标路径
fis = new FileInputStream(file.getAbsolutePath() + "\\" + f.getName());
fos = new FileOutputStream(fileCopy.getAbsoluteFile() + "\\" + f.getName());
byte[] b = new byte[1024*1024];//中转,将内容暂存于此
int count = 0;
while((count = fis.read(b)) != -1) {
fos.write(b, 0, count);
}
//刷新
fos.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {//关闭文件
fos.close();
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3) 套娃
【Copyyy.java】
拷贝指定目录下的直接文件、文件夹:
a. 文件直接复制;
b. 文件夹只拷贝文件夹(不拷贝文件夹内容),同时递归实现套娃(新建一个对象传入两个参数:当前源文件作为新对象的源文件;当前目的文件作为新对象的目的文件)
import java.io.File;
public class Copyyy {
public void copyyy(File file, File fileCopy){
if(!fileCopy.exists()) {//目标文件不存在则创建
fileCopy.mkdir();
}
File[] files = file.listFiles();
for(File f : files) {
if(f.isHidden()) {//不拷贝隐藏文件
continue;
}
if(f.isFile() ) {
CopyFile cf = new CopyFile();
cf.copyfile(file, fileCopy, f);
}else {
CopyMuLu cml = new CopyMuLu();
File n = cml.copymulu(fileCopy, f);
//套娃
Copyyy c1 = new Copyyy();
c1.copyyy(f, n);
}
}
}
}
4)测试
【Test.java】
测试案例我选择将"E:\CopyTest"目录下的所有文件拷贝到“F:\copy”目录下的。即:
源目录:E:\CopyTest
目的目录:F:\copy
运行前目录情况:
import java.io.File;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("E:\\CopyTest");//待拷贝目录
File fileCopy = new File("F:\\copy");//目标目录
Copyyy c = new Copyyy();
c.copyyy(file, fileCopy);
}
}
运行后对应目录情况:
测试效果