1.CopyFile类是拷贝单独的一个文件的类,里面有三个静态方法,分别实现拷贝一个文件的要求,其中 批量拷贝(多字节):效率最高,所以应该多使用此中方法,具体测试这个类的效率,由测试类Test1实现。
package com.imooc;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyFile {
/**
* 拷贝单个文件(单字节):效率最低
*
* @param srcFile
* 源文件
* @param destFile
* 目标文件
* @throws IOException
* IO异常
*/
public static void copyFileByByte(File srcFile, File destFile) throws IOException {
if (!srcFile.exists())
throw new IllegalArgumentException("文件:" + srcFile + "不存在.");
if (!srcFile.isFile())
throw new IllegalArgumentException(srcFile + "不是文件.");
// 输入流 (读)
FileInputStream in = new FileInputStream(srcFile);
// 输出流 (写)
FileOutputStream out = new FileOutputStream(destFile);
int b;
while ((b = in.read()) != -1) {
out.write(b);
out.flush();
}
// 先关闭输入流,再关闭输出流、
in.close();
out.close();
}
/**
* 批量拷贝(多字节):效率最高
*
* @param srcFile
* 源文件
* @param destFile
* 目标文件
* @throws IOException
* IO异常
*/
public static void copyFileByBytes(File srcFile, File destFile) throws IOException {
if (!srcFile.exists())
throw new IllegalArgumentException("文件:" + srcFile + "不存在.");
if (!srcFile.isFile())
throw new IllegalArgumentException(srcFile + "不是文件.");
// 输入流 (读)
FileInputStream in = new FileInputStream(srcFile);
// 输出流 (写)
FileOutputStream out = new FileOutputStream(destFile);
// 读到的内容以字节的形式存储在字节数组buf中;
byte[] buf = new byte[100]; // 字节数组(缓冲区)长度100字节
// 如果读取的源文件大小超过100字节,则表示每读取100字节后,就写入100字节,
// 但最后一次时,读取的大小应该是(源文件大小减去N*100)<100字节,N表示读的次数,
// 然后继续读取,直到文件读完毕
// 如果文件大小小于100字节,则表示一次即可读完文件,并写入新的文件
int b;
while ((b = in.read(buf, 0, buf.length)) != -1) {
out.write(buf, 0, b);
// System.out.println(b); // 这里可以显示每次读取或写入的字节数
out.flush(); // 刷新
}
// 先关闭输入流,再关闭输出流、
in.close();
out.close();
}
/**
* 使用缓冲区拷贝:效率中等
*
* @param srcFile
* 源文件
* @param destFile
* 目标文件
* @throws IOException
* IO异常
*/
public static void copyFileByBuffered(File srcFile, File destFile) throws IOException {
if (!srcFile.exists())
throw new IllegalArgumentException("文件:" + srcFile + "不存在.");
if (!srcFile.isFile())
throw new IllegalArgumentException(srcFile + "不是文件.");
// 输入流 (读)
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
// 输出流 (写)
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
int b;
while ((b = bis.read()) != -1) {
bos.write(b);
bos.flush(); // 刷新
}
// 先关闭输入流,再关闭输出流、
bis.close();
bos.close();
}
}
Test1类,测试CopyFile类里的三个静态方法的性能
package com.imooc;
import java.io.File;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) {
long begin, end;
try {
// 一次读取一个字节(效率最低)
begin = System.currentTimeMillis();
CopyFile.copyFileByByte(new File("微信_2.0.0.37.exe"), new File("21.exe"));
end = System.currentTimeMillis();
System.out.println("copyFileByByte()" + (end - begin));
// 一次读取多个字节(效率最高)
begin = System.currentTimeMillis();
CopyFile.copyFileByBytes(new File("微信_2.0.0.37.exe"), new File("22.exe"));
end = System.currentTimeMillis();
System.out.println("copyFileByBytes()" + (end - begin));
// 通过缓冲区读取(效率中等)
begin = System.currentTimeMillis();
CopyFile.copyFileByBuffered(new File("微信_2.0.0.37.exe"), new File("23.exe"));
end = System.currentTimeMillis();
System.out.println("copyFileByByteBuffered()" + (end - begin));
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
}
2、 复制一个目录及其子目录下的所有或目录文件到另外一个目录
package com.imooc;
import java.io.File;
import java.io.IOException;
public class CopyFolder {
/**
* 复制一个目录及其子目录、文件到另外一个目录
*
* @param src
* 源目录或文件
* @param dest
* 目标目录或文件
* @throws IOException异常
*/
public static void copyFolder(File src, File dest) throws IOException {
if (src.isDirectory()) {
if (!dest.exists()) { //目标目录不存在,则创建目录
dest.mkdir();
}
String files[] = src.list(); //返回源目录下的文件及子目录
for (String file : files) {
System.out.println("src="+src);
System.out.println("file="+file);
File srcFile = new File(src, file);
System.out.println("srcFile="+srcFile);
File destFile = new File(dest, file);
// 递归调用
copyFolder(srcFile, destFile);
}
} else {// src是文件
CopyFile.copyFileByBytes(src, dest);
}
}
}
Test2是测试类,用于测试CopyFolder类的功能
package com.imooc;
import java.io.File;
import java.io.IOException;
public class Test2 {
public static void main(String[] args) throws IOException {
CopyFolder.copyFolder(new File("C:\\docs\\api"), new File("D:\\12"));
}
}
热门评论
拷贝文件目录,递归调用算法有问题