这两天学习到了IO流方面的知识,简单来讲就是文件的输入和输出操作
然后就想着通过java的io流和File类的文件操作实现某个文件夹的复制拷贝,本来还想加一个文件压缩的函数,但是学艺未精,后面再说吧。
具体思路如下:一开始想着先把文件夹下所有的子文件夹都通过File类里的mkdirs方法全部创建下来,然后,重新遍历文件夹copy一些文件,但是这样我就要遍历两次,有点麻烦。
然后,想到所有的文件都存放在文件夹里,我遍历到每一个文件,然后获取前一目录,创建文件夹,复制文件,直接一步到位,但是如果有空文件夹就会直接跳过,复制不了,所有得再加一个判断文件夹是否为空的语句。
import java.io.*;
public class getDirectory {
String oldpath;//复制的原路径
String newpath;//复制的目标路径
getDirectory(String oldpath,String newpath){
this.oldpath=oldpath;
this.newpath=newpath;
}
public void copy(){
File file=new File(oldpath);
getdir(file);
}
private void getdir(File file) {
File[] f;//存储文件夹下子目录信息
f = file.listFiles();//返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
for (File f1 : f) {
if (f1.isDirectory()) {//判断子目录是否为文件夹
if (f1.list().length==0){//判断子目录是不是空文件夹
System.out.println(f1.getPath());//打印空文件路径(测试)
File fcopy = new File(f1.getPath().replace(oldpath, newpath));//这里替换原路径和目标路径
fcopy.mkdirs();//如果是空文件夹就直接创建一个空的目录,
}
getdir(f1);//如果不是空的就继续遍历。
} else if (f1.isFile()) {//判断是不是文件,如果是,获取当前目录,替换路径字符串,然后进行复制
File fcopy = new File(f1.getParent().replace(oldpath, newpath));
fcopy.mkdirs();
FileInputStream fis= null ;
BufferedInputStream bis= null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
byte[] b=new byte[1024];
int temp=0;
try {
fis = new FileInputStream(f1);
bis = new BufferedInputStream(fis);
fos = new FileOutputStream(new File(f1.getPath().replace(oldpath, newpath)));
bos = new BufferedOutputStream(fos);
while ((temp=bis.read(b))!=-1){
bos.write(b);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bos!=null)
bos.close();
if (fos!=null)
fos.close();
if (bis!=null)
bis.close();
if (fis!=null)
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
在主函数里建立这个类,调用copy方法传入要复制的文件信息
import java.io.File;
public class fileCopyAndZip {
public static void main(String[] args) {
String oldpath="E:\text";//复制的原路径
String newpath="E:\text2";//复制的目标路径
File file=new File(oldpath);
getDirectory g=new getDirectory(oldpath,newpath);
g.copy();
}
}
经过测试确实复制了份文件,包括空白文件夹



