import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class Demo3 {
public static void main(String[] args) throws Exception{//为了省事,主方法中也不处理异常,直接抛给JVM默认处理,实际开发中必须处理
copy("D:\\Kstest" , "试题" , "txt" , "D:\\试题") ;
}
/**
* 此方法用于把源文件目录中文件名包含关键字的 以及指定文件后缀的文件,拷贝到一个指定目录中
* 采用边读边写的方式提高效率,避免内存不足的隐患
* @param 参数一,表示源目标文件夹的路径,参数二,文件名包含的关键字,参数三,文件后缀名,参数四,目标路径
* @exception IO中出现的异常方法中暂时不处理,交调用出处理
*
* */
public static void copy(String url1 , String key1 , String key2 , String url2) throws Exception{
File inFile = new File(url1) ;//构建源文件目录路径
File outFile = new File(url2) ;//构建目标文件夹路径
if(!outFile.exists()){//如果目标路径不存在
outFile.mkdirs() ;//则创建目标路径
}
if(inFile.isDirectory()){//如果源路径是目录
File[] f = inFile.listFiles() ;//找到目录中所包含的所有文件夹和文件
if(f != null){//如果找到的结果不为空
for(int x = 0 ; x < f.length ; x ++){//循环对找到的文件或者文件夹进行读写操作
if(f[x].isFile()){//如果找到的文件是一个具体文件(不是文件夹)
if(f[x].getName().matches("(.)*" + key1 + "(.)*\\." + key2)){//如果这个文件的格式为包含 “关键字.后缀名”(既key1.key格式)
InputStream in = new FileInputStream(f[x]) ;//建立输入流
File outDest = new File(url2 + File.separator + f[x].getName()) ;//构建目标文件路径,f[x].getName()保证写入的文件跟读取的同名
OutputStream out = new FileOutputStream(outDest) ;//建立输出流
int temp = 0 ;
byte[] date = new byte[1024] ;//每次读1024字节,如果有大文件拷贝可以改容量,加快速度
while((temp = in.read(date)) != -1){//读
out.write(date , 0 , temp) ;//写
}
in.close() ;//关闭输入流
out.close() ;//关闭输出流
}
}else{
//如果找到的文件不是一个具体文件(不是具体文件,就是文件夹了),那么递归方式再次对这个新的路径执行上述读写,f[x].getPath()得到这个不是具体文件的文件夹的路径
copy(f[x].getPath() , key1 ,key2 , url2) ;
System.out.println(f[x].getPath());
}
}
}
}
}
}
|