代码简介:利用字节缓冲输入输出流复制单文件、单级文件夹里的文件或文件夹以及多级文件夹里的文件或文件夹
如果srcFile是文件时,则调用copyFile方法。因为要复制的文件有图片和视频资源,所以采用字节缓冲输入输出流,同时为了提高读取速度,采用一次读取一个字节数组的数据来复制文件。
// 复制文件
private static void copyFile(File srcFile, File destFile) throws IOException {
// 创建字节缓冲输入流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
// 创建字节缓冲输出流对象
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
//一次读入一个字节数组的数据
byte[] bys = new byte[1024];
int len;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
//释放资源
bos.close();
bis.close();
}
如果srcFile是一个文件夹时,则调用copyFolder方法。
//复制文件夹
private static void copyFolder(File srcFile, File destFile) throws IOException {
//如果srcFile为目录,首次调用即是判断test是否为目录
if (srcFile.isDirectory()) {
String srcFileName = srcFile.getName(); //获取目录名,首次调用时目录名为test
//在destFile下新建一个名为srcFile的目录,首次调用时即在code2目录下创建test目录
File newFolder = new File(destFile, srcFileName);
// 如果目录不存在,则新建目录
if (!newFolder.exists()) {
newFolder.mkdir();
}
// 将srcFile目录下的文件或目录存入文件数组中
File[] listFiles = srcFile.listFiles();
// 遍历test目录下所有的文件
for (File file : listFiles) {
// 利用递归将file作为srcFile,newFolder作为destFile调用copyFolder方法
copyFolder(file, newFolder);
}
} else {
String srcFileName = srcFile.getName();
File newFile = new File(destFile, srcFileName);
copyFile(srcFile, newFile);
}
}
主方法:
public static void main(String[] args) throws IOException {
// 创建数据源File对象srcFolder,路径为文件或目录原本存放的位置+文件或目录名,自己根据实际情况而定
// 此处文件名为test,存放于C:\Users\Administrator\Desktop
File srcFile = new File("C:\\Users\\Administrator\\Desktop\\test");
// 创建目的地File对象destFolder,路径为你想要存放的位置,此处想存放的位置为我Java项目下的code2模块下
File destFile = new File("code2");
//如果test为文件
if (srcFile.isFile()) {
String srcFileName = srcFile.getName(); //获取文件名
File newFile = new File(destFile, srcFileName); //创建新的目的地File对象
copyFile(srcFile, newFile); //复制文件
} else {
copyFolder(srcFile, destFile);
}
}
完整代码:
import java.io.*;
public class CopyFoldersTest {
public static void main(String[] args) throws IOException {
// 创建数据源File对象srcFolder,路径为文件或目录原本存放的位置+文件或目录名,自己根据实际情况而定
// 此处文件名为test,存放于C:\Users\Administrator\Desktop
File srcFile = new File("C:\\Users\\Administrator\\Desktop\\test");
// 创建目的地File对象destFolder,路径为你想要存放的位置,此处想存放的位置为我Java项目下的code2模块下
File destFile = new File("code2");
//如果test为文件
if (srcFile.isFile()) {
String srcFileName = srcFile.getName(); //获取文件名
File newFile = new File(destFile, srcFileName); //创建新的目的地File对象
copyFile(srcFile, newFile); //复制文件
} else {
copyFolder(srcFile, destFile);
}
}
//复制文件夹
private static void copyFolder(File srcFile, File destFile) throws IOException {
//如果srcFile为目录,首次调用即是判断test是否为目录
if (srcFile.isDirectory()) {
String srcFileName = srcFile.getName(); //获取目录名,首次调用时目录名为test
//在destFile下新建一个名为srcFile的目录,首次调用时即在code2目录下创建test目录
File newFolder = new File(destFile, srcFileName);
// 如果目录不存在,则新建目录
if (!newFolder.exists()) {
newFolder.mkdir();
}
// 将srcFile目录下的文件或目录存入文件数组中
File[] listFiles = srcFile.listFiles();
// 遍历test目录下所有的文件
for (File file : listFiles) {
// 利用递归将file作为srcFile,newFolder作为destFile调用copyFolder方法
copyFolder(file, newFolder);
}
} else {
String srcFileName = srcFile.getName();
File newFile = new File(destFile, srcFileName);
copyFile(srcFile, newFile);
}
}
// 复制文件
private static void copyFile(File srcFile, File destFile) throws IOException {
// 创建字节缓冲输入流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
// 创建字节缓冲输出流对象
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
//一次读入一个字节数组的数据
byte[] bys = new byte[1024];
int len;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
//释放资源
bos.close();
bis.close();
}
}
刚开始写文章,文章有什么问题的话欢迎评论指正,各位觉得写得还行的话给个点赞加关注呗,感谢大家!