1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileOutputStream; 4 import java.io.FilenameFilter; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 9 10 /** 11 * 需求: 12 * 编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad。 13 * 14 * 思想及策略模式的解析: 15 * 1. 得到某个目录下的所有的java文件集合 16 * 1.1 得到目录 File srcDir = new File("d:\\java"); 17 * 1.2 得到目录下的所有java文件:File[] files = srcDir.listFiles(new MyFileFilter()); 18 * 1.3 只想得到.java的文件: 19 * class MyFileFilter implememyts FileFilter{ 20 * public boolean accept(File pathname){ 21 * return pathname.getName().endsWith(".java") 22 * } 23 * } 24 * 2.将每个文件复制到另外一个目录,并改扩展名 25 * 2.1 得到目标目录,如果目标目录不存在,则创建之 26 * 2.2 根据源文件名得到目标文件名,注意要用正则表达式,注意.的转义。 27 * 2.3 根据表示目录的File和目标文件名的字符串,得到表示目标文件的File。 28 * 要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。 29 * 2.4 将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。 30 * 方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。 31 */ 32 public class Jad2Java { 33 34 public static void main(String[] args) throws Exception { 35 File srcDir = new File("java"); 36 if(!(srcDir.exists() && srcDir.isDirectory())) 37 throw new Exception("目录不存在"); 38 File[] files = srcDir.listFiles( 39 new FilenameFilter(){ 40 41 public boolean accept(File dir, String name) { 42 return name.endsWith(".java"); 43 } 44 45 } 46 ); 47 48 System.out.println(files.length); 49 File destDir = new File("jad"); 50 if(!destDir.exists()) destDir.mkdir(); 51 for(File f :files){ 52 FileInputStream fis = new FileInputStream(f); 53 String destFileName = f.getName().replaceAll("\\.java$", ".jad"); 54 FileOutputStream fos = new FileOutputStream(new File(destDir,destFileName)); 55 copy(fis,fos); 56 fis.close(); 57 fos.close(); 58 } 59 } 60 61 private static void copy(InputStream ips,OutputStream ops) throws Exception{ 62 int len = 0; 63 byte[] buf = new byte[1024]; 64 while((len = ips.read(buf)) != -1){ 65 ops.write(buf,0,len); 66 } 67 68 } 69 }