1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
2.获取指定目录及子目录下所有txt文件的个数,并将这些txt文件复制到D盘下任意目录
实现代码:
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class HomeWork1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入读取的文件路径:");
// 源文件夹
File file1 = new File(sc.next());//测试路径:D:\360MoveData\Users\xucc\Desktop\aaa
System.out.print("请输入目标文件夹路径:");
// 目标文件夹
File file2 = new File(sc.next());//测试路径:D:\360MoveData\Users\xucc\Desktop\a
copyFiles(file1 , file2);
// 只复制txt文件
List<File> list = new ArrayList<>();//利用数组统计txt文件个数
System.out.print("请输入复制txt文件目标文件夹路径:");
copyTxtFiles(file1, new File(sc.next()),list);//测试路径:D:\\360MoveData\\Users\\xucc\\Desktop\\TXT
System.out.println("txt文件共有"+list.size()+"个");
sc.close();
}
// 复制全部文件
public static void copyFiles(File file1 , File file2) {
File[] fileArr = file1.listFiles();
// 遍历源文件中的所有文件
for(File f : fileArr) {
// 获取目标文件路径
String filePath = file2.toString()+f.toString().substring(file1.toString().length());
if(!f.isDirectory()) {
copy(f.toString(), filePath);
}
else {
createFile(filePath);//如果文件是源文件的子文件夹,在目标文件中创建子文件夹
copyFiles(f , new File(filePath));
}
}
}
// 创建文件夹
public static void createFile(String name) {
File newfile = new File(name);
if(newfile.mkdir() == true)
System.out.println("创建文件夹成功");
}
// 只复制文件夹中的txt文件
public static void copyTxtFiles(File file1 , File file2,List<File> list) {
File[] fileArr = file1.listFiles(new JudgeTXT());
// 遍历源文件中的所有文件
for(File f : fileArr) {
// 获取目标文件路径
String filePath = file2.toString() + f.toString().substring(file1.toString().length());
if(!f.isDirectory()) {
list.add(f);
copy(f.toString(), filePath);
}else{
createFile(filePath);//如果文件是源文件的子文件夹,在目标文件中创建子文件夹
copyTxtFiles(f, new File(filePath),list);
}
}
}
// 复制文件方法
public static void copy(String sourseF , String targetF) {
// 先声明引用变量,提升作用范围
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(sourseF);
fos = new FileOutputStream(targetF);
byte[] buff = new byte[1024];//建立一个缓冲容器,可以一次可以读取多个字节
int len = 0;
// 边读边写
while((len = fis.read(buff)) != -1) {
fos.write(buff,0,len);
fos.flush();
}
} catch (IOException e) {
System.out.println(e);
throw new RuntimeException( "文件复制异常中断,复制失败!");
}finally { //关流一定要放在finally里,因为关流是一定要执行的
try {
if(fos!=null) //判断fos的对象是否建立成功,,如果fos=null,就不用关流,释放资源
fos.close();
} catch (IOException e) {
throw new RuntimeException( "释放资源失败!");
}finally {
try {
if(fis!=null) //判断fis的对象是否建立成功,如果fis=null,就不用关流,释放资源
fis.close();
} catch (IOException e2) {
throw new RuntimeException( "释放资源失败!");
}
}
}
}
}
class JudgeTXT implements FileFilter{
//判断文件中有没有txt文件和文件夹,如果有,则放入File数组中
public boolean accept(File pathname) {
int index = pathname.toString().indexOf(".");
String s = pathname.toString().substring(index+1);//获取文件后缀名
if(s.equals("txt") || pathname.isDirectory())//判断文件后缀名是否是txt
return true;
return false;
}
}