﻿<?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-小菜毛毛技术分享-随笔分类-java基础运用</title><link>http://www.blogjava.net/caizh2009/category/40905.html</link><description>与大家共同成长</description><language>zh-cn</language><lastBuildDate>Thu, 12 May 2011 08:54:19 GMT</lastBuildDate><pubDate>Thu, 12 May 2011 08:54:19 GMT</pubDate><ttl>60</ttl><item><title>java sax 解析 实例</title><link>http://www.blogjava.net/caizh2009/archive/2011/05/11/350042.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 11 May 2011 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2011/05/11/350042.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/350042.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2011/05/11/350042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/350042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/350042.html</trackback:ping><description><![CDATA[<span style="font-size: 22pt; color: navy; font-family: 宋体; letter-spacing: 1.3pt">&nbsp;
<div align="right"><strong>用</strong></span><strong><span style="font-size: 22pt; color: navy; font-family: tahoma; letter-spacing: 1.3pt"  Times New Roman??>SAX</span><span style="font-size: 22pt; color: navy; font-family: 宋体; letter-spacing: 1.3pt">解析</span><span style="font-size: 22pt; color: navy; font-family: tahoma; letter-spacing: 1.3pt"  Times New Roman??>XML</span><span style="font-size: 22pt; color: navy; font-family: 宋体; letter-spacing: 1.3pt">实例</span></strong></div>
<div style="margin: 12pt 0cm"><strong><span style="font-size: 14pt; color: purple; font-family: 幼圆">实例：以下输出</strong></span><strong><span style="font-size: 14pt; color: purple; font-family: tahoma"  Times New Roman?;??><strong><span style="font-size: 14pt; color: purple; font-family: 幼圆">中的所有属性和标签值</strong></span></div>
<span style="font-size: 14pt; color: purple; font-family: tahoma"  Times New #eeeeee? background-color: verdana,宋体; font-family: solid; 1px #cccccc border-bottom: 4px; padding-top: 16px; line-height: break-all; word-break: #000000; color: 98%; width: border-left: padding-bottom: 10pt; font-size: padding-left: border-top: padding-right: Roman?;?border-right:><font color="#0000ff">package</font> com.meixin.xml; <br />
<br />
<font color="#0000ff">import</font> java.io.File; <br />
<font color="#0000ff">import</font> java.util.HashMap; <br />
<font color="#0000ff">import</font> java.util.Vector; <br />
<br />
<font color="#0000ff">import</font> org.xml.sax.Attributes; <br />
<font color="#0000ff">import</font> org.xml.sax.SAXException; <br />
<font color="#0000ff">import</font> org.xml.sax.helpers.DefaultHandler; <br />
<br />
<font color="#0000ff">import</font> javax.xml.parsers.SAXParser; <br />
<font color="#0000ff">import</font> javax.xml.parsers.SAXParserFactory; <br />
<br />
<font color="#0000ff">public</font> <font color="#0000ff">class</font> PraseXML <font color="#0000ff">extends</font> DefaultHandler <br />
{ <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">private</font> Vector&lt;String&gt; tagName; <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">private</font> Vector&lt;String&gt; tagValue; <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">private</font> <font color="#0000ff">int</font> step; <br />
<br />
&nbsp;&nbsp;<font color="#008000">// 开始解析XML文件 </font><br />
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">void</font> startDocument() <font color="#0000ff">throws</font> SAXException <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;tagName = <font color="#0000ff">new</font> Vector&lt;String&gt;(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;tagValue = <font color="#0000ff">new</font> Vector&lt;String&gt;(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;step = 0; <br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#008000">// 结束解析XML文件 </font><br />
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">void</font> endDocument() <font color="#0000ff">throws</font> SAXException <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">for</font> (<font color="#0000ff">int</font> i = 0; i &lt; tagName.size(); i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (!tagName.get(i).equals("") || tagName.get(i) != <font color="#0000ff">null</font>) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<font color="#800000">"节点名称："</font> + tagName.get(i)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<font color="#800000">"节点值："</font> + tagValue.get(i)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#008000">/** <br />
&nbsp;&nbsp;&nbsp;&nbsp;* 在解释到一个开始元素时会调用此方法.但是当元素有重复时可以自己写算法来区分 <br />
&nbsp;&nbsp;&nbsp;&nbsp;* 这些重复的元素.qName是什么? &lt;name:page ll=""&gt;&lt;/name:page&gt;这样写就会抛出SAXException错误 <br />
&nbsp;&nbsp;&nbsp;&nbsp;* 通常情况下qName等于localName <br />
&nbsp;&nbsp;&nbsp;&nbsp;*/</font> <br />
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">void</font> startElement(String uri, String localName, String qName, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Attributes attributes) <font color="#0000ff">throws</font> SAXException <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">// 节点名称 </font><br />
&nbsp;&nbsp;&nbsp;&nbsp;tagName.add(qName); <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">// 循环输出属性 </font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">for</font> (<font color="#0000ff">int</font> i = 0; i &lt; attributes.getLength(); i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">// 获取属性名称 </font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<font color="#800000">"属性名称："</font> + attributes.getQName(i)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">// 获取属性值 </font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<font color="#800000">"属性值："</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ attributes.getValue(attributes.getQName(i))); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#008000">/** <br />
&nbsp;&nbsp;&nbsp;&nbsp;* 在遇到结束标签时调用此方法 <br />
&nbsp;&nbsp;&nbsp;&nbsp;*/</font> <br />
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">void</font> endElement(String uri, String localName, String qName) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">throws</font> SAXException <br />
&nbsp;&nbsp;{ <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;step = step + 1; <br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#008000">/** <br />
&nbsp;&nbsp;&nbsp;&nbsp;* 读取标签里的值,ch用来存放某行的xml的字符数据,包括标签,初始大小是2048, <br />
&nbsp;&nbsp;&nbsp;&nbsp;* 每解释到新的字符会把它添加到char[]里。&nbsp;&nbsp;&nbsp;&nbsp;* 注意,这个char字符会自己管理存储的字符, <br />
&nbsp;&nbsp;&nbsp;&nbsp;* 并不是每一行就会刷新一次char,start,length是由xml的元素数据确定的, <br />
&nbsp;&nbsp;&nbsp;&nbsp;* 暂时找不到规律,以后看源代码. <br />
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;* 这里一个正标签，反标签都会被执行一次characters，所以在反标签时不用获得其中的值 <br />
&nbsp;&nbsp;&nbsp;&nbsp;*/</font> <br />
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">void</font> characters(<font color="#0000ff">char</font> ch[], <font color="#0000ff">int</font> start, <font color="#0000ff">int</font> length) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">throws</font> SAXException <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">// 只要当前的标签组的长度一至，值就不赋，则反标签不被计划在内 </font><br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">if</font> (tagName.size() - 1 == tagValue.size()) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagValue.add(<font color="#0000ff">new</font> String(ch, start, length)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">void</font> main(String[] args) <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;String filename = <font color="#800000">"MyXml.xml"</font>; <br />
&nbsp;&nbsp;&nbsp;&nbsp;SAXParserFactory spf = SAXParserFactory.newInstance(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">try</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParser saxParser = spf.newSAXParser(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saxParser.parse(<font color="#0000ff">new</font> File(filename), <font color="#0000ff">new</font> PraseXML()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">catch</font> (Exception e) <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">public</font> Vector getTagName() <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> tagName; <br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">void</font> setTagName(Vector tagName) <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">this</font>.tagName = tagName; <br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">public</font> Vector getTagValue() <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">return</font> tagValue; <br />
&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">void</font> setTagValue(Vector tagValue) <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">this</font>.tagValue = tagValue; <br />
&nbsp;&nbsp;} <br />
<br />
} <br />
<div></div>
</span>
<div style="margin: 12pt 0cm"><strong><span style="font-size: 14pt; color: purple; font-family: 幼圆">输出结果：</span></strong></div>
<span>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee">属性名称：personid <br />
属性值：e01 <br />
属性名称：enable <br />
属性值：true <br />
属性名称：personid <br />
属性值：e02 <br />
属性名称：enable <br />
属性值：false <br />
属性名称：personid <br />
属性值：e03 <br />
属性名称：enable <br />
属性值：true <br />
节点名称：people <br />
节点值： <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
节点名称：person <br />
节点值： <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
节点名称：name <br />
节点值：张三 <br />
节点名称：tel <br />
节点值：5128 <br />
节点名称：email <br />
节点值：txq512@sina.com <br />
节点名称：person <br />
节点值： <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
节点名称：name <br />
节点值：meixin <br />
节点名称：tel <br />
节点值：5252525 <br />
节点名称：email <br />
节点值：wnight88@sina.com <br />
节点名称：person <br />
节点值： <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
节点名称：name <br />
节点值：yu <br />
节点名称：tel <br />
节点值：5389654 <br />
节点名称：email <br />
节点值：yu@188.net <br />
</div>
</div>
<div style="margin: 12pt 0cm"><strong><span style="font-size: 14pt; color: purple; font-family: tahoma"  Times New Roman?;??><span style="font-size: 14pt; color: purple; font-family: 幼圆">文件内容</span></strong></div>
<span>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee"><font color="#0000ff">&lt;?</font><font color="#800000">xml</font> <font color="#ff0000">version</font><font color="#0000ff">="1.0"</font> <font color="#ff0000">encoding</font><font color="#0000ff">="UTF-8"</font><font color="#0000ff">?&gt;</font> <br />
<font color="#0000ff">&lt;</font><font color="#800000">people</font><font color="#0000ff">&gt;</font> <br />
<br />
&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">person</font> <font color="#ff0000">personid</font><font color="#0000ff">="e01"</font> <font color="#ff0000">enable</font><font color="#0000ff">="true"</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">name</font><font color="#0000ff">&gt;</font>张三<font color="#0000ff">&lt;/</font><font color="#800000">name</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">tel</font><font color="#0000ff">&gt;</font>5128<font color="#0000ff">&lt;/</font><font color="#800000">tel</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">email</font><font color="#0000ff">&gt;</font>txq512@sina.com<font color="#0000ff">&lt;/</font><font color="#800000">email</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">person</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">person</font> <font color="#ff0000">personid</font><font color="#0000ff">="e02"</font> <font color="#ff0000">enable</font><font color="#0000ff">="false"</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">name</font><font color="#0000ff">&gt;</font>meixin<font color="#0000ff">&lt;/</font><font color="#800000">name</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">tel</font><font color="#0000ff">&gt;</font>5252525<font color="#0000ff">&lt;/</font><font color="#800000">tel</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">email</font><font color="#0000ff">&gt;</font>wnight88@sina.com<font color="#0000ff">&lt;/</font><font color="#800000">email</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">person</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">person</font> <font color="#ff0000">personid</font><font color="#0000ff">="e03"</font> <font color="#ff0000">enable</font><font color="#0000ff">="true"</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">name</font><font color="#0000ff">&gt;</font>yu<font color="#0000ff">&lt;/</font><font color="#800000">name</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">tel</font><font color="#0000ff">&gt;</font>5389654<font color="#0000ff">&lt;/</font><font color="#800000">tel</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&lt;</font><font color="#800000">email</font><font color="#0000ff">&gt;</font>yu@188.net<font color="#0000ff">&lt;/</font><font color="#800000">email</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;<font color="#0000ff">&lt;/</font><font color="#800000">person</font><font color="#0000ff">&gt;</font> <br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<font color="#0000ff">&lt;/</font><font color="#800000">people</font><font color="#0000ff">&gt;</font> <br />
</div>
<br />
</div>
http://wnight88.blog.51cto.com/512204/163197/</span></span></span></span></strong>
<img src ="http://www.blogjava.net/caizh2009/aggbug/350042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2011-05-11 22:34 <a href="http://www.blogjava.net/caizh2009/archive/2011/05/11/350042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java反射详解</title><link>http://www.blogjava.net/caizh2009/archive/2011/01/13/342941.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 13 Jan 2011 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2011/01/13/342941.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/342941.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2011/01/13/342941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/342941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/342941.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java的反射机制是Java特性之一，反射机制是构建框架技术的基础所在。灵活掌握Java反射机制，对大家以后学习框架技术有很大的帮助。&nbsp;&nbsp;那么什么是Java的反射呢？&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大家都知道，要让Java程序能够运行，那么就得让Java类要被Java虚拟机加载。Java类如果不被Java虚拟机加载，是不...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2011/01/13/342941.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/342941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2011-01-13 17:09 <a href="http://www.blogjava.net/caizh2009/archive/2011/01/13/342941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中文汉字排序</title><link>http://www.blogjava.net/caizh2009/archive/2010/12/17/340974.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 17 Dec 2010 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/12/17/340974.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/340974.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/12/17/340974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/340974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/340974.html</trackback:ping><description><![CDATA[<p><span style="color: #808080;"><span style="color: #00ff00;"><span style="color: #339966;">// Collator 类是用来执行区分语言环境的 String 比较的，这里选择使用CHINA&nbsp;&nbsp;&nbsp;</span>
&nbsp;</span>
&nbsp;&nbsp;&nbsp;</span>
</p>
<p><span style="color: #ff6600;"> Comparator cmp = Collator.getInstance(java.util.Locale.CHINA);&nbsp;</span>
</p>
<p><span style="color: #ff6600;">TreeMap tree=new TreeMap(cmp);</span>
<span style="color: #808080;"><span style="color: #ff6600;"> &nbsp;&nbsp;&nbsp; </span>
<br />
</span>
</p>
<p><span style="color: #808080;"><span style="color: #ff6600;">&nbsp; String[] arr = {"张三", "李四", "王五"};&nbsp;&nbsp;&nbsp;</span>
&nbsp;&nbsp;&nbsp; </span>
</p>
<p><span style="color: #808080;"><span style="color: #339966;">// 使根据指定比较器产生的顺序对指定对象数组进行排序。&nbsp;</span>
&nbsp;&nbsp;&nbsp;&nbsp;</span>
</p>
<p><span style="color: #ff6600;">&nbsp;&nbsp; Arrays.sort(arr, cmp);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
</p>
<p><span style="color: #ff6600;">&nbsp; for (int i = 0; i &lt; arr.length; i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
</p>
<p><span style="color: #ff6600;">&nbsp;&nbsp;&nbsp; System.out.println(arr[i]);</span>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #808080;">
</span></p>
<p>&lt;script&gt;<br />
&nbsp;names = ["张三", "李四", "王五", "刘六"];<br />
&nbsp;names.sort(function(a,b){return a.localeCompare(b)});//a,b 为数组a的某两个值，自动传入<br />
&nbsp;alert(names);<br />
&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>另:</p>
<p>
</p>
<h4>示例文本：</h4>
<p><br />
<strong><br />
String&nbsp;[]&nbsp;test&nbsp;=&nbsp;new&nbsp;String[]&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;"测试",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"test",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;"。空",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;"[",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;"皙"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
</strong>
</p>
<h4>jdk&nbsp;版本：</h4>
<p>&nbsp;1.5.6</p>
<h4>开发平台：</h4>
<p>&nbsp;Eclipse&nbsp;3.1</p>
<h4>关键字：&nbsp;中文排序</h4>
<p>&nbsp;</p>
<h3>概述</h3>
<p><br />
我们在应用程序中可能会经常遇到对中文排序的问题，例如姓名列表，词汇表等等。对中文排序，我们使用比较多的是根据汉语拼音发音来确定顺序。<br />
<br />
我们可能会经常使用&nbsp; </p>
<div class="codeStyle">
<ol>
    <li>java.util.<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/util/Set.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Set</span>
    </span>
    </a>
    </strong>
    </li>
</ol>
</div>
<p>&nbsp;接口， </p>
<div class="codeStyle">
<ol>
    <li>java.util.<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/util/Arrays.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Arrays</span>
    </span>
    </a>
    </strong>
    .sort((T[]&nbsp;a,&nbsp;<span style="color: #ff0000;">Comparator</span>
    &lt;?&nbsp;<strong><span style="color: #0000ff;">super</span>
    </strong>
    &nbsp;T&gt;&nbsp;c)) </li>
</ol>
</div>
<p>&nbsp;等类或方法对含有中文字符的对象进行排序，但是这些在默认情况下都是调用&nbsp; </p>
<div class="codeStyle">
<ol>
    <li><strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
    </span>
    </a>
    </strong>
    .CompareTo(<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
    </span>
    </a>
    </strong>
    ) </li>
</ol>
</div>
<p>方法，这个方法是比较2个字符的&nbsp;codepoint&nbsp;value，如果第一个字符的值小于第二个，则在排序结果中第一个会在前面，反之亦然。</p>
<h3>
<div class="codeStyle">
<ol>
    <li>java.text.<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/Collator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Collator</span>
    </span>
    </a>
    </strong>
    </li>
</ol>
</div>
接口及其实现类</h3>
<p><br />
其实&nbsp;java&nbsp;中提供了和语言相关的类，即&nbsp;Collator&nbsp;接口及其实现类。 </p>
<div class="codeStyle">
<ol>
    <li>java.text.<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/RuleBasedCollator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">RuleBasedCollator</span>
    </span>
    </a>
    </strong>
    </li>
</ol>
</div>
<p>&nbsp;是一个具体类，它实现了&nbsp;Comparator&nbsp;接口中的&nbsp;compare(Object,&nbsp;Object)&nbsp;方法。
RuleBasedCollator&nbsp;根据根据特定语言的默认规则比较字符，也可以按照指定的规则来比较，请参阅&nbsp;java&nbsp;API&nbsp;获取此类的详细信
息。<br />
如果我们需要对一个有中文的数组进行排序，则可以使用这个类。请看如下示例代码：</p>
<div class="codeStyle">
<ol>
    <li><strong><span style="color: #0000ff;">import</span>
    </strong>
    &nbsp;java.util.*; </li>
    <li><strong><span style="color: #0000ff;">import</span>
    </strong>
    &nbsp;java.text.*; </li>
    <li><strong><span style="color: #0000ff;">public</span>
    </strong>
    &nbsp;<strong><span style="color: #0000ff;">class</span>
    </strong>
    &nbsp;Test </li>
    <li>{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
    </span>
    </a>
    </strong>
    &nbsp;[]&nbsp;test&nbsp;=&nbsp;<strong><span style="color: #0000ff;">new</span>
    </strong>
    &nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
    </span>
    </a>
    </strong>
    []&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"作业"</span>
    , </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"测试"</span>
    , </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"test"</span>
    , </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"我们"</span>
    , </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"。空"</span>
    , </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"镂空"</span>
    , </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"["</span>
    , </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"浏"</span>
    , </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"皙"</span>
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.util.<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/util/Arrays.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Arrays</span>
    </span>
    </a>
    </strong>
    .sort(test,&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/RuleBasedCollator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">RuleBasedCollator</span>
    </span>
    </a>
    </strong>
    )<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/Collator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Collator</span>
    </span>
    </a>
    </strong>
    .getInstance(<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/util/Locale.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Locale</span>
    </span>
    </a>
    </strong>
    .CHINA)); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/System.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">System</span>
    </span>
    </a>
    </strong>
    .out.println(<span style="color: #ff33ff;">"============"</span>
    ); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">for</span>
    </strong>
    (<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
    </span>
    </a>
    </strong>
    &nbsp;key&nbsp;:&nbsp;test) </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/System.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">System</span>
    </span>
    </a>
    </strong>
    .out.println(key); </li>
    <li>} </li>
</ol>
</div>
<p><br />
<br />
以上代码的输出结果为：<br />
<strong><br />
============<br />
[<br />
test<br />
。空<br />
测试<br />
我们<br />
作业<br />
浏<br />
镂空<br />
皙<br />
</strong>
<br />
<br />
大家可能会发现只有一部分汉字是按照汉语拼音排序了，还有几个没有。</p>
<h3>问题分析：</h3>
<p><br />
GB2312:<br />
在简体中文中我们使用比较多的字符集是&nbsp;GB2312-80，简称为&nbsp;GB2312，这个字符集包含了目前最常用的汉字共计&nbsp;6736&nbsp;个。其中的汉字分为两大类：</p>
<ul>
    常用汉字
</ul>
<p>&nbsp;</p>
<ul>
    次常用汉字
</ul>
<p><br />
<br />
常用汉字按照汉语拼音来排序，而次常用汉字按照笔画部首进行排序。<br />
<br />
简体汉字在&nbsp;Unicode&nbsp;中一般是按照&nbsp;gb2312&nbsp;的码点值的顺序来放置的，所以如果是常用汉字&nbsp;java&nbsp;就能够很准确的进行排序，但如果是次常用汉字，则就会出现问题。在以上示例中，"镂"，"皙"&nbsp;属于次常用字。</p>
<h3>解决方案：</h3>
<p><br />
RuleBasedCollator&nbsp;类&nbsp;getRules()&nbsp;方法可以返回对应语言的规则设置。简体中文对应的规则是&nbsp;gb2312&nbsp;所对应的字符。</p>
<ol><br />
    我们可以把其中的全部汉字提取出来</ol>
    <p>&nbsp;</p>
    <ol>对这些汉字重新排序</ol>
        <p>&nbsp;</p>
        <ol>利用RuleBasedCollator(String&nbsp;rules)&nbsp;构造器新建一个定制的&nbsp;RuleBasedCollator</ol>
            <p>&nbsp;</p>
            <h3>参考代码</h3>
            <p><br />
            在以下的代码中，我把排过序的汉字直接作为&nbsp;String&nbsp;对象放在类里面了，如果要让代码变得简洁一些，则可以把完整的规则（特殊字符＋排序汉字）存为文件。</p>
            <div class="codeStyle">
            <ol>
                <li><strong><span style="color: #0000ff;">package</span>
                </strong>
                &nbsp;sorting; </li>
                <li><strong><span style="color: #0000ff;">import</span>
                </strong>
                &nbsp;java.util.*; </li>
                <li><strong><span style="color: #0000ff;">import</span>
                </strong>
                &nbsp;java.text.*; </li>
                <li><em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;*&nbsp;@author&nbsp;GaoJianMin</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;*</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;*/</span>
                </em>
                </li>
                <li><strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">class</span>
                </strong>
                &nbsp;ChineseGB2312Collator </li>
                <li>{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;a&nbsp;customized&nbsp;RuleBasedCollator&nbsp;with&nbsp;Chinese&nbsp;characters&nbsp;(GB2312)&nbsp;sorted&nbsp;correctly</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span>
                </em>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">static</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">final</span>
                </strong>
                &nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/RuleBasedCollator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">RuleBasedCollator</span>
                </span>
                </a>
                </strong>
                &nbsp;getFixedGB2312Collator() </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/RuleBasedCollator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">RuleBasedCollator</span>
                </span>
                </a>
                </strong>
                &nbsp;fixedGB2312Collator&nbsp;=<strong><span style="color: #0000ff;">null</span>
                </strong>
                ; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">try</span>
                </strong>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fixedGB2312Collator&nbsp;=&nbsp;<strong><span style="color: #0000ff;">new</span>
                </strong>
                &nbsp;java.text.<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/RuleBasedCollator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">RuleBasedCollator</span>
                </span>
                </a>
                </strong>
                ( </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChineseGB2312Collator.getGB2312SpecialChars()&nbsp;+ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GB2312Chars </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<strong><span style="color: #0000ff;">catch</span>
                </strong>
                (<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/ParseException.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">ParseException</span>
                </span>
                </a>
                </strong>
                &nbsp;e) </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">return</span>
                </strong>
                &nbsp;fixedGB2312Collator; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;the&nbsp;special&nbsp;characters&nbsp;in&nbsp;GB2312&nbsp;charset.</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span>
                </em>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">static</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">final</span>
                </strong>
                &nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;getGB2312SpecialChars() </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/RuleBasedCollator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">RuleBasedCollator</span>
                </span>
                </a>
                </strong>
                &nbsp;zh_CNCollator&nbsp;=&nbsp;(<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/RuleBasedCollator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">RuleBasedCollator</span>
                </span>
                </a>
                </strong>
                )<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/Collator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Collator</span>
                </span>
                </a>
                </strong>
                .getInstance(<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/util/Locale.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Locale</span>
                </span>
                </a>
                </strong>
                .CHINA); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #339900;">//index&nbsp;2125&nbsp;is&nbsp;the&nbsp;last&nbsp;symbol&nbsp;"╋"</span>
                </em>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">return</span>
                </strong>
                &nbsp;zh_CNCollator.getRules().substring(0,2125); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;6763&nbsp;Chinese&nbsp;characters&nbsp;in&nbsp;GB2312&nbsp;charset</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span>
                </em>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">static</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">final</span>
                </strong>
                &nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;GB2312Chars&nbsp;= </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"&lt;吖&lt;阿&lt;啊&lt;
                锕&lt;嗄&lt;哎&lt;哀&lt;唉&lt;埃&lt;挨&lt;锿&lt;捱&lt;皑&lt;癌&lt;嗳&lt;矮&lt;蔼&lt;
                霭&lt;艾&lt;爱&lt;砹&lt;隘&lt;嗌&lt;嫒&lt;碍&lt;暧&lt;瑷&lt;安&lt;桉&lt;氨&lt;庵&lt;
                谙&lt;鹌&lt;鞍&lt;俺&lt;埯&lt;铵&lt;揞&lt;犴&lt;岸&lt;按&lt;案&lt;胺&lt;暗&lt;黯&lt;
                肮&lt;昂&lt;盎&lt;凹&lt;坳&lt;敖&lt;嗷&lt;廒&lt;獒&lt;遨&lt;熬&lt;翱&lt;聱&lt;螯&lt;
                鳌&lt;鏖&lt;拗&lt;袄&lt;媪&lt;岙&lt;傲&lt;奥&lt;骜&lt;澳&lt;懊&lt;鏊"</span>
                &nbsp;+ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"&lt;八&lt;巴&lt;叭&lt;
                扒&lt;吧&lt;岜&lt;芭&lt;疤&lt;捌&lt;笆&lt;粑&lt;拔&lt;茇&lt;菝&lt;跋&lt;魃&lt;把&lt;
                钯&lt;靶&lt;坝&lt;爸&lt;罢&lt;鲅&lt;霸&lt;灞&lt;掰&lt;白&lt;百&lt;佰&lt;柏&lt;捭&lt;
                摆&lt;呗&lt;败&lt;拜&lt;稗&lt;扳&lt;班&lt;般&lt;颁&lt;斑&lt;搬&lt;瘢&lt;癍&lt;阪&lt;
                坂&lt;板&lt;版&lt;钣&lt;舨&lt;办&lt;半&lt;伴&lt;扮&lt;拌&lt;绊&lt;瓣&lt;邦&lt;帮&lt;
                梆&lt;浜&lt;绑&lt;榜&lt;膀&lt;蚌&lt;傍&lt;棒&lt;谤&lt;蒡&lt;磅&lt;镑&lt;勹&lt;包&lt;
                孢&lt;苞&lt;胞&lt;煲&lt;龅&lt;褒&lt;雹&lt;宝&lt;饱&lt;保&lt;鸨&lt;堡&lt;葆&lt;褓&lt;
                报&lt;抱&lt;豹&lt;趵&lt;鲍&lt;暴&lt;爆&lt;陂&lt;卑&lt;杯&lt;悲&lt;碑&lt;鹎&lt;北&lt;
                贝&lt;狈&lt;邶&lt;备&lt;背&lt;钡&lt;倍&lt;悖&lt;被&lt;惫&lt;焙&lt;辈&lt;碚&lt;蓓&lt;
                褙&lt;鞴&lt;鐾&lt;奔&lt;贲&lt;锛&lt;本&lt;苯&lt;畚&lt;坌&lt;笨&lt;崩&lt;绷&lt;嘣&lt;
                甭&lt;泵&lt;迸&lt;甏&lt;蹦&lt;逼&lt;荸&lt;鼻&lt;匕&lt;比&lt;吡&lt;妣&lt;彼&lt;秕&lt;
                俾&lt;笔&lt;舭&lt;鄙&lt;币&lt;必&lt;毕&lt;闭&lt;庇&lt;畀&lt;哔&lt;毖&lt;荜&lt;陛&lt;
                毙&lt;狴&lt;铋&lt;婢&lt;庳&lt;敝&lt;萆&lt;弼&lt;愎&lt;筚&lt;滗&lt;痹&lt;蓖&lt;裨&lt;
                跸&lt;辟&lt;弊&lt;碧&lt;箅&lt;蔽&lt;壁&lt;嬖&lt;篦&lt;薜&lt;避&lt;濞&lt;臂&lt;髀&lt;
                璧&lt;襞&lt;边&lt;砭&lt;笾&lt;编&lt;煸&lt;蝙&lt;鳊&lt;鞭&lt;贬&lt;扁&lt;窆&lt;匾&lt;
                碥&lt;褊&lt;卞&lt;弁&lt;忭&lt;汴&lt;苄&lt;拚&lt;便&lt;变&lt;缏&lt;遍&lt;辨&lt;辩&lt;
                辫&lt;灬&lt;杓&lt;彪&lt;标&lt;飑&lt;髟&lt;骠&lt;膘&lt;瘭&lt;镖&lt;飙&lt;飚&lt;镳&lt;
                表&lt;婊&lt;裱&lt;鳔&lt;憋&lt;鳖&lt;别&lt;蹩&lt;瘪&lt;宾&lt;彬&lt;傧&lt;斌&lt;滨&lt;
                缤&lt;槟&lt;镔&lt;濒&lt;豳&lt;摈&lt;殡&lt;膑&lt;髌&lt;鬓&lt;冫&lt;冰&lt;兵&lt;丙&lt;
                邴&lt;秉&lt;柄&lt;炳&lt;饼&lt;禀&lt;并&lt;病&lt;摒&lt;拨&lt;波&lt;玻&lt;剥&lt;钵&lt;
                饽&lt;啵&lt;脖&lt;菠&lt;播&lt;伯&lt;孛&lt;驳&lt;帛&lt;泊&lt;勃&lt;亳&lt;钹&lt;铂&lt;
                舶&lt;博&lt;渤&lt;鹁&lt;搏&lt;箔&lt;膊&lt;踣&lt;薄&lt;礴&lt;跛&lt;簸&lt;擘&lt;檗&lt;
                逋&lt;钸&lt;晡&lt;醭&lt;卜&lt;卟&lt;补&lt;哺&lt;捕&lt;不&lt;布&lt;步&lt;怖&lt;钚&lt;
                部&lt;埠&lt;瓿&lt;簿"</span>
                &nbsp;;</li>
            </ol>
            </div>
            <div><span style="color: #ff33ff;">
            <ol>
                <li>} </li>
                <li><strong><span style="color: #0000ff;">package</span>
                </strong>
                &nbsp;sorting; </li>
                <li><strong><span style="color: #0000ff;">import</span>
                </strong>
                &nbsp;java.util.*; </li>
                <li><strong><span style="color: #0000ff;">import</span>
                </strong>
                &nbsp;java.text.*; </li>
                <li><em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;*&nbsp;@author&nbsp;GaoJianMin</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;*</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;*/</span>
                </em>
                </li>
                <li><strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">class</span>
                </strong>
                &nbsp;ChineseGB2312Comparator&nbsp;<strong><span style="color: #0000ff;">implements</span>
                </strong>
                &nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/util/Comparator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Comparator</span>
                </span>
                </a>
                </strong>
                &lt;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &gt;,&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/Comparable.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Comparable</span>
                </span>
                </a>
                </strong>
                &lt;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &gt;&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">private</span>
                </strong>
                &nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/text/RuleBasedCollator.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">RuleBasedCollator</span>
                </span>
                </a>
                </strong>
                &nbsp;GB2312Collator&nbsp;= </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChineseGB2312Collator.getFixedGB2312Collator(); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">private</span>
                </strong>
                &nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;str1; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;str1</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span>
                </em>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;ChineseGB2312Comparator(<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;str1)&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">this</span>
                </strong>
                .str1&nbsp;=&nbsp;str1; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span>
                </em>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;ChineseGB2312Comparator()&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">this</span>
                </strong>
                .str1=<span style="color: #ff33ff;">""</span>
                ; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;str1</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;str2</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;an&nbsp;integer&nbsp;indicatint&nbsp;the&nbsp;comparison&nbsp;result</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;java.util.Comparator#compare(Object,&nbsp;Object)</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span>
                </em>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">int</span>
                </strong>
                &nbsp;compare(<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;str1,&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;str2)&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">return</span>
                </strong>
                &nbsp;GB2312Collator.compare(str1,&nbsp;str2); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #339900;">/**</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;str2</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;an&nbsp;integer&nbsp;indicatint&nbsp;the&nbsp;comparison&nbsp;result</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@see&nbsp;java.lang.Comparable#compareTo(Object)</span>
                </em>
                </li>
                <li><em><span style="color: #339900;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span>
                </em>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">int</span>
                </strong>
                &nbsp;compareTo(<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;str2)&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">return</span>
                </strong>
                &nbsp;GB2312Collator.compare(str1,&nbsp;str2); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
                <li>} </li>
                <li><br />
                <br />
                </li>
            </ol>
            <h3>测试代码及结果</h3>
            <br />
            代码：<br />
            <div class="codeStyle">
            <ol>
                <li><strong><span style="color: #0000ff;">import</span>
                </strong>
                &nbsp;java.util.*; </li>
                <li><strong><span style="color: #0000ff;">import</span>
                </strong>
                &nbsp;java.text.*; </li>
                <li><strong><span style="color: #0000ff;">public</span>
                </strong>
                &nbsp;<strong><span style="color: #0000ff;">class</span>
                </strong>
                &nbsp;Test </li>
                <li>{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;[]&nbsp;test&nbsp;=&nbsp;<strong><span style="color: #0000ff;">new</span>
                </strong>
                &nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                []&nbsp;{ </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"作业"</span>
                , </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"测试"</span>
                , </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"test"</span>
                , </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"我们"</span>
                , </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"。空"</span>
                , </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"镂空"</span>
                , </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"["</span>
                , </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"浏"</span>
                , </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff33ff;">"皙"</span>
                </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.util.<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/util/Arrays.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">Arrays</span>
                </span>
                </a>
                </strong>
                .sort(test,&nbsp;<strong><span style="color: #0000ff;">new</span>
                </strong>
                &nbsp;ChineseGB2312Comparator()); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/System.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">System</span>
                </span>
                </a>
                </strong>
                .out.println(<span style="color: #ff33ff;">"============"</span>
                ); </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #0000ff;">for</span>
                </strong>
                (<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/String.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">String</span>
                </span>
                </a>
                </strong>
                &nbsp;key&nbsp;:&nbsp;test) </li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><a href="http://vtyi.javaeye.com/source/jdk142/java/lang/System.java.html" target="_blank"><span class="classLink"><span style="text-decoration: underline;">System</span>
                </span>
                </a>
                </strong>
                .out.println(key); </li>
                <li>} </li>
            </ol>
            </div>
            <br />
            <br />
            ChineseGB2312Comparator&nbsp;类同时实现了&nbsp;Comparator,&nbsp;Comparable&nbsp;接口，这样以后能够使用&nbsp;compare,&nbsp;compareTo&nbsp;方法的时候都可以使用这个类。</span></div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/340974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-12-17 13:22 <a href="http://www.blogjava.net/caizh2009/archive/2010/12/17/340974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javac -classpath的使用</title><link>http://www.blogjava.net/caizh2009/archive/2010/10/19/335634.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Oct 2010 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/10/19/335634.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/335634.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/10/19/335634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/335634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/335634.html</trackback:ping><description><![CDATA[<span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">javac -classpath的使用：</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">javac：如果当前你要编译的java文件中引用了其它的类(比如说：继承)，但该引用类的.class文件不在当前目录下，这种情况下就需要在javac命令后面加上-classpath参数，通过使用以下三种类型的方法 来指导编译器在编译的时候去指定的路径下查找引用类。</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(1).绝对路径：javac -classpath c:\junit3.8.1\junit.jar&nbsp;&nbsp; Xxx.java</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(2).相对路径：javac -classpath ..\junit3.8.1\Junit.javr&nbsp; Xxx.java</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(3).系统变量：javac -classpath %CLASSPATH% Xxx.java (注意：%CLASSPATH%表示使用系统变量CLASSPATH的值进行查找，这里假设Junit.jar的路径就包含在CLASSPATH系统变量中)</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">javac 绝对路径的使用：</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">javac：假设你要编译的类文件名叫：HelloWorld.java，其完全路径为：D:\java\HelloWorld.java。但你所在的当前目录是：C:\Documents and Settings\peng&gt;。如果想在这里执行编译，会有什么结果呢？</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(1).C:\Documents and Settings\peng&gt; javac HelloWorld.java 这时编译器会给出如下的错误提示信息：</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">error: cannot read: HelloWorld.java</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">这是因为默认情况下javac是在当前目录下查找类文件，很明显这个路径不是我们存放类文件的地方，所以就会报错了</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(2).C:\Documents and Settings\peng&gt;javac D:\java\HelloWorld.java</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">这时编译成功。</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">所以，只要你执行javac命令的目录不是类文件存放的目录，你就必须在javac命令中显式地指定类文件的路径。</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">java -classpath的使用：</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">java：假设我们的CLASSPATH设置为：D:\peng\java\pro ，在该目录下有三个文件：HelloWorld.java / HelloWorldExtendsTestCase / HelloWorldExtendsHelloWorld。这三个文件的类声明分别如下：</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">HelloWorld.java ：public class HelloWorld</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">HelloWorldExtendsHelloWorld.java ：public class HelloWorldExtendsHelloWorld extends HelloWorld</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">HelloWorldExtendsTestCase.java：public class HelloWorldExtendsTestCase extends junit.framework.TestCase</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假设我们已经按照上面关于javac -classpath和javac 绝对路径的使用，顺利地完成了三个文件地编译。现在我们在C:\Documents and Settings\peng&gt;目录下执行这三个.class文件</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(1).C:\Documents and Settings\peng&gt;java&nbsp; HelloWorld</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hello World</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">可以看到执行成功。为什么我们在 C:\Documents and Settings\peng&gt;执行命令，JVM能够找到D:\peng\java\pro\HelloWorld.class文件呢？这是因为我们配置了系统变量CLASSPATH，并且指向了目录：D:\peng\java\pro 。所以JVM会默认去该目录下加载类文件，而不需要指定.class文件的绝对路径了。</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(2).C:\Documents and Settings\peng&gt;java HelloWorldExtendsHelloWorld</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hello World</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">可以看到执行成功了。HelloWorldExtendsHelloWorld继承了HelloWorld类，所以在执行时JVM会先查找在CLASSPATH下是否存在一个HelloWorld.class文件，因为我们已经成功编译了HelloWorld 类了，所以可以成功执行HelloWorldExtendsHelloWorld.class</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(3).C:\Documents and Settings\peng&gt;java HelloWorldExtendsTestCase</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp;&nbsp;&nbsp; Exception in thread "main" java.lang.NoClassDefFoundError: junit/framework/TestCase</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">可以看到程序抛出异常了，提示找不到junit.framework.TestCase文件。为什么同样在:\peng\java\pro 下，HelloWorldExtendsHelloWorld.class就可以成功执行，而这个就不行了呢？这是因为：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; junit.framework.TestCase.class文件并不存在于当前目录下，所以为了能够让程序成功运行，我们必须通过指定CLASSPATH的方式，让JVM可以找到junit.framework.TestCase这个类，如(4)：</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(4). C:\Documents and Settings\peng&gt;java -classpath %CLASSPATH% HelloWorldExtendsTestCase</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hello World</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">总结：</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(1).何时需要使用-classpath：当你要编译或执行的类引用了其它的类，但被引用类的.class文件不在当前目录下时，就需要通过-classpath来引入类</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">(2).何时需要指定路径：当你要编译的类所在的目录和你执行javac命令的目录不是同一个目录时，就需要指定源文件的路径(CLASSPATH是用来指定.class路径的，不是用来指定.java文件的路径的)</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">[转自：</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">http://blog.csdn.net/pengpenglin/</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">http://www.blogjava.net/pengpenglin/</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><br />
</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">]</span><span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; ">&nbsp;</span>
<img src ="http://www.blogjava.net/caizh2009/aggbug/335634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-10-19 22:32 <a href="http://www.blogjava.net/caizh2009/archive/2010/10/19/335634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVAC 命令详解(http://www.cnblogs.com/jeffchen/archive/2008/01/16/1041783.html)</title><link>http://www.blogjava.net/caizh2009/archive/2010/10/19/335633.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Oct 2010 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/10/19/335633.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/335633.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/10/19/335633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/335633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/335633.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis">
<h2 style="margin-top: 10px; font-size: 1.1em; ">结构</h2>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; "><strong>javac</strong> [ options ] [ sourcefiles ] [ @files ]
</pre>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">参数可按任意次序排列。</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; "><dl><dt><code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">options</font></code></dt><dd>命令行选项。</dd><dt><code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">sourcefiles</font></code></dt><dd>一个或多个要编译的源文件（例如 MyClass.java）。</dd><dt><code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">@files</font></code></dt><dd>一个或多个对源文件进行列表的文件。</dd></dl></blockquote></blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="description">
<h2 style="margin-top: 10px; font-size: 1.1em; ">说明</h2>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a></span><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; "><a name="synopsis">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">javac</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">有两种方法可将源代码文件名传递给 javac：</p>
<ul>
    <li style="font-size: 10pt; font-style: normal; ">如果源文件数量少，在命令行上列出文件名即可。</li>
    <li style="font-size: 10pt; font-style: normal; ">如果源文件数量多，则将源文件名列在一个文件中，名称间用空格或回车行来进行分隔。然后在 javac 命令行中使用该列表文件名，文件名前冠以 @ 字符。</li>
</ul>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">源代码文件名称必须含有&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">.java</font></code>&nbsp;后缀，类文件名称必须含有&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">.class</font></code>&nbsp;后缀，源文件和类文件都必须有识别该类的根名。例如，名为&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">MyClass</font></code>&nbsp;的类将写在名为&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">MyClass.java</font></code>的源文件中，并被编译为字节码类文件&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">MyClass.class</font></code>。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">内部类定义产生附加的类文件。这些类文件的名称将内部类和外部类的名称结合在一起，例如<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">MyClass$MyInnerClass.class</font></code>。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">应当将源文件安排在反映其包树结构的目录树中。例如，如果将所有的源文件放在 /workspace 中，那么&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">com.mysoft.mypack.MyClass</font></code>&nbsp;的代码应该在 \workspace\com\mysoft\mypack\MyClass.java 中。</p>
</a>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; "><a name="synopsis">缺省情况下，编译器将每个类文件与其源文件放在同一目录中。可用 -d 选项（请参阅后面的</a><a href="http://www.iplab.cs.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/win32/javac.html#options" style="color: #0066ff; text-decoration: none; ">选项</a><a name="synopsis">）指定其它目标目录。</a></p>
<a name="synopsis">工具读取用 Java 编程语言编写的类和接口定义，并将它们编译成字节码类文件。</a></blockquote><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="searching">
<h2 style="margin-top: 10px; font-size: 1.1em; ">查找类型</h2>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">当编译源文件时，编译器常常需要它还没有识别出的类型的有关信息。对于源文件中使用、扩展或实现的每个类或接口，编译器都需要其类型信息。这包括在源文件中没有明确提及、但通过继承提供信息的类和接口。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">例如，当扩展&nbsp;<strong>java.applet.Applet</strong>&nbsp;时还要用到&nbsp;<strong>Applet</strong>&nbsp;的祖先类：<strong>java.awt.Panel</strong>&nbsp;、<strong>java.awt.Container</strong>、&nbsp;<strong>java.awt.Component</strong>&nbsp;和&nbsp;<strong>java.awt.Object</strong>。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">当编译器需要类型信息时，它将查找定义类型的源文件或类文件。编译器先在自举类及扩展类中查找，然后在用户类路径中查找。用户类路径通过两种途径来定义：通过设置&nbsp;<strong>CLASSPATH</strong>&nbsp;环境变量或使用&nbsp;<strong>-classpath</strong>&nbsp;命令行选项。（有关详细资料，请参阅设置类路径）。如果使用&nbsp;<strong>-sourcepath</strong>&nbsp;选项，则编译器在<strong>&nbsp;sourcepath</strong>&nbsp;指定的路径中查找源文件；否则，编译器将在用户类路径中查找类文件和源文件。可用<strong>-bootclasspath</strong>&nbsp;和&nbsp;<strong>-extdirs</strong>&nbsp;选项来指定不同的自举类或扩展类；参阅下面的联编选项。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">成功的类型搜索可能生成类文件、源文件或两者兼有。以下是&nbsp;<strong>javac</strong>&nbsp;对各种情形所进行的处理：</p>
<ul>
    <li style="font-size: 10pt; font-style: normal; "><em>搜索结果只生成类文件而没有源文件：</em>&nbsp;<strong>javac</strong>&nbsp;使用类文件。</li>
    <li style="font-size: 10pt; font-style: normal; "><em>搜索结果只生成源文件而没有类文件：</em>&nbsp;<strong>javac</strong>&nbsp;编译源文件并使用由此生成的类文件。</li>
    <li style="font-size: 10pt; font-style: normal; "><em>搜索结果既生成源文件又生成类文件：<strong>&nbsp;</strong>确定类文件是否过时。若类文件已过时，则&nbsp;<strong>javac</strong>重新编译源文件并使用更新后的类文件。否则，&nbsp;<strong>javac</strong>&nbsp;直接使用类文件。
    <p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">缺省情况下，只要类文件比源文件旧，&nbsp;<strong>javac</strong>&nbsp;就认为它已过时。（&nbsp;<strong>-Xdepend</strong>&nbsp;选项指定相对来说较慢但却比较可靠的过程。）</p>
    </em>javac</li>
</ul>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">注意：&nbsp;<strong>javac</strong>&nbsp;可以隐式编译一些没有在命令行中提及的源文件。用&nbsp;<strong>-verbose</strong>&nbsp;选项可跟踪自动编译。</p>
</blockquote></a></span>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="commandlineargfile" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a><a name="synopsis" style="width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a></p>
<span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis">
<h2 style="margin-top: 10px; font-size: 1.1em; ">文件列表</h2>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">为缩短或简化&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">javac</font></code>&nbsp;命令，可以指定一个或多个每行含有一个文件名的文件。在命令行中，采用 '<tt><font face="新宋体">@</font></tt>' 字符加上文件名的方法将它指定为文件列表。当 javac 遇到以 `<tt><font face="新宋体">@</font></tt>' 字符开头的参数时，它对那个文件中所含文件名的操作跟对命令行中文件名的操作是一样的。这使得 Windows 命令行长度不再受限制。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">例如，可以在名为&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">sourcefiles</font></code>&nbsp;的文件中列出所有源文件的名称。该文件可能形如：</p>
<pre style="margin-top: 0px; margin-bottom: 0px; ">     MyClass1.java
MyClass2.java
MyClass3.java
</pre>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">然后可用下列命令运行编译器：</p>
<pre style="margin-top: 0px; margin-bottom: 0px; ">     C:&gt; <strong>javac @sourcefiles</strong>
</pre>
</blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="options">
<h2 style="margin-top: 10px; font-size: 1.1em; ">选项</h2>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">编译器有一批标准选项，目前的开发环境支持这些标准选项，将来的版本也将支持它。还有一批附加的非标准选项是目前的虚拟机实现所特有的，将来可能要有变化。非标准选项以&nbsp;<strong>-X</strong>&nbsp;打头。</p>
</blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="standard">
<h2 style="margin-top: 10px; font-size: 1.1em; ">标准选项</h2>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; "><dl><dt><strong>-classpath</strong>&nbsp;<em>类路径</em></dt><dd>设置用户类路径，它将覆盖&nbsp;<strong>CLASSPATH</strong>&nbsp;环境变量中的用户类路径。若既未指定<strong>CLASSPATH</strong>&nbsp;又未指定&nbsp;<strong>-classpath</strong>，则用户类路径由当前目录构成。有关详细信息，请参阅设置类路径。
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">若未指定&nbsp;<strong>-sourcepath</strong>&nbsp;选项，则将在用户类路径中查找类文件和源文件。</p>
</dd><dt><strong>-d</strong>&nbsp;<em>目录</em></dt><dd>设置类文件的目标目录。如果某个类是一个包的组成部分，则&nbsp;<strong>javac</strong>&nbsp;将把该类文件放入反映包名的子目录中，必要时创建目录。例如，如果指定&nbsp;<strong>-d c:\myclasses</strong>&nbsp;并且该类名叫<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">com.mypackage.MyClass</font></code>，那么类文件就叫作<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">c:\myclasses\com\mypackage\MyClass.class</font></code>。
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">若未指定&nbsp;<strong>-d</strong>&nbsp;选项，则&nbsp;<strong>javac</strong>&nbsp;将把类文件放到与源文件相同的目录中。</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">注意：&nbsp;<strong>-d</strong>&nbsp;选项指定的目录不会被自动添加到用户类路径中。</p>
</dd><dt><strong>-deprecation</strong></dt><dd>显示每种不鼓励使用的成员或类的使用或覆盖的说明。没有给出&nbsp;<strong>-deprecation</strong>&nbsp;选项的话，&nbsp;<strong>javac</strong>&nbsp;将显示这类源文件的名称：这些源文件使用或覆盖不鼓励使用的成员或类。</dd><dt><strong>-encoding</strong></dt><dd>设置源文件编码名称，例如&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">EUCJIS/SJIS</font></code>。若未指定&nbsp;<strong>-encoding</strong>&nbsp;选项，则使用平台缺省的转换器。</dd><dt><strong>-g</strong></dt><dd>生成所有的调试信息，包括局部变量。缺省情况下，只生成行号和源文件信息。</dd><dt><strong>-g:none</strong></dt><dd>不生成任何调试信息。</dd><dt><strong>-g:</strong><em>{关键字列表}</em></dt><dd>只生成某些类型的调试信息，这些类型由逗号分隔的关键字列表所指定。有效的关键字有：<dl><dt><strong>source</strong></dt><dd>源文件调试信息</dd><dt><strong>lines</strong></dt><dd>行号调试信息</dd><dt><strong>vars</strong></dt><dd>局部变量调试信息</dd></dl></dd><dt><strong>-nowarn</strong></dt><dd>禁用警告信息。</dd><dt><strong>-O</strong></dt><dd>优化代码以缩短执行时间。使用&nbsp;<strong>-O</strong>&nbsp;选项可能使编译速度下降、生成更大的类文件并使程序难以调试。
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">在 JDK 1.2 以前的版本中，javac 的&nbsp;<strong>-g</strong>&nbsp;选项和&nbsp;<strong>-O</strong>&nbsp;选项不能一起使用。在 JDK 1.2 中，可以将&nbsp;<strong>-g</strong>&nbsp;和&nbsp;<strong>-O</strong>&nbsp;选项结合起来，但可能会得到意想不到的结果，如丢失变量或重新定位代码或丢失代码。<strong>-O</strong>&nbsp;选项不再自动打开&nbsp;<strong>-depend</strong>&nbsp;或关闭&nbsp;<strong>-g</strong>&nbsp;选项。同样，&nbsp;<strong>-O</strong>&nbsp;选项也不再允许进行跨类内嵌。</p>
</dd><dt><strong>-sourcepath</strong>&nbsp;<em>源路径</em></dt><dd>指定用以查找类或接口定义的源代码路径。与用户类路径一样，源路径项用分号 (<strong>;</strong>) 进行分隔，它们可以是目录、JAR 归档文件或 ZIP 归档文件。如果使用包，那么目录或归档文件中的本地路径名必须反映包名。
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">注意：通过类路径查找的类，如果找到了其源文件，则可能会自动被重新编译。</p>
</dd><dt><strong>-verbose</strong></dt><dd>冗长输出。它包括了每个所加载的类和每个所编译的源文件的有关信息。</dd></dl></blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="crosscomp-options">
<h3 style="font-size: 10pt; border-bottom-width: 0px; border-bottom-style: dotted; border-bottom-color: #d6d6d6; color: #000000; background-color: transparent; ">联编选项</h3>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">缺省情况下，类是根据与&nbsp;<strong>javac</strong>&nbsp;一起发行的 JDK 自举类和扩展类来编译。但&nbsp;<strong>javac</strong>&nbsp;也支持<em>联编</em>，在联编中，类是根据其它 Java平台实现的自举类和扩展类来进行编译的。联编时，&nbsp;<strong>-bootclasspath</strong>&nbsp;和&nbsp;<strong>-extdirs</strong>&nbsp;的使用很重要；请参阅下面的联编程序示例。</p>
<dl><dt><strong>-target</strong>&nbsp;<em>版本</em></dt><dd>生成将在指定版本的虚拟机上运行的类文件。缺省情况下生成与 1.1 和 1.2 版本的虚拟机都兼容的类文件。JDK 1.2 中的&nbsp;<strong>javac</strong>&nbsp;所支持的版本有：<dl><dt><strong>1.1</strong></dt><dd>保证所产生的类文件与 1.1 和 1.2 版的虚拟机兼容。这是缺省状态。</dd><dt><strong>1.2</strong></dt><dd>生成的类文件可在 1.2 版的虚拟机上运行，但不能在 1.1 版的虚拟机上运行。</dd></dl></dd><dt><strong>-bootclasspath</strong>&nbsp;<em>自举类路径</em></dt><dd>根据指定的自举类集进行联编。和用户类路径一样，自举类路径项用分号 (<strong>;</strong>) 进行分隔，它们可以是目录、JAR 归档文件或 ZIP 归档文件。</dd><dt><strong>-extdirs</strong>&nbsp;<em>目录</em></dt><dd>根据指定的扩展目录进行联编。<em>目录</em>是以分号分隔的目录列表。在指定目录的每个 JAR 归档文件中查找类文件。</dd></dl></blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="nonstandard">
<h3 style="font-size: 10pt; border-bottom-width: 0px; border-bottom-style: dotted; border-bottom-color: #d6d6d6; color: #000000; background-color: transparent; ">非标准选项</h3>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; "><dl><dt><strong>-X</strong></dt><dd>显示非标准选项的有关信息并退出。</dd><dt><strong>-Xdepend</strong></dt><dd>递归地搜索所有可获得的类，以寻找要重编译的最新源文件。该选项将更可靠地查找需要编译的类，但会使编译进程的速度大为减慢。</dd><dt><strong>-Xstdout</strong></dt><dd>将编译器信息送到<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">System.out</font></code>&nbsp;中。缺省情况下，编译器信息送到&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">System.err</font></code>&nbsp;中。</dd><dt><strong>-Xverbosepath</strong></dt><dd>说明如何搜索路径和标准扩展以查找源文件和类文件。</dd><dt><strong>-J</strong><em>选项</em></dt><dd>将<em>选项</em>传给&nbsp;<strong>javac</strong>&nbsp;调用的&nbsp;<strong>java</strong>&nbsp;启动器。例如，&nbsp;<strong>-J-Xms48m</strong>&nbsp;将启动内存设为 48 兆字节。虽然它不以&nbsp;<strong>-X</strong>&nbsp;开头，但它并不是&nbsp;<strong>javac</strong>&nbsp;的&#8216;标准选项&#8217;。用<strong>&nbsp;-J</strong>&nbsp;将选项传给执行用 Java 编写的应用程序的虚拟机是一种公共约定。
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">注意：&nbsp;<strong>CLASSPATH</strong>&nbsp;、&nbsp;<strong>-classpath</strong>&nbsp;、&nbsp;<strong>-bootclasspath</strong>&nbsp;和&nbsp;<strong>-extdirs</strong>&nbsp;并&nbsp;<em>不</em>&nbsp;指定用于运行&nbsp;<strong>javac</strong>&nbsp;的类。如此滥用编译器的实现通常没有任何意义而且总是很危险的。如果确实需要这样做，可用&nbsp;<strong>-J</strong>&nbsp;选项将选项传给基本的&nbsp;<strong>java</strong>&nbsp;启动器。</p>
</dd></dl></blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="examples">
<h2 style="margin-top: 10px; font-size: 1.1em; ">程序示例</h2>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="simpleexamples">
<h3 style="font-size: 10pt; border-bottom-width: 0px; border-bottom-style: dotted; border-bottom-color: #d6d6d6; color: #000000; background-color: transparent; ">编译简单程序</h3>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">一个源文件&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">Hello.java</font></code>&nbsp;，它定义了一个名叫&nbsp;<strong>greetings.Hello</strong>&nbsp;的类。<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">greetings</font></code>&nbsp;目录是源文件和类文件两者的包目录，且它不是当前目录。这让我们可以使用缺省的用户类路径。它也使我们没必要用&nbsp;<strong>-d</strong>&nbsp;选项指定单独的目标目录。</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; ">C:&gt; <strong>dir</strong>
greetings/
C:&gt; <strong>dir greetings</strong>
Hello.java
C:&gt; <strong>cat greetings\Hello.java</strong>
package greetings;
public class Hello {
public static void main(String[] args) {
for (int i=0; i &lt; args.length; i++) {
System.out.println("Hello " + args[i]);
}
}
}
C:&gt; <strong>javac greetings\Hello.java</strong>
C:&gt; <strong>dir greetings</strong>
Hello.class   Hello.java
C:&gt; <strong>java greetings.Hello World Universe Everyone</strong>
Hello World
Hello Universe
Hello Everyone
</pre>
</blockquote></blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="multiple-example">
<h3 style="font-size: 10pt; border-bottom-width: 0px; border-bottom-style: dotted; border-bottom-color: #d6d6d6; color: #000000; background-color: transparent; ">编译多个源文件</h3>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">该示例编译&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">greetings</font></code>&nbsp;包中的所有源文件。</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; ">C:&gt; <strong>dir</strong>
greetings\
C:&gt; <strong>dir greetings</strong>
Aloha.java         GutenTag.java      Hello.java         Hi.java
C:&gt; <strong>javac greetings\*.java</strong>
C:&gt; <strong>dir greetings</strong>
Aloha.class         GutenTag.class      Hello.class         Hi.class
Aloha.java          GutenTag.java       Hello.java          Hi.java
</pre>
</blockquote></blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="userclasspath">
<h3 style="font-size: 10pt; border-bottom-width: 0px; border-bottom-style: dotted; border-bottom-color: #d6d6d6; color: #000000; background-color: transparent; ">指定用户类路径</h3>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">对前面示例中的某个源文件进行更改后，重新编译它：</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; ">C:&gt; <strong>cd</strong>
\examples
C:&gt; <strong>javac greetings\Hi.java</strong>
</pre>
</blockquote>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">由于&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">greetings.Hi</font></code>&nbsp;引用了&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">greetings</font></code>&nbsp;包中其它的类，编译器需要找到这些其它的类。上面的示例能运行是因为缺省的用户类路径刚好是含有包目录的目录。但是，假设我们想重新编译该文件并且不关心我们在哪个目录中的话， 我们需要将&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">\examples</font></code>&nbsp;添加到用户类路径中。可以通过设置<strong>CLASSPATH</strong>&nbsp;达到此目的，但这里我们将使用&nbsp;<strong>-classpath</strong>&nbsp;选项来完成。</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; ">C:&gt;<strong>javac -classpath \examples \examples\greetings\Hi.java</strong>
</pre>
</blockquote>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">如果再次将&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">greetings.Hi</font></code>&nbsp;改为使用标题实用程序，该实用程序也需要通过用户类路径来进行访问：</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; ">C:&gt;<strong>javac -classpath \examples:\lib\Banners.jar \
\examples\greetings\Hi.java</strong>
</pre>
</blockquote>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">要执行&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">greetings</font></code>&nbsp;中的类，需要访问&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">greetings</font></code>&nbsp;和它所使用的类。</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; ">C:&gt;<strong>java -classpath \examples:\lib\Banners.jar greetings.Hi</strong>
</pre>
</blockquote></blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="separating">
<h3 style="font-size: 10pt; border-bottom-width: 0px; border-bottom-style: dotted; border-bottom-color: #d6d6d6; color: #000000; background-color: transparent; ">将源文件和类文件分开</h3>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">将源文件和类文件置于不同的目录下经常是很有意义的，特别是在大型的项目中。我们用&nbsp;<strong>-d</strong>&nbsp;选项来指明单独的类文件目标位置。由于源文件不在用户类路径中，所以用&nbsp;<strong>-sourcepath</strong>&nbsp;选项来协助编译器查找它们。</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; ">C:&gt; <strong>dir</strong>
classes\  lib\      src\
C:&gt; <strong>dir src</strong>
farewells\
C:&gt; <strong>dir src\farewells</strong>
Base.java      GoodBye.java
C:&gt; <strong>dir lib</strong>
Banners.jar
C:&gt; <strong>dir classes</strong>
C:&gt; <strong>javac -sourcepath src -classpath classes:lib\Banners.jar \
src\farewells\GoodBye.java -d classes</strong>
C:&gt; <strong>dir classes</strong>
farewells\
C:&gt; <strong>dir classes\farewells</strong>
Base.class      GoodBye.class
</pre>
</blockquote>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">注意：编译器也编译了&nbsp;<code style="font-family: 'Courier New', Courier, monospace; font-size: 10pt; "><font face="新宋体">src\farewells\Base.java</font></code>，虽然我们没有在命令行中指定它。要跟踪自动编译，可使用&nbsp;<strong>-verbose</strong>&nbsp;选项。</p>
</blockquote></a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="crosscomp-example">
<h3 style="font-size: 10pt; border-bottom-width: 0px; border-bottom-style: dotted; border-bottom-color: #d6d6d6; color: #000000; background-color: transparent; ">联编程序示例</h3>
</a></span><span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 18px; "><a name="synopsis"><blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">这里我们用 JDK 1.2 的&nbsp;<strong>javac</strong>&nbsp;来编译将在 1.1 版的虚拟机上运行的代码。</p>
<blockquote style="background-image: none; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #f4f4f4; border-right-color: #f4f4f4; border-bottom-color: #f4f4f4; border-left-color: #f4f4f4; color: #5b5b5b; margin-left: 25px; padding-left: 11px; padding-right: 11px; padding-top: 0px; padding-bottom: 0px; margin-top: 10px; margin-bottom: 10px; font-style: normal; font-size: 10pt; line-height: 19px; background-position: initial initial; background-repeat: initial initial; ">
<pre style="margin-top: 0px; margin-bottom: 0px; ">C:&gt; <strong>javac -target 1.1 -bootclasspath jdk1.1.7\lib\classes.zip \
-extdirs "" OldCode.java</strong>
</pre>
</blockquote><strong>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">-target 1.1</p>
<p style="margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; text-indent: 0px; ">JDK 1.2&nbsp;<strong>javac</strong>&nbsp;在缺省状态下也将根据 1.2 版的自举类来进行编译，因此我们需要告诉<strong>javac</strong>&nbsp;让它根据 JDK 1.1 自举类来进行编译。可用&nbsp;<strong>-bootclasspath</strong>&nbsp;和&nbsp;<strong>-extdirs</strong>&nbsp;选项来达到此目的。不这样做的话，可能会使编译器根据 1.2 版的 API 来进行编译。由于 1.1 版的虚拟机上可能没有该 1.2 版的 API，因此运行时将出错。</p>
</strong>选项可确保生成的类文件与 1.1 版的虚拟机兼容。在 JDK1.2 中， 缺省情况下&nbsp;<strong>javac</strong>&nbsp;编译生成的文件是与 1.1 版的虚拟机兼容的，因此并非严格地需要该选项。然而，由于别的编译器可能采用其它的缺省设置，所以提供这一选项将不失为是个好习惯。</blockquote></a></span>
<img src ="http://www.blogjava.net/caizh2009/aggbug/335633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-10-19 22:31 <a href="http://www.blogjava.net/caizh2009/archive/2010/10/19/335633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java虚拟机参数详解</title><link>http://www.blogjava.net/caizh2009/archive/2010/10/19/335589.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 19 Oct 2010 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/10/19/335589.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/335589.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/10/19/335589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/335589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/335589.html</trackback:ping><description><![CDATA[<p>
<p style="font-family: verdana; font-size: 12px; line-height: 20px; color: #666666; ">下面的讨论以Windows平台的Sun MicroSystem实现的java5虚拟机为蓝本，其他操作系统或其他公司实现的虚拟机参数会有部分不同，但大部分含义都和Windows上的类似。Java5与以前版本相比，虚拟机参数大部分保持了向前兼容，同时也增加了一些新的参数，本文将对这些参数的作用作详细描述，使虚拟机能更符合运行环境的需要，获得更好的性能和稳定性。</p>
<p style="font-family: verdana; font-size: 12px; line-height: 20px; color: #666666; ">Java在运行已编译完成的类时，是通过java虚拟机来装载和执行的，java虚拟机通过操作系统命令JAVA_HOME\bin\java &#8211;option 来启动，-option为虚拟机参数，JAVA_HOME为JDK安装路径，通过这些参数可对虚拟机的运行状态进行调整，掌握参数的含义可对虚拟机的运行模式有更深入理解。<br />
<br />
<br />
虚拟机参数分为基本和扩展两类，在命令行中输入JAVA_HOME\bin\java 就可得到基本参数列表，<br />
<br />
在命令行输入JAVA_HOME\bin\java &#8211;X 就可得到扩展参数列表。<br />
<br />
基本参数说明：<br />
<br />
<br />
-client，-server<br />
<br />
这两个参数用于设置虚拟机使用何种运行模式，client模式启动比较快，但运行时性能和内存管理效率不如server模式，通常用于客户端应用程序。相反，server模式启动比client慢，但可获得更高的运行性能。<br />
<br />
在windows上，缺省的虚拟机类型为client模式，如果要使用server模式，就需要在启动虚拟机时加-server参数，以获得更高性能，对服务器端应用，推荐采用server模式，尤其是多个CPU的系统。在Linux，Solaris上缺省采用server模式。<br />
<br />
<br />
-hotspot<br />
<br />
含义与client相同，jdk1.4以前使用的参数，jdk1.4开始不再使用，代之以client。<br />
<br />
<br />
-classpath,-cp<br />
<br />
虚拟机在运行一个类时，需要将其装入内存，虚拟机搜索类的方式和顺序如下：<br />
<br />
Bootstrap classes，Extension classes，User classes。<br />
<br />
Bootstrap 中的路径是虚拟机自带的jar或zip文件，虚拟机首先搜索这些包文件，用System.getProperty("sun.boot.class.path")可得到虚拟机搜索的包名。<br />
<br />
<br />
Extension是位于jre\lib\ext目录下的jar文件，虚拟机在搜索完Bootstrap后就搜索该目录下的jar文件。用System. getProperty("java.ext.dirs&#8221;)可得到虚拟机使用Extension搜索路径。<br />
<br />
User classes搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。<br />
<br />
-classpath告知虚拟机搜索目录名、jar文档名、zip文档名，之间用分号;分隔。<br />
<br />
例如当你自己开发了公共类并包装成一个common.jar包，在使用common.jar中的类时，就需要用-classpath common.jar 告诉虚拟机从common.jar中查找该类，否则虚拟机就会抛出java.lang.NoClassDefFoundError异常，表明未找到类定义。<br />
<br />
在运行时可用System.getProperty(&#8220;java.class.path&#8221;)得到虚拟机查找类的路径。<br />
<br />
<br />
使用-classpath后虚拟机将不再使用CLASSPATH中的类搜索路径，如果-classpath和CLASSPATH都没有设置，则虚拟机使用当前路径(.)作为类搜索路径。<br />
<br />
<br />
推荐使用-classpath来定义虚拟机要搜索的类路径，而不要使用环境变量CLASSPATH的搜索路径，以减少多个项目同时使用CLASSPATH时存在的潜在冲突。例如应用1要使用a1.0.jar中的类G，应用2要使用a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包，当a1.0.jar，a2.0.jar都在CLASSPATH中，虚拟机搜索到第一个包中的类G时就停止搜索，如果应用1应用2的虚拟机都从CLASSPATH中搜索，就会有一个应用得不到正确版本的类G。<br />
<br />
<br />
<br />
-D&lt;propertyName&gt;=value<br />
<br />
在虚拟机的系统属性中设置属性名/值对，运行在此虚拟机之上的应用程序可用System.getProperty(&#8220;propertyName&#8221;)得到value的值。<br />
<br />
如果value中有空格，则需要用双引号将该值括起来，如-Dname=&#8221;space string&#8221;。<br />
<br />
该参数通常用于设置系统级全局变量值，如配置文件路径，应为该属性在程序中任何地方都可访问。<br />
<br />
<br />
-verbose[:class|gc|jni]<br />
<br />
在输出设备上显示虚拟机运行信息。<br />
<br />
verbose和verbose:class含义相同，输出虚拟机装入的类的信息，显示的信息格式如下：<br />
<br />
[Loaded java.io.FilePermission$1 from shared objects file]<br />
<br />
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。<br />
<br />
<br />
-verbose:gc在虚拟机发生内存回收时在输出设备显示信息，格式如下：<br />
<br />
[Full GC 268K-&gt;168K(1984K), 0.0187390 secs]<br />
<br />
该参数用来监视虚拟机内存回收的情况。<br />
<br />
<br />
-verbose:jni在虚拟机调用native方法时输出设备显示信息，格式如下：<br />
<br />
[Dynamic-linking native method HelloNative.sum ... JNI]<br />
<br />
该参数用来监视虚拟机调用本地方法的情况，在发生jni错误时可为诊断提供便利。<br />
<br />
<br />
<br />
-version<br />
<br />
显示可运行的虚拟机版本信息然后退出。一台机器上装有不同版本的JDK时<br />
<br />
<br />
<br />
-showversion<br />
<br />
显示版本信息以及帮助信息。<br />
<br />
<br />
<br />
-ea[:&lt;packagename&gt;...|:&lt;classname&gt;]<br />
<br />
-enableassertions[:&lt;packagename&gt;...|:&lt;classname&gt;]<br />
<br />
从JDK1.4开始，java可支持断言机制，用于诊断运行时问题。通常在测试阶段使断言有效，在正式运行时不需要运行断言。断言后的表达式的值是一个逻辑值，为true时断言不运行，为false时断言运行，抛出java.lang.AssertionError错误。<br />
<br />
上述参数就用来设置虚拟机是否启动断言机制，缺省时虚拟机关闭断言机制，用-ea可打开断言机制，不加&lt;packagename&gt;和classname时运行所有包和类中的断言，如果希望只运行某些包或类中的断言，可将包名或类名加到-ea之后。例如要启动包com.foo.util中的断言，可用命令 &#8211;ea:com.foo.util 。<br />
<br />
<br />
-da[:&lt;packagename&gt;...|:&lt;classname&gt;]<br />
<br />
-disableassertions[:&lt;packagename&gt;...|:&lt;classname&gt;]<br />
<br />
用来设置虚拟机关闭断言处理，packagename和classname的使用方法和-ea相同。<br />
<br />
<br />
<br />
-esa | -enablesystemassertions<br />
<br />
设置虚拟机显示系统类的断言。<br />
<br />
<br />
-dsa | -disablesystemassertions<br />
<br />
设置虚拟机关闭系统类的断言。<br />
<br />
<br />
-agentlib:&lt;libname&gt;[=&lt;options&gt;]<br />
<br />
该参数是JDK5新引入的，用于虚拟机装载本地代理库。<br />
<br />
Libname为本地代理库文件名，虚拟机的搜索路径为环境变量PATH中的路径，options为传给本地库启动时的参数，多个参数之间用逗号分隔。在Windows平台上虚拟机搜索本地库名为libname.dll的文件，在Unix上虚拟机搜索本地库名为libname.so的文件，搜索路径环境变量在不同系统上有所不同，Linux、SunOS、IRIX上为LD_LIBRARY_PATH，AIX上为LIBPATH，HP-UX上为SHLIB_PATH。<br />
<br />
<br />
例如可使用-agentlib:hprof来获取虚拟机的运行情况，包括CPU、内存、线程等的运行数据，并可输出到指定文件中，可用-agentlib:hprof=help来得到使用帮助列表。在jre\bin目录下可发现hprof.dll文件。<br />
<br />
<br />
-agentpath:&lt;pathname&gt;[=&lt;options&gt;]<br />
<br />
设置虚拟机按全路径装载本地库，不再搜索PATH中的路径。其他功能和agentlib相同。<br />
<br />
<br />
<br />
-javaagent:&lt;jarpath&gt;[=&lt;options&gt;]<br />
<br />
虚拟机启动时装入java语言设备代理。Jarpath文件中的mainfest文件必须有Agent-Class属性。代理类要实现public static void premain(String agentArgs, Instrumentation inst)方法。当虚拟机初始化时，将按代理类的说明顺序调用premain方法。<br />
<br />
参见：java.lang.instrument<br />
<br />
<br />
<br />
扩展参数说明<br />
<br />
<br />
-Xmixed<br />
<br />
设置-client模式虚拟机对使用频率高的方式进行Just-In-Time编译和执行，对其他方法使用解释方式执行。该方式是虚拟机缺省模式。<br />
<br />
<br />
<br />
-Xint<br />
<br />
设置-client模式下运行的虚拟机以解释方式执行类的字节码，不将字节码编译为本机码。<br />
<br />
<br />
-Xbootclasspath:path<br />
<br />
-Xbootclasspath/a:path<br />
<br />
-Xbootclasspath/p:path<br />
<br />
改变虚拟机装载缺省系统运行包rt.jar而从-Xbootclasspath中设定的搜索路径中装载系统运行类。除非你自己能写一个运行时，否则不会用到该参数。<br />
<br />
/a:将在缺省搜索路径后加上path 中的搜索路径。<br />
<br />
/p:在缺省搜索路径前先搜索path中的搜索路径。<br />
<br />
<br />
-Xnoclassgc<br />
<br />
关闭虚拟机对class的垃圾回收功能。<br />
<br />
<br />
-Xincgc<br />
<br />
启动增量垃圾收集器，缺省是关闭的。增量垃圾收集器能减少偶然发生的长时间的垃圾回收造成的暂停时间。但增量垃圾收集器和应用程序并发执行，因此会占用部分CPU在应用程序上的功能。<br />
<br />
<br />
-Xloggc:&lt;file&gt;<br />
<br />
将虚拟机每次垃圾回收的信息写到日志文件中，文件名由file指定，文件格式是平文件，内容和-verbose:gc输出内容相同。<br />
<br />
<br />
<br />
<br />
-Xbatch<br />
<br />
虚拟机的缺省运行方式是在后台编译类代码，然后在前台执行代码，使用-Xbatch参数将关闭虚拟机后台编译，在前台编译完成后再执行。<br />
<br />
<br />
<br />
-Xms&lt;size&gt;<br />
<br />
设置虚拟机可用内存堆的初始大小，缺省单位为字节，该大小为1024的整数倍并且要大于1MB，可用k(K)或m(M)为单位来设置较大的内存数。初始堆大小为2MB。<br />
<br />
例如：-Xms6400K，-Xms256M<br />
<br />
<br />
<br />
-Xmx&lt;size&gt;<br />
<br />
设置虚拟机内存堆的最大可用大小，缺省单位为字节。该值必须为1024整数倍，并且要大于2MB。可用k(K)或m(M)为单位来设置较大的内存数。缺省堆最大值为64MB。<br />
<br />
例如：-Xmx81920K，-Xmx80M<br />
<br />
当应用程序申请了大内存运行时虚拟机抛出java.lang.OutOfMemoryError: Java heap space错误，就需要使用-Xmx设置较大的可用内存堆。<br />
<br />
<br />
-Xss&lt;size&gt;<br />
<br />
设置线程栈的大小，缺省单位为字节。与-Xmx类似，也可用K或M来设置较大的值。通常操作系统分配给线程栈的缺省大小为1MB。<br />
<br />
另外也可在java中创建线程对象时设置栈的大小，构造函数原型为Thread(ThreadGroup group, Runnable target, String name, long stackSize)。<br />
<br />
<br />
<br />
-Xprof<br />
<br />
输出CPU运行时的诊断信息。<br />
<br />
<br />
<br />
-Xfuture<br />
<br />
对类文件进行严格格式检查，以保证类代码符合类代码规范。为保持向后兼容，虚拟机缺省不进行严格的格式检查。<br />
<br />
<br />
-Xrs<br />
<br />
减少虚拟机中操作系统的信号（singals）的使用。该参数通常用在虚拟机以后台服务方式运行时使用（如Servlet）。<br />
<br />
<br />
<br />
-Xcheck:jni<br />
<br />
调用JNI函数时进行附加的检查，特别地虚拟机将校验传递给JNI函数参数的合法性，在本地代码中遇到非法数据时，虚拟机将报一个致命错误而终止。使用该参数后将造成性能下降。</p>
</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/335589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-10-19 17:07 <a href="http://www.blogjava.net/caizh2009/archive/2010/10/19/335589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用java实现comet，基于 HTTP长连接的实现，用于从服务端实时发送信息到客户端</title><link>http://www.blogjava.net/caizh2009/archive/2010/06/02/322571.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 02 Jun 2010 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/06/02/322571.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/322571.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/06/02/322571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/322571.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/322571.html</trackback:ping><description><![CDATA[http://homelink.javaeye.com/blog/293328#comments<br />
参考文档 <a href="http://www.ibm.com/developerworks/cn/web/wa-lo-comet/">http://www.ibm.com/developerworks/cn/web/wa-lo-comet/</a>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comet是HTTP长连接，就是在HTTP发送请求时，服务器不立刻发送响应信息给客户端，
而是保持着连接，等待一定情况发生后才把数据发送回去给客户端。所以用comet可以实现服务器端的数据实时地发送给客户端。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本文主要是用java和js来简单地实现comet，最后附上源码和使用例子。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在客户端用XMLRequest发送请求到服务器，在服务器端用一个servlet来接收XMLRequest的请求，当接收到请
求时，并不立刻响应客户端，而是把该servlet线程阻塞，等到一定事件发生后，再响应客户端。当客户端接收到服务端的响应后，调用自定义的回调函数来
处理服务器发送回来的数据，处理完成后，再发送一个XMLRequest请求到服务端，这样循环下去，就可以实现数据的实时更新，又不必要在客户端不断地
轮循（polling）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;利用该comet的实现（以后简称为keeper）时，只要在客户端注册事件和写一个处理返回数据的回调函数，然后在服务端实现
keeper中的EventListener接口，调用Controller.action(eventListener,eventType)就可以
了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keeper分成两大部分，第一部分为客户端的javascript,第二部分是服务端的servlet和事件处理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一.客户端</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;建立一个XMLRequest对象池，每发送一次请求，从对象池中取一个XMLRequest对象，如果没有可用的对象，则创建一
个，把它加入到对象池中。这部分的代码来自于网络。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了使用方便，再添加一些方法，用来注册事件。这样只要调用注册函数来注册事件，并且把回调函数传给注册事件函数就行了，处理数据
的事情，交给回调函数，并由用户来实现。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keeper为了方便使用，把客户端的javascript代码集成在servlet中，当配置好keeper的servlet，
启动HTTP服务器时，keeper会根据用户的配置，在相应的目录下生成客户端的javascript代码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;二.服务端</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务端的servlet初始化时，根据配置来生成相应的客户端javascript代码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servlet的入口由keeper.servlet.Keeper.java中的doGet进入。在Keeper的doGet
中，从请求中获取用户注册事件的名称（字符串类型），然后根据事件的名称，构造一个事件（Event类型），再把它注册到NameRegister中，注
册完成后，该servlet线程调用wait(),把自已停止。等待该servlet线程被唤醒后，从Event中调用事件的EventListener
接口的process(request,response)来处理客户端的请求。</p>
<div>
<ol>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;throws&nbsp;ServletException,&nbsp;IOException&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;eventName&nbsp;=&nbsp;request.getParameter("event"); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NameRegister&nbsp;reg&nbsp;=&nbsp;NameRegister.getInstance(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;event&nbsp;=&nbsp;null;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event&nbsp;=&nbsp;reg.getEvent(eventName);
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(event&nbsp;==&nbsp;null)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event&nbsp;=&nbsp;new&nbsp;Event(eventName,this); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reg.registeEvent(eventName,&nbsp;event); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(event.getServlet()&nbsp;==&nbsp;null)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.setServlet(this); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(RegistException&nbsp;e1)&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e1.printStackTrace(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;synchronized(this)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!event.isProcess())&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EventListener&nbsp;listener&nbsp;=&nbsp;event.getListener(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(listener&nbsp;!=&nbsp;null)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listener.process(request,response); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
</ol>
</div>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000; background-color: #f8f8f8;">在服务端处理事件时，调用了keeper.control.Controller中的静态方法
action(EventListener listener,String eventName)来处理。如下所示。</span></span></p>
<div>
<ol>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;boolean&nbsp;action(EventListener&nbsp;listener,String&nbsp;eventName){
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NameRegister&nbsp;reg&nbsp;=&nbsp;NameRegister.getInstance();
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServlet&nbsp;servlet&nbsp;=&nbsp;null;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;e&nbsp;=&nbsp;null;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;reg.getEvent(eventName,true); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(e&nbsp;==&nbsp;null)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.setListener(listener); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servlet&nbsp;=&nbsp;e.getServlet(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.setProcess(true); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;synchronized(servlet)&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servlet.notifyAll(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(RegistException&nbsp;ex)&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(servlet&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;e&nbsp;!=&nbsp;null)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;=&nbsp;null;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
</ol>
</div>
<span><span style="color: #000000;">
<p>下面开始用keeper来写一个简单的网页聊天程序和基于服务端的时间。</p>
</span></span>
<p><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;1.客户端设置</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注册两个事件，一个用于是时间事件，一个是消息事件。同时还要写两个回调函数，用于处理服务
端返回的时间和聊天消息。如下所于：</span></p>
<div>
<ol>
    <li>&lt;script&nbsp;type="text/javascript"&gt;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Keeper.addListener('timer',showTime);//注册时间事件 </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;showTime(obj){&nbsp;//时间处理回调函数 </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sp&nbsp;=&nbsp;document.getElementById("dateTime"); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(sp){
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp.innerHTML&nbsp;=&nbsp;obj.responseText;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;startOrStop(obj){
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;btn&nbsp;=&nbsp;document.getElementById("controlBtn") </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btn.value=obj.responseText; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Keeper.addListener('msg',showMsg,"GBK");<span>//注册消息事
    件，最后一个参数是 </span></li>
    <li>//字符串编码 </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;showMsg(obj){//处理消息的回调函数 </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;msg&nbsp;=&nbsp;document.getElementById("msg"); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(msg){
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.value&nbsp;=&nbsp;obj.responseText+""n"+msg.value; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;sendMsg()&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;msg&nbsp;=&nbsp;document.getElementById("sendMsg"); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(msg){
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;d&nbsp;=&nbsp;"msg="+msg.value; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendReq('POST','./demo',d,startOrStop); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.value&nbsp;=&nbsp;""; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&lt;/script&gt;</li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000;">2.配置服务端</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000;">服务端的配置在
web.xml文件中，如下所示</span></span></p>
<span><span style="color: #000000;">
<div>
<ol>
    <li>&nbsp;&nbsp;&lt;servlet&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;keeper&lt;/servlet-name&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;keeper.servlet.Keeper&lt;/servlet-class&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; </li>
    <li><span>&lt;!--可选项，设置生成客户端的JavaScript路径和名字，默认置为
    /keeper.js--&gt;</span> </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;ScriptName&lt;/param-name&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/keeperScript.js&lt;/param-value&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt; </li>
    <li>&lt;!--这个一定要设置，否则不能生成客户端代码--&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; </li>
    <li>&nbsp;&nbsp;&lt;/servlet&gt; </li>
    <li>&nbsp;&nbsp;&lt;servlet-mapping&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;keeper&lt;/servlet-name&gt; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/keeper&lt;/url-pattern&gt; </li>
    <li>&nbsp;&nbsp;&lt;/servlet-mapping&gt;</li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用&lt;script type="text/javascript"
src="./keeperScript.js"&gt;&lt;/script&gt;在页面包含JavaScript时，这里的src一定要和上面配
置的一至。上面的设置除了&lt;init-param&gt;&lt;/init-param&gt;为可选的设置外，其他的都是必要的，而且不能改
变。</p>
<span><span><span style="color: #000000;">
</span></span></span></span>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.编写事件处理代码，消息的处理代码如下：</span>
<div>
<ol>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;void&nbsp;doPost(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;throws&nbsp;ServletException,&nbsp;IOException&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Post.."); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msg&nbsp;=&nbsp;request.getParameter("msg"); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Controller.action(new&nbsp;SendMsg(msg),"msg"); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}</li>
</ol>
</div>
<div>
<ol>
    <li>class&nbsp;SendMsg&nbsp;implements&nbsp;EventListener{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;msg;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;SendMsg(String&nbsp;msg)&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.msg&nbsp;=&nbsp;msg;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;@Override
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;process(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setCharacterEncoding("UTF-8"); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;=&nbsp;null;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;=&nbsp;response.getWriter(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(msg!=null){ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write(msg); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally{
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(out&nbsp;!=&nbsp;null)&nbsp;{ </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close(); </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} </li>
    <li>}</li>
</ol>
</div>
<p>&nbsp;到这时，一个基本的keeper应用就完成了。其它部分请参考附件中的例子源码。</p>
<div>
<ul>
    <li><a href="http://dl.javaeye.com/topics/download/d97d20a9-bab6-3f1d-b782-a0aa4e6c87ad">Keeper_KeeperDemo.rar</a>
    (36 KB)</li>
    <li>描述: comet的实现和应用例子</li>
    <li>下载次数: 767</li>
</ul>
</div>
<br />
<img src ="http://www.blogjava.net/caizh2009/aggbug/322571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-06-02 15:31 <a href="http://www.blogjava.net/caizh2009/archive/2010/06/02/322571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符，字节和编码</title><link>http://www.blogjava.net/caizh2009/archive/2010/04/30/319769.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 30 Apr 2010 03:15:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2010/04/30/319769.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/319769.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2010/04/30/319769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/319769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/319769.html</trackback:ping><description><![CDATA[<h2>字符，字节和编码</h2>
<p><font size="1">转载自：<a href="http://www.regexlab.com/zh/encoding.htm">http://www.regexlab.com/zh/encoding.htm</a></font></p>
<p>级别：中级</p>
<blockquote>
<p>摘要：本文介绍了字符与编码的发展过程，相关概念的正确理解。举例说明了一些实际应用中，编码的实现方法。然后，本文
讲述了通常对字符与编码的几种误解，由于这些误解而导致乱码产生的原因，以及消除乱码的办法。本文的内容涵盖了&#8220;中文问题&#8221;，&#8220;乱码问题&#8221;。</p>
<p>掌握编码问题的关键是正确地理解相关概念，编码所涉及的技术其实是很简单的。因此，阅读本文时需要慢读多想，多思考。</p>
</blockquote>
<h4>引言</h4>
<p>&#8220;字符与编码&#8221;是一个被经常讨论的话题。即使这样，时常出现的乱码仍然困扰着大家。虽然我们有很多的办法可以用来消除乱
码，但我们并不一定理解这些办法的内在原理。而有的乱码产生的原因，实际上由于底层代码本身有问题所导致的。因此，不仅是初学者会对字符编码感到模糊，有
的底层开发人员同样对字符编码缺乏准确的理解。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h4>1. 编码问题的由来，相关概念的理解</h4>
<h5>1.1 字符与编码的发展</h5>
<p>从计算机对多国语言的支持角度看，大致可以分为三个阶段：</p>
<table border="0" cellpadding="3" cellspacing="0">
    <tbody>
        <tr>
            <td align="center" nowrap="nowrap"><strong>系统内码</strong></td>
            <td align="center"><strong>说明</strong></td>
            <td align="center"><strong>系统</strong></td>
        </tr>
        <tr>
            <td nowrap="nowrap">阶段一</td>
            <td align="center" nowrap="nowrap">ASCII</td>
            <td>计算机刚开始只支持英语，其它语言不能够在计算机上存储和显示。</td>
            <td>英文 DOS</td>
        </tr>
        <tr>
            <td nowrap="nowrap">阶段二</td>
            <td align="center" nowrap="nowrap">ANSI编码<br />
            （本地化）</td>
            <td>为使计算机支持更多语言，通常使用 0x80~0xFF 范围的 2
            个字节来表示 1 个字符。比如：汉字 '中' 在中文操作系统中，使用 [0xD6,0xD0] 这两个字节存储。<br />
            <br />
            不同的国家和地区制定了不同的标准，由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2
            个字节来代表一个字符的各种汉字延伸编码方式，称为<strong> ANSI 编码</strong>。在简体中文系统下，ANSI 编码代表 GB2312
            编码，在日文操作系统下，ANSI 编码代表 JIS 编码。<br />
            <br />
            不同 ANSI 编码之间互不兼容，当信息在国际间交流时，无法将属于两种语言的文字，存储在同一段<strong> ANSI
            编码</strong>的文本中。</td>
            <td>中文 DOS，中文 Windows 95/98，日文 Windows
            95/98</td>
        </tr>
        <tr>
            <td nowrap="nowrap">阶段三</td>
            <td align="center" nowrap="nowrap">UNICODE<br />
            （国际化）</td>
            <td>为了使国际间信息交流更加方便，国际组织制定了 <strong>UNICODE 字符集</strong>，
            为各种语言中的每一个字符设定了统一并且唯一的数字编号，以满足跨语言、跨平台进行文本转换、处理的要求。</td>
            <td>Windows NT/2000/XP，Linux，Java</td>
        </tr>
    </tbody>
</table>
<p>字符串在内存中的存放方法：</p>
<p>在 ASCII 阶段，<strong>单字节字符串</strong>使用一个字节存放一个字符（SBCS）。比如，"Bob123"
在内存中为：</p>
<table style="font-size: 80%; color: #000080;" border="0" cellpadding="0" cellspacing="5">
    <tbody>
        <tr>
            <td>42</td>
            <td>6F</td>
            <td>62</td>
            <td>31</td>
            <td>32</td>
            <td>33</td>
            <td>00</td>
        </tr>
        <tr>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
        </tr>
        <tr>
            <td align="center">B</td>
            <td align="center">o</td>
            <td align="center">b</td>
            <td align="center">1</td>
            <td align="center">2</td>
            <td align="center">3</td>
            <td align="center">"0</td>
        </tr>
    </tbody>
</table>
<p>在使用 ANSI
编码支持多种语言阶段，每个字符使用一个字节或多个字节来表示（MBCS），因此，这种方式存放的字符也被称作<strong>多字节字符</strong>。比如，"中文
123" 在中文 Windows 95 内存中为7个字节，每个汉字占2个字节，每个英文和数字字符占1个字节：</p>
<table style="font-size: 80%; color: #000080;" border="0" cellpadding="0" cellspacing="5">
    <tbody>
        <tr>
            <td>D6</td>
            <td>D0</td>
            <td>CE</td>
            <td>C4</td>
            <td>31</td>
            <td>32</td>
            <td>33</td>
            <td>00</td>
        </tr>
        <tr>
            <td colspan="2" bgcolor="#ff0000"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td colspan="2" bgcolor="#ff0000"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td bgcolor="#000080"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
        </tr>
        <tr>
            <td colspan="2" align="center">中</td>
            <td colspan="2" align="center">文</td>
            <td align="center">1</td>
            <td align="center">2</td>
            <td align="center">3</td>
            <td align="center">"0</td>
        </tr>
    </tbody>
</table>
<p>在 UNICODE 被采用之后，计算机存放字符串时，改为存放每个字符在 UNICODE
字符集中的序号。目前计算机一般使用 2 个字节（16 位）来存放一个序号（DBCS），因此，这种方式存放的字符也被称作<strong>宽字节字符</strong>。
比如，字符串 "中文123" 在 Windows 2000 下，内存中实际存放的是 5 个序号：</p>
<table style="font-size: 80%; color: #000080;" border="0" cellpadding="0" cellspacing="5">
    <tbody>
        <tr>
            <td valign="bottom">2D</td>
            <td valign="bottom">4E</td>
            <td valign="bottom">87</td>
            <td valign="bottom">65</td>
            <td valign="bottom">31</td>
            <td valign="bottom">00</td>
            <td valign="bottom">32</td>
            <td valign="bottom">00</td>
            <td valign="bottom">33</td>
            <td valign="bottom">00</td>
            <td valign="bottom">00</td>
            <td valign="bottom">00</td>
            <td><font color="#808080">&nbsp;&nbsp;&nbsp;&nbsp; &#8592; 在 x86 CPU 中，低字节在前</font></td>
        </tr>
        <tr>
            <td colspan="2" bgcolor="#ff0000"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td colspan="2" bgcolor="#ff0000"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td colspan="2" bgcolor="#ff0000"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td colspan="2" bgcolor="#ff0000"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td colspan="2" bgcolor="#ff0000"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td colspan="2" bgcolor="#ff0000"><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
            <td><img src="http://www.regexlab.com/images/spacer.gif" border="0" height="1" width="1"  alt="" /></td>
        </tr>
        <tr>
            <td colspan="2" align="center">中</td>
            <td colspan="2" align="center">文</td>
            <td colspan="2" align="center">1</td>
            <td colspan="2" align="center">2</td>
            <td colspan="2" align="center">3</td>
            <td colspan="2" align="center">"0</td>
        </tr>
    </tbody>
</table>
<p>一共占 10 个字节。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>1.2 字符，字节，字符串</h5>
<p>理解编码的关键，是要把字符的概念和字节的概念理解准确。这两个概念容易混淆，我们在此做一下区分：</p>
<table border="0" cellpadding="3" cellspacing="0">
    <tbody>
        <tr>
            <td align="center"><strong>概念描述</strong></td>
            <td align="center"><strong>举例</strong></td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">字符</td>
            <td>人们使用的记号，抽象意义上的一个符号。</td>
            <td>'1', '中', 'a', '$', '￥', &#8230;&#8230;</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">字节</td>
            <td>计算机中存储数据的单元，一个8位的二进制数，是一个很具体的存储空间。</td>
            <td>0x01, 0x45, 0xFA, &#8230;&#8230;</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">ANSI<br />
            字符串</td>
            <td>在内存中，如果&#8220;字符&#8221;是以 <strong>ANSI 编码</strong>形式存在的，一个字符
            可能使用一个字节或多个字节来表示，那么我们称这种字符串为 <strong>ANSI 字符串</strong>或者<strong>多字节字符串</strong>。</td>
            <td>"中文123"<br />
            （占7字节）</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">UNICODE<br />
            字符串</td>
            <td>在内存中，如果&#8220;字符&#8221;是以在 UNICODE
            中的序号存在的，那么我们称这种字符串为 <strong>UNICODE 字符串</strong>或者<strong>宽字节字符串</strong>。</td>
            <td>L"中文123"<br />
            （占10字节）</td>
        </tr>
    </tbody>
</table>
<p>由于不同 ANSI 编码所规定的标准是不相同的，因此，对于一个给定的<strong>多字节字符串</strong>，我们必须知道它采用
的是哪一种编码规则，才能够知道它包含了哪些&#8220;字符&#8221;。而对于 <strong>UNICODE 字符串</strong>来说，不管在什么环境下，它所代表的&#8220;字符&#8221;内容总
是不变的。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>1.3 字符集与编码</h5>
<table id="ggad_box_3" style="float: right;" bgcolor="#eae7e3" border="0" cellpadding="0" cellspacing="0" width="208">
    <tbody>
        <tr>
            <td><img src="http://www.regexlab.com/images/ggad3box_01.gif" alt="" height="4" width="4" /></td>
            <td background="../images/ggad3box_02.gif" width="200"><img src="http://www.regexlab.com/images/spacer.gif"  alt="" /></td>
            <td><img src="http://www.regexlab.com/images/ggad3box_03.gif" alt="" height="4" width="4" /></td>
        </tr>
        <tr>
            <td background="../images/ggad3box_04.gif"><img src="http://www.regexlab.com/images/spacer.gif"  alt="" /></td>
            <td align="right"><a href="javascript:close_ggad_box(3)"><img src="http://www.regexlab.com/images/ggad3box_close.gif" border="0"  alt="" /></a></td>
            <td background="../images/ggad3box_06.gif"><img src="http://www.regexlab.com/images/spacer.gif"  alt="" /></td>
        </tr>
        <tr>
            <td background="../images/ggad3box_04.gif"><img src="http://www.regexlab.com/images/spacer.gif"  alt="" /></td>
            <td height="200">
            <p id="ggad_3">
            <script type="text/javascript"><!--
            google_ad_client = "pub-0994550267179056";
            google_ad_slot = "8063252029";
            google_ad_width = 200;
            google_ad_height = 200;
            //--></script>
            <script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script>
            </p>
            </td>
            <td background="../images/ggad3box_06.gif"><img src="http://www.regexlab.com/images/spacer.gif"  alt="" />
            <div id="ggadcode_3" style="display: none;">
            <script type="text/javascript"><!--
            google_ad_client = "pub-0994550267179056";
            google_ad_slot = "8063252029";
            google_ad_width = 200;
            google_ad_height = 200;
            //--></script>
            <script>google_protectAndRun("ads_core.google_render_ad", google_handleError, google_render_ad);</script>
            </div>
            </td>
        </tr>
        <tr>
            <td><img src="http://www.regexlab.com/images/ggad3box_07.gif" alt="" height="4" width="4" /></td>
            <td background="../images/ggad3box_08.gif" height="4" width="200"><img src="http://www.regexlab.com/images/spacer.gif"  alt="" /></td>
            <td><img src="http://www.regexlab.com/images/ggad3box_09.gif" alt="" height="4" width="4" /></td>
        </tr>
    </tbody>
</table>
<p>各个国家和地区所制定的不同 ANSI
编码标准中，都只规定了各自语言所需的&#8220;字符&#8221;。比如：汉字标准（GB2312）中没有规定韩国语字符怎样存储。这些 ANSI
编码标准所规定的内容包含两层含义：</p>
<ol>
    <li>使用哪些字符。也就是说哪些汉字，字母和符号会被收入标准中。所包含&#8220;字符&#8221;的集合就叫做&#8220;<strong>字符集</strong>&#8221;。
    </li>
    <li>规定每个&#8220;字符&#8221;分别用一个字节还是多个字节存储，用哪些字节来存储，这个规定就叫做&#8220;<strong>编码</strong>&#8221;。 </li>
</ol>
<p>各个国家和地区在制定编码标准的时候，&#8220;字符的集合&#8221;和&#8220;编码&#8221;一般都是同时制定的。因此，平常我们所说的&#8220;字符集&#8221;，比
如：GB2312, GBK, JIS 等，除了有&#8220;字符的集合&#8221;这层含义外，同时也包含了&#8220;编码&#8221;的含义。</p>
<p>&#8220;<strong>UNICODE 字符集</strong>&#8221;包含了各种语言中使用到的所有&#8220;字符&#8221;。用来给 UNICODE
字符集编码的标准有很多种，比如：UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>1.4 常用的编码简介</h5>
<p>简单介绍一下常用的编码规则，为后边的章节做一个准备。在这里，我们根据编码规则的特点，把所有的编码分成三类：</p>
<table border="0" cellpadding="3" cellspacing="0">
    <tbody>
        <tr>
            <td align="center"><strong>分类</strong></td>
            <td align="center"><strong>编码标准</strong></td>
            <td align="center"><strong>说明</strong></td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">单字节字符编码</td>
            <td>ISO-8859-1</td>
            <td>最简单的编码规则，每一个字节直接作为一个 UNICODE
            字符。比如，[0xD6, 0xD0] 这两个字节，通过 iso-8859-1 转化为字符串时，将直接得到 [0x00D6, 0x00D0] 两个
            UNICODE 字符，即 "&#214;&#208;"。<br />
            <br />
            反之，将 UNICODE 字符串通过 iso-8859-1 转化为字节串时，只能正常转化 0~255
            范围的字符。</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">ANSI 编码</td>
            <td>GB2312,<br />
            BIG5,<br />
            Shift_JIS,<br />
            ISO-8859-2 &#8230;&#8230;</td>
            <td>把 UNICODE 字符串通过 ANSI
            编码转化为&#8220;字节串&#8221;时，根据各自编码的规定，一个 UNICODE 字符可能转化成一个字节或多个字节。<br />
            <br />
            反之，将字节串转化成字符串时，也可能多个字节转化成一个字符。比如，[0xD6, 0xD0] 这两个字节，通过
            GB2312 转化为字符串时，将得到 [0x4E2D] 一个字符，即 '中' 字。<br />
            <br />
            &#8220;ANSI 编码&#8221;的特点：<br />
            1. 这些&#8220;ANSI 编码标准&#8221;都只能处理各自语言范围之内的 UNICODE 字符。<br />
            2. &#8220;UNICODE 字符&#8221;与&#8220;转换出来的字节&#8221;之间的关系是人为规定的。</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">UNICODE
            编码</td>
            <td>UTF-8,<br />
            UTF-16, UnicodeBig &#8230;&#8230;</td>
            <td>与&#8220;ANSI 编码&#8221;类似的，把字符串通过 UNICODE
            编码转化成&#8220;字节串&#8221;时，一个 UNICODE 字符可能转化成一个字节或多个字节。<br />
            <br />
            与&#8220;ANSI 编码&#8221;不同的是：<br />
            1. 这些&#8220;UNICODE 编码&#8221;能够处理所有的 UNICODE 字符。<br />
            2. &#8220;UNICODE 字符&#8221;与&#8220;转换出来的字节&#8221;之间是可以通过计算得到的。</td>
        </tr>
    </tbody>
</table>
<p>我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节，我们只需要知道&#8220;编码&#8221;的概念就是把&#8220;字符&#8221;转
化成&#8220;字节&#8221;就可以了。对于&#8220;UNICODE 编码&#8221;，由于它们是可以通过计算得到的，因此，在特殊的场合，我们可以去了解某一种&#8220;UNICODE
编码&#8221;是怎样的规则。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h4>2. 字符与编码在程序中的实现</h4>
<h5>2.1 程序中的字符与字节</h5>
<p>在 C++ 和 Java 中，用来代表&#8220;字符&#8221;和&#8220;字节&#8221;的数据类型，以及进行编码的方法：</p>
<table border="0" cellpadding="3" cellspacing="0">
    <tbody>
        <tr>
            <td align="center"><strong>类型或操作</strong></td>
            <td align="center"><strong>C++</strong></td>
            <td align="center"><strong>Java</strong></td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">字符</td>
            <td>wchar_t</td>
            <td>char</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">字节</td>
            <td>char</td>
            <td>byte</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">ANSI
            字符串</td>
            <td>char[]</td>
            <td>byte[]</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">UNICODE
            字符串</td>
            <td>wchar_t[]</td>
            <td>String</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">字节串&#8594;字符串</td>
            <td>mbstowcs(), MultiByteToWideChar()</td>
            <td>string = new String(bytes, "encoding")</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">字符串&#8594;字节串</td>
            <td>wcstombs(), WideCharToMultiByte()</td>
            <td>bytes = string.getBytes("encoding")</td>
        </tr>
    </tbody>
</table>
<p>以上需要注意几点：</p>
<ol>
    <li>Java 中的 char 代表一个&#8220;UNICODE 字符（宽字节字符）&#8221;，而 C++ 中的 char
    代表一个字节。</li>
    <li>MultiByteToWideChar() 和 WideCharToMultiByte() 是
    Windows API 函数。</li>
</ol>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>2.2 C++ 中相关实现方法</h5>
<p>声明一段字符串常量：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td>// ANSI 字符串，内容长度 7 字节<span><br />
            char</span>&nbsp;&nbsp;&nbsp;&nbsp; sz[20] = "中文123";<br />
            <br />
            // UNICODE 字符串，内容长度 5 个 wchar_t（10 字节）<br />
            wchar_t wsz[20] = L""x4E2D"x6587"x0031"x0032"x0033";</td>
        </tr>
    </tbody>
</table>
<p>UNICODE 字符串的 I/O 操作，字符与字节的转换操作：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td><span>// 运行时设定当前 ANSI 编码，VC
            格式<br />
            </span>setlocale(LC_ALL, ".936");<br />
            <br />
            // GCC 中格式<br />
            setlocale(LC_ALL, "zh_CN.GBK");<br />
            <br />
            <span>// Visual C++ 中使用小写 %s，按照 setlocale
            指定编码输出到文件<br />
            // GCC 中使用大写 %S</span><br />
            fwprintf(fp, L"%s"n", wsz);<br />
            <br />
            <span>// 把 UNICODE 字符串按照 setlocale
            指定的编码转换成字节</span><br />
            wcstombs(sz, wsz, 20);<span><br />
            // 把字节串按照 setlocale 指定的编码转换成 UNICODE 字符串<br />
            </span>mbstowcs(wsz, sz, 20);</td>
        </tr>
    </tbody>
</table>
<p>在 Visual C++ 中，UNICODE 字符串常量有更简单的表示方法。如果源程序的编码与当前默认 ANSI
编码不符，则需要使用 #pragma setlocale，告诉编译器源程序使用的编码：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td><span>// 如果源程序的编码与当前默认 ANSI
            编码不一致，<br />
            // 则需要此行，编译时用来指明当前源程序使用的编码</span><span><br />
            #pragma setlocale</span>(".936")<br />
            <br />
            // UNICODE 字符串常量，内容长度 10 字节<br />
            wchar_t wsz[20] = L"中文123";</td>
        </tr>
    </tbody>
</table>
<p>以上需要注意 #pragma setlocale 与 setlocale(LC_ALL, "")
的作用是不同的，#pragma setlocale 在编译时起作用，setlocale() 在运行时起作用。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>2.3 Java 中相关实现方法</h5>
<p>字符串类 String 中的内容是 UNICODE 字符串：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td>// Java 代码，直接写中文<span><br />
            String</span> string = "中文123";<br />
            <br />
            // 得到长度为 5，因为是 5 个字符<br />
            System.out.println(string.length());</td>
        </tr>
    </tbody>
</table>
<p>字符串 I/O 操作，字符与字节转换操作。在 Java 包 java.io.*
中，以&#8220;Stream&#8221;结尾的类一般是用来操作&#8220;字节串&#8221;的类，以&#8220;Reader&#8221;，&#8220;Writer&#8221;结尾的类一般是用来操作&#8220;字符串&#8221;的类。</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td><span>// 字符串与字节串间相互转化<br />
            <br />
            // 按照 GB2312 得到字节（得到多字节字符串）</span><span><br />
            byte</span> [] bytes = string.getBytes("GB2312");<br />
            <br />
            // 从字节按照 GB2312 得到 UNICODE 字符串<br />
            string = new String(bytes,
            "GB2312");<br />
            <br />
            <span>// 要将 String 按照某种编码写入文本文件，有两种方法：<br />
            <br />
            // 第一种办法：用 Stream 类写入已经按照指定编码转化好的字节串</span><br />
            OutputStream os = new
            FileOutputStream("1.txt");<br />
            os.write(bytes);<br />
            os.close();<br />
            <br />
            // 第二种办法：构造指定编码的 Writer 来写入字符串<br />
            Writer ow = new
            OutputStreamWriter(new FileOutputStream("2.txt"), "GB2312");<br />
            ow.write(string);<br />
            ow.close();<br />
            <br />
            /* 最后得到的 1.txt 和 2.txt 都是 7 个字节 */</td>
        </tr>
    </tbody>
</table>
<p>如果 java 的源程序编码与当前默认 ANSI 编码不符，则在编译的时候，需要指明一下源程序的编码。比如：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td>E:"&gt;javac <font color="#ff0000">-encoding
            BIG5</font> Hello.java</td>
        </tr>
    </tbody>
</table>
<p>以上需要注意区分源程序的编码与 I/O 操作的编码，前者是在编译时起作用，后者是在运行时起作用。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h4>3. 几种误解，以及乱码产生的原因和解决办法</h4>
<h5>3.1 容易产生的误解</h5>
<table border="0" cellpadding="3" cellspacing="0">
    <tbody>
        <tr>
            <td align="center"><strong>对编码的误解</strong></td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">误解一</td>
            <td>在将&#8220;字节串&#8221;转化成&#8220;UNICODE
            字符串&#8221;时，比如在读取文本文件时，或者通过网络传输文本时，容易将&#8220;字节串&#8221;简单地作为<strong>单字节字符串</strong>，采用每&#8220;一个字节&#8221;就是&#8220;一个字
            符&#8221;的方法进行转化。<br />
            <br />
            而实际上，在非英文的环境中，应该将&#8220;字节串&#8221;作为 ANSI 字符串，采用适当的编码来得到 UNICODE
            字符串，有可能&#8220;多个字节&#8221;才能得到&#8220;一个字符&#8221;。<br />
            <br />
            通常，一直在英文环境下做开发的程序员们，容易有这种误解。</td>
        </tr>
        <tr>
            <td align="center" nowrap="nowrap">误解二</td>
            <td>在 DOS，Windows 98 等非 UNICODE 环境下，字符串都是以
            ANSI 编码的字节形式存在的。这种以字节形式存在的字符串，必须知道是哪种编码才能被正确地使用。这使我们形成了一个惯性思维：&#8220;字符串的编码&#8221;。<br />
            <br />
            当 UNICODE 被支持后，Java 中的 String
            是以字符的&#8220;序号&#8221;来存储的，不是以&#8220;某种编码的字节&#8221;来存储的，因此已经不存在&#8220;字符串的编码&#8221;这个概念了。只有在&#8220;字符串&#8221;与&#8220;字节串&#8221;转化时，或
            者，将一个&#8220;字节串&#8221;当成一个 ANSI 字符串时，才有编码的概念。<br />
            <br />
            不少的人都有这个误解。</td>
        </tr>
    </tbody>
</table>
<p>第一种误解，往往是导致乱码产生的原因。第二种误解，往往导致本来容易纠正的乱码问题变得更复杂。</p>
<p>在这里，我们可以看到，其中所讲的&#8220;误解一&#8221;，即采用每&#8220;一个字节&#8221;就是&#8220;一个字符&#8221;的转化方法，实际上也就等同于采用
iso-8859-1 进行转化。因此，我们常常使用 bytes = string.getBytes("iso-8859-1")
来进行逆向操作，得到原始的&#8220;字节串&#8221;。然后再使用正确的 ANSI 编码，比如 string = new String(bytes,
"GB2312")，来得到正确的&#8220;UNICODE 字符串&#8221;。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>3.2 非 UNICODE 程序在不同语言环境间移植时的乱码</h5>
<p>非 UNICODE 程序中的字符串，都是以某种 ANSI
编码形式存在的。如果程序运行时的语言环境与开发时的语言环境不同，将会导致 ANSI 字符串的显示失败。</p>
<p>比如，在日文环境下开发的非 UNICODE
的日文程序界面，拿到中文环境下运行时，界面上将显示乱码。如果这个日文程序界面改为采用 UNICODE
来记录字符串，那么当在中文环境下运行时，界面上将可以显示正常的日文。</p>
<p>由于客观原因，有时候我们必须在中文操作系统下运行非 UNICODE
的日文软件，这时我们可以采用一些工具，比如，南极星，AppLocale 等，暂时的模拟不同的语言环境。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>3.3 网页提交字符串</h5>
<p>当页面中的表单提交字符串时，首先把字符串按照当前页面的编码，转化成字节串。然后再将每个字节转化成 "%XX"
的格式提交到 Web 服务器。比如，一个编码为 GB2312 的页面，提交 "中" 这个字符串时，提交给服务器的内容为 "%D6%D0"。</p>
<p>在服务器端，Web 服务器把收到的 "%D6%D0" 转化成 [0xD6, 0xD0] 两个字节，然后再根据
GB2312 编码规则得到 "中" 字。</p>
<p>在 Tomcat 服务器中，request.getParameter()
得到乱码时，常常是因为前面提到的&#8220;误解一&#8221;造成的。默认情况下，当提交 "%D6%D0" 给 Tomcat
服务器时，request.getParameter() 将返回 [0x00D6, 0x00D0] 两个 UNICODE 字符，而不是返回一个
"中" 字符。因此，我们需要使用 bytes = string.getBytes("iso-8859-1") 得到原始的字节串，再用
string
= new String(bytes, "GB2312") 重新得到正确的字符串 "中"。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>3.4 从数据库读取字符串</h5>
<p>通过数据库客户端（比如 ODBC 或 JDBC）从数据库服务器中读取字符串时，客户端需要从服务器获知所使用的
ANSI 编码。当数据库服务器发送字节流给客户端时，客户端负责将字节流按照正确的编码转化成 UNICODE 字符串。</p>
<p>如果从数据库读取字符串时得到乱码，而数据库中存放的数据又是正确的，那么往往还是因为前面提到的&#8220;误解一&#8221;造成的。解决
的办法还是通过 string = new String( string.getBytes("iso-8859-1"), "GB2312")
的方法，重新得到原始的字节串，再重新使用正确的编码转化成字符串。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h5>3.5 电子邮件中的字符串</h5>
<p>当一段 Text 或者 HTML 通过电子邮件传送时，发送的内容首先通过一种指定的<strong>字符编码</strong>转化成&#8220;字
节串&#8221;，然后再把&#8220;字节串&#8221;通过一种指定的<strong>传输编码</strong>（Content-Transfer-Encoding）进行转化得到另一串&#8220;字节
串&#8221;。比如，打开一封电子邮件源代码，可以看到类似的内容：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>Content-Type: text/plain;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">charset="gb2312"</font><br />
            <font color="#ff0000">Content-Transfer-Encoding: base64</font><br />
            <br />
            sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg==</td>
        </tr>
    </tbody>
</table>
<p>最常用的 Content-Transfer-Encoding 有 Base64 和
Quoted-Printable 两种。在对二进制文件或者中文文本进行转化时，Base64 得到的&#8220;字节串&#8221;比 Quoted-Printable
更短。在对英文文本进行转化时，Quoted-Printable 得到的&#8220;字节串&#8221;比 Base64 更短。</p>
<p>邮件的标题，用了一种更简短的格式来标注&#8220;字符编码&#8221;和&#8220;传输编码&#8221;。比如，标题内容为
"中"，则在邮件源代码中表示为：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>// 正确的标题格式<br />
            Subject: <span style="background-color: #ffff00;">=?</span>GB2312<span style="background-color: #ffff00;">?B?</span>1tA=<span style="background-color: #ffff00;">?=</span></td>
        </tr>
    </tbody>
</table>
<p>其中，</p>
<ul>
    <li>第一个&#8220;=?&#8221;与&#8220;?&#8221;中间的部分指定了字符编码，在这个例子中指定的是 GB2312。</li>
    <li>&#8220;?&#8221;与&#8220;?&#8221;中间的&#8220;B&#8221;代表 Base64。如果是&#8220;Q&#8221;则代表 Quoted-Printable。</li>
    <li>最后&#8220;?&#8221;与&#8220;?=&#8221;之间的部分，就是经过 GB2312 转化成字节串，再经过 Base64
    转化后的标题内容。</li>
</ul>
<p>如果&#8220;传输编码&#8221;改为 Quoted-Printable，同样，如果标题内容为 "中"：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>// 正确的标题格式<br />
            Subject: <span style="background-color: #ffff00;">=?</span>GB2312<span style="background-color: #ffff00;">?Q?</span>=D6=D0<span style="background-color: #ffff00;">?=</span></td>
        </tr>
    </tbody>
</table>
<p>如果阅读邮件时出现乱码，一般是因为&#8220;字符编码&#8221;或&#8220;传输编码&#8221;指定有误，或者是没有指定。比如，有的发邮件组件在发送邮
件时，标题 "中"：</p>
<table bgcolor="#eeeeee" border="1" cellpadding="6" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>// 错误的标题格式<br />
            Subject: <span style="background-color: #ffff00;">=?</span><font color="#ff0000">ISO-8859-1</font><span style="background-color: #ffff00;">?Q?</span>=D6=D0<span style="background-color: #ffff00;">?=</span></td>
        </tr>
    </tbody>
</table>
<p>这样的表示，实际上是明确指明了标题为 [0x00D6, 0x00D0]，即 "&#214;&#208;"，而不是 "中"。</p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img alt="" src="http://www.regexlab.com/images/blue_rule.gif" border="0" height="1" width="100%" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">
            <table cellpadding="0" cellspacing="0">
                <tbody>
                    <tr align="right">
                        <td>
                        <table border="0" cellpadding="0" cellspacing="0">
                            <tbody>
                                <tr>
                                    <td valign="middle"><img alt="" src="http://www.regexlab.com/images/u_bold.gif" border="0" height="16" width="16" /></td>
                                    <td align="right" valign="top">
                                    <p><a href="http://www.regexlab.com/zh/encoding.htm#main">回页首</a></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<h4>4. 几种错误理解的纠正</h4>
<h5>误解：&#8220;ISO-8859-1 是国际编码？&#8221;</h5>
<p>非也。iso-8859-1 只是单字节字符集中最简单的一种，也就是&#8220;字节编号&#8221;与&#8220;UNICODE
字符编号&#8221;一致的那种编码规则。当我们要把一个&#8220;字节串&#8221;转化成&#8220;字符串&#8221;，而又不知道它是哪一种 ANSI
编码时，先暂时地把&#8220;每一个字节&#8221;作为&#8220;一个字符&#8221;进行转化，不会造成信息丢失。然后再使用 bytes =
string.getBytes("iso-8859-1") 的方法可恢复到原始的字节串。</p>
<h5>误解：&#8220;Java 中，怎样知道某个字符串的内码？&#8221;</h5>
<p>Java 中，字符串类 java.lang.String 处理的是 UNICODE 字符串，不是 ANSI
字符串。我们只需要把字符串作为&#8220;抽象的符号的串&#8221;来看待。因此不存在字符串的内码的问题。</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/319769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2010-04-30 11:15 <a href="http://www.blogjava.net/caizh2009/archive/2010/04/30/319769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交换两个变量的值，不使用第三个变量</title><link>http://www.blogjava.net/caizh2009/archive/2009/12/02/304514.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 02 Dec 2009 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2009/12/02/304514.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/304514.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2009/12/02/304514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/304514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/304514.html</trackback:ping><description><![CDATA[<div class="contentLayout">
<div class="column_2 floatLeft">
<div class="components730 SinaAd_hide" id="advertise_top"></div>
<div class="components730">
<div class="component">
<div class="componentBar"><span class="floatRight articleFontSize" id="articleFontManage">字体大小：<a onclick="changeFontSize(2);return false;" href="">大</a><strong>中</strong><a onclick="changeFontSize(0);return false;" href="">小</a></span> <span class="title">正文</span> </div>
<div class="componentContent article">
<div class="comconblog">
<div class="articleTitle">
<div style="display: inline;"><strong id="t_4ed6fd3d0100f3d5">交换两个变量的值，不使用第三个变量</strong><span class="time">(2009-09-16 18:19:18)</span></div>
</div>
<div class="articleTag">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td>
            <script>
            var $tag='杂谈';
            var $tag_code='9f600dcf5ee9c5054770d84346587294';
            </script>
            标签：<a class="tag" href="http://uni.sina.com.cn/c.php?t=blog&amp;k=%D4%D3%CC%B8&amp;ts=bpost&amp;stype=tag" target="_blank">杂谈</a><wbr>&nbsp; </td>
            <td align="right" valign="top" width="250">分类：<a href="http://blog.sina.com.cn/s/articlelist_1322712381_2_1.html">计算机</a></td>
        </tr>
    </tbody>
</table>
</div>
<div class="articleContent" id="articleBody">
<div>&nbsp;<wbr></div>
<table style="table-layout: fixed; width: 100%;">
    <tbody>
        <tr>
            <td>
            <div>通常我们的做法是（尤其是在学习阶段）：定义一个新的变量，借助它完成交换。代码如下：<br />
            int a,b;<br />
            a=10; b=15;<br />
            int t;<br />
            t=a; a=b; b=t;<br />
            这种算法易于理解，特别适合帮助初学者了解计算机程序的特点，是赋值语句的经典应用。在实际软件开发当中，此算法简单明了，不会产生歧义，便于程序员之间的交流，一般情况下碰到交换变量值的问题，都应采用此算法（以下称为标准算法）。<br />
            <br />
            上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗？答案是肯定的！这里我们可以用三种算法来实现：1）算术运算；2）指针地址操作；3）位运算。<br />
            <br />
            1） 算术运算<br />
            简单来说，就是通过普通的+和-运算来实现。代码如下：<br />
            int a,b;<br />
            a=10;b=12;<br />
            a=b-a; //a=2;b=12<br />
            b=b-a; //a=2;b=10<br />
            a=b+a; //a=10;b=10<br />
            通过以上运算，a和b中的值就进行了交换。表面上看起来很简单，但是不容易想到，尤其是在习惯标准算法之后。<br />
            它的原理是：把a、b看做数轴上的点，围绕两点间的距离来进行计算。<br />
            具体过程：第一句&#8220;a=b-a&#8221;求出ab两点的距离，并且将其保存在a中；第二句&#8220;b=b-a&#8221;求出a到原点的距离（b到原点的距离与ab两点距离之差），并且将其保存在b中；第三句&#8220;a=b+a&#8221;求出b到原点的距离（a到原点距离与ab两点距离之和），并且将其保存在a中。完成交换。<br />
            此算法与标准算法相比，多了三个计算的过程，但是没有借助临时变量。（以下称为算术算法）<br />
            <br />
            2） 指针地址操作<br />
            因为对地址的操作实际上进行的是整数运算，比如：两个地址相减得到一个整数，表示两个变量在内存中的储存位置隔了多少个字节；地址和一个整数相加即&#8220;a+10&#8221;表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通过和算术算法类似的运算来完成地址的交换，从而达到交换变量的目的。即：<br />
            int *a,*b; //假设<br />
            *a=new int(10);<br />
            *b=new int(20); //&amp;a=0x00001000h,&amp;b=0x00001200h<br />
            a=(int*)(b-a); //&amp;a=0x00000200h,&amp;b=0x00001200h<br />
            b=(int*)(b-a); //&amp;a=0x00000200h,&amp;b=0x00001000h<br />
            a=(int*)(b+int(a)); //&amp;a=0x00001200h,&amp;b=0x00001000h<br />
            通过以上运算a、b的地址真的已经完成了交换，且a指向了原先b指向的值，b指向原先a指向的值了吗？上面的代码可以通过编译，但是执行结果却令人匪夷所思！原因何在？<br />
            首先必须了解，操作系统把内存分为几个区域：系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等。在编译源程序时，常量、全局变量等都放入全局数据区，局部变量、动态变量则放入堆栈区。这样当算法执行到&#8220;a=(int*)(b-a)&#8221;时，a的值并不是0x00000200h，而是要加上变量a所在内存区的基地址，实际的结果是：0x008f0200h，其中0x008f即为基地址，0200即为a在该内存区的位移。它是由编译器自动添加的。因此导致以后的地址计算均不正确，使得a,b指向所在区的其他内存单元。再次，地址运算不能出现负数，即当a的地址大于b的地址时，b-a&lt;0，系统自动采用补码的形式表示负的位移，由此会产生错误，导致与前面同样的结果。<br />
            有办法解决吗？当然！以下是改进的算法：<br />
            if(a&lt;b)<br />
            {<br />
            a=(int*)(b-a);<br />
            b=(int*)(b-(int(a)&amp;0x0000ffff));<br />
            a=(int*)(b+(int(a)&amp;0x0000ffff));<br />
            }<br />
            else<br />
            {<br />
            b=(int*)(a-b);<br />
            a=(int*)(a-(int(b)&amp;0x0000ffff));<br />
            b=(int*)(a+(int(b)&amp;0x0000ffff));<br />
            }<br />
            算法做的最大改进就是采用位运算中的与运算&#8220;int(a)&amp;0x0000ffff&#8221;，因为地址中高16位为段地址，后16位为位移地址，将它和0x0000ffff进行与运算后，段地址被屏蔽，只保留位移地址。这样就原始算法吻合，从而得到正确的结果。<br />
            此算法同样没有使用第三变量就完成了值的交换，与算术算法比较它显得不好理解，但是它有它的优点即在交换很大的数据类型时，它的执行速度比算术算法快。因为它交换的时地址，而变量值在内存中是没有移动过的。（以下称为地址算法）<br />
            <br />
            3） 位运算<br />
            通过异或运算也能实现变量的交换，这也许是最为神奇的，请看以下代码：<br />
            int a=10,b=12; //a=1010^b=1100;<br />
            a=a^b; //a=0110^b=1100;<br />
            b=a^b; //a=0110^b=1010;<br />
            a=a^b; //a=1100=12;b=1010;<br />
            此算法能够实现是由异或运算的特点决定的，通过异或运算能够使数据中的某些位翻转，其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次，值不变。<br />
            即：a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。<br />
            <br />
            以上三个算法均实现了不借助其他变量来完成两个变量值的交换，相比较而言算术算法和位算法计算量相当，地址算法中计算较复杂，却可以很轻松的实现大类型（比如自定义的类或结构）的交换，而前两种只能进行整形数据的交换（理论上重载&#8220;^&#8221;运算符，也可以实现任意结构的交换）。<br />
            <br />
            介绍这三种算法并不是要应用到实践当中，而是为了探讨技术，展示程序设计的魅力。从中可以看出，数学中的小技巧对程序设计而言具有相当的影响力，运用得当会有意想不到的神奇效果。而从实际的软件开发看，标准算法无疑是最好的，能够解决任意类型的交换问题</div>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/304514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-12-02 14:55 <a href="http://www.blogjava.net/caizh2009/archive/2009/12/02/304514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 书籍比较全的网站 http://ajava.org/book/</title><link>http://www.blogjava.net/caizh2009/archive/2009/09/02/293611.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 02 Sep 2009 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2009/09/02/293611.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/293611.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2009/09/02/293611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/293611.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/293611.html</trackback:ping><description><![CDATA[JAVA 书籍比较全的网站 http://ajava.org/book/
<img src ="http://www.blogjava.net/caizh2009/aggbug/293611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-09-02 16:20 <a href="http://www.blogjava.net/caizh2009/archive/2009/09/02/293611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主题：多线程断点续传实践</title><link>http://www.blogjava.net/caizh2009/archive/2009/07/17/287207.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Fri, 17 Jul 2009 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/archive/2009/07/17/287207.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/287207.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/archive/2009/07/17/287207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/287207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/287207.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这个程序的功能，就是可以分多个线程从目标地址上下载数据，每个线程负责下载一部分，并可以支持断点续传和超时重连。 下载的方法是download()，它接收两个参数，分别是要下载的页面的url和编码方式。在这个负责下载的方法中，主要分了三个步骤。第一步是用来设置断点续传时候的一些信息的，第二步就是主要的分多线程来下载了，最后是数据的合并。 1、多线程下载： Java代码...&nbsp;&nbsp;<a href='http://www.blogjava.net/caizh2009/archive/2009/07/17/287207.html'>阅读全文</a><img src ="http://www.blogjava.net/caizh2009/aggbug/287207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-07-17 22:12 <a href="http://www.blogjava.net/caizh2009/archive/2009/07/17/287207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>