当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

目录列表器[Java编程]

赞助商链接



  本文“目录列表器[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

目前假定我们想傍观一个目录列表.可用两种方法列出File对象.若在不含自变量(参数)的情形下调用list(),会得到File对象包含的一个完好列表.但是,若想对这个列表举行某些限制,就需求利用一个“目录过滤器”,该类的作用是指出应若何挑选File对象来完成显示.
下面是用于这个例子的代码(或在履行该程序时碰到艰难,请参考第3章3.1.2小节“赋值”):

//: DirList.java
// Displays directory listing
package c10;
import java.io.*;

public class DirList {
  public static void main(String[] args) {
    try {
      File path = new File(".");
      String[] list;
      if(args.length == 0)
        list = path.list();
      else 
        list = path.list(new DirFilter(args[0]));
      for(int i = 0; i < list.length; i++)
        System.out.println(list[i]);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

class DirFilter implements FilenameFilter {
  String afn;
  DirFilter(String afn) { this.afn = afn; }
  public boolean accept(File dir, String name) {
    // Strip path information:
    String f = new File(name).getName();
    return f.indexOf(afn) != -1;
  }
} ///:~

DirFilter类“实现”了interface FilenameFilter(关于接口的问题,已在第7章举行了详述).下面让我们看看FilenameFilter接口有多么简单:

public interface FilenameFilter {
boolean accept(文件目录, 字串名);
}

它指出这种范例的全部对象都供应了一个名为accept()的办法.之所以要成立这样的一个类,背后的全部缘由就是把accept()办法供应应list()办法,使list()可以“回调”accept(),从而判断应将哪些文件名包含到列表中.因此,普通将这种技术称为“回调”,有时也称为“算子”(也就是说,DirFilter是一个算子,因为它唯一的作用就是包容一个办法).由于list()采取一个FilenameFilter对象作为自己的自变量利用,所以我们能传送实现了FilenameFilter的任何类的一个对象,用它决意(乃至在运行期)list()办法的行为方法.回调的目的是在代码的行为上供应更大的机动性.
通过DirFilter,我们看出固然一个“接口”只包含了一系列办法,但并不范围于只能写那些办法(但是,至少必须供应一个接口内全部办法的定义.在这种情形下,DirFilter构建器也会成立).
accept()办法必须采取一个File对象,用它指导用于探求一个特定文件的目录;并采取一个String,此中包含了要探求之文件的名字.可决意利用或忽视这两个参数之一,但有时至少要利用文件名.记着list()办法预备为目录对象中的每个文件名调用accept(),核实哪个应包含在内——具体由accept()返回的“布尔”后果断定.
为肯定我们操作的只是文件名,此中没有包含途径信息,必须采取String对象,并在它的外部成立一个File对象.然后调用getName(),它的作用是去除全部途径信息(采取与平台无关的方法).随后,accept()用String类的indexOf()办法查抄文件名内部能否存在搜索字串"afn".若在字串内找到afn,那么返回值就是afn的起点索引;但假定没有找到,返回值就是-1.注意这只是一个简单的字串搜索例子,未利用常见的表达式“通配符”筹划,比方"fo?.b?r*";这种筹划更难实现.
list()办法返回的是一个数组.可查询这个数组的长度,然后在此中遍历,选定数组元素.与C和C++的近似行为相比,这种于办法内外便利游历数组的行为无疑是一个明显的进步.

1. 匿名内部类
下例用一个匿名内部类(已在第7章报告)来重写显得非常抱负.首先成立了一个filter()办法,它返回指向FilenameFilter的一个句柄:
//: DirList2.java
// Uses Java 1.1 anonymous inner classes
import java.io.*;

public class DirList2 {
  public static FilenameFilter 
  filter(final String afn) {
    // Creation of anonymous inner class:
    return new FilenameFilter() {
      String fn = afn;
      public boolean accept(File dir, String n) {
        // Strip path information:
        String f = new File(n).getName();
        return f.indexOf(fn) != -1;
      }
    }; // End of anonymous inner class
  }
  public static void main(String[] args) {
    try {
      File path = new File(".");
      String[] list;
      if(args.length == 0)
        list = path.list();
      else 
        list = path.list(filter(args[0]));
      for(int i = 0; i < list.length; i++)
        System.out.println(list[i]);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

注意filter()的自变量必须是final.这一点是匿名内部类要求的,使其能利用来自本身作用域以外的一个对象.
之所以认为这样做更好,是由于FilenameFilter类目前同DirList2精密地结合在一同.但是,我们可采纳进一步的操作,将匿名内部类定义成list()的一个参数,使其显得越发精简.以下所示:
//: DirList3.java
// Building the anonymous inner class "in-place"
import java.io.*;

public class DirList3 {
  public static void main(final String[] args) {
    try {
      File path = new File(".");
      String[] list;
      if(args.length == 0)
        list = path.list();
      else 
        list = path.list(
          new FilenameFilter() {
            public boolean 
            accept(File dir, String n) {
              String f = new File(n).getName();
              return f.indexOf(args[0]) != -1;
            }
          });
      for(int i = 0; i < list.length; i++)
        System.out.println(list[i]);
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
} ///:~

main()目前的自变量是final,因为匿名内部类直接利用args[0].
这展示了若何操纵匿名内部类快速成立精简的类,以便办理一些复杂的问题.由于Java中的全部东西都与类有关,所以它无疑是一种相当有效的编码技术.它的一个好处是将特定的问题断绝在一个地方统一办理.但在另一方面,这样生成的代码不是非常简单阅读,所以利用时必须慎重.

2. 次序目录列表
常常都需求文件名以排好序的方法供应.由于Java 1.0和Java 1.1都没有供应对排序的支持(从Java 1.2开始供应),所以必须用第8章成立的SortVector将这一本领直接加入自己的程序.就象下面这样:
//: SortedDirList.java
// Displays sorted directory listing
import java.io.*;
import c08.*;

public class SortedDirList {
  private File path;
  private String[] list;
  public SortedDirList(final String afn) {
    path = new File(".");
    if(afn == null)
      list = path.list();
    else
      list = path.list(
          new FilenameFilter() {
            public boolean 
            accept(File dir, String n) {
              String f = new File(n).getName();
              return f.indexOf(afn) != -1;
            }
          });
    sort();
  }
  void print() {
    for(int i = 0; i < list.length; i++)
      System.out.println(list[i]);
  }
  private void sort() {
    StrSortVector sv = new StrSortVector();
    for(int i = 0; i < list.length; i++)
      sv.addElement(list[i]);
    // The first time an element is pulled from
    // the StrSortVector the list is sorted:
    for(int i = 0; i < list.length; i++)
      list[i] = sv.elementAt(i);
  }
  // Test it:
  public static void main(String[] args) {
    SortedDirList sd;
    if(args.length == 0)
      sd = new SortedDirList(null);
    else
      sd = new SortedDirList(args[0]);
    sd.print();
  }
} ///:~

这里举行了别的少量改良.不再是将path(途径)和list(列表)成立为main()的本地变量,它们变成了类的成员,使它们的值能在对象“生存”期间便利地拜候.事实上,main()目前只是对类举行测试的一种方法.大家可以看到,一旦列表成立完毕,类的构建器就会自动开始对列表举行排序.
这种排序不要求辨别大小写,所以终究不会得到一组全部单词都以大写字母开首的列表,随着是全部以小写字母开首的列表.但是,我们注意到在以相同字母开首的一组文件名中,大写字母是排在前面的——这对尺度的排序来说还是一种不合格的行为.Java 1.2已成功办理了这个问题.
  以上是“目录列表器[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 目录列表器
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .