2、编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。
(大家正在做上面这道题,网上迟到的朋友也请做做这道题,找工作必须能编写这些简单问题的代码!)
答:listFiles方法接受一个FileFilter对象,这个FileFilter对象就是过虑的策略对象,不同的人提供不同的FileFilter实现,即提供了不同的过滤策略。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Jad2Java {
public static void main(String[] args) throws Exception {
File srcDir =new File("java");
if(!(srcDir.exists()&& srcDir.isDirectory()))//在在且是一个目录
throw new Exception("目录不存在");
File[] files= srcDir.listFiles(
New FilenameFilter(){
publicboolean accept(File dir, String name) {
return name.endsWith(".java");
}
}
);
System.out.println(files.length);
File destDir= new File("jad");
if(!destDir.exists())destDir.mkdir();//如果不存在,mkdir()创建目录
for(File f:files){
FileInputStream fis = new FileInputStream(f);
Stringdest FileName = f.getName().replaceAll("\\.java$", ".jad");
FileOutputStream fos = new FileOutputStream(new File(destDir,destFileName));
copy(fis,fos);
fis.close();
fos.close();
}
}
private static void copy(InputStream ips,OutputStream ops) throws Exception{
int len = 0;
byte[] buf =new byte[1024];
while((len =ips.read(buf)) != -1){
ops.write(buf,0,len);
}
}
}
由本题总结的思想及策略模式的解析:
1.
class jad2java{
1.得到某个目录下的所有的java文件集合
1.1得到目录 File srcDir = newFile("d:\\java");
1.2得到目录下的所有java文件:File[] files=srcDir.listFiles(new MyFileFilter());
1.3只想得到.java的文件: classMyFileFilterimplememyts FileFilter{
publicboolean accept(Filepathname){
returnpathname.getName().endsWith(".java")
}
}
2.将每个文件复制到另外一个目录,并改扩展名
2.1得到目标目录,如果目标目录不存在,则创建之
2.2根据源文件名得到目标文件名,注意要用正则表达式,注意.的转义。
2.3根据表示目录的File和目标文件名的字符串,得到表示目标文件的File。
//要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。
2.4将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。
//方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。
}
分析listFiles方法内部的策略模式实现原理
File[]listFiles(FileFilter filter){
File[] files=listFiles();
//ArraylistacceptedFilesList= new ArrayList();
File[] acceptedFiles= newFile[files.length];
int pos = 0;
for(File file:files){
booleanaccepted =filter.accept(file);
if(accepted){
//acceptedFilesList.add(file);
acceptedFiles[pos++]=file;
}
}
Arrays.copyOf(acceptedFiles,pos);
//return(File[])accpetedFilesList.toArray();
}