文件拷贝使用io流将一个指定目录文件拷贝到另一个磁盘的位置上
涉及知识点:缓冲流、文件字符流、File类、获取当前系统时间毫秒值、异常处理
编写时间:2019/7/20
具体思路如下:
1、先从简单的入手,考虑一下如何复制文件?所以我们创建一个类之后,可以先编写一个拷贝文件的方法,有两个参数:分别为:被拷贝文件路径和终点位置。流的输入输出概念是针对程序而言的,所以我们要先从起点位置将内容复制到程序中,可以使用FileInputStream,也可以使用缓冲字符流将FileInputStream放进BufferedInputStream的参数中。其作用在于提高读写效率。接着我们用一个大一点的byte数组去接收。定义一个int类型变量接收read()方法的字节数作判断,当等于-1时,说明数据读完了。同时,在读的时候也就是在while循环的时候使用BufferedOutputStream的write方法写入目标地址。
2、文件复制解决了,那如果我们要复制的是目录呢?如果我们还用上面那个方法,回报该目录拒绝访问的错误。所以我们再编写一个方法,该方法中首先判断一下该目录是否存在,使用exists()方法进行判断,若不存在则调用mkdir()方法创建目录(mkdirs()方法用于创建多级目录)。是目录则使用listFiles()方法获取指定目录下的所有文件。该结果是一个数组,所以可以使用加强for循环(for-each)遍历。也可以用普通for循环。由于目录里面可能还会有目录,所以再循环中还要进行一次是不是文件的判断,是文件,则可以复用刚刚编写的拷贝文件的方法。如果不是,则自己调用自己。是一个递归思想。
3、最后编写main方法,创建两个file,传入对应地址,调用相对于方法即可。具体代码如下:
package com.bjsxt.interface1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TextCopyFile {
public static void main(String[] args) {
File file1=new File("D:\\笔记\\笔记");//被复制的文件地址
File file2=new File("F:\\笔记");//目的地
//copyFile(file1,file2);测试复制文件是否可以成功
long start=System.currentTimeMillis();//获取当前系统毫秒值
copyDir(file1,file2);
long end=System.currentTimeMillis();
System.out.println(end-start);//将量毫秒值相减就是复制文件一共执行的时间
}
private static void copyDir(File file1, File file2) {
//先判断目标文件是否存在
if(!file2.exists()) {
file2.mkdir();
}
//获取指定目录下的所有文件
File[] f = file1.listFiles();
for (File file : f) {
if(file.isFile()) {//如果该文件是文件,则进行拷贝
copyFile(new File(file1+"\\"+file.getName()),new File(file2+"\\"+file.getName()));
}else {//不是文件,则递归调用该方法本身
copyDir(new File(file1+"\\"+file.getName()),new File(file2+"\\"+file.getName()));
}
}
}
private static void copyFile(File file1, File file2) {
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {
bis = new BufferedInputStream(new FileInputStream(file1));
bos = new BufferedOutputStream(new FileOutputStream(file2));
byte[] buf=new byte[1024];
int len=0;
while((len=bis.read(buf))!=-1) {
bos.write(buf,0,len);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(bos!=null) {
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(bis!=null) {
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
执行结果图:
以下是不使用缓冲流进行文件复制的代码。效率很低。感兴趣的可以用System.currentTimeMillis()方法测试下拷贝所用时间。
private static void copyFile(File fstart, File fend) {
FileInputStream fis=null;
FileOutputStream fos=null;
try {
fis = new FileInputStream(fstart);
fos = new FileOutputStream(fend);
byte[] buf=new byte[1024];
int len=0;
while((len=fis.read())!=-1) {
fos.write(buf,0,len);
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
if(fos!=null) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fis!=null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}