listFiles方法接受一個FileFilter對象,這個FileFilter對象就是過慮的策略對象杖剪,不同的人提供不同的FileFilter實現(xiàn)冻押,即提供了不同的過濾策略。
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) {
returnname.endsWith(".java");
}
}
);
System.out.println(files.length);
File destDir= new File("jad");
if(!destDir.exists())destDir.mkdir();
for(File f:files){
FileInputStream fis = new FileInputStream(f);
StringdestFileName = f.getName().replaceAll("\\.java$", ".jad");
FileOutputStreamfos = 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);
}
}
}
由本題總結(jié)的思想及策略模式的解析:
class jad2java{
- 得到某個目錄下的所有的java文件集合
1.1 得到目錄 File srcDir = newFile("d:\java");
1.2 得到目錄下的所有java文件:File[] files =srcDir.listFiles(new MyFileFilter());
1.3 只想得到.java的文件: class MyFileFilterimplememyts FileFilter{
publicboolean accept(File pathname){
returnpathname.getName().endsWith(".java")
}
}
2.將每個文件復(fù)制到另外一個目錄盛嘿,并改擴展名
2.1 得到目標(biāo)目錄洛巢,如果目標(biāo)目錄不存在,則創(chuàng)建之
2.2 根據(jù)源文件名得到目標(biāo)文件名次兆,注意要用正則表達式稿茉,注意.的轉(zhuǎn)義。
2.3 根據(jù)表示目錄的File和目標(biāo)文件名的字符串芥炭,得到表示目標(biāo)文件的File漓库。
//要在硬盤中準確地創(chuàng)建出一個文件,需要知道文件名和文件的目錄园蝠。
2.4 將源文件的流拷貝成目標(biāo)文件流渺蒿,拷貝方法獨立成為一個方法,方法的參數(shù)采用抽象流的形式彪薛。
//方法接受的參數(shù)類型盡量面向父類茂装,越抽象越好,這樣適應(yīng)面更寬廣善延。
}
分析listFiles方法內(nèi)部的策略模式實現(xiàn)原理
File[] listFiles(FileFilter filter){
File[] files =listFiles();
//Arraylis tacceptedFilesList = new ArrayList();
File[] acceptedFiles= new File[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();
}