(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) {
小说推荐
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 最新章:第26章
- 深入浅出MFC第2版(PDF格式)
- -Page 1-Page 2-山高月小山高月小 水落石出水落石出山高月小山高月小 水落石出水落石出-Page 3-深入淺出MFC(第版 使用Visual C 5.0 MFC 4.2)Dissecting MFC(Second Edition Using Visual C 5.0 MFC 4.2)侯俊
- 最新章:第309章
- VB2008从入门到精通(PDF格式英文版)
- -Page 1(R)The eXperT’s Voice inBeginningVB 2008From Novice to ProfessionalChristian Gross-Page 2-Page 3-Beginning VB 2008From Novice to Professional■C
- 最新章:第214章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 最新章:第143章
- 神祗之眼 (正式版)第7卷(全文完)作者:百里芜虚
- 第五十一章离12月25日的圣诞节还有两天,纽约已经换上了节日的盛装,几天前的一场大雪令整个城市一片银白。人们笑逐颜开,都纷纷开始为节日做准备,商家为了在节日打开销路纷纷推出各种优惠促销手段,纽约的大街小巷全都这样热闹。依沙那被老婆打发出来买过节要用的杂货,而女儿则和凯妮一起到百货商场去买衣服去了。对
- 最新章:第23章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 最新章:第27章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章