A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 逆风TO 于 2017-12-14 11:33 编辑

3、编写一个程序,将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(){

                              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);
            }

      }
}

由本题总结的思想及策略模式的解析:
1.
class jad2java{
      1. 得到某个目录下的所有的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.将每个文件复制到另外一个目录,并改扩展名
            2.1 得到目标目录,如果目标目录不存在,则创建之
            2.2 根据源文件名得到目标文件名,注意要用正则表达式,注意.的转义。
            2.3 根据表示目录的File和目标文件名的字符串,得到表示目标文件的File。
                  //要在硬盘中准确地创建出一个文件,需要知道文件名和文件的目录。
            2.4 将源文件的流拷贝成目标文件流,拷贝方法独立成为一个方法,方法的参数采用抽象流的形式。
                  //方法接受的参数类型尽量面向父类,越抽象越好,这样适应面更宽广。
}

分析listFiles方法内部的策略模式实现原理
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();
     
}

3 个回复

倒序浏览
这个文件操作算是算法吗
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
棒棒哒~
回复 使用道具 举报
棒棒哒~~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马