文件夹的复制
前言
在Java中,复制文件夹,需要用到的是IO流技术。下面我将分别介绍单级文件夹和多级文件夹的复制。
一、单级文件夹的复制
(文件夹里面只有文件 不包含子文件夹)
需求:把"E:\english"这个文件夹复制到E:\CloudMusic目录下。
思路:
- 创建数据源目录File对象,路径是E:\english
- 获取数据源目录File对象的名称(english)
- 创建目的地目录File对象,路径名是目的地目录+english组成:E:\CloudMusic\english
- 判断目的地目录对应的File是否存在,如果不存在,就创建
- 获取数据源目录下所有文件的File数组
- 遍历File数组,得到每一个File对象,其实就是数据源文件
- 获取数据源文件File的名称(mn.jpg)
- 创建目的地文件File对象,路径名是目的地目录+mn.jpg组成:E:\CloudMusic\english\mn.jpg
- 复制文件
由于文件不仅仅是文本文件,还有图片,所以采用字节流复制文件
1.main方法
代码如下(示例):
public static void main(String[] args) throws IOException {
//创建数据源目录File对象,路径是E:\english
File srcFolder = new File("E:\\english");
//获取数据源目录File对象的名称(english)
String srcFolderName = srcFolder.getName();
//创建目的地目录File对象,路径名是目的地目录+english组成E:\\CloudMusic\\english
File destFolder = new File("E:\\CloudMusic", srcFolderName);
// 判断目的地目录对应的File是否存在,如果不存在,就创建
if (!destFolder.exists()) {
destFolder.mkdir();
}
//获取数据源目录下所有文件的File数组
File[] listFiles = srcFolder.listFiles();
//遍历File数组,得到每一个File对象,其实就是数据源文件
for (File srcFile : listFiles) {
String srcFileName = srcFile.getName();
// 创建目的地文件File对象,路径名是目的地目录+mn.jpg组成E:\\CloudMusic\\english\\mn.jpg
File destFile = new File(destFolder, srcFileName);
//复制文件
copyFile(srcFile, destFile);
}
}
2.字符缓冲流复制文件
代码如下(示例):
public static void copyFile(File srcFile, File destFile) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] bytes = new byte[1024];
int length;
while ((length = bis.read(bytes)) != -1) {
bos.write(bytes, 0, length);
}
bis.close();
bos.flush();
bos.close();
}
运行结果如下:
二、多级文件夹的复制
(文件夹里面包含子文件夹 子文件夹里面也可能包含子文件夹)
需求:把"E:\english"复制到F盘目录下
思路:
- 创建数据源File对象,路径是E:\english
- 创建目的地File对象,路径是F:\
- 写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
- 判断数据源File对象是否是目录
是:- 在目的地下创建和数据源File名称一样的目录
- 获取数据源File下所有文件或者目录的File数组
- 遍历该File数组,得到每一个File对象
- 把该File作为数据源File对象,递归调用复制文件夹的方法
不是:
说明是文件,直接复制,由于文件不仅仅是文本文件,
可能还有图片,所以采用字节流复制文件
1.main方法
代码如下(示例):
public static void main(String[] args) throws IOException {
//创建数据源File对象,路径是E:\english
File srcFile = new File("E:\\english");
//创建目的地File对象,路径是F:\\
File destFile = new File("F:\\");
//写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
copyFolder(srcFile, destFile);
2.复制文件夹
代码如下(示例):
public static void copyFolder(File srcFile, File destFile) throws IOException {
//判断数据源File对象是否是目录
if (srcFile.isDirectory()) {
String srcFileName = srcFile.getName();
//在目的地下创建和数据源File名称一样的目录
File newFolder = new File(descFile, srcFileName);//F:\\english
if (!newFolder.exists()) {
newFolder.mkdir();
}
//获取数据源File下所有文件或者目录的File数组
File[] fileArray = srcFile.listFiles();//返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
//遍历该File数组,得到每一个File对象
for (File file : fileArray) {
//把该File作为数据源File对象,递归调用复制文件夹的方法
copyFolder(file, newFolder);
}
} else {
//不是,说明是文件,直接复制,采用字节流复制文件
File newFile = new File(destFile, srcFile.getName());
copyFile(srcFile, newFile);
}
}
3.字符缓冲流复制文件
代码如下(示例):
public static void copyFile(File srcFile, File destFile) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] bytes = new byte[1024];
int length;
while ((length = bis.read(bytes)) != -1) {
bos.write(bytes, 0, length);
}
bis.close();
bos.flush();
bos.close();
}
运行结果如下:
总结
多级文件夹的复制,得用到递归调用。当要复制文件夹时,用listFiles()方法得到文件夹的所有File,然后用增强for循环遍历所有的File对象,再判断他们是文件夹还是文件,递归调用。版权声明:本文为qq_45117196原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。