//使用字节流访问一个路径下的文件夹,遍历复制含有java文件的文件夹
package com.itheima_02;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Test02_2 {
public static void main(String[] args) throws IOException {
// File src = getDir();
// File dest = getDir();
//源目录
File src = new File("D:\\workspace");
//目标目录
File dest = new File("d:\\copy");
copy(src, dest);
}
private static void copy(File src, File dest) throws IOException {
// 获取源文件夹中的所有内容(子文件夹和文件)
File[] listFiles = src.listFiles();
// 判断File数组是否为空(因为系统有些隐藏文件不能被直接访问)
if(listFiles != null){
// 遍历File数组
for (File subFile : listFiles) { // subFile表示 这个数组中(源文件)的 子文件夹和文件
if(subFile.isFile() && subFile.getName().endsWith(".java")){ // 判断这个File是否为文件并且是否以.java为后缀名结尾
// 使用IO流拷贝文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(dest, subFile.getName())));
byte[] buf = new byte[1024];
int len;
while((len = bis.read(buf)) != -1){
bos.write(buf, 0, len);
}
bos.close();
bis.close();
} else if(subFile.isDirectory()){
// 由于subFile是代表源文件夹中的子文件夹,而目的地中并没有这个目录(即subFile), 所以需要现在目标文件夹中创建 这个目录
// 为啥非要在目的地中创建subFile文件夹呢? 因为,subFile文件夹中有可能有文件,而这个subFile里边的文件必须得拷贝目标文件夹中的subFile这个目录中,所以需要在目的地中创建这个subFile目录
// 若要创建文件夹,必须通过File对象
if(compare(subFile)){ // D:\\workspace\\abc
File newDir = new File(dest, subFile.getName());
if(!newDir.exists())
newDir.mkdir();
// 递归调用此方法
copy(subFile, newDir);
}
}
}
}
}
/*
* 要确定是否在目标文件夹中创建这个目录,只需要明确传递过来的文件夹中,是否有包含.java文件
* 举例:
* 判断 D:\\workspace文件夹中是否有以.java结尾的文件
* 只要D:\\workspace文件夹中当前目录有.java文件或者D:\\workspace目录的子文件夹中有.java文件,都称之为D:\\workspace文件夹中有.java文件
*/
private static boolean compare(File dir) { // D:\\workspace\\abc
// D:\\workspace\\abc\\exam0425
// aa
//cc
// bb
//dd
File[] listFiles = dir.listFiles(); // listFiles代表当前路径下的所有文件和文件夹
if(listFiles != null){
for (File subFile : listFiles) { // D:\\workspace\\abc\\exam0425 D:\\workspace\\abc\\RemoteSystemsTempFiles
if(subFile.isFile() && subFile.getName().endsWith(".java")){
return true;
} else if(subFile.isDirectory()){ // D:\\workspace\\abc\\exam0425
boolean flag = compare(subFile);
if(flag == false){
continue;
} else{
return flag;
}
}
}
}
return false;
}
// 键盘录入文件夹路径
private static File getDir() {
Scanner sc = new Scanner(System.in);
while(true){
System.out.println("请输入一个文件夹路径字符串:");
String line = sc.nextLine();
// 将字符串转换成File对象,因为只有File对象,才能判断这个字符串路径是否为文件夹路径。
File dir = new File(line);
// 判断这个File是否是文件夹路径
if(dir.isDirectory()){
return dir;
} else{
System.out.println("你录入的路径有误,请重新录入:");
}
/*if(dir.isDirectory()){
return dir;
} else if(dir.isFile()){
System.out.println("你录入的是文件路径,请重新录入");
} else{
System.out.println("你录入的路径有误,请重新录入:");
}*/
}
}
}