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 }