友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

Java编程思想第4版[中文版](PDF格式)-第270章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




(2) 若行首是一个用于源码列表的结束标记,表明某个地方出现错误,因为结束标记应当只能由 

SourceCodeFile 构建器发现。  

  

提取/释放一个打包文件时,提取出来的内容可进入当前目录,亦可进入另一个备用目录。所以需要相应地 

创建DirMap 对象。打开文件,并将第一行读入。老的文件路径分隔符信息将从这一行中提取出来。随后根据 

输入来创建第一个 SourceCodeFile 对象,它会加入DirMap。只要包含了一个文件,新的 SourceCodeFile 对 

象就会创建并加入(创建的最后一个用光输入内容后,会简单地返回,然后hasFile()会返回一个错误)。  



17。1。2 检查大小写样式  



尽管对涉及文字处理的一些项目来说,前例显得比较方便,但下面要介绍的项目却能立即发挥作用,因为它 

执行的是一个样式检查,以确保我们的大小写形式符合“事实上”的 Java 样式标准。它会在当前目录中打开 

每个。java 文件,并提取出所有类名以及标识符。若发现有不符合Java 样式的情况,就向我们提出报告。  

为了让这个程序正确运行,首先必须构建一个类名,将它作为一个“仓库”,负责容纳标准 Java 库中的所有 

类名。为达到这个目的,需遍历用于标准 Java 库的所有源码子目录,并在每个子目录都运行 

ClassScanner。至于参数,则提供仓库文件的名字(每次都用相同的路径和名字)和命令行开关…a,指出类 

名应当添加到该仓库文件中。  

为了用程序检查自己的代码,需要运行它,并向它传递要使用的仓库文件的路径与名字。它会检查当前目录 

中的所有类和标识符,并告诉我们哪些没有遵守典型的Java 大写写规范。  

要注意这个程序并不是十全十美的。有些时候,它可能报告自己查到一个问题。但当我们仔细检查代码的时 

候,却发现没有什么需要更改的。尽管这有点儿烦人,但仍比自己动手检查代码中的所有错误强得多。  

下面列出源代码,后面有详细的解释:  

  

//: ClassScanner。java  

// Scans all files in directory for classes  

// and identifiers; to check capitalization。  

// Assumes properly piling code listings。  

// Doesn't do everything right; but is a very  

// useful aid。  

import java。io。*;  

import java。util。*;  

  

class MultiStringMap extends Hashtable {  

  public void add(String key; String value) {  

    if(!containsKey(key))  

      put(key; new Vector());  

    ((Vector)get(key))。addElement(value);  



                                                                             633 


…………………………………………………………Page 635……………………………………………………………

  }  

  public Vector getVector(String key) {  

    if(!containsKey(key)) {  

      System。err。println(  

        〃ERROR: can't find key: 〃 + key);  

      System。exit(1);  

    }  

    return (Vector)get(key);  

  }  

  public void printValues(PrintStream p) {  

    Enumeration k = keys();  

    while(k。hasMoreElements()) {  

      String oneKey = (String)k。nextElement();  

      Vector val = getVector(oneKey);  

      for(int i = 0; i 《 val。size(); i++)  

        p。println((String)val。elementAt(i));  

    }  

  }  

}  

  

public class ClassScanner {  

  private File path;  

  private String'' fileList;  

  private Properties classes = new Properties();  

  private MultiStringMap   

    classMap = new MultiStringMap();  

    identMap = new MultiStringMap();  

  private StreamTokenizer in;  

  public ClassScanner() {  

    path = new File(〃。〃);  

    fileList = path。list(new JavaFilter());  

    for(int i = 0; i 《 fileList。length; i++) {  

      System。out。println(fileList'i');  

      scanListing(fileList'i');  

    }  

  }  

  void scanListing(String fname) {  

    try {  

      in = new StreamTokenizer(  

          new BufferedReader(  

            new FileReader(fname)));  

      // Doesn't seem to work:  

      // in。slashStarments(true);  

      // in。slashSlashments(true);  

      in。ordinaryChar('/');  

      in。ordinaryChar('。');  

      in。wordChars('_'; '_');  

      in。eolIsSignificant(true);  

      while(in。nextToken() !=   

            StreamTokenizer。TT_EOF) {  

        if(in。ttype == '/')  

          eatments();  



                                                                                             634 


…………………………………………………………Page 636……………………………………………………………

        else if(in。ttype ==   

                StreamTokenizer。TT_WORD) {  

          if(in。sval。equals(〃class〃) ||   

             in。sval。equals(〃interface〃)) {  

            // Get class name:  

               while(in。nextToken() !=   

                     StreamTokenizer。TT_EOF  

                     && in。ttype !=   

                     StreamTokenizer。TT_WORD)  

                 ;  

               classes。put(in。sval; in。sval);  

               classMap。add(fname; in。sval);  

          }  

          if(in。sval。equals(〃import〃) ||  

             in。sval。equals(〃package〃))  

            discardLine();  

          else // It's an identifier or keyword  

            identMap。add(fname; in。sval);  

        }  

      }  

    } catch(IOException e) {  

      e。printStackTrace();  

    }  

  }  

  void discardLine() {  

    try {  

      while(in。nextToken() !=   

            StreamTokenizer。TT_EOF  

            && in。ttype !=   

            StreamTokenizer。TT_EOL)  

        ; // Throw away tokens to end of line  

    } catch(IOException e) {  

      e。printStackTrace();  

    }  

  }  

  // StreamTokenizer's ment removal seemed  

  // to be broken。 This extracts them:  

  void eatments() {  

    try {  

      if(in。nextToken() !=   

         StreamTokenizer。TT_EOF) {  

        if(in。ttype == '/')  

          discardLine();  

        else if(in。ttype != '*')  

          in。pushBack();  

        else   

          while(true) {  

            if(in。nextToken() ==   

              StreamTokenizer。TT_EOF)  

              break;  

            if(in。ttype == '*')  

              if(in。nextToken() !=   



                                                                                        635 


…………………………………………………………Page 637……………………………………………………………

                StreamTokenizer。TT_EOF  

                && in。ttype == '/')  

                break;  

          }  

      }  

    } catch(IOException e) {  

   
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!