﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-eroself-随笔分类-Java</title><link>http://www.blogjava.net/eroself/category/28452.html</link><description>关于人生的程式，在这里谱写......</description><language>zh-cn</language><lastBuildDate>Tue, 18 Mar 2008 02:46:20 GMT</lastBuildDate><pubDate>Tue, 18 Mar 2008 02:46:20 GMT</pubDate><ttl>60</ttl><item><title>java正则表达式入门</title><link>http://www.blogjava.net/eroself/archive/2008/03/18/186928.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Tue, 18 Mar 2008 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2008/03/18/186928.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/186928.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2008/03/18/186928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/186928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/186928.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://blog.csdn.net/cping1982/archive/2007/11/24/1900808.aspx">http://blog.csdn.net/cping1982/archive/2007/11/24/1900808.aspx</a><br />
<br />
众所周知，在程序开发中，难免会遇到需要匹配、查找、替换、判断字符串的情况发生，而这些情况有时又比较复杂，如果用纯编码方式解决，往往会浪费程序员的时间及精力。因此，学习及使用正则表达式，便成了解决这一矛盾的主要手段。<br />
&nbsp;大家都知道，正则表达式是一种可以用于模式匹配和替换的规范，一个正则表达式就是由普通的字符（例如字符a到z）以及特殊字符（元字符）组成的文字模式，它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。<br />
&nbsp; 自从jdk1.4推出java.util.regex包，就为我们提供了很好的JAVA正则表达式应用平台。<br />
&nbsp;<br />
&nbsp;因为正则表达式是一个很庞杂的体系，所以我仅例举些入门的概念，更多的请参阅相关书籍及自行摸索。 <br />
<br />
\\ 反斜杠<br />
\t 间隔 ('\u0009')<br />
\n 换行 ('\u000A')<br />
\r 回车 ('\u000D')<br />
\d 数字 等价于[0-9]<br />
\D 非数字 等价于[^0-9]<br />
\s 空白符号 [\t\n\x0B\f\r]<br />
\S 非空白符号 [^\t\n\x0B\f\r]<br />
\w 单独字符 [a-zA-Z_0-9]<br />
\W 非单独字符 [^a-zA-Z_0-9]<br />
\f 换页符<br />
\e Escape<br />
\b 一个单词的边界<br />
\B 一个非单词的边界<br />
\G 前一个匹配的结束<br />
<br />
^为限制开头<br />
^java &nbsp;&nbsp;&nbsp; 条件限制为以Java为开头字符<br />
$为限制结尾<br />
java$ &nbsp;&nbsp;&nbsp; 条件限制为以java为结尾字符<br />
.为限制一个任意字符<br />
java.. &nbsp;&nbsp;&nbsp; 条件限制为java后除换行外任意两个字符<br />
<br />
<br />
加入特定限制条件「[]」<br />
[a-z] &nbsp;&nbsp;&nbsp; 条件限制在小写a to z范围中一个字符<br />
[A-Z] &nbsp;&nbsp;&nbsp; 条件限制在大写A to Z范围中一个字符<br />
[a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符<br />
[0-9] &nbsp;&nbsp;&nbsp; 条件限制在小写0 to 9范围中一个字符<br />
[0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符<br />
[0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集)<br />
<br />
[]中加入^后加再次限制条件「[^]」<br />
[^a-z] &nbsp;&nbsp;&nbsp; 条件限制在非小写a to z范围中一个字符<br />
[^A-Z] &nbsp;&nbsp;&nbsp; 条件限制在非大写A to Z范围中一个字符<br />
[^a-zA-Z] 条件限制在非小写a to z或大写A to Z范围中一个字符<br />
[^0-9] &nbsp;&nbsp;&nbsp; 条件限制在非小写0 to 9范围中一个字符<br />
[^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符<br />
[^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)<br />
<br />
在限制条件为特定字符出现0次以上时，可以使用「*」<br />
J* &nbsp;&nbsp;&nbsp; 0个以上J<br />
.* &nbsp;&nbsp;&nbsp; 0个以上任意字符<br />
J.*D &nbsp;&nbsp;&nbsp; J与D之间0个以上任意字符<br />
<br />
在限制条件为特定字符出现1次以上时，可以使用「+」<br />
J+ &nbsp;&nbsp;&nbsp; 1个以上J<br />
.+ &nbsp;&nbsp;&nbsp; 1个以上任意字符<br />
J.+D &nbsp;&nbsp;&nbsp; J与D之间1个以上任意字符<br />
<br />
在限制条件为特定字符出现有0或1次以上时，可以使用「?」<br />
JA? &nbsp;&nbsp;&nbsp; J或者JA出现<br />
<br />
限制为连续出现指定次数字符「{a}」<br />
J{2} &nbsp;&nbsp;&nbsp; JJ<br />
J{3} &nbsp;&nbsp;&nbsp; JJJ<br />
文字a个以上，并且「{a,}」<br />
J{3,} &nbsp;&nbsp;&nbsp; JJJ,JJJJ,JJJJJ,???(3次以上J并存)<br />
文字个以上，b个以下「{a,b}」<br />
J{3,5} &nbsp;&nbsp;&nbsp; JJJ或JJJJ或JJJJJ<br />
两者取一「|」<br />
J|A &nbsp;&nbsp;&nbsp; J或A<br />
Java|Hello &nbsp;&nbsp;&nbsp; Java或Hello<br />
&nbsp;<br />
「()」中规定一个组合类型<br />
比如，我查询&lt;a href=\"index.html\"&gt;index&lt;/a&gt;中&lt;a href&gt;&lt;/a&gt;间的数据，可写作&lt;a.*href=\".*\"&gt;(.+?)&lt;/a&gt;<br />
<br />
在使用Pattern.compile函数时，可以加入控制正则表达式的匹配行为的参数：<br />
Pattern Pattern.compile(String regex, int flag)<br />
<br />
flag的取值范围如下：<br />
Pattern.CANON_EQ &nbsp;&nbsp;&nbsp; 当且仅当两个字符的"正规分解(canonical decomposition)"都完全相同的情况下，才认定匹配。比如用了这个标志之后，表达式"a\u030A"会匹配"?"。默认情况下，不考虑"规范相等性(canonical equivalence)"。<br />
Pattern.CASE_INSENSITIVE(?i) &nbsp;&nbsp;&nbsp; 默认情况下，大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配，只要将UNICODE_CASE与这个标志合起来就行了。<br />
Pattern.COMMENTS(?x) &nbsp;&nbsp;&nbsp; 在这种模式下，匹配时会忽略(正则表达式里的)空格字符(译者注：不是指表达式里的"\\s"，而是指表达式里的空格，tab，回车之类)。注释从#开始，一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。<br />
Pattern.DOTALL(?s) &nbsp;&nbsp;&nbsp; 在这种模式下，表达式'.'可以匹配任意字符，包括表示一行的结束符。默认情况下，表达式'.'不匹配行的结束符。<br />
Pattern.MULTILINE<br />
(?m) &nbsp;&nbsp;&nbsp; 在这种模式下，'^'和'$'分别匹配一行的开始和结束。此外，'^'仍然匹配字符串的开始，'$'也匹配字符串的结束。默认情况下，这两个表达式仅仅匹配字符串的开始和结束。<br />
Pattern.UNICODE_CASE<br />
(?u) &nbsp;&nbsp;&nbsp; 在这个模式下，如果你还启用了CASE_INSENSITIVE标志，那么它会对Unicode字符进行大小写不明感的匹配。默认情况下，大小写不敏感的匹配只适用于US-ASCII字符集。<br />
Pattern.UNIX_LINES(?d) &nbsp;&nbsp;&nbsp; 在这个模式下，只有'\n'才被认作一行的中止，并且与'.'，'^'，以及'$'进行匹配。<br />
<br />
<br />
抛开空泛的概念，下面写出几个简单的Java正则用例：<br />
<br />
◆比如，在字符串包含验证时<br />
<br />
//查找以Java开头,任意结尾的字符串<br />
&nbsp; Pattern pattern = Pattern.compile("^Java.*");<br />
&nbsp; Matcher matcher = pattern.matcher("Java不是人");<br />
&nbsp; boolean b= matcher.matches();<br />
&nbsp; //当条件满足时，将返回true，否则返回false<br />
&nbsp; System.out.println(b);<br />
<br />
<br />
◆以多条件分割字符串时<br />
Pattern pattern = Pattern.compile("[, |]+");<br />
String[] strs = pattern.split("Java Hello World&nbsp; Java,Hello,,World|Sun");<br />
for (int i=0;i&lt;strs.length;i++) {<br />
&nbsp;&nbsp;&nbsp; System.out.println(strs[i]);<br />
} <br />
<br />
◆文字替换（首次出现字符）<br />
Pattern pattern = Pattern.compile("正则表达式");<br />
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");<br />
//替换第一个符合正则的数据<br />
System.out.println(matcher.replaceFirst("Java"));<br />
<br />
◆文字替换（全部）<br />
Pattern pattern = Pattern.compile("正则表达式");<br />
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World");<br />
//替换第一个符合正则的数据<br />
System.out.println(matcher.replaceAll("Java"));<br />
<br />
<br />
◆文字替换（置换字符）<br />
Pattern pattern = Pattern.compile("正则表达式");<br />
Matcher matcher = pattern.matcher("正则表达式 Hello World,正则表达式 Hello World ");<br />
StringBuffer sbr = new StringBuffer();<br />
while (matcher.find()) {<br />
&nbsp;&nbsp;&nbsp; matcher.appendReplacement(sbr, "Java");<br />
}<br />
matcher.appendTail(sbr);<br />
System.out.println(sbr.toString());<br />
<br />
◆验证是否为邮箱地址<br />
<br />
String str="ceponline@yahoo.com.cn";<br />
Pattern pattern = Pattern.compile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);<br />
Matcher matcher = pattern.matcher(str);<br />
System.out.println(matcher.matches());<br />
<br />
◆去除html标记<br />
Pattern pattern = Pattern.compile("&lt;.+?&gt;", Pattern.DOTALL);<br />
Matcher matcher = pattern.matcher("&lt;a href=\"index.html\"&gt;主页&lt;/a&gt;");<br />
String string = matcher.replaceAll("");<br />
System.out.println(string);<br />
<br />
◆查找html中对应条件字符串<br />
Pattern pattern = Pattern.compile("href=\"(.+?)\"");<br />
Matcher matcher = pattern.matcher("&lt;a href=\"index.html\"&gt;主页&lt;/a&gt;");<br />
if(matcher.find())<br />
&nbsp; System.out.println(matcher.group(1));<br />
}<br />
<br />
◆截取http://地址<br />
//截取url<br />
Pattern pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:]+");<br />
Matcher matcher = pattern.matcher("dsdsds&lt;http://dsds//gfgffdfd&gt;fdf");<br />
StringBuffer buffer = new StringBuffer();<br />
while(matcher.find()){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; buffer.append(matcher.group());&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; buffer.append("\r\n");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
System.out.println(buffer.toString());<br />
}<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
◆替换指定{}中文字<br />
<br />
String str = "Java目前的发展史是由{0}年-{1}年";<br />
String[][] object={new String[]{"\\{0\\}","1995"},new String[]{"\\{1\\}","2007"}};<br />
System.out.println(replace(str,object));<br />
<br />
public static String replace(final String sourceString,Object[] object) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String temp=sourceString;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(int i=0;i&lt;object.length;i++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] result=(String[])object[i];<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Pattern&nbsp;&nbsp;&nbsp; pattern = Pattern.compile(result[0]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Matcher matcher = pattern.matcher(temp);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; temp=matcher.replaceAll(result[1]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return temp;<br />
}<br />
<br />
<br />
◆以正则条件查询指定目录下文件<br />
<br />
&nbsp;//用于缓存文件列表<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private ArrayList files = new ArrayList();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //用于承载文件路径<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private String _path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用于承载未合并的正则公式<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private String _regexp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; class MyFileFilter implements FileFilter {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; * 匹配文件名称<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; public boolean accept(File file) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pattern pattern = Pattern.compile(_regexp);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Matcher match = pattern.matcher(file.getName());&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return match.matches();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* 解析输入流<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* @param inputs<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FilesAnalyze (String path,String regexp){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; getFileName(path,regexp);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* 分析文件名并加入files<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* @param input<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*/<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private void getFileName(String path,String regexp) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //目录<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _path=path;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _regexp=regexp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; File directory = new File(_path);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; File[] filesFile = directory.listFiles(new MyFileFilter());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; if (filesFile == null) return;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; for (int j = 0; j &lt; filesFile.length; j++) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; files.add(filesFile[j]);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; return;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; * 显示输出信息<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; * @param out<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public void print (PrintStream out) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Iterator elements = files.iterator();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (elements.hasNext()) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; File file=(File) elements.next();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.println(file.getPath());&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public static void output(String path,String regexp) {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fileGroup1.print(System.out);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public static void main (String[] args) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; output("C:\\","[A-z|.]*");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
<br />
Java正则的功用还有很多，事实上只要是字符处理，就没有正则做不到的事情存在。（当然，正则解释时较耗时间就是了|||&#8230;&#8230;）<br />
</p>
<img src ="http://www.blogjava.net/eroself/aggbug/186928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2008-03-18 10:11 <a href="http://www.blogjava.net/eroself/archive/2008/03/18/186928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdt学习</title><link>http://www.blogjava.net/eroself/archive/2008/02/23/181565.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Sat, 23 Feb 2008 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2008/02/23/181565.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/181565.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2008/02/23/181565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/181565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/181565.html</trackback:ping><description><![CDATA[转自：http://plutoluo.javaeye.com/blog/146281<br />
<p><font face="Arial"><br />
<br />
JDT实际上是将Java代码构建成一个基于DOM结构的抽象语法树AST（Abstract Syntax Tree ）。代码中的每个部分都对应一个ASTNode，许多的ASTNode就构成了这个抽象的语法树。Java Class一般对应Compilation Unit node，该节点也是AST树上的顶点。创建一个AST如下：</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>ASTParser&nbsp;parser&nbsp;=&nbsp;ASTParser.newParser(AST.JLS3); &nbsp;&nbsp;</span></span>
    <li class=""><span>parser.setSource(</span><span class="string">""</span><span>.toCharArray()); &nbsp;&nbsp;</span>
    <li class="alt"><span>CompilationUnit&nbsp;unit&nbsp;=&nbsp;(CompilationUnit)&nbsp;parser.createAST(</span><span class="keyword">null</span><span>);&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>unit.recordModifications(); &nbsp;&nbsp;</span>
    <li class="alt"><span>AST&nbsp;ast&nbsp;=&nbsp;unit.getAST();&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial">其中createAST，当parse需要较长时间时，可以采用createAST(new NullProgressMonitor())，否则直接传null即可。</font></p>
<p><font face="Arial">recordModifications()用于记录节点的变动，比如修改、删除等，当需要对AST树进行变动操作时，必须要预先调用这个方法。</font></p>
<font face="Arial">
<p><br />
比较重要的是：一个AST树上的所有节点必须都属于该AST。不允许直接将其他AST树上的节点添加该AST树上。否则会抛出java.lang.IllegalArgumentException异常。须使用ASTNode.copySubtree(AST target, ASTNode node)返回一个目标树的深度拷贝，才能进行添加操作。例如:</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>ASTParser&nbsp;parser&nbsp;=&nbsp;ASTParser.newParser(AST.JLS3); &nbsp;&nbsp;</span></span>
    <li class=""><span>parser.setSource(</span><span class="string">""</span><span>.toCharArray()); &nbsp;&nbsp;</span>
    <li class="alt"><span>CompilationUnit&nbsp;targetRoot=&nbsp;(CompilationUnit)&nbsp;parser.createAST(</span><span class="keyword">null</span><span>);&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>targetRoot.recordModifications(); &nbsp;&nbsp;</span>
    <li class="alt"><span>parser.setSource(</span><span class="string">"class&nbsp;T{}&#8221;"</span><span>.toCharArray()); &nbsp;&nbsp;</span>
    <li class=""><span>CompilationUnit&nbsp;srcRoot=&nbsp;(CompilationUnit)&nbsp;parser.createAST(</span><span class="keyword">null</span><span>);&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span class="comment">//这是非法操作，两者的AST源不一样 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>targetRoot.types().add(srcRoot.types().get(</span><span class="number">0</span><span>)); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="comment">//这是合法操作 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>targetRoot.types().add(ASTNode.copySubtree( &nbsp;&nbsp;</span>
    <li class="alt"><span>targetRoot.getAST(),&nbsp;(ASTNode)&nbsp;srcRoot.types().get(</span><span class="number">0</span><span>))); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="comment">//这是合法操作 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>targetRoot.types().add(targetRoot.getAST().newTypeDeclaration());&nbsp;&nbsp;</span> </li>
</ol>
</font></div>
<br />
<div class="blog_content">现把一些 Java代码生成对应的ASTNode方式列出来，供参考：<br />
<br />
<strong>List 1 生成Package<br />
</strong>
<pre>// package astexplorer;
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>PackageDeclaration&nbsp;<strong>packageDeclaration&nbsp;</strong>=&nbsp;ast.newPackageDeclaration();&nbsp;&nbsp;</span></span>
    <li class=""><span>unit.setPackage(packageDeclaration);&nbsp;&nbsp;</span>
    <li class="alt"><span>packageDeclaration.setName(ast.newSimpleName(<span class="string">"astexplorer"</span><span>));&nbsp;<br />
    </span></span></li>
</ol>
</div>
<strong></strong></pre>
<strong><strong>List 2 生成Import<br />
</strong></strong>
<pre>// import org.eclipse.swt.SWT;<br />
// import org.eclipse.swt.events.*;<br />
// import org.eclipse.swt.graphics.*;<br />
// import org.eclipse.swt.layout.*;<br />
// import org.eclipse.swt.widgets.*;
<div class="code_title"><strong>java 代码</strong></div>
<div class="dp-highlighter">
<div class="bar"><strong>&nbsp;</strong></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;IMPORTS.length;&nbsp;++i)&nbsp;{&nbsp;&nbsp;</span></span>
    <li class=""><span>ImportDeclaration&nbsp;<strong>importDeclaration&nbsp;</strong>=&nbsp;ast.newImportDeclaration();&nbsp;&nbsp;</span>
    <li class="alt"><span>importDeclaration.setName(ast.newName(getSimpleNames(IMPORTS[i])));&nbsp;&nbsp;</span>
    <li class=""><span><span class="keyword">if</span><span>&nbsp;(IMPORTS[i].indexOf(</span><span class="string">"*"</span><span>)&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>importDeclaration.setOnDemand(<span class="keyword">true</span><span>);&nbsp;&nbsp;</span></span>
    <li class=""><span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>importDeclaration.setOnDemand(<span class="keyword">false</span><span>);&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>unit.imports().add(importDeclaration);&nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</pre>
<strong><strong>List 3 生成Class Declaration<br />
</strong></strong>
<pre>// public class SampleComposite extends Composite <br />
</pre>
<pre class="code_title">java 代码</pre>
<pre>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>TypeDeclaration&nbsp;<strong>classType&nbsp;</strong>=&nbsp;ast.newTypeDeclaration();&nbsp;&nbsp;</span></span>
    <li class=""><span>classType.setInterface(<span class="keyword">false</span><span>);&nbsp;&nbsp;</span></span>
    <li class="alt"><span>classType.setModifiers(Modifier.PUBLIC);&nbsp;&nbsp;</span>
    <li class=""><span>classType.setName(ast.newSimpleName(<span class="string">"SampleComposite"</span><span>));&nbsp;&nbsp;</span></span>
    <li class="alt"><span>classType.setSuperclass(ast.newSimpleName(<span class="string">"Composite"</span><span>));&nbsp;&nbsp;</span></span>
    <li class=""><span>unit.types().add(classType);&nbsp;&nbsp;</span></li>
</ol>
</div>
</pre>
<pre><br />
<font face="Arial"><strong><strong><br />
List 4 生成Constructor Declaration<br />
<br />
</strong></strong></font>// public SampleComposite(Composite parent,int style){}</pre>
<pre class="code_title">java 代码</pre>
<pre>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>MethodDeclaration&nbsp;<strong>methodConstructor&nbsp;</strong>=&nbsp;ast.newMethodDeclaration();&nbsp;&nbsp;</span></span>
    <li class=""><span>methodConstructor.setConstructor(<span class="keyword">true</span><span>);&nbsp;&nbsp;</span></span>
    <li class="alt"><span>methodConstructor.setModifiers(Modifier.PUBLIC);&nbsp;&nbsp;</span>
    <li class=""><span>methodConstructor.setName(ast.newSimpleName(<span class="string">"SampleComposite"</span><span>));&nbsp;&nbsp;</span></span>
    <li class="alt"><span>classType.bodyDeclarations().add(methodConstructor);&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span><span class="comment">//&nbsp;constructor&nbsp;parameters</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>SingleVariableDeclaration&nbsp;variableDeclaration&nbsp;=&nbsp;ast.newSingleVariableDeclaration();&nbsp;&nbsp;</span>
    <li class=""><span>variableDeclaration.setModifiers(Modifier.NONE);&nbsp;&nbsp;</span>
    <li class="alt"><span>variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName(<span class="string">"Composite"</span><span>)));&nbsp;&nbsp;</span></span>
    <li class=""><span>variableDeclaration.setName(ast.newSimpleName(<span class="string">"parent"</span><span>));&nbsp;&nbsp;</span></span>
    <li class="alt"><span>methodConstructor.parameters().add(variableDeclaration);&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>variableDeclaration&nbsp;=&nbsp;ast.newSingleVariableDeclaration();&nbsp;&nbsp;</span>
    <li class=""><span>variableDeclaration.setModifiers(Modifier.NONE);&nbsp;&nbsp;</span>
    <li class="alt"><span>variableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));&nbsp;&nbsp;</span>
    <li class=""><span>variableDeclaration.setName(ast.newSimpleName(<span class="string">"style"</span><span>));&nbsp;&nbsp;</span></span>
    <li class="alt"><span>methodConstructor.parameters().add(variableDeclaration);&nbsp;&nbsp;</span>
    <li class="">
    <li class="alt"><span>Block&nbsp;constructorBlock&nbsp;=&nbsp;ast.newBlock();&nbsp;&nbsp;</span>
    <li class=""><span>methodConstructor.setBody(constructorBlock);<br />
    </span></li>
</ol>
</div>
</pre>
<font face="Arial">
<pre><strong>&nbsp;</strong><font size="+0"><font face="Arial"><strong>List 5 生成Spuer Invocation<br />
<br />
</strong></font></font>// super(parent,style)</pre>
<pre class="code_title">java 代码</pre>
<pre>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>SuperConstructorInvocation&nbsp;superConstructorInvocation&nbsp;=&nbsp;ast.newSuperConstructorInvocation();&nbsp;&nbsp;</span></span>
    <li class=""><span>constructorBlock.statements().add(superConstructorInvocation);&nbsp;&nbsp;</span>
    <li class="alt"><span>Expression&nbsp;exp&nbsp;=&nbsp;ast.newSimpleName(<span class="string">"parent"</span><span>);&nbsp;&nbsp;</span></span>
    <li class=""><span>superConstructorInvocation.arguments().add(exp);&nbsp;&nbsp;</span>
    <li class="alt"><span>superConstructorInvocation.arguments().add(ast.newSimpleName(<span class="string">"style"</span><span>));&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</pre>
<pre><br />
<font size="+0"><font size="+0"><font size="+0"><font face="Arial"><strong>List 6 生成ClassInstanceCreation<br />
</strong><br />
</font></font></font></font>// GridLayout gridLayout = new GridLayout();</pre>
<pre class="code_title">java 代码</pre>
<pre>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>VariableDeclarationFragment&nbsp;vdf&nbsp;=&nbsp;ast.newVariableDeclarationFragment();&nbsp;&nbsp;</span></span>
    <li class=""><span>vdf.setName(ast.newSimpleName(<span class="string">"gridLayout"</span><span>));&nbsp;&nbsp;</span></span><span></span>
    <li class="alt"><span>ClassInstanceCreation&nbsp;cc&nbsp;=&nbsp;ast.newClassInstanceCreation();&nbsp;&nbsp;</span>
    <li class=""><span>cc.setName(ast.newSimpleName(<span class="string">"GridLayout"</span><span>));&nbsp;&nbsp;</span></span>
    <li class="alt"><span>vdf.setInitializer(cc);&nbsp;&nbsp;</span>
    <li class="alt"><span>VariableDeclarationStatement&nbsp;vds&nbsp;=&nbsp;ast.newVariableDeclarationStatement(vdf);&nbsp;&nbsp;</span>
    <li class=""><span>vds.setType(ast.newSimpleType(ast.newSimpleName(<span class="string">"GridLayout"</span><span>)));&nbsp;</span></span>
    <li class="alt"><span>constructBlock.statements().add(vds);</span></li>
</ol>
</div>
</pre>
<pre><br />
// Label label = new Label(this,SWT.NONE);</pre>
<pre class="code_title">java 代码</pre>
<pre>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>VariableDeclarationFragment vdf&nbsp;=&nbsp;ast.newVariableDeclarationFragment();&nbsp;&nbsp;</span></span>
    <li class=""><span>vdf.setName(ast.newSimpleName(<span class="string">"label"</span><span>));&nbsp;&nbsp;</span></span>
    <li class="alt"><span>cc&nbsp;=&nbsp;ast.newClassInstanceCreation();&nbsp;&nbsp;</span>
    <li class=""><span>cc.setName(ast.newSimpleName(<span class="string">"Label"</span><span>));&nbsp;&nbsp;</span></span>
    <li class=""><span>cc.arguments().add(ast.newThisExpression());&nbsp;&nbsp;</span>
    <li class="alt"><span>cc.arguments().add(ast.newName(getSimpleNames(<span class="string">"SWT.NONE"</span><span>)));&nbsp;&nbsp;</span></span>
    <li class="alt"><span>vdf.setInitializer(cc);&nbsp; <br />
    </span>
    <li class="alt"><span>VariableDeclarationStatement vds&nbsp;=&nbsp;ast.newVariableDeclarationStatement(vdf);&nbsp;&nbsp;</span>
    <li class="alt"><span>vds.setType(ast.newSimpleType(ast.newSimpleName(<span class="string">"Label"</span><span>))); </span> </span>
    <li class="alt"><span><span>constructBlock.statements().add(vds);</span></span></li>
</ol>
</div>
</pre>
<pre><br />
<font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font face="Arial"><strong>List 7生成MethodInvocation<br />
</strong><br />
</font></font></font></font></font></font></font></font>// setLayout(gridLayout);</pre>
<pre class="code_title">java 代码</pre>
<pre>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>MethodInvocation&nbsp;mi&nbsp;=&nbsp;ast.newMethodInvocation();&nbsp;&nbsp;</span></span>
    <li class=""><span>mi.setName(ast.newSimpleName(<span class="string">"setLayout"</span><span>));&nbsp;&nbsp;</span></span>
    <li class="alt"><span>mi.arguments().add(ast.newSimpleName(<span class="string">"gridLayout"</span><span>));&nbsp;</span></span>
    <li class="alt"><span><span><font style="background-color: #fafafa" face="Courier New">constructorBlock.statements().add(ast.newExpressionStatement(mi));</font></span></span></li>
</ol>
</div>
</pre>
<pre><font face="Arial">// label.setText("Press the button to close:");</font></pre>
<pre><font face="Arial">       <strong>  java 代码</strong></font></pre>
<pre>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>mi&nbsp;=&nbsp;ast.newMethodInvocation(); &nbsp;&nbsp;</span></span>
    <li class=""><span>mi.setExpression(ast.newSimpleName(</span><span class="string">"label"</span><span>)); &nbsp;&nbsp;</span>
    <li class="alt"><span>mi.setName(ast.newSimpleName(</span><span class="string">"setText"</span><span>)); &nbsp;&nbsp;</span>
    <li class=""><span>StringLiteral&nbsp;sl&nbsp;=&nbsp;ast.newStringLiteral(); &nbsp;&nbsp;</span>
    <li class="alt"><span>sl.setLiteralValue(</span><span class="string">"Press&nbsp;the&nbsp;button&nbsp;to&nbsp;close:"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>mi.arguments().add(sl); &nbsp;&nbsp;</span>
    <li class="alt"><span>constructorBlock.statements().add(ast.newExpressionStatement(mi));&nbsp;&nbsp;</span></li>
</ol>
</div>
</pre>
<pre><font face="Arial">// label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));</font></pre>
<pre><font face="Arial">           <strong>java 代码</strong></font>
<pre>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>mi&nbsp;=&nbsp;ast.newMethodInvocation(); &nbsp;&nbsp;</span></span>
    <li class=""><span>mi.setExpression(ast.newSimpleName(</span><span class="string">"label"</span><span>)); &nbsp;&nbsp;</span>
    <li class="alt"><span>mi.setName(ast.newSimpleName(</span><span class="string">"setLayoutData"</span><span>)); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>cc&nbsp;=&nbsp;ast.newClassInstanceCreation(); &nbsp;&nbsp;</span>
    <li class=""><span>cc.setName(ast.newSimpleName(</span><span class="string">"GridData"</span><span>)); &nbsp;&nbsp;</span>
    <li class="alt"><span>cc.arguments().add(ast.newName(getSimpleNames(</span><span class="string">"GridData.HORIZONTAL_ALIGN_CENTER"</span><span>))); &nbsp;&nbsp;</span>
    <li class=""><span>mi.arguments().add(cc); &nbsp;&nbsp;</span>
    <li class="alt"><span>constructorBlock.statements().add(ast.newExpressionStatement(mi));&nbsp;&nbsp;</span></li>
</ol>
</div>
</pre>
<font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font face="Arial"></font></font></font></font></font></font></font></font>
<p><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font size="+0"><font face="Arial"></font></font></font></font></font></font></font></font>&nbsp;<font face="Arial">// Button button = new Button(this,SWT.PUSH);</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>vdf&nbsp;=&nbsp;ast.newVariableDeclarationFragment(); &nbsp;&nbsp;</span></span>
    <li class=""><span>vdf.setName(ast.newSimpleName(</span><span class="string">"button"</span><span>)); &nbsp;&nbsp;</span>
    <li class="alt"><span>vds&nbsp;=&nbsp;ast.newVariableDeclarationStatement(vdf); &nbsp;&nbsp;</span>
    <li class=""><span>vds.setType(ast.newSimpleType(ast.newSimpleName(</span><span class="string">"Button"</span><span>))); &nbsp;&nbsp;</span>
    <li class="alt"><span>constructorBlock.statements().add(vds); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>cc&nbsp;=&nbsp;ast.newClassInstanceCreation(); &nbsp;&nbsp;</span>
    <li class=""><span>cc.setName(ast.newSimpleName(</span><span class="string">"Button"</span><span>)); &nbsp;&nbsp;</span>
    <li class="alt"><span>vdf.setInitializer(cc); &nbsp;&nbsp;</span>
    <li class=""><span>cc.arguments().add(ast.newThisExpression()); &nbsp;&nbsp;</span>
    <li class="alt"><span>cc.arguments().add(ast.newName(getSimpleNames(</span><span class="string">"SWT.PUSH"</span><span>)));&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font face="Arial"></font></p>
<p><font face="Arial">// button.addSelectionListener(new SelectionAdapter() {});</font> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<strong>java 代码</strong></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>mi&nbsp;=&nbsp;ast.newMethodInvocation(); &nbsp;&nbsp;</span></span>
    <li class=""><span>constructorBlock.statements().add(ast.newExpressionStatement(mi)); &nbsp;&nbsp;</span>
    <li class="alt"><span>mi.setExpression(ast.newSimpleName(</span><span class="string">"button"</span><span>)); &nbsp;&nbsp;</span>
    <li class=""><span>mi.setName(ast.newSimpleName(</span><span class="string">"addSelectionListener"</span><span>)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>ClassInstanceCreation&nbsp;ci&nbsp;=&nbsp;ast.newClassInstanceCreation(); &nbsp;&nbsp;</span>
    <li class="alt"><span>ci.setName(ast.newSimpleName(</span><span class="string">"SelectionAdapter"</span><span>)); &nbsp;&nbsp;</span>
    <li class=""><span>mi.arguments().add(ci); &nbsp;&nbsp;</span>
    <li class="alt"><span>AnonymousClassDeclaration&nbsp;cd&nbsp;=&nbsp;ast.newAnonymousClassDeclaration(); &nbsp;&nbsp;</span>
    <li class=""><span>ci.setAnonymousClassDeclaration(cd);&nbsp;</span> </li>
</ol>
</div>
</pre>
</font></div>
<img src ="http://www.blogjava.net/eroself/aggbug/181565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2008-02-23 11:14 <a href="http://www.blogjava.net/eroself/archive/2008/02/23/181565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中如何以类为相对路径或以库为相对路径定位资源  </title><link>http://www.blogjava.net/eroself/archive/2008/02/19/180602.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Tue, 19 Feb 2008 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2008/02/19/180602.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/180602.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2008/02/19/180602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/180602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/180602.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">转自：http://blog.csdn.net/ruyanhai/archive/2007/11/07/1871663.aspx<br />
<br />
</p>
</span></span></span></span>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-size: 10pt; font-family: 宋体">◆</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">一般情况下</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">,</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">我们都使用相对路径来获取资源</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">,</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">这样的灵活性比较大</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">.</span></strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt; font-family: 宋体">比如当前类为</span><span style="font-size: 10pt; font-family: 'Courier New'">com/bbebfe/Test.class</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt; font-family: 宋体">而图像资源比如</span><span style="font-size: 10pt; font-family: 'Courier New'">sample.gif</span><span style="font-size: 10pt; font-family: 宋体">应该放置在</span><span style="font-size: 10pt; font-family: 'Courier New'">com/bbebfe/sample.gif</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt; font-family: 宋体">而如果这些图像资源放置在</span><span style="font-size: 10pt; font-family: 'Courier New'">icons</span><span style="font-size: 10pt; font-family: 宋体">目录下</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">则应该是</span><span style="font-size: 10pt; font-family: 'Courier New'">com/bbebfe/icons/sample.gif</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt; font-family: 宋体">通过当前类文件的路径获取资源主要有如下几种方式</span><span style="font-size: 10pt; font-family: 'Courier New'">:</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; font-family: 'Courier New'"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&#183; 假设当前类为com.bbebfe.Test</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; font-family: 'Courier New'"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&#183; 包所在的文件夹为bin</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-size: 10pt; font-family: 'Courier New'">String imageName</span></strong><span style="font-size: 10pt; font-family: 'Courier New'"> = "icons/sample.gif"</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong>1, </strong><strong><span style="font-family: 宋体">通过</span></strong><strong>Class.getResource()</strong><strong><span style="font-family: 宋体">定位类路径下的资源</span></strong><strong>(bin/com/bbebfe/icons/sample.gif)</strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">Class clazz = this.getClass();</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">URL url = <span style="font-size: 10pt; font-family: 'Courier New'">clazz.getResource(imageName);</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-size: 10pt; font-family: 'Courier New'">2,</span></strong><strong><span style="font-family: 宋体">通过</span></strong><strong>ClassLoader.getResource()</strong><strong><span style="font-family: 宋体">定位包的根目录下的资源</span></strong><strong>(bin/icons/sample.gif)</strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; font-family: 'Courier New'"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">Class clazz = this.getClass();</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; font-family: 'Courier New'"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">URLClassLoader loader = (URLClassLoader)clazz.getClassLoader();</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt; font-family: 'Courier New'"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">URL url = loader.getResource(imageName);</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong>3, </strong><strong><span style="font-family: 宋体">通过</span></strong><strong>ClassLoader.findResource()</strong><strong><span style="font-family: 宋体">提供自己定制的方式定位资源</span></strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">URL url = loader.findResource(imageName);</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-family: 宋体">◆</span></strong><strong><span style="font-family: 宋体">那么这三种方法有那些区别</span></strong><strong>, </strong><strong><span style="font-family: 宋体">我们应该在何时使用哪种方法呢</span></strong><strong>?</strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-family: 宋体">&#183;</span></strong><strong> Class.getResource() </strong><strong><span style="font-family: 宋体">方法</span></strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: 宋体">该方法实际通过该</span>Class<span style="font-family: 宋体">的</span>Class Loader<span style="font-family: 宋体">的</span>getResource()<span style="font-family: 宋体">方法来获得资源</span>, <span style="font-family: 宋体">在调用</span>ClassLoader<span style="font-family: 宋体">的</span>getResource()<span style="font-family: 宋体">方法之前</span>, Class.getResource()<span style="font-family: 宋体">方法会对资源名称做一定的处理</span>,<span style="font-family: 宋体">构建一个该资源的绝对名称</span>(absolute name, <span style="font-family: 宋体">大意是</span>:</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">＋</span><span style="font-family: 宋体">如果资源名称以</span>'/'('"u002f') <span style="font-family: 宋体">开始</span>, <span style="font-family: 宋体">则资源的绝对名称是</span>'/'<span style="font-family: 宋体">以后的部分</span>.</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">如果</span>imageName<span style="font-family: 宋体">是</span>"/icons/sample.gif", <span style="font-family: 宋体">则在这里会变成</span>"icons/sample.gif"</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">＋</span><span style="font-family: 宋体">否则对于其他情况</span>, <span style="font-family: 宋体">绝对名称将是如下形式</span>(<span style="font-family: 宋体">给资源名称的前面加上</span>modified_package_name/):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; modified_package_name/resource_name (<span style="font-family: 宋体">修正的包名称</span>/<span style="font-family: 宋体">资源名称</span>)</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: 宋体">其中</span><em><span style="font-size: 10.5pt; font-family: 宋体">修正的包名称</span></em><span style="font-family: 宋体">含义是将<strong>当前对象所在的包名称</strong>中的</span>'.'('"u002e')<span style="font-family: 宋体">替换为</span>'/'</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: 宋体">如果</span>ClassLoader.getResource()<span style="font-family: 宋体">方法返回一个值为</span>null<span style="font-family: 宋体">的</span>URL, <span style="font-family: 宋体">则</span>Class.getResource()<span style="font-family: 宋体">方法最终会将资源请求交给</span></span></span></span></span><a lang="" href="mk:@MSITStore:E:"  ClassLoader.html#getSystemResource(java.lang.String)? java api jdk150 java相关?SUN?jdk150-hh?jdk150.chm::><span style="color: black; text-decoration: none; text-underline: none"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">ClassLoader.getSystemResource(java.lang.String)</span></span></span></span></a><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">.</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-family: 宋体">&#183;</span></strong><strong> ClassLoader.getResource() </strong><strong><span style="font-family: 宋体">方法</span></strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: 宋体">该对资源进行查找</span>, <span style="font-family: 宋体">资源的名称是以</span>'/'<span style="font-family: 宋体">分隔的路径</span>, <span style="font-family: 宋体">这个方法首先查找自己的父亲</span>ClassLoader, <span style="font-family: 宋体">由自己的父</span>ClassLoader<span style="font-family: 宋体">来查找资源</span>(<span style="font-family: 宋体">实际上</span>, <span style="font-family: 宋体">如果父亲的父亲不是空</span>, <span style="font-family: 宋体">则父亲仍会向上提交查找请求</span>). <span style="font-family: 宋体">如果自己的父</span>ClassLoader<span style="font-family: 宋体">是</span>null, <span style="font-family: 宋体">则查找</span>Java<span style="font-family: 宋体">虚拟机中内建的</span>class loader, <span style="font-family: 宋体">并将资源请求提交给它们</span>, <span style="font-family: 宋体">如果这些操作都失败了</span>, <span style="font-family: 宋体">则</span>ClassLoader<span style="font-family: 宋体">会调用自己的</span>findResource()<span style="font-family: 宋体">方法来查找资源</span>.</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-family: 宋体">&#183;</span></strong><strong> ClassLoader.findResource() </strong><strong><span style="font-family: 宋体">方法</span></strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: 宋体">该方法在内部查找指定的资源</span>, <strong><span style="font-family: 宋体">如果你实现了自己的</span></strong><strong>Class Loader,</strong><strong><span style="font-family: 宋体">则应该重载这个方法以自己特定的方式来查找类文件和资源</span></strong><strong>.</strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-family: 宋体">◆</span></strong><strong><span style="font-family: 宋体">通过以上的总结</span></strong><strong>, </strong><strong><span style="font-family: 宋体">我们可以看到三点</span></strong><strong>.</strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong>1, </strong><span style="font-family: 宋体">无论是</span>getResource(), <span style="font-family: 宋体">还是</span>findResource(), <span style="font-family: 宋体">这些方法都只是资源的定位方法</span>, <span style="font-family: 宋体">最终都只是返回一个</span>URL, <span style="font-family: 宋体">只是对资源的定位而已</span>, <span style="font-family: 宋体">我们随后应通过自己的方法来读取这些资源</span>. <span style="font-family: 宋体">而在</span>Class<span style="font-family: 宋体">和</span>ClassLoader<span style="font-family: 宋体">中还定义的有</span>getResourceAsStream<span style="font-family: 宋体">方法</span>, <span style="font-family: 宋体">该方法是</span>getResource<span style="font-family: 宋体">的增强版</span>, <span style="font-family: 宋体">这里就不介绍了</span>.</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong>2,</strong><strong><span style="font-family: 宋体">如果需要以类为相对路径查找资源</span></strong><strong>, </strong><strong><span style="font-family: 宋体">则应该调用</span></strong><strong>Class.getResource()</strong><strong><span style="font-family: 宋体">方法</span></strong>, <span style="font-family: 宋体">不要直接调用</span>ClassLoader.getResource()<span style="font-family: 宋体">方法</span>. <span style="font-family: 宋体">另外</span>, <span style="font-family: 宋体">除非是你自己定义了</span>ClassLoader<span style="font-family: 宋体">并重载了</span>findResource<span style="font-family: 宋体">方法</span>,<span style="font-family: 宋体">否则也不要直接调用</span>ClassLoader.findResource<span style="font-family: 宋体">方法</span>, <span style="font-family: 宋体">因为在</span>Class.getResource()<span style="font-family: 宋体">方法中<strong>会对资源名称作一定的处理</strong></span>, <span style="font-family: 宋体">这在上面介绍了</span>, <span style="font-family: 宋体">下面举个实例</span>:</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">假设我的当前类在</span>Eclipse<span style="font-family: 宋体">工程</span>Database<span style="font-family: 宋体">下</span>, <span style="font-family: 宋体">类所在的包是</span>com.bbebfe.test, <span style="font-family: 宋体">而</span>icons<span style="font-family: 宋体">目录放在</span>bin/com/bbebfe/test/<span style="font-family: 宋体">目录下</span>, <span style="font-family: 宋体">我需要得到</span>icons/sample.gif<span style="font-family: 宋体">文件的</span>URL, <span style="font-family: 宋体">则调用</span>this.getClass().getResource()<span style="font-family: 宋体">得到的</span>URL<span style="font-family: 宋体">是</span>:</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 10pt; font-family: 'Courier New'">file:/E:/MyLife/MyProjects/Eclipse3.2/</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">Database/bin/</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">com/bbebfe/test/</span><span style="font-size: 10pt; font-family: 'Courier New'">icons/disremove.gif</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;</span></span></span></span></strong></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong>3, </strong><span style="font-family: 宋体">有时候我们希望某个</span>jar<span style="font-family: 宋体">库的图像资源在同一个</span>icons<span style="font-family: 宋体">下统一管理</span>, <span style="font-family: 宋体">而不是为每个包下面的</span>Class<span style="font-family: 宋体">建一个</span>icons, <span style="font-family: 宋体">也就是说<strong>需要以库为相对路径来查找资源</strong></span><strong>, </strong><strong><span style="font-family: 宋体">此时则应该调用</span></strong><strong>ClassLoader.getResource()</strong><span style="font-family: 宋体">方法</span>, <span style="font-family: 宋体">举个例子</span>:</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: 宋体">&#183;</span><span style="font-family: 宋体">某个工程有如下的包结构</span>:</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.ui</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.test</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.database</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: 宋体">&#183;</span><span style="font-family: 宋体">如果以类为相对路径</span>, <span style="font-family: 宋体">则在每个包下都必须建立一个</span>icons<span style="font-family: 宋体">目录</span>, <span style="font-family: 宋体">并放置相应的资源文件</span>. <span style="font-family: 宋体">如下</span>:</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.ui/icons/...</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.test/icons/...</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.database/icons/...</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-family: 宋体">&#183;</span><span style="font-family: 宋体">而我们可能希望在<strong>根目录下</strong>放置一个</span>icons<span style="font-family: 宋体">目录</span>, <span style="font-family: 宋体">把所有资源放置在这里管理</span>, <span style="font-family: 宋体">这样还可以防止资源的重复</span>. <span style="font-family: 宋体">就是如下形式</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.ui</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.test</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.bbebfe.database</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: blue">icons/sample.gif ... </span></strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">则此时<strong>我们应该调用</strong></span><strong>ClassLoader.getResource</strong><strong><span style="font-family: 宋体">方法</span></strong>, <span style="font-family: 宋体">由于它没有对资源名称作处理</span>, <span style="font-family: 宋体">也就是说<strong>没有将修正的包名添加到资源名称前</strong></span>, <span style="font-family: 宋体">所以它会在类所在的包的根下去查找资源</span>.(<span style="font-family: 宋体">运行</span>java<span style="font-family: 宋体">程序的语法是</span>java com.bbebfe.ui.Test, <span style="font-family: 宋体">所以<strong>根目录</strong>是</span>com<span style="font-family: 宋体">目录的上级目录</span>).</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;</span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><strong><span style="font-family: 宋体">◆</span></strong><strong><span style="font-family: 宋体">最后</span></strong><strong>, </strong><strong><span style="font-family: 宋体">在</span></strong><strong>Java</strong><strong><span style="font-family: 宋体">中对资源进行定位的方法有很多种</span></strong><strong>, </strong><strong><span style="font-family: 宋体">在</span></strong><strong>Eclipse</strong><strong><span style="font-family: 宋体">源代码中还有如下一段定位文件资源的代码</span></strong><strong>, </strong><strong><span style="font-family: 宋体">还没有时间研究</span></strong><strong>, </strong><strong><span style="font-family: 宋体">以后再谈</span></strong><strong>:</strong></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt; color: blue">ProtectionDomain</span><span style="font-size: 10pt"> domain = Main.class.getProtectionDomain();</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt; color: blue">CodeSource</span><span style="font-size: 10pt"> source = null;</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt; color: blue">URL</span><span style="font-size: 10pt"> result = null;</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">if (domain != null)</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">source = domain.getCodeSource();//</span><span style="font-size: 10pt; font-family: 宋体">获得</span><span style="font-size: 10pt">code source</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">if (source != null)</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = source.getLocation();//</span><span style="font-size: 10pt; font-family: 宋体">获得</span><span style="font-size: 10pt">URL</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">String path = decode(result.getFile());//</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; color: green"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">// normalize to not have leading / so we can check the form</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">File file = new File(path);</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">path = file.toString().replace('""', '/');</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; color: green"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">// create a file URL (via File) to normalize the form (e.g., put </span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt; color: green"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">// the leading / on if necessary)</span></span></span></span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="font-family: 宋体"><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 12pt">path = new File(path).toURL().getFile();</span></span></span></span></span></p>
<img src ="http://www.blogjava.net/eroself/aggbug/180602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2008-02-19 10:37 <a href="http://www.blogjava.net/eroself/archive/2008/02/19/180602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>synchronized的作用</title><link>http://www.blogjava.net/eroself/archive/2008/01/11/174630.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Fri, 11 Jan 2008 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2008/01/11/174630.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/174630.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2008/01/11/174630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/174630.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/174630.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://www.blogjava.net/swingboat/archive/2007/05/08/115882.htmlsynchronized的作用&nbsp;一、同步方法public synchronized void methodAAA(){//&#8230;.}锁定的是调用这个同步方法的对象测试：a、不使用这个关键字修饰方法，两个线程调用同...&nbsp;&nbsp;<a href='http://www.blogjava.net/eroself/archive/2008/01/11/174630.html'>阅读全文</a><img src ="http://www.blogjava.net/eroself/aggbug/174630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2008-01-11 15:09 <a href="http://www.blogjava.net/eroself/archive/2008/01/11/174630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java实时多任务调度过程中的安全监控设计</title><link>http://www.blogjava.net/eroself/archive/2007/12/28/171220.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Fri, 28 Dec 2007 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2007/12/28/171220.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/171220.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2007/12/28/171220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/171220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/171220.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://java.chinaitlab.com/model/528568.html<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在一系列关联的多任务的实时环境中，如果有一个任务发生失败，可能导致所有任务产生连锁反应，从而造成调度失控的局面。特别是对于核心控制设备尤其重要，为了解决这个问题，必须对每个任务进行实时监控。
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<a name="1"><strong>1. 问题分析</strong> </a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JAVA环境中，一个任务一般是由一个独立线程来引导实现的，独立线程可能调用一系列子线程。如果在执行过程中，某一个线程发生异常（产生的原因很多，比如软件升级、运行环境改变、系统资抢占等），那么该线程就会停止运行，直到下次任务重新被提交。对于实时环境来说当前任务是失败的。我们无法预测和完全避免异常的发生，但是可以通过一些技术手段来跟踪任务的状态，从而及时发现问题并恢复正常，减少损失。</p>
<p><strong>　 </strong><a name="2"><strong>2. 设计原理</strong> </a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于一个实时任务而言，执行效率是非常关键的，这意味着不可能考虑用非常复杂的方式来实现任务监控，即使这样可以做的比较完善，同时监控代码本身也会引入一些异常，这就要求监控程序必须简单可靠，能够发现大多数问题，并能及时处理。 </p>
<p>一个可能的简单实现。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们对每个任务加上一个监控的"壳"，调度程序调用这个"壳"来完成对具体任务的引导和监控，相当于每个任务具有自治能力。这样做的好处有： </p>
<ol>
    <li>分散控制。不需要修改调度主体程序，不增加调度过程的复杂度；
    <li>控制灵活，<a class="channel_keylink" href="http://security.chinaitlab.com/" target="_blank">安全</a>性高。对于不同任务可定义不同控制方式和控制参数，封装在任务内部，灵活性好，对个别任务控制代码的修改不会影响其他任务，即任务控制实现松藕合，避免错误扩散。适合团队开发；
    <li>维护简单，升级方便。对于新的任务加入也无需改变原来调度程序的结构，只需修改任务表及相关参数，这样在性能提高的同时也简化了软件升级过程中的代码维护量。 </li>
</ol>
<p><img height="198" alt="" src="http://java.chinaitlab.com/UploadFiles_8734/200610/20061024093359920.gif" width="386" /><br />
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a name="3"><strong>3. 设计实现</strong> </a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个线程理论上有四种状态： </p>
<table>
    <tbody>
        <tr>
            <td>new </td>
            <td>线程对象已经创建，但尚未启动，不可运行 </td>
        </tr>
        <tr>
            <td>runnable </td>
            <td>一旦有时间分片机制有空闲的CPU周期，线程立即开始运行 </td>
        </tr>
        <tr>
            <td>dead </td>
            <td>从run()方法退出后，一个线程即消亡 </td>
        </tr>
        <tr>
            <td>blocked </td>
            <td>线程可运行，但有某种东西阻碍了它。调度机制不给它分配任何CPU时间，直到它进入runnable状态 </td>
        </tr>
    </tbody>
</table>
<p>在实际操作中，为了便于描述，我们重新规定了线程的状态： </p>
<table>
    <tbody>
        <tr>
            <td>Actived </td>
            <td>线程已被激活，处于运行状态 </td>
        </tr>
        <tr>
            <td>Sleeping </td>
            <td>线程完成一个特定任务后退出，进入休眠状态 </td>
        </tr>
        <tr>
            <td>Dead </td>
            <td>线程运行过程中发生异常，终止运行，处于死亡状态 </td>
        </tr>
    </tbody>
</table>
<p>根据上述理论，我们只需要对Actived状态的线程进行监控，也只有对Actived状态监控才有意义，这是对监控模块做出逻辑简化。那么如何实现监控模块对具体任务的监控呢？ </p>
<p>对具体任务的监控方式有多种，根据任务的不同，需要采用不同的监控代码，但是在结构上基本相同。这和类的重载概念有点相似。本文附有一个简单的例子。 </p>
<p>A任务每秒执行一个简单的代数运算 j = 1/ i，并打印结果。我们故意在其中设置了一个异常陷阱，使得执行过程中出现一次被0除的算术异常，下面结合这个例子讲述监控原理。 </p>
<p>为了监控A，我们设计了一个监控线程M。M中定义了一些关键逻辑变量： </p>
<table>
    <tbody>
        <tr>
            <td>Keepchecking </td>
            <td>持续监控标志 </td>
        </tr>
        <tr>
            <td>laststatus </td>
            <td>保存上次监控状态 </td>
        </tr>
        <tr>
            <td>maydeadtimes </td>
            <td>监控线程可能死亡的计数器 </td>
        </tr>
        <tr>
            <td>maydeadtimeout </td>
            <td>定义判断线程死亡的边界条件 </td>
        </tr>
        <tr>
            <td>deadtimes </td>
            <td>监控线程死亡次数的计数器 </td>
        </tr>
        <tr>
            <td>deadtimeout </td>
            <td>定义判断线程不正常的边界条件 </td>
        </tr>
    </tbody>
</table>
<p>为了适应监控，在A任务中相应增加一些可以被监控的状态和行为： </p>
<table>
    <tbody>
        <tr>
            <td>dead </td>
            <td>死状态标志 </td>
        </tr>
        <tr>
            <td>dead = !dead; </td>
            <td>改变状态 </td>
        </tr>
    </tbody>
</table>
<br />
整个监控就是围绕这些状态标志和行为展开的。A任务定期修改自己的dead标志，dead是一个布尔变量，理论上只要A没有死，那么dead肯定是周期变化的（和心跳概念差不多），M需要做的就是监控dead的变化。为了避免一些偶然因素导致的误判，我们在M中设置了一些计数器和边界值（maydeadtimes和maydeadtimeout），当M发现A的可能死亡次数超过一定限制后，判断A已死亡，不在继续等待了，作为实时处理，首先注销A的实例，然后重新启动A（和我们计算机死机的复位很像），然后进入新一轮监控。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果是因为系统偶然因素导致A死亡，那么在随后的新的任务启动过程中一般可以顺利完成。但是万一由于环境参数改变或软件升级存在版本缺陷，A可能始终会产生异常，那么M是否需要耐心地监控下去呢？一个形象的例子是：如果你连续3次开机都失败，你是否会怀疑机器有问题？当然，你会，那么M也应该会。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了对A任务重复多次死亡有一个统计，M中又引入了另外对计数器和边界值（deadtimes和deadtimeout），和你开计算机的过程一样，如果连续n次都发现A有问题，可以基本肯定不是由于偶然因素引起的，需要对A的代码或系统的环境进行检查。M会发出告警，通知必须要对A进行审查了，然后清空A，自己自动<a class="channel_keylink" href="http://security.chinaitlab.com/" target="_blank">安全</a>退出。如果在核心调度程序中设置一个标志接受M们的告警，就可以有足够理由终止其他任务的执行。可以看见，在A任务发生异常期间，M承担了核心调度程序的维护功能。特别是当任务数量比较多的情况，核心调度程序只能采用排队方式处理任务异常，而且由于处理异常的复杂程度不同，无法保证对多任务异常的实时处理。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还要考虑正常情况下A和M的关系。核心调度程序通过M启动A任务后，M处于持续监控状态，当A正常结束任务后，A需要通知M结束监控，这样，当A进入休眠状态后，M也不会占用内存空间，提高了系统资源的利用率。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过以上描述，可以看到，上述监控思想具有清晰的概念和可操作性，占用资源少，为保证系统连续稳定运行创造了条件。 </p>
<p>具体代码实现附后。 </p>
<p>运行结果如下： </p>
<p>
<table cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td width="408">
            <table>
                <tbody>
                    <tr>
                        <td width="235">异常情况 </td>
                        <td width="211">正常情况 </td>
                    </tr>
                    <tr>
                        <td valign="top">i=-3: status=true <br />
                        M read A status = true <br />
                        i=-2: status=false <br />
                        M read A status = false <br />
                        i=-1: status=true <br />
                        M read A status = true <br />
                        A become Exception! <br />
                        M read A status = true <br />
                        M read A status = true <br />
                        M read A status = true <br />
                        A is deaded! <br />
                        M is restarting A! <br />
                        ____________________________ <br />
                        i=-3: status=false <br />
                        M read A status = false <br />
                        i=-2: status=true <br />
                        M read A status = true <br />
                        i=-1: status=false <br />
                        M read A status = false <br />
                        A become Exception! <br />
                        M read A status = false <br />
                        M read A status = false <br />
                        M read A status = false <br />
                        A is deaded! <br />
                        M is restarting A! <br />
                        ____________________________ <br />
                        i=-3: status=true <br />
                        M read A status = true <br />
                        i=-2: status=false <br />
                        M read A status = false <br />
                        i=-1: status=true <br />
                        M read A status = true <br />
                        A become Exception! <br />
                        M read A status = true <br />
                        M read A status = true <br />
                        M read A status = true <br />
                        Alert! A is unstable, M will stop it <br />
                        （结束） <br />
                        </td>
                        <td valign="top">i=1: status=true <br />
                        M read A status = true <br />
                        i=2: status=false <br />
                        M read A status = false <br />
                        i=3: status=true <br />
                        M read A status = true <br />
                        i=4: status=false <br />
                        M read A status = false <br />
                        i=5: status=true <br />
                        M read A status = true <br />
                        A is Ending M <br />
                        M read A status = true <br />
                        （结束） <br />
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a name="4"><strong>4. 结束语</strong> </a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过给制定任务线程增加监控线程，可以很好地解决实时多任务环境下的安全监控问题，同时避免了核心调度线程事务过分复杂的问题。实践证明，该方法复杂度小，占用资源少，运行可靠，适合复杂条件下的多任务环境。 </p>
<br />
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. 源代码：</strong> </p>
<p>
<pre>// 核心调度程序
public class mythread {
public mythread() {  }
public static void main(String[] args) {
M m = new M();
}
}
// A 任务线程
class A extends Thread {
public static boolean dead = false;
M m;
A(M m){
m = m;
start();
}
public void run(){
try{
for(int i=-3;i&lt;= 5;i++){
int j=1/i;   // 人为设置过程中陷阱
dead = !dead;  // 活动状态
System.out.println("i=" + i + ": status=" + dead);
try{
sleep(2000);
}
catch(InterruptedException ie){
System.out.println("A is Interrupted!");
}
}
m.Keepchecking = false;  //A 正常结束后关闭监控线程
System.out.println("A is Ending M");
}
catch(Exception e){
System.out.println("A become Exception!");
}
}
}
// 监控线程
class M extends Thread{
public static boolean Keepchecking = true;  // 持续监控标志
boolean laststatus;     //保存上次监控状态
int maydeadtimes = 0;  //监控线程可能死亡的计数器
int maydeadtimeout = 3;//定义判断线程死亡的边界条件
int deadtimes = 0;     //监控线程死亡次数的计数器
int deadtimeout = 3;   //定义判断线程不正常的边界条件
A a;
M(){start();}
public void run(){
schedule();
while(Keepchecking){
laststatus = a.dead;
try{
sleep(2000);
}
catch(InterruptedException e){
System.out.println("M is Interrupted!");
}
System.out.println("M read A status = " + a.dead);
if(laststatus == a.dead ){
if(++maydeadtimes &gt;= maydeadtimeout){
if(++deadtimes &gt;= deadtimeout){
System.out.println("Alert! A is unstable, M will stop it");
a = null;
break;
}
else{
System.out.println( "A is deaded!");
schedule();
System.out.println("M is restarting A!\n____________________________\n");
}
}
}
else{
maydeadtimes = 0;
}
}
}
private void schedule(){
A a = new A(this);
}
}
</pre>
<br />
<img src ="http://www.blogjava.net/eroself/aggbug/171220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2007-12-28 15:38 <a href="http://www.blogjava.net/eroself/archive/2007/12/28/171220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java日期时间使用总结及项目中遇到的问题</title><link>http://www.blogjava.net/eroself/archive/2007/12/28/171195.html</link><dc:creator>鬼谷子</dc:creator><author>鬼谷子</author><pubDate>Fri, 28 Dec 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/eroself/archive/2007/12/28/171195.html</guid><wfw:comment>http://www.blogjava.net/eroself/comments/171195.html</wfw:comment><comments>http://www.blogjava.net/eroself/archive/2007/12/28/171195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/eroself/comments/commentRss/171195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/eroself/services/trackbacks/171195.html</trackback:ping><description><![CDATA[<p>Java日期时间使用总结</p>
<p>http://lavasoft.blog.51cto.com/ <br />
<br />
一、Java中的日期概述 <br />
<br />
日期在Java中是一块非常复杂的内容，对于一个日期在不同的语言国别环境中，日期的国际化，日期和时间之间的转换，日期的加减运算，日期的展示格式都是非常复杂的问题。 <br />
<br />
在Java中，操作日期主要涉及到一下几个类： <br />
<br />
1、java.util.Date <br />
类 Date 表示特定的瞬间，精确到毫秒。从 JDK 1.1 开始，应该使用 Calendar 类实现日期和时间字段之间转换，使用 DateFormat 类来格式化和分析日期字符串。Date 中的把日期解释为年、月、日、小时、分钟和秒值的方法已废弃。 <br />
<br />
2、java.text.DateFormat（抽象类） <br />
DateFormat 是日期/时间格式化子类的抽象类，它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类（如 SimpleDateFormat）允许进行格式化（也就是日期 -&gt; 文本）、分析（文本-&gt; 日期）和标准化。将日期表示为 Date 对象，或者表示为从 GMT（格林尼治标准时间）1970 年，1 月 1 日 00:00:00 这一刻开始的毫秒数。 <br />
<br />
3、java.text.SimpleDateFormat（DateFormat的直接子类） <br />
SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化（日期 -&gt; 文本）、分析（文本 -&gt; 日期）和规范化。 <br />
SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是，仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。 <br />
<br />
4、java.util.Calendar（抽象类） <br />
Calendar 类是一个抽象类，它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法，并为操作日历字段（例如获得下星期的日期）提供了一些方法。瞬间可用毫秒值来表示，它是距历元（即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000，格里高利历）的偏移量。 <br />
与其他语言环境敏感类一样，Calendar 提供了一个类方法 getInstance，以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象，其日历字段已由当前日期和时间初始化。 <br />
<br />
5、java.util.GregorianCalendar（Calendar的直接子类） <br />
GregorianCalendar 是 Calendar 的一个具体子类，提供了世界上大多数国家使用的标准日历系统。 <br />
GregorianCalendar 是一种混合日历，在单一间断性的支持下同时支持儒略历和格里高利历系统，在默认情况下，它对应格里高利日历创立时的格里高利历日期（某些国家是在 1582 年 10 月 15 日创立，在其他国家要晚一些）。可由调用方通过调用 setGregorianChange() 来更改起始日期。 <br />
<br />
<br />
二、java.util.Date的使用 <br />
<br />
1、java.util.Date的API简介 <br />
<br />
类 java.util.Date 表示特定的瞬间，精确到毫秒。提供了很多的方法，但是很多已经过时，不推荐使用，下面仅仅列出没有过时的方法： <br />
<br />
构造方法摘要 <br />
------------- <br />
Date() <br />
分配 Date 对象并用当前时间初始化此对象，以表示分配它的时间（精确到毫秒）。 <br />
Date(long date) <br />
分配 Date 对象并初始化此对象，以表示自从标准基准时间（称为&#8220;历元（epoch）&#8221;，即 1970 年 1 月 1 日 00:00:00 GMT）以来的指定毫秒数。 <br />
<br />
方法摘要 <br />
------------- <br />
boolean after(Date when) <br />
测试此日期是否在指定日期之后。 <br />
<br />
boolean before(Date when) <br />
测试此日期是否在指定日期之前。 <br />
<br />
Object clone() <br />
返回此对象的副本。 <br />
<br />
int compareTo(Date anotherDate) <br />
比较两个日期的顺序。 <br />
<br />
boolean equals(Object obj) <br />
比较两个日期的相等性。 <br />
<br />
long getTime() <br />
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 <br />
<br />
int hashCode() <br />
返回此对象的哈希码值。 <br />
<br />
void setTime(long time) <br />
设置此 Date 对象，以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。 <br />
<br />
String toString() <br />
把此 Date 对象转换为以下形式的 String： dow mon dd hh:mm:ss zzz yyyy 其中： <br />
dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。 <br />
mon 是月份 (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)。 <br />
dd 是一月中的某一天（01 至 31），显示为两位十进制数。 <br />
hh 是一天中的小时（00 至 23），显示为两位十进制数。 <br />
mm 是小时中的分钟（00 至 59），显示为两位十进制数。 <br />
ss 是分钟中的秒数（00 至 61），显示为两位十进制数。 <br />
zzz 是时区（并可以反映夏令时）。标准时区缩写包括方法 parse 识别的时区缩写。如果不提供时区信息，则 zzz 为空，即根本不包括任何字符。 <br />
yyyy 是年份，显示为 4 位十进制数。</p>
<p>下面是一个Date类的综合实例: <br />
import java.util.Date; </p>
<p>/** <br />
* Created by IntelliJ IDEA. <br />
* User: leizhimin <br />
* Date: 2007-11-30 <br />
* Time: 8:45:44 <br />
* 日期测试 <br />
*/ <br />
public class TestDate { <br />
public static void main(String args[]) { <br />
TestDate nowDate = new TestDate(); <br />
nowDate.getSystemCurrentTime(); <br />
nowDate.getCurrentDate(); <br />
} </p>
<p>/** <br />
* 获取系统当前时间 <br />
* System.currentTimeMillis()返回系统当前时间，结果为1970年1月1日0时0分0秒开始，到程序执行取得系统时间为止所经过的毫秒数 <br />
* 1秒＝1000毫秒 <br />
*/ <br />
public void getSystemCurrentTime() { <br />
System.out.println("----获取系统当前时间----"); <br />
System.out.println("系统当前时间 = " + System.currentTimeMillis()); <br />
} </p>
<p>/** <br />
* 通过Date类获取当前日期和当前时间 <br />
* date.toString()把日期转换为dow mon dd hh:mm:ss zzz yyyy <br />
*/ <br />
public void getCurrentDate() { <br />
System.out.println("----获取系统当前日期----"); <br />
//创建并初始化一个日期（初始值为当前日期） <br />
Date date = new Date(); <br />
System.out.println("现在的日期是 = " + date.toString()); <br />
System.out.println("自1970年1月1日0时0分0秒开始至今所经历的毫秒数 = " + date.getTime()); <br />
} <br />
} <br />
<br />
运行结果: <br />
----获取系统当前时间---- <br />
系统当前时间 = 1196413077278 <br />
----获取系统当前日期---- <br />
现在的日期是 = Fri Nov 30 16:57:57 CST 2007 <br />
自1970年1月1日0时0分0秒开始至今所经历的毫秒数 = 1196413077278 </p>
<p>Process finished with exit code 0 <br />
<br />
<br />
2、java.text.DateFormat抽象类的使用 <br />
<br />
DateFormat 是日期/时间格式化子类的抽象类，它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类（如 SimpleDateFormat）允许进行格式化（也就是日期 -&gt; 文本）、分析（文本-&gt; 日期）和标准化。将日期表示为 Date 对象，或者表示为从 GMT（格林尼治标准时间）1970 年，1 月 1 日 00:00:00 这一刻开始的毫秒数。 <br />
<br />
DateFormat 提供了很多类方法，以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间 Formatter。格式化风格包括 FULL、LONG、MEDIUM 和 SHORT。方法描述中提供了使用这些风格的更多细节和示例。 <br />
<br />
DateFormat 可帮助进行格式化并分析任何语言环境的日期。对于月、星期，甚至日历格式（阴历和阳历），其代码可完全与语言环境的约定无关。 <br />
<br />
要格式化一个当前语言环境下的日期，可使用某个静态工厂方法： <br />
myString = DateFormat.getDateInstance().format(myDate); <br />
<br />
<br />
<br />
如果格式化多个日期，那么获得该格式并多次使用它是更为高效的做法，这样系统就不必多次获取有关环境语言和国家约定的信息了。 <br />
DateFormat df = DateFormat.getDateInstance(); <br />
for (int i = 0; i &lt; myDate.length; ++i) { <br />
output.println(df.format(myDate[i]) + "; "); <br />
} <br />
<br />
要格式化不同语言环境的日期，可在 getDateInstance() 的调用中指定它。 <br />
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE); <br />
<br />
还可使用 DateFormat 进行分析。 <br />
myDate = df.parse(myString); <br />
<br />
使用 getDateInstance 来获得该国家的标准日期格式。另外还提供了一些其他静态工厂方法。使用 getTimeInstance 可获得该国家的时间格式。使用 getDateTimeInstance 可获得日期和时间格式。可以将不同选项传入这些工厂方法，以控制结果的长度（从 SHORT 到 MEDIUM 到 LONG 再到 FULL）。确切的结果取决于语言环境，但是通常： <br />
SHORT 完全为数字，如 12.13.52 或 3:30pm <br />
MEDIUM 较长，如 Jan 12, 1952 <br />
LONG 更长，如 January 12, 1952 或 3:30:32pm <br />
FULL 是完全指定，如 Tuesday, April 12, 1952 AD 或 3:30:42pm PST。 <br />
<br />
如果愿意，还可以在格式上设置时区。如果想对格式化或分析施加更多的控制（或者给予用户更多的控制），可以尝试将从工厂方法所获得的 DateFormat 强制转换为 SimpleDateFormat。这适用于大多数国家；只是要记住将其放入一个 try 代码块中，以防遇到特殊的格式。 <br />
<br />
还可以使用借助 ParsePosition 和 FieldPosition 的分析和格式化方法形式来：逐步地分析字符串的各部分。 对齐任意特定的字段，或者找出字符串在屏幕上的选择位置。 <br />
<br />
DateFormat 不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式，则它必须保持外部同步。 <br />
<br />
3、java.text.SimpleDateFormat（DateFormat的直接子类）的使用 <br />
<br />
SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化（日期 -&gt; 文本）、分析（文本 -&gt; 日期）和规范化。 <br />
<br />
SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是，仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。每一个这样的类方法都能够返回一个以默认格式模式初始化的日期/时间格式化程序。可以根据需要使用 applyPattern 方法来修改格式模式。有关使用这些方法的更多信息，请参阅 DateFormat。 <br />
<br />
日期和时间模式 <br />
日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中，未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母，用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来，以免进行解释。"''" 表示单引号。所有其他字符均不解释；只是在格式化时将它们简单复制到输出字符串，或者在分析时与输入字符串进行匹配。 <br />
<br />
定义了以下模式字母（所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留）： <br />
字母 日期或时间元素 表示 示例 <br />
G Era 标志符 Text AD <br />
y 年 Year 1996; 96 <br />
M 年中的月份 Month July; Jul; 07 <br />
w 年中的周数 Number 27 <br />
W 月份中的周数 Number 2 <br />
D 年中的天数 Number 189 <br />
d 月份中的天数 Number 10 <br />
F 月份中的星期 Number 2 <br />
E 星期中的天数 Text Tuesday; Tue <br />
a Am/pm 标记 Text PM <br />
H 一天中的小时数（0-23） Number 0 <br />
k 一天中的小时数（1-24） Number 24 <br />
K am/pm 中的小时数（0-11） Number 0 <br />
h am/pm 中的小时数（1-12） Number 12 <br />
m 小时中的分钟数 Number 30 <br />
s 分钟中的秒数 Number 55 <br />
S 毫秒数 Number 978 <br />
z 时区 General time zone Pacific Standard Time; PST; GMT-08:00 <br />
Z 时区 RFC 822 time zone -0800 </p>
<p><br />
更多的参考信息可以查看JDK API文档,下面给出一个综合实例: <br />
<br />
import java.util.Date; <br />
import java.util.Locale; <br />
import java.text.DateFormat; <br />
import java.text.ParseException; <br />
import java.text.SimpleDateFormat; </p>
<p>/** <br />
* Created by IntelliJ IDEA. <br />
* User: leizhimin <br />
* Date: 2007-11-30 <br />
* Time: 11:20:58 <br />
* To change this template use File | Settings | File Templates. <br />
*/ <br />
public class TestSimpleDateFormat { <br />
public static void main(String args[]) throws ParseException { <br />
TestSimpleDateFormat test = new TestSimpleDateFormat(); <br />
test.testDateFormat(); </p>
<p>} </p>
<p>public void testDateFormat() throws ParseException { <br />
//创建日期 <br />
Date date = new Date(); </p>
<p>//创建不同的日期格式 <br />
DateFormat df1 = DateFormat.getInstance(); <br />
DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE"); <br />
DateFormat df3 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA); //产生一个指定国家指定长度的日期格式，长度不同，显示的日期完整性也不同 <br />
DateFormat df4 = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒 EE", Locale.CHINA); <br />
DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEEEE", Locale.US); <br />
DateFormat df6 = new SimpleDateFormat("yyyy-MM-dd"); <br />
DateFormat df7 = new SimpleDateFormat("yyyy年MM月dd日"); </p>
<p>//将日期按照不同格式进行输出 <br />
System.out.println("-------将日期按照不同格式进行输出------"); <br />
System.out.println("按照Java默认的日期格式，默认的区域 : " + df1.format(date)); <br />
System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE ，系统默认区域 :" + df2.format(date)); <br />
System.out.println("按照日期的FULL模式，区域设置为中文 : " + df3.format(date)); <br />
System.out.println("按照指定格式 yyyy年MM月dd日 hh时mm分ss秒 EE ，区域为中文 : " + df4.format(date)); <br />
System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE ，区域为美国 : " + df5.format(date)); <br />
System.out.println("按照指定格式 yyyy-MM-dd ，系统默认区域 : " + df6.format(date)); </p>
<p>//将符合该格式的字符串转换为日期，若格式不相配，则会出错 <br />
Date date1 = df1.parse("07-11-30 下午2:32"); <br />
Date date2 = df2.parse("2007-11-30 02:51:07 星期五"); <br />
Date date3 = df3.parse("2007年11月30日 星期五"); <br />
Date date4 = df4.parse("2007年11月30日 02时51分18秒 星期五"); <br />
Date date5 = df5.parse("2007-11-30 02:51:18 Friday"); <br />
Date date6 = df6.parse("2007-11-30"); </p>
<p>System.out.println("-------输出将字符串转换为日期的结果------"); <br />
System.out.println(date1); <br />
System.out.println(date2); <br />
System.out.println(date3); <br />
System.out.println(date4); <br />
System.out.println(date5); <br />
System.out.println(date6); <br />
} <br />
} </p>
<p><br />
运行结果: <br />
-------将日期按照不同格式进行输出------ <br />
按照Java默认的日期格式，默认的区域 : 07-11-30 下午5:04 <br />
按照指定格式 yyyy-MM-dd hh:mm:ss EE ，系统默认区域 :2007-11-30 05:04:10 星期五 <br />
按照日期的FULL模式，区域设置为中文 : 2007年11月30日 星期五 <br />
按照指定格式 yyyy年MM月dd日 hh时mm分ss秒 EE ，区域为中文 : 2007年11月30日 05时04分10秒 星期五 <br />
按照指定格式 yyyy-MM-dd hh:mm:ss EE ，区域为美国 : 2007-11-30 05:04:10 Friday <br />
按照指定格式 yyyy-MM-dd ，系统默认区域 : 2007-11-30 <br />
-------输出将字符串转换为日期的结果------ <br />
Fri Nov 30 14:32:00 CST 2007 <br />
Fri Nov 30 02:51:07 CST 2007 <br />
Fri Nov 30 00:00:00 CST 2007 <br />
Fri Nov 30 02:51:18 CST 2007 <br />
Fri Nov 30 02:51:18 CST 2007 <br />
Fri Nov 30 00:00:00 CST 2007 </p>
<p>Process finished with exit code 0 <br />
<br />
4、java.util.Calendar（抽象类） <br />
<br />
java.util.Calendar是个抽象类，是系统时间的抽象表示，它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法，并为操作日历字段（例如获得下星期的日期）提供了一些方法。瞬间可用毫秒值来表示，它是距历元（即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000，格里高利历）的偏移量。 <br />
<br />
与其他语言环境敏感类一样，Calendar 提供了一个类方法 getInstance，以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象，其日历字段已由当前日期和时间初始化。 <br />
<br />
一个Calendar的实例是系统时间的抽象表示，从Calendar的实例可以知道年月日星期月份时区等信息。Calendar类中有一个静态方法get(int x),通过这个方法可以获取到相关实例的一些值（年月日星期月份等）信息。参数x是一个产量值，在Calendar中有定义。 <br />
<br />
Calendar中些陷阱，很容易掉下去： <br />
1、Calendar的星期是从周日开始的，常量值为0。 <br />
2、Calendar的月份是从一月开始的，常量值为0。 <br />
3、Calendar的每个月的第一天值为1。 <br />
<br />
5、java.util.GregorianCalendar（Calendar的直接子类） <br />
<br />
GregorianCalendar 是 Calendar 的一个具体子类，提供了世界上大多数国家使用的标准日历系统。结合Calendar抽象类使用。 <br />
<br />
下面给出一个综合实例看看Calendar类的用法： <br />
<br />
import java.util.*; <br />
import java.text.SimpleDateFormat; </p>
<p>/** <br />
* Created by IntelliJ IDEA. <br />
* User: leizhimin <br />
* Date: 2007-11-30 <br />
* Time: 15:06:57 <br />
* Calendar的使用测试 <br />
*/ <br />
public class TestCalendar { <br />
public static void main(String args[]) { <br />
TestCalendar testCalendar = new TestCalendar(); <br />
testCalendar.testCalendar(); </p>
<p>} </p>
<p>public void testCalendar() { <br />
//创建Calendar的方式 <br />
Calendar now1 = Calendar.getInstance(); <br />
Calendar now2 = new GregorianCalendar(); <br />
Calendar now3 = new GregorianCalendar(2007, 10, 30); <br />
Calendar now4 = new GregorianCalendar(2007, 10, 30, 15, 55); //陷阱:Calendar的月份是0~11 <br />
Calendar now5 = new GregorianCalendar(2007, 10, 30, 15, 55, 44); <br />
Calendar now6 = new GregorianCalendar(Locale.US); <br />
Calendar now7 = new GregorianCalendar(TimeZone.getTimeZone("GMT-8:00")); </p>
<p>//通过日期和毫秒数设置Calendar <br />
now2.setTime(new Date()); <br />
System.out.println(now2); </p>
<p>now2.setTimeInMillis(new Date().getTime()); <br />
System.out.println(now2); </p>
<p>//定义日期的中文输出格式,并输出日期 <br />
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒 E", Locale.CHINA); <br />
System.out.println("获取日期中文格式化化输出：" + df.format(now5.getTime())); <br />
System.out.println(); </p>
<p>System.out.println("--------通过Calendar获取日期中年月日等相关信息--------"); <br />
System.out.println("获取年：" + now5.get(Calendar.YEAR)); <br />
System.out.println("获取月(月份是从0开始的)：" + now5.get(Calendar.MONTH)); <br />
System.out.println("获取日：" + now5.get(Calendar.DAY_OF_MONTH)); <br />
System.out.println("获取时：" + now5.get(Calendar.HOUR)); <br />
System.out.println("获取分：" + now5.get(Calendar.MINUTE)); <br />
System.out.println("获取秒：" + now5.get(Calendar.SECOND)); <br />
System.out.println("获取上午、下午：" + now5.get(Calendar.AM_PM)); <br />
System.out.println("获取星期数值(星期是从周日开始的)：" + now5.get(Calendar.DAY_OF_WEEK)); <br />
System.out.println(); </p>
<p>System.out.println("---------通用星期中文化转换---------"); <br />
String dayOfWeek[] = {"", "日", "一", "二", "三", "四", "五", "六"}; <br />
System.out.println("now5对象的星期是:" + dayOfWeek[now5.get(Calendar.DAY_OF_WEEK)]); <br />
System.out.println(); </p>
<p>System.out.println("---------通用月份中文化转换---------"); <br />
String months[] = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"}; <br />
System.out.println("now5对象的月份是: " + months[now5.get(Calendar.MONTH)]); <br />
} <br />
} <br />
<br />
运行结果： <br />
java.util.GregorianCalendar[time=1196414388324,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=10,WEEK_OF_YEAR=48,WEEK_OF_MONTH=5,DAY_OF_MONTH=30,DAY_OF_YEAR=334,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=19,SECOND=48,MILLISECOND=324,ZONE_OFFSET=28800000,DST_OFFSET=0] <br />
java.util.GregorianCalendar[time=1196414388324,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2007,MONTH=10,WEEK_OF_YEAR=48,WEEK_OF_MONTH=5,DAY_OF_MONTH=30,DAY_OF_YEAR=334,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=5,HOUR_OF_DAY=17,MINUTE=19,SECOND=48,MILLISECOND=324,ZONE_OFFSET=28800000,DST_OFFSET=0] <br />
获取日期中文格式化化输出：2007年11月30日 03时55分44秒 星期五 </p>
<p>--------通过Calendar获取日期中年月日等相关信息-------- <br />
获取年：2007 <br />
获取月(月份是从0开始的)：10 <br />
获取日：30 <br />
获取时：3 <br />
获取分：55 <br />
获取秒：44 <br />
获取上午、下午：1 <br />
获取星期数值(星期是从周日开始的)：6 </p>
<p>---------通用星期中文化转换--------- <br />
now5对象的星期是:五 </p>
<p>---------通用月份中文化转换--------- <br />
now5对象的月份是: 十一月 </p>
<p>Process finished with exit code 0 </p>
<p><br />
三、总结 <br />
Java中日期的经常有一下五个方面： <br />
1、创建日期 <br />
2、日期格式化显示 <br />
3、日期的转换（主要是和字符串之间的相互转换） <br />
4、日期中年、月、日、时、分、秒、星期、月份等获取。 <br />
5、日期的大小比较、日期的加减。 <br />
这也是学习java日期操作的难点和关键，掌握了这些，日期问题一般难不倒你。 <br />
<br />
关于日期的大小比较和加减在API文档中都有详尽的描述。</p>
<p>做项目的时候，用到了JfreeChart。但是在时间轴刻度的显示上出现了问题。在设置dateAxis.setAutoTickUnitSelection(true)后，当时间间隔比较小的时候，同一时间段会显示多个相同的时间。我一直没有查出原因，在网上也没有搜到相关的问题和解决办法，感觉是JfreeChart的问题。一直想了解JfreeChart是如何自动设置时间刻度，但没有头绪。于是，增加了判断当时间间隔 &gt;10天的时候，自动设置时间刻度；反之，以1天为间隔设置。这样问题解决了，经过测试，也没有发现相同时间刻度的情况的出现。 <br />
long maximumDate = dateAxis.getMaximumDate().getTime(); <br />
long minimumDate = dateAxis.getMinimumDate().getTime(); <br />
long times = (maximumDate - minimumDate)/(3600*24*1000); <br />
<br />
if(times&lt;10){ <br />
dateAxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY, 1, dateFormat)); <br />
} <br />
else{ <br />
dateAxis.setAutoTickUnitSelection(true); <br />
} <br />
尽管这样还是感觉这样解决问题不是很好。</p>
<p>在解决问题过程中，遇到了关于对日期的处理问题。在网上找了资料，发现上面那篇不错还，就拿过来了，以后遇到日期问题也好有个参考，不用再东找西找了。</p>
   <img src ="http://www.blogjava.net/eroself/aggbug/171195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/eroself/" target="_blank">鬼谷子</a> 2007-12-28 14:55 <a href="http://www.blogjava.net/eroself/archive/2007/12/28/171195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>