1
青扔、編寫一個程序概行,將 d:\java 目錄下的所有.java 文件復(fù)制到
d:\jad 目錄下代箭,并將原來文件的擴(kuò)展名從.java 改為.jad嫩与。
答: listFiles 方法接受一個 FileFilter 對象,這個 FileFilter 對象就是過慮的策略對象儡毕,不同
的人提供不同的 FileFilter 實(shí)現(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(){
public boolean accept(File dir, String name) {
return name.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);
String destFileName = 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);
}
}}
由本題總結(jié)的思想及策略模式的解析:
class jad2java{
- 得到某個目錄下的所有的 java 文件集合
1.1 得到目錄 File srcDir = new File("d:\java");
1.2 得到目錄下的所有 java 文件: File[] files = srcDir.listFiles(new MyFileFilter());
1.3 只想得到.java 的文件: class MyFileFilter implememyts FileFilter{
public boolean accept(File pathname){
return pathname.getName().endsWith(".java")
}
}
2.將每個文件復(fù)制到另外一個目錄腰湾,并改擴(kuò)展名
2.1 得到目標(biāo)目錄雷恃,如果目標(biāo)目錄不存在,則創(chuàng)建之
2.2 根據(jù)源文件名得到目標(biāo)文件名费坊,注意要用正則表達(dá)式倒槐,注意.的轉(zhuǎn)義。
2.3 根據(jù)表示目錄的 File 和目標(biāo)文件名的字符串葵萎,得到表示目標(biāo)文件的 File导犹。
//要在硬盤中準(zhǔn)確地創(chuàng)建出一個文件,需要知道文件名和文件的目錄羡忘。
2.4 將源文件的流拷貝成目標(biāo)文件流谎痢,拷貝方法獨(dú)立成為一個方法,方法的參數(shù)采
用抽象流的形式卷雕。
//方法接受的參數(shù)類型盡量面向父類节猿,越抽象越好,這樣適應(yīng)面更寬廣。
}
分析 listFiles 方法內(nèi)部的策略模式實(shí)現(xiàn)原理
File[] listFiles(FileFilter filter){
File[] files = listFiles();
//Arraylist acceptedFilesList = new ArrayList();
File[] acceptedFiles = new File[files.length];
int pos = 0;
for(File file: files){
boolean accepted = filter.accept(file);
if(accepted){
//acceptedFilesList.add(file);
acceptedFiles[pos++] = file;
}
}
Arrays.copyOf(acceptedFiles,pos);
//return (File[])accpetedFilesList.toArray();
}