﻿<?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-执着的笨蛋-随笔分类-j2se</title><link>http://www.blogjava.net/lcs/category/26133.html</link><description>黑暗的SH！灰暗的人生！</description><language>zh-cn</language><lastBuildDate>Mon, 21 Apr 2008 12:37:30 GMT</lastBuildDate><pubDate>Mon, 21 Apr 2008 12:37:30 GMT</pubDate><ttl>60</ttl><item><title>Ant入门教程</title><link>http://www.blogjava.net/lcs/archive/2008/04/21/194534.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 21 Apr 2008 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/21/194534.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/194534.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/21/194534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/194534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/194534.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td valign="top" width="358">
            <div style="text-indent: 21pt">本内容包含了Ant的历史简要介绍，Ant的功能以及Ant框架的介绍，并对下载安装使用Ant进行了示例介绍，同时通过一个Java程序讲解了Ant的基本使用方法。<br />
            <br />
            <br />
            </div>
            <div style="margin-left: 21pt; text-indent: -21pt"><span class="STYLE1"><strong>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong>Ant简介：这里引用Ant帮助文档中对Ant</strong><strong>的介绍：</strong></span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt"><br />
            &nbsp;&nbsp;&nbsp;&nbsp; Apache Ant是一个基于Java的构建工具。从理论上讲，也是一种类似于Make的工具，只是去除了Make工具的缺点。</div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;既然已经有了make, gnumake, nmake, jam以及其他的构件工具，为什么还要Ant呢？因为Ant的早期开发者发现所有以上这些工具都或多或少的有一些局限性，使得在跨平台开发软件成为困难。类似于Make的工具都是传统的基于Shell的--首先进行依赖性检查，然后执行命令。这意味着你可以轻易的通过使用或者编写程序来扩展这些工具，以满足不同的平台。当然，这也意味着你将局限于特定的平台，至少可以说局限于特定类型的平台，例如：Unix平台。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt"></div>
            </td>
        </tr>
        <tr>
            <td colspan="2" height="20">
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt">
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;同时，Make文件也有一些先天的缺陷。好多人都会遇到恐怖的tab问题。Ant的最初开发者多次说&#8220;我的命令不能执行因为我在tab前面加了一个空格！&#8221;。一些工具如Jam一定程序上解决了这个问题，但仍有其它的格式问题。<br />
            <br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;Ant与从基于命令的那些扩展开来的那些工具不同，Ant是由java类扩展的。不用编写shell命令，而是配置基于XML的文件，形成多个任务的目标配置树。每一个任务都是通过一个实现了一个规定接口的java类来运行的。</div>
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;ant缺少了一些直接执行shell命令的能力，如find . -name foo -exec rm {}，但它给用户提供了跨平台的能力，可以在任何地方工作。实际上，Ant也提供了命令execute用来执行shell命令,这就是它的任务，它允许执行基于操作系统的命令。<br />
            <br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 0cm"><span style="font-size: 10.5pt">&nbsp;&nbsp;&nbsp;&nbsp;</span>简单的说，Ant是一个基于Java，并且主要用于Java工程的构建工具。Ant本意是Another Neat Tool,也就是另一种整洁的工具，取首字符就是Ant。<br />
            <br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 0cm">构建工具就是为了减少重复工作而产生的。<br />
            <br />
            <br />
            </div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt"><span style="color: #0000ff"><strong><span style="font-size: 10.5pt">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ant的一些核心概念：</span></strong></span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">XML:</span><span style="font-size: 10.5pt">构建文件是以</span><span style="font-size: 10.5pt">XML</span><span style="font-size: 10.5pt">文件来描述的，采用</span><span style="font-size: 10.5pt">XML</span><span style="font-size: 10.5pt">格式有很多好处。这里就不一一列举。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt">陈述式语法：构建文件短小精悍，且易于理解。</div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">每个构建文件包含一个工程</span><span style="font-size: 10.5pt">(project)</span><span style="font-size: 10.5pt">。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">每个工程包含若干个目标</span><span style="font-size: 10.5pt">(target)</span><span style="font-size: 10.5pt">。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">目标可以依赖于其他的目标</span><span style="font-size: 10.5pt">(depends)</span><span style="font-size: 10.5pt">。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">目标包含任务</span><span style="font-size: 10.5pt">(task)</span><span style="font-size: 10.5pt">。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">易于使用</span><span style="font-size: 10.5pt">Java</span><span style="font-size: 10.5pt">语言增加新的任务</span><span style="font-size: 10.5pt">---</span><span style="font-size: 10.5pt">易于扩展（自定义）。</span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt"><span class="STYLE1"><strong><span style="font-size: 10.5pt">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span style="font-size: 10.5pt">Ant</span></strong><strong><span style="font-size: 10.5pt">结构：</span></strong></span></div>
            <div style="margin-top: 0cm; margin-bottom: 0pt; margin-left: 21pt"><span style="font-size: 10.5pt">Ant</span><span style="font-size: 10.5pt">的结构如下图所示：</span></div>
            <div style="margin-top: 0cm; text-justify: inter-ideograph; margin-bottom: 0pt; margin-left: 0cm"><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/1dfd5fb0860e49caa4ac48253544cb79.png" /></div>
            <div style="margin-top: 0cm; text-justify: inter-ideograph; margin-bottom: 0pt; margin-left: 0cm"><span style="font-size: 10.5pt"><br />
            构建文件的概念视图：工程包含一个目标的集合。在每个目标里是任务的声明，它们是对</span><span style="font-size: 10.5pt">Ant</span><span style="font-size: 10.5pt">用于构建该目标的行为说明。目标生成一个依赖关系图表来声明该目标的依赖关系。当执行一个目标时，必须先执行它们依赖的目标。</span></div>
            <div style="margin-top: 0cm; text-justify: inter-ideograph; margin-bottom: 0pt; margin-left: 0cm">&nbsp;</div>
            <div style="margin-top: 0cm; text-justify: inter-ideograph; margin-bottom: 0pt; margin-left: 0cm"><strong><span style="font-size: 10.5pt"><span class="STYLE1">例子：一个典型的构建文件</span>：</span></strong></div>
            <div>&lt;?xml version="1.0" ?&gt;</div>
            <div>&lt;project name="OurProject" default="deploy"&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="init"&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="build/classes" /&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="dist" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="compile" depends="init" &gt;</div>
            <div style="text-indent: 21pt">&lt;javac srcdir="src" destdir="build/classes"/&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="doc" depends="init" &gt;</div>
            <div style="text-indent: 21pt">&lt;javadoc destdir="build/classes" sourcepath="src" packagenames="org.*" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="deploy" depends="compile,doc" &gt;</div>
            <div style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&lt;jar destfile="dist/project.jar" basedir="build/classes"/&gt; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ftp server="<span style="color: red">"</span> userid="<span style="color: red">"</span> password="<span style="color: red">"&gt;</span>
            <div style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset dir="dist"/&gt;</div>
            <div style="text-indent: 21pt">&lt;/ftp&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div>&lt;/project&gt;</div>
            <div>&nbsp;</div>
            <div><strong>该构建过程如下：</strong></div>
            <div>系统初始化1、编译&nbsp;&nbsp;2、生成JAVADOC&nbsp;&nbsp;&nbsp;4、打包&nbsp;&nbsp;5、上传到FTP，其中后两步结合到一起叫部署。</div>
            <div>&nbsp;</div>
            <div>执行时输出如下：</div>
            <div>&gt; ant -propertyfile ftp.properties</div>
            <div>Buildfile: build.xml</div>
            <div>init:</div>
            <div>[mkdir] Created dir: /home/ant/Projects/OurProject/build/classes</div>
            <div>[mkdir] Created dir: /home/ant/Projects/OurProject/dist</div>
            <div>compile:</div>
            <div>[javac] Compiling 1 source file to /home/ant/Projects/OurProject/build/</div>
            <div>classes</div>
            <div>doc:</div>
            <div>[javadoc] Generating Javadoc</div>
            <div>[javadoc] Javadoc execution</div>
            <div>[javadoc] Loading source files for package org.example.antbook.lesson1...</div>
            <div>[javadoc] Constructing Javadoc information...</div>
            <div>[javadoc] Building tree for all the packages and classes...</div>
            <div>[javadoc] Building index for all the packages and classes...</div>
            <div>[javadoc] Building index for all classes...</div>
            <div>deploy:</div>
            <div>[jar] Building jar: /home/ant/Projects/OurProject/dist/project.jar</div>
            <div>[ftp] sending files</div>
            <div>[ftp] 1 files sent</div>
            <div>BUILD SUCCESSFUL</div>
            <div>Total time: 5 seconds.</div>
            <div><br />
            在执行时使用命令行参数以传入一个属性文件，属性文件中包含连接FTP服务器使用的服务器名，用户名，用户密码来给<span style="color: red">特性使用。</span></div>
            <div>这个例子很好的展示了Ant的一些基本要素：目标依赖、特性的使用、编译、文档生成、JAR打包（tar,Zip,WAR,EAR等），最后是部署。</div>
            <div>&nbsp;</div>
            <div>Ant的简单任务(&lt;mkdir&gt;)都是由Java类库来实现相应的功能。而一些复杂的任务&lt;ftp&gt;、&lt;junit&gt;还需要第三方库的支持。</div>
            <div>&nbsp;</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;Ant的一个强大之处：它总能工作。只要正确的指定构建文件，Ant就能计算出目标的依赖性，并且按照正确的顺序调用目标。目标通过任务按序执行，而任务自身处理其文件依赖性以及实际的操作来完成工作。因为每个任务通常都是在高层陈述，所以一两行XML语句经常就已经足够描述任务的内容。</div>
            <div>&nbsp;</div>
            <div style="margin-left: 21pt; text-indent: -21pt"><span class="STYLE1"><strong>4.&nbsp;&nbsp;&nbsp;</strong><strong>下载并安装</strong><strong>Ant</strong></span></div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用Ant前提条件，系统中已经安装JDK以及Ant。在文档编写之时，Ant的最新版本是Ant 1.7,但是为了稳定性，本文档使用版本为Ant 1.6.5.</div>
            <div>首先下载Ant，到apache软件网站<a href="http://www.apache.org/">http://www.apache.org/</a>。</div>
            <div>其次，解压缩文件，放到指定的系统目录中，例如C:\Ant。</div>
            <div>再次，将其添加到path，以便从命令行使用。(一些IDE，例如Eclipse可以不需要设置path,而通过IDE相关设置将Ant添加到path中。)</div>
            <div>再次，设置一些环境变量指向JDK以及ANT。</div>
            <div>最后，添加需要的可选库。</div>
            <div>&nbsp;</div>
            <div>在Windows安装过程（以笔者的安装过程为例）</div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;下载apache-ant-1.6.5-bin.zip到本地硬盘，解压缩之后将文件夹命名为Ant,放在C:\Ant中。这个目录就是Ant主目录。</div>
            <div>应该将主目录中的bin目录添加到path属性中，这样就可以在命令行中调用ant命令，ANT_HOME是批处理文件所在目录的上级目录。最好明确设定。</div>
            <div><span style="color: black">现在许多工具已经集成了特定版本的</span><span style="color: black">Ant</span><span style="color: black">，一些操作系统甚至默认的已经安装了</span><span style="color: black">Ant</span><span style="color: black">。所以，你的系统中可能已经安装了</span><span style="color: black">Ant</span><span style="color: black">。</span></div>
            <div>首先可以通过运行以下命令：<br />
            <strong>ant -version</strong><br />
            和<br />
            ant -diagnostics <br />
            来确定。我们推荐您不设置CLASSPATH来运行Ant命令。如果任何版本的Ant可以从CLASSPATH加载 ，这时就会由于加载了不兼容的类而产生许多错误。</div>
            <div>&nbsp;</div>
            <div>一些其他问题请参阅Ant的FAQ设置。</div>
            <div>正常情况下，执行ant ?Cversion即可显示Ant版本，则说明安装配制成功：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/ea29812585e24474a75be50e7407e4be.png" /></div>
            <div>&nbsp;</div>
            <div style="margin-left: 21pt; text-indent: -21pt"><strong>5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong>运行第一个构建文件：</strong></div>
            <div style="margin-left: 21pt">首先创建一个Java工程，名为AntProject，工程中源文件和目标文件是分开的，分别为文件夹src和bin,然后创建一个Java类文件，类名为</div>
            <div style="margin-left: 21pt">com.neusoft.test.AntTest，只是为了测试，所以类的内容很简单：</div>
            <div style="margin-left: 21pt">package com.neusoft.test;</div>
            <div style="margin-left: 21pt">/**</div>
            <div style="margin-left: 21pt">&nbsp;*This is just a test class.</div>
            <div style="margin-left: 21pt">&nbsp;*/</div>
            <div style="margin-left: 21pt">public class AntTest{</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args){</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;args.length;i++){</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(args[i]);</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
            <div style="margin-left: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
            <div style="margin-left: 21pt">}</div>
            <div style="margin-left: 21pt">&nbsp;</div>
            <div style="margin-left: 21pt"><strong>然后我们在工程的路径下面建立一个构建文件</strong><strong>build.xml</strong><strong>，内容如下：</strong></div>
            <div>&lt;?xml version="1.0" ?&gt;</div>
            <div>&lt;project name="structured" default="archive" &gt;</div>
            <div style="text-indent: 21pt">&lt;target name="init"&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="build/classes" /&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="dist" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="compile" depends="init" &gt;</div>
            <div style="text-indent: 21pt">&nbsp;&nbsp;&lt;javac srcdir="src" destdir="build/classes"/&gt;</div>
            <div style="text-indent: 21pt"></div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="archive" depends="compile" &gt;</div>
            <div style="text-indent: 21pt">&lt;jar destfile="dist/project.jar"</div>
            <div style="text-indent: 21pt">basedir="build/classes" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div style="text-indent: 21pt">&lt;target name="clean" depends="init"&gt;</div>
            <div style="text-indent: 21pt">&lt;delete dir="build" /&gt;</div>
            <div style="text-indent: 21pt">&lt;delete dir="dist" /&gt;</div>
            <div style="text-indent: 21pt">&lt;/target&gt;</div>
            <div>&lt;/project&gt;<br />
            </div>
            <div>构建文件说明如下图：</div>
            <div style="text-indent: 21pt"><img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/d13b06a92da34475a024ee7923683186.png" /></div>
            <div><br />
            <br />
            关于XML的知识，请参考其他书籍，这里不做介绍。</div>
            <div>以上创建完成后，目录结构如下图：<br />
            <br />
            </div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/18957dabfc4747ea9fa861b1101371af.png" /></div>
            <div>&nbsp;<br />
            </div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ant构建文件总是有一个&lt;project&gt;元素做为根元素，它有两个属性，name和default，&lt;target&gt;元素是&lt;project&gt;元素的子元素，可以有多个，它有两个属性，name和depends，&lt;target&gt;元素包含的元素就是一些任务元素。<br />
            <br />
            </div>
            <div>&lt;target&gt;可以由命令行进行显示的调用，也可以在内部使用如可以直接调用ant init、ant compile等。如果不写参数，则默认的build文件是build.xml，默认的目标是&lt;project&gt;的default属性定义的目标。目标的名称是唯一的，可以是任意字符串。</div>
            <div>&nbsp;</div>
            <div>下面我们先运行一下这个Ant构建，再讲解其他的内容，进入工程目录，执行</div>
            <div>ant</div>
            <div>这里就相当于执行默认的目标，也就是&lt;project name="structured" default="archive" &gt;中的archive目标。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/bf58caa3631043c9934e37a8c6842cd3.png" /></div>
            <div>&nbsp;</div>
            <div>这里说明了首先初始化创建两个目录，然后编译了一个JAVA文件，然后进行了打包的操作。</div>
            <div>&nbsp;</div>
            <div><strong>这里讲解一下如果构建失败了怎么办？</strong></div>
            <div>首先有可能是XML语法书写不正确(将&lt;target&gt;写成&lt;targe&gt;)，或者在任务执行过程中出现了错误(.java文件中包含编译错误)，或者任务名称书写错误(将&lt;javac&gt;写成&lt;javacc&gt;)等等，这些都不是Ant的错误，不需要填写Bug Report。写XML时一定要细心，一些IDE已经有验证功能，可以很好的防止书写的错误。</div>
            <div>&nbsp;</div>
            <div><strong>出现错误时，可以使用</strong></div>
            <div>ant ?Cverbose</div>
            <div>或者</div>
            <div>ant ?Cdebug来获取更加详细的构建信息，以解决问题。</div>
            <div>下图是使用ant ?Cverbose时的输出，使用ant ?Cdebug将获取比这更详细的信息，这里就不举例了。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/457f2ee754f04d1380a08a6bc45e55b9.png" /></div>
            <div>&nbsp;</div>
            <div>本例中直接使用了软件工程中的构建结构，使用src作为源文件目录，build/class作为中间生成文件，以dist作为可发布文件。在最后把一些可执行文件可以放在bin目录中。此时目录结构如下图所示：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/3112c28771af45a3be22d7e26e77836d.png" /></div>
            <div>&nbsp;</div>
            <div>我们需要一种办法来确定某些任务先执行，而有些任务后执行，比如必须先编译，才能执行程序或者打包。我们在声明目标的时候，就在其依赖属性中列出其依赖关系：</div>
            <div>&lt;target name="compile" depends="init" &gt;</div>
            <div>&lt;target name="archive" depends="compile" &gt;</div>
            <div>&lt;target name="clean" depends="init"&gt;</div>
            <div>如果一个目标依赖与多个其他目标，需要将它们都写到依赖属性中，例如：</div>
            <div>depents=&#8221;compile,test&#8221;。在我们的构建中，archive依赖于init和compile，但是我们不需要去写，因为compile已经依赖于init了。即：Ant的依赖关系是传递的，但不是自反的。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/ca47e0d3fd364097922f0f809a976277.png" /></div>
            <div><br />
            如果在执行过程中两个目标共享同一个目标，则先导目标只被执行一次。</div>
            <div>可以通过指定目标来运行构建：</div>
            <div>例如执行完ant后，可以执行ant clean来清理构建：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/19f835f2ad08455fa56fb807fa63c69e.png" /></div>
            <div>&nbsp;</div>
            <div>ant等价于ant archive</div>
            <div>ant init</div>
            <div>ant clean</div>
            <div>ant compile</div>
            <div>ant archive</div>
            <div>ant clean archive</div>
            <div>&nbsp;</div>
            <div><strong>当构建完成一次以后，再次执行构建会发生什么呢？</strong></div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/904f2e88b87947d09c5195ed45dbb523.png" /></div>
            <div>&nbsp;</div>
            <div>第二次执行构建时只花了2s，相比第一次的4s。并且没有任何一个目标表示做了任何工作。</div>
            <div>原因如下：所有的任务都检查了它们的依赖关系：</div>
            <div>&lt;mkdir&gt;没有创建目录因为已经存在</div>
            <div>&lt;javac&gt;比较了源文件和类文件的时间戳</div>
            <div>&lt;jar&gt;比较了要被加入文件与已经存在文件的时间</div>
            <div>只有更新的时候才进行任务执行。</div>
            <div>&nbsp;</div>
            <div><strong>Ant</strong><strong>如何处理命令行上的多个目标？</strong></div>
            <div>执行ant compile archive会怎么样？</div>
            <div>先实验一下：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/b563e0adc32748f1a08f9ba0f2fb4667.png" /></div>
            <div>&nbsp;</div>
            <div>Ant依次执行每个目标和其依赖目标，即Ant的执行顺序是init compile init compile archive，虽然这样看起来增加了额外的工作，但是通过上面的执行过程就会发现，由于其依赖性检查的阻止，第二次的init和compile并未真正的执行，执行时间与直接执行archive的时间是一样的。</div>
            <div>&nbsp;</div>
            <div><strong>运行程序：</strong></div>
            <div>普通执行该类的方法是：</div>
            <div>java ?Ccp build/class com.neusoft.test.AntTest args1 args2</div>
            <div>而我们使用Ant的任务来执行它仅仅需要增加一个任务，好处在于：</div>
            <div style="text-indent: 21pt">让用于执行的目标依赖与编译的目标，确保运行最新版本</div>
            <div style="text-indent: 21pt">易于传递复杂参数</div>
            <div style="text-indent: 21pt">设置classpath更方便</div>
            <div style="text-indent: 21pt">在Ant自身的JVM中运行，载入更快</div>
            <div style="text-indent: 21pt"></div>
            <div>增加一个新的目标：</div>
            <div>&lt;target name="execute" depends="compile"&gt;</div>
            <div style="text-indent: 10.5pt">&lt;java classname="com.neusoft.test.AntTest"</div>
            <div style="text-indent: 10.5pt">classpath="build/classes"&gt;</div>
            <div style="text-indent: 10.5pt">&lt;arg value="a"/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;arg value="b"/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;arg file="."/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/java&gt;</div>
            <div>&lt;/target&gt;</div>
            <div>&nbsp;</div>
            <div>最后一个参数是file=&#8221;.&#8221;，表示传入的参数是一个目录，为文件绝对路径。</div>
            <div>运行该目标，输出如下：</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/8c8d4063542a498a9ef5d88fd5867661.png" /></div>
            <div>&nbsp;</div>
            <div>Ant命令行选项：</div>
            <div><img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/a1affbf572d04d559f61b9df8722fd57.png" /></div>
            <div>&nbsp;</div>
            <div>请参阅相关手册进行查询相关选项的功能。</div>
            <div>&nbsp;</div>
            <div><strong>当有多个构建文件时，可以指定构建文件：</strong></div>
            <div>ant ?Cbuildfile build.xml compile</div>
            <div>来表示执行build.xml这个构建文件中的compile目标。</div>
            <div>&nbsp;</div>
            <div>控制提供的信息量：</div>
            <div>ant ?Cquiet:安静模式，不给出任何输出。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/e93c45b2b38f465783cc7dc668e69b4f.png" /></div>
            <div>&nbsp;</div>
            <div>ant ?Cemacs:简单模式，不显示任务名称。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/96fc30525694483ea06e5d2f3764bcae.png" /></div>
            <div>&nbsp;</div>
            <div>ant ?Cprojecthelp:获取项目信息。</div>
            <div><br />
            <img alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img1/52050191b8974e1e955de48d68730446.png" /></div>
            <div>&nbsp;</div>
            <div><strong>最终的构建文件，添加了</strong><strong>description</strong><strong>属性。</strong></div>
            <div>&lt;?xml version="1.0" ?&gt;</div>
            <div>&lt;project name="secondbuild" <strong>default="execute" </strong>&gt;</div>
            <div style="text-indent: 10.5pt"><strong>&lt;description&gt;Compiles and runs a simple program&lt;/description&gt;</strong></div>
            <div style="text-indent: 10.5pt">&lt;target name="init"&gt;</div>
            <div style="text-indent: 10.5pt">&lt;mkdir dir="build/classes" /&gt;</div>
            <div style="text-indent: 21pt">&lt;mkdir dir="dist" /&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div style="text-indent: 10.5pt">&lt;target name="compile" depends="init"</div>
            <div style="text-indent: 10.5pt"><strong>description="Compiles the source code"</strong>&gt;</div>
            <div style="text-indent: 10.5pt">&lt;javac srcdir="src" destdir="build/classes"/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div style="text-indent: 10.5pt">&lt;target name="archive" depends="compile"</div>
            <div style="text-indent: 10.5pt"><strong>description="Creates the JAR file"</strong>&gt;</div>
            <div style="text-indent: 10.5pt">&lt;jar destfile="dist/project.jar" basedir="build/classes"/&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div>&lt;target name="clean" depends="init"</div>
            <div style="text-indent: 10.5pt"><strong>description="Removes the temporary directories used"</strong>&gt;</div>
            <div style="text-indent: 10.5pt">&lt;delete dir="build" /&gt;</div>
            <div style="text-indent: 21pt">&lt;delete dir="dist" /&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div style="text-indent: 10.5pt">&lt;target name="execute" depends="compile"</div>
            <div><strong>description="Runs the program"</strong>&gt;</div>
            <div style="text-indent: 10.5pt"><strong>&lt;echo level="warning" message="running" /&gt;</strong></div>
            <div style="text-indent: 10.5pt">&lt;java classname="org.example.antbook.lesson1.Main"</div>
            <div style="text-indent: 21pt">classpath="build/classes"&gt;</div>
            <div style="text-indent: 10.5pt">&lt;arg value="a"/&gt;</div>
            <div style="text-indent: 21pt">&lt;arg value="b"/&gt;</div>
            <div>&lt;arg file="."/&gt;</div>
            <div>&lt;/java&gt;</div>
            <div style="text-indent: 10.5pt">&lt;/target&gt;</div>
            <div>
            <p>&lt;/project&gt;</p>
            <table width="673" border="0">
                <tbody>
                    <tr>
                        <td>
                        <div align="center"><script type="text/javascript"><!-- google_ad_client="pub-1832179689702023" ;
/* 728x90, 创建于 08-3-11 */ google_ad_slot="5833511817" ; google_ad_width="728;
google_ad_height" = 90;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script></div>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/lcs/aggbug/194534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-21 16:19 <a href="http://www.blogjava.net/lcs/archive/2008/04/21/194534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java加密解密</title><link>http://www.blogjava.net/lcs/archive/2008/04/14/192833.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 14 Apr 2008 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/14/192833.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/192833.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/14/192833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/192833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/192833.html</trackback:ping><description><![CDATA[代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.security.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.crypto.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_66_2690_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_2690_Open_Text.style.display='none'; Codehighlighter1_66_2690_Closed_Image.style.display='inline'; Codehighlighter1_66_2690_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_66_2690_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_66_2690_Closed_Text.style.display='none'; Codehighlighter1_66_2690_Open_Image.style.display='inline'; Codehighlighter1_66_2690_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Crypt&nbsp;</span><span id="Codehighlighter1_66_2690_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_66_2690_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;Algorithm</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">DES</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">定义&nbsp;加密算法,可用&nbsp;DES,DESede,Blowfish</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;debug&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_185_253_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_253_Open_Text.style.display='none'; Codehighlighter1_185_253_Closed_Image.style.display='inline'; Codehighlighter1_185_253_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_185_253_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_185_253_Closed_Text.style.display='none'; Codehighlighter1_185_253_Open_Image.style.display='inline'; Codehighlighter1_185_253_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span id="Codehighlighter1_185_253_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_185_253_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Security.addProvider(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;com.sun.crypto.provider.SunJCE());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">生成密钥,&nbsp;注意此步骤时间比较长</span><span style="color: #008000"><br />
<img id="Codehighlighter1_325_549_Open_Image" onclick="this.style.display='none'; Codehighlighter1_325_549_Open_Text.style.display='none'; Codehighlighter1_325_549_Closed_Image.style.display='inline'; Codehighlighter1_325_549_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_325_549_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_325_549_Closed_Text.style.display='none'; Codehighlighter1_325_549_Open_Image.style.display='inline'; Codehighlighter1_325_549_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;getKey()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_325_549_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_325_549_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;KeyGenerator&nbsp;keygen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;KeyGenerator.getInstance(Algorithm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;deskey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;keygen.generateKey();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">生成密钥:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(deskey.getEncoded()));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;deskey.getEncoded();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">加密</span><span style="color: #008000"><br />
<img id="Codehighlighter1_630_1067_Open_Image" onclick="this.style.display='none'; Codehighlighter1_630_1067_Open_Text.style.display='none'; Codehighlighter1_630_1067_Closed_Image.style.display='inline'; Codehighlighter1_630_1067_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_630_1067_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_630_1067_Closed_Text.style.display='none'; Codehighlighter1_630_1067_Open_Image.style.display='inline'; Codehighlighter1_630_1067_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;encode(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;input,</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;key)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_630_1067_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_630_1067_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;deskey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;javax.crypto.spec.SecretKeySpec(key,Algorithm);<br />
<img id="Codehighlighter1_721_837_Open_Image" onclick="this.style.display='none'; Codehighlighter1_721_837_Open_Text.style.display='none'; Codehighlighter1_721_837_Closed_Image.style.display='inline'; Codehighlighter1_721_837_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_721_837_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_721_837_Closed_Text.style.display='none'; Codehighlighter1_721_837_Open_Image.style.display='inline'; Codehighlighter1_721_837_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)</span><span id="Codehighlighter1_721_837_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_721_837_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">加密前的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">加密前的字符串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Cipher.getInstance(Algorithm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;c1.init(Cipher.ENCRYPT_MODE,deskey);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;cipherByte</span><span style="color: #000000">=</span><span style="color: #000000">c1.doFinal(input);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">加密后的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(cipherByte));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;cipherByte;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">解密</span><span style="color: #008000"><br />
<img id="Codehighlighter1_1148_1587_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1148_1587_Open_Text.style.display='none'; Codehighlighter1_1148_1587_Closed_Image.style.display='inline'; Codehighlighter1_1148_1587_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1148_1587_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1148_1587_Closed_Text.style.display='none'; Codehighlighter1_1148_1587_Open_Image.style.display='inline'; Codehighlighter1_1148_1587_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;decode(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;input,</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;key)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_1148_1587_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1148_1587_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;deskey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;javax.crypto.spec.SecretKeySpec(key,Algorithm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">解密前的信息:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Cipher.getInstance(Algorithm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;c1.init(Cipher.DECRYPT_MODE,deskey);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;clearByte</span><span style="color: #000000">=</span><span style="color: #000000">c1.doFinal(input);<br />
<img id="Codehighlighter1_1435_1561_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1435_1561_Open_Text.style.display='none'; Codehighlighter1_1435_1561_Closed_Image.style.display='inline'; Codehighlighter1_1435_1561_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1435_1561_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1435_1561_Closed_Text.style.display='none'; Codehighlighter1_1435_1561_Open_Image.style.display='inline'; Codehighlighter1_1435_1561_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)</span><span id="Codehighlighter1_1435_1561_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1435_1561_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">解密后的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(clearByte));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">解密后的字符串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(clearByte)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;clearByte;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">md5()信息摘要,&nbsp;不可逆</span><span style="color: #008000"><br />
<img id="Codehighlighter1_1666_2045_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1666_2045_Open_Text.style.display='none'; Codehighlighter1_1666_2045_Closed_Image.style.display='inline'; Codehighlighter1_1666_2045_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1666_2045_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1666_2045_Closed_Text.style.display='none'; Codehighlighter1_1666_2045_Open_Image.style.display='inline'; Codehighlighter1_1666_2045_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;md5(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;input)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_1666_2045_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1666_2045_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;java.security.MessageDigest&nbsp;alg</span><span style="color: #000000">=</span><span style="color: #000000">java.security.MessageDigest.getInstance(</span><span style="color: #000000">"</span><span style="color: #000000">MD5</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">or&nbsp;"SHA-1"</span><span style="color: #008000"><br />
<img id="Codehighlighter1_1779_1895_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1779_1895_Open_Text.style.display='none'; Codehighlighter1_1779_1895_Closed_Image.style.display='inline'; Codehighlighter1_1779_1895_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1779_1895_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1779_1895_Closed_Text.style.display='none'; Codehighlighter1_1779_1895_Open_Image.style.display='inline'; Codehighlighter1_1779_1895_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)</span><span id="Codehighlighter1_1779_1895_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1779_1895_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">摘要前的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">摘要前的字符串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(input));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;alg.update(input);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;digest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;alg.digest();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(debug)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">摘要后的二进串:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">byte2hex(digest));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;digest;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">字节码转换成16进制字符串</span><span style="color: #008000"><br />
<img id="Codehighlighter1_2108_2439_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2108_2439_Open_Text.style.display='none'; Codehighlighter1_2108_2439_Closed_Image.style.display='inline'; Codehighlighter1_2108_2439_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2108_2439_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2108_2439_Closed_Text.style.display='none'; Codehighlighter1_2108_2439_Open_Image.style.display='inline'; Codehighlighter1_2108_2439_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;byte2hex(</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;b)&nbsp;</span><span id="Codehighlighter1_2108_2439_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2108_2439_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;stmp</span><span style="color: #000000">=</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_2180_2368_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2180_2368_Open_Text.style.display='none'; Codehighlighter1_2180_2368_Closed_Image.style.display='inline'; Codehighlighter1_2180_2368_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2180_2368_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2180_2368_Closed_Text.style.display='none'; Codehighlighter1_2180_2368_Open_Image.style.display='inline'; Codehighlighter1_2180_2368_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;n</span><span style="color: #000000">&lt;</span><span style="color: #000000">b.length;n</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_2180_2368_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2180_2368_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmp</span><span style="color: #000000">=</span><span style="color: #000000">(java.lang.Integer.toHexString(b[n]&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0XFF</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(stmp.length()</span><span style="color: #000000">==</span><span style="color: #000000">1</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #000000">hs</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">stmp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #000000">hs</span><span style="color: #000000">+</span><span style="color: #000000">stmp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n</span><span style="color: #000000">&lt;</span><span style="color: #000000">b.length</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hs</span><span style="color: #000000">=</span><span style="color: #000000">hs</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("hs="+hs);</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;hs.toUpperCase();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_2499_2688_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2499_2688_Open_Text.style.display='none'; Codehighlighter1_2499_2688_Closed_Image.style.display='inline'; Codehighlighter1_2499_2688_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2499_2688_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2499_2688_Closed_Text.style.display='none'; Codehighlighter1_2499_2688_Open_Image.style.display='inline'; Codehighlighter1_2499_2688_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="Codehighlighter1_2499_2688_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2499_2688_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;debug&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;key&nbsp;=&nbsp;getKey();</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;key&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">好好学习</span><span style="color: #000000">"</span><span style="color: #000000">.getBytes();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;decode(encode(</span><span style="color: #000000">"</span><span style="color: #000000">测试加密</span><span style="color: #000000">"</span><span style="color: #000000">.getBytes(),key),key);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;md5("测试加密".getBytes());</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;md5(</span><span style="color: #000000">"</span><span style="color: #000000">A</span><span style="color: #000000">"</span><span style="color: #000000">.getBytes());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/lcs/aggbug/192833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-14 16:14 <a href="http://www.blogjava.net/lcs/archive/2008/04/14/192833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中&lt; E &gt;&lt; T &gt;&lt; ? &gt;&lt; A &gt;&lt; U &gt;这都是什么意思?</title><link>http://www.blogjava.net/lcs/archive/2008/04/08/191523.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Tue, 08 Apr 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/08/191523.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/191523.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/08/191523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/191523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/191523.html</trackback:ping><description><![CDATA[<p><font style="background-color: #dee0fe">从JDK5.0开始出现的泛型（Generics）功能。泛型提供编译时期的检查，不会将对象置于某个容器而失去其类型。 </font></p>
<p><font style="background-color: #dee0fe">http://www.onjava.com/pub/a/onjava/excerpt/javaian5_chap04/index.html<br />
<br />
这个是JDK&nbsp;&nbsp; 1.5&nbsp;&nbsp; 的新特性。<br />
举个例子。&nbsp;&nbsp;<br />
一个列表中加入3个数字，然后从列表中取出作合计的操作。 </font></p>
<p><font style="background-color: #dee0fe">JDK&nbsp;&nbsp; 1.4&nbsp;&nbsp; 的时候 <br />
List&nbsp;&nbsp; testList&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; ArrayList(); <br />
testList.add(new&nbsp;&nbsp; Integer(100)); <br />
testList.add(new&nbsp;&nbsp; Integer(200)); <br />
testList.add(new&nbsp;&nbsp; Integer(300)); <br />
int&nbsp;&nbsp; result&nbsp;&nbsp; =&nbsp;&nbsp; 0; <br />
for(int&nbsp;&nbsp; i&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; i&nbsp;&nbsp; &lt;&nbsp;&nbsp; testList.size();&nbsp;&nbsp; i&nbsp;&nbsp; ++)&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; 这里从列表中取数据时，需要强制转换。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result&nbsp;&nbsp; +=&nbsp;&nbsp; (Integer)testList.get(i).intValue(); <br />
} <br />
System.out.println(result); </font></p>
<p><font style="background-color: #dee0fe"><br />
JDK&nbsp;&nbsp; 1.5&nbsp;&nbsp; 的时候 <br />
List &lt;Integer&gt;&nbsp;&nbsp; testList&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; ArrayList &lt;Integer&gt; (); <br />
//&nbsp;&nbsp; 注意，JDK1.5的&nbsp;&nbsp; int&nbsp;&nbsp; 的&nbsp;&nbsp; 100，能够自动的转换成&nbsp;&nbsp; Integer&nbsp;&nbsp; 类型。不强制要求&nbsp;&nbsp; new&nbsp;&nbsp; Integer(100) <br />
testList.add(100); <br />
testList.add(200); <br />
testList.add(300); <br />
int&nbsp;&nbsp; result&nbsp;&nbsp; =&nbsp;&nbsp; 0; <br />
for(int&nbsp;&nbsp; i&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp; i&nbsp;&nbsp; &lt;&nbsp;&nbsp; testList.size();&nbsp;&nbsp; i&nbsp;&nbsp; ++)&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp; 这里从列表中取数据时，不需要强制转换。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result&nbsp;&nbsp; +=&nbsp;&nbsp; testList.get(i).intValue(); <br />
} <br />
System.out.println(result); </font></p>
 <img src ="http://www.blogjava.net/lcs/aggbug/191523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-08 16:07 <a href="http://www.blogjava.net/lcs/archive/2008/04/08/191523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit最佳实践</title><link>http://www.blogjava.net/lcs/archive/2008/03/31/189806.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 31 Mar 2008 08:38:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/31/189806.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/189806.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/31/189806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/189806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/189806.html</trackback:ping><description><![CDATA[<p><font style="background-color: #dee0fe">JUnit是什么？ </font></p>
<p><font style="background-color: #dee0fe">cherami</font></p>
<font style="background-color: #dee0fe">
<p><br />
JUnit是一个开发源代码的Java测试框架，用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例（用于java语言）。它包括以下特性：<br />
1、用于测试期望结果的断言（Assertion）<br />
2、用于共享共同测试数据的测试工具<br />
3、用于方便的组织和运行测试的测试套件<br />
4、图形和文本的测试运行器</p>
<p>JUnit最初是由Erich Gamma（GoF之一）和Kent Beck（xp和refactor的先驱之一）编写的. </p>
<p>需要说明的是junit一般是用来进行单元测试的，因此需要了解被测试代码的内部结构（即所谓的白盒测试），另外junit是在xp编程和重构（refactor）中被极力推荐使用的工具，因为在实现自动单元测试的情况下可以大大的提高开发的效率，但是实际上编写测试代码也是需要耗费很多的时间和精力的，那么使用这个东东好处到底在哪里呢？笔者认为是这样的：<br />
1、对于xp编程而言，要求在编写代码之前先写测试，这样可以强制你在写代码之前好好的思考代码（方法）的功能和逻辑，否则编写的代码很不稳定，那么你需要同时维护测试代码和实际代码，这个工作量就会大大增加。因此在xp编程中，基本过程是这样的：构思－》编写测试代码－》编写代码－》测试，而且编写测试和编写代码都是增量式的，写一点测一点，在编写以后的代码中如果发现问题可以较块的追踪到问题的原因，减小回归错误的纠错难度<br />
2、对于重构而言，其好处和xp编程中是类似的，因为重构也是要求改一点测一点，减少回归错误造成的时间消耗。<br />
3、对于非以上两种情况，我们在开发的时候使用junit写一些适当的测试也是有必要的，因为一般我们也是需要编写测试的代码的，可能原来不是使用的junit，如果使用junit，而且针对接口（方法）编写测试代码会减少以后的维护工作，例如以后对方法内部的修改（这个就是相当于重构的工作了）。另外就是因为junit有断言功能，如果测试结果不通过会告诉我们那个测试不通过，为什么，而如果是想以前的一般做法是写一些测试代码看其输出结果，然后再由自己来判断结果使用正确，使用junit的好处就是这个结果是否正确的判断是它来完成的，我们只需要看看它告诉我们结果是否正确就可以了，在一般情况下会大大提高效率。</p>
<p><br />
JUnit入门 </p>
<p>cherami 整理 </p>
<p><br />
安装JUnit</p>
<p>安装很简单，先到以下地址下载一个最新的zip包：<br />
http://download.sourceforge.net/junit/<br />
下载完以后解压缩到你喜欢的目录下，假设是JUNIT_HOME，然后将JUNIT_HOME下的junit.jar包加到你的系统的CLASSPATH环境变量中，对于IDE环境，对于需要用到的junit的项目增加到lib中，其设置不同的IDE有不同的设置，这里不多讲。</p>
<p><br />
如何使用JUnit写测试？</p>
<p>最简单的范例如下：<br />
1、创建一个TestCase的子类: <br />
package junitfaq;</p>
<p>import java.util.*;<br />
import junit.framework.*;</p>
<p>public class SimpleTest extends TestCase {</p>
<p>public SimpleTest(String name) {<br />
super(name);<br />
}</p>
<p><br />
2、写一个测试方法断言期望的结果：<br />
public void testEmptyCollection() {<br />
Collection collection = new ArrayList();<br />
assertTrue(collection.isEmpty());<br />
}<br />
注意：JUnit推荐的做法是以test作为待测试的方法的开头，这样这些方法可以被自动找到并被测试。</p>
<p>3、写一个suite()方法，它会使用反射动态的创建一个包含所有的testXxxx方法的测试套件：<br />
public static Test suite() {<br />
return new TestSuite(SimpleTest.class);<br />
}</p>
<p>4、写一个main()方法以文本运行器的方式方便的运行测试：<br />
public static void main(String args[]) {<br />
junit.textui.TestRunner.run(suite());<br />
}<br />
}</p>
<p>5、运行测试：<br />
以文本方式运行：<br />
java junitfaq.SimpleTest </p>
<p>通过的测试结果是：</p>
<p>.<br />
Time: 0</p>
<p>OK (1 tests)</p>
<p>Time上的小点表示测试个数，如果测试通过则显示OK。否则在小点的后边标上F，表示该测试失败。<br />
每次的测试结果都应该是OK的，这样才能说明测试是成功的，如果不成功就要马上根据提示信息进行修正了。<br />
如果JUnit报告了测试没有成功，它会区分失败（failures）和错误（errors）。失败是你的代码中的assert方法失败引起的；而错误则是代码异常引起的，例如ArrayIndexOutOfBoundsException。 </p>
<p><br />
以图形方式运行：</p>
<p>java junit.swingui.TestRunner junitfaq.SimpleTest </p>
<p>通过的测试结果在图形界面的绿色条部分。</p>
<p>&nbsp;</p>
<p>以上是最简单的测试样例，在实际的测试中我们测试某个类的功能是常常需要执行一些共同的操作，完成以后需要销毁所占用的资源（例如网络连接、数据库连接，关闭打开的文件等），TestCase类给我们提供了setUp方法和tearDown方法，setUp方法的内容在测试你编写的TestCase子类的每个testXxxx方法之前都会运行，而tearDown方法的内容在每个testXxxx方法结束以后都会执行。这个既共享了初始化代码，又消除了各个测试代码之间可能产生的相互影响。 </p>
<p>JUnit最佳实践 </p>
<p>&nbsp;</p>
<p>Martin Fowler说过：&#8220;当你试图打印输出一些信息或调试一个表达式时，写一些测试代码来替代那些传统的方法。&#8221;一开始，你会发现你总是要创建一些新的Fixture，而且测试似乎使你的编程速度慢了下来。然而不久之后，你会发现你重复使用相同的Fixture，而且新的测试通常只涉及添加一个新的测试方法。&nbsp; </p>
<p>你可能会写许多测试代码，但你很快就会发现你设想出的测试只有一小部分是真正有用的。你所需要的测试是那些会失败的测试，即那些你认为不会失败的测试，或你认为应该失败却成功的测试。 </p>
<p>我们前面提到过测试是一个不会中断的过程。一旦你有了一个测试，你就要一直确保其正常工作，以检验你所加入的新的工作代码。不要每隔几天或最后才运行测试，每天你都应该运行一下测试代码。这种投资很小，但可以确保你得到可以信赖的工作代码。你的返工率降低了，你会有更多的时间编写工作代码。 </p>
<p>不要认为压力大，就不写测试代码。相反编写测试代码会使你的压力逐渐减轻，应为通过编写测试代码，你对类的行为有了确切的认识。你会更快地编写出有效率地工作代码。</p>
<p>下面是一些具体的编写测试代码的技巧或较好的实践方法： </p>
<p>1. 不要用TestCase的构造函数初始化Fixture，而要用setUp()和tearDown()方法。 </p>
<p>2. 不要依赖或假定测试运行的顺序，因为JUnit利用Vector保存测试方法。所以不同的平台会按不同的顺序从Vector中取出测试方法。 </p>
<p>3. 避免编写有副作用的TestCase。例如：如果随后的测试依赖于某些特定的交易数据，就不要提交交易数据。简单的会滚就可以了。 </p>
<p>4. 当继承一个测试类时，记得调用父类的setUp()和tearDown()方法。 </p>
<p>5. 将测试代码和工作代码放在一起，一边同步编译和更新。（使用Ant中有支持junit的task.） </p>
<p>6. 测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。 </p>
<p>7. 确保测试与时间无关，不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。 </p>
<p>8. 如果你编写的软件面向国际市场，编写测试时要考虑国际化的因素。不要仅用母语的Locale进行测试。 </p>
<p>9. 尽可能地利用JUnit提供地assert/fail方法以及异常处理的方法，可以使代码更为简洁。<br />
&nbsp;<br />
10.测试要尽可能地小，执行速度快。</p>
<p><br />
JUnit和ant结合 </p>
<p>cherami 转贴</p>
<p><br />
ant 提供了两个 target ： junit 和 junitreport <br />
运行所有 测试用例 ，并生成 html 格式的报表 <br />
具体操作如下： </p>
<p>1.将 junit.jar 放在 ANT_HOME\lib 目录下 <br />
2.修改 build.xml ，加入如下 内容： </p>
<p><br />
&lt;property name="report" value="report" /&gt; &lt;target name="junitreport" depends="clean, compile"&gt; &lt;junit printsummary="on" fork="true" haltonfailure="false" failureproperty="tests.failed" showoutput="true"&gt; &lt;classpath refid="myclasspath"/&gt; &lt;formatter type="xml"/&gt; &lt;batchtest todir="${report}"&gt; &lt;fileset dir="${build}"&gt; &lt;include name="**/*Test.*"/&gt; &lt;/fileset&gt; &lt;/batchtest&gt; &lt;/junit&gt; &lt;junitreport todir="${report}"&gt; &lt;fileset dir="${report}"&gt; &lt;include name="TEST-*.xml"/&gt; &lt;/fileset&gt; &lt;report format="frames" todir="${report}"/&gt; &lt;/junitreport&gt; &lt;fail if="tests.failed"&gt; --------------------------------------------------------- One or more tests failed, check the report for detail... --------------------------------------------------------- &lt;/fail&gt; &lt;/target&gt; </p>
<p>运行 这个 target ，ant 会运行每个 TestCase <br />
在 report 目录下就有了 很多 TEST*.xml 和 一些网页 <br />
打开 report 目录下的 index.html 就可以看到很直观的测试运行报告，一目了然。 </p>
<p><br />
本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考：http://www.zxbc.cn/html/rjgc/1414044315681.htm</font></p>
<img src ="http://www.blogjava.net/lcs/aggbug/189806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-31 16:38 <a href="http://www.blogjava.net/lcs/archive/2008/03/31/189806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit best practice   </title><link>http://www.blogjava.net/lcs/archive/2008/03/31/189805.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 31 Mar 2008 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/31/189805.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/189805.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/31/189805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/189805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/189805.html</trackback:ping><description><![CDATA[这是一个学习英文的好机会！但只能看到这些，不知道是不是因为我不是会员！<br />
<font style="background-color: #dee0fe">转自：<a href="http://www.zxbc.cn/html/rjgc/1414044383648.htm">http://www.zxbc.cn/html/rjgc/1414044383648.htm</a></font><br />
<p><font style="background-color: #dee0fe">JUnit best practices <br />
JUnit 最佳实践</font></p>
<p><font style="background-color: #dee0fe">Techniques for building resilient, relocatable, multithreaded JUnit tests<br />
一项灵活的、可重定位的多线程JUnit测试技术 <br />
作者 Andy Schneider</font></p>
<p><font style="background-color: #dee0fe">译者 雷云飞 javawebstart Barret gstian [AKA]<br />
校对 gstian [AKA]</font></p>
<font style="background-color: #dee0fe">
<p><br />
Summary<br />
摘要 <br />
Extreme Programming's rise in popularity among the Java community has prompted more development teams to use JUnit: a simple test framework for building and executing unit tests. Like any toolkit, JUnit can be used effectively and ineffectively. In this article, Andy Schneider discusses good and bad ways to use JUnit and provides practical recommendations for its use by development teams. In addition, he explains simple mechanisms to support: <br />
Java社区里面流行的编程热的不断升温使越来越多的开发团队使用 JUnit进行测试。JUnit 是一种构造和进行单元测试的简便的测试框架。就象所有的工具包一样，JUnit 可以被高效的使用，也可以被低效的使用。在这篇文章种，Andy Schneider讨论了JUnit 的高效和低效的使用方法，并且为开发团队提供了实用的JUnit使用建议。另外，他提供了几种简单的机制来解释两种方法的差别: </p>
<p><br />
Automatic construction of composite tests <br />
组合测试的自动构件 <br />
Multithreaded test cases <br />
多线程测试用例 <br />
This article assumes some familiarity with JUnit. (4,000 words) <br />
阅读本篇文章，需要您对JUnit略知一二。 </p>
<p>&nbsp;</p>
<p>JUnit is a typical toolkit: if used with care and with recognition of its idiosyncrasies, JUnit will help to develop good, robust tests. Used blindly, it may produce a pile of spaghetti instead of a test suite. This article presents some guidelines that can help you avoid the pasta nightmare. The guidelines sometimes contradict themselves and each other -- this is deliberate. In my experience, there are rarely hard and fast rules in development, and guidelines that claim to be are misleading. <br />
JUnit是一个有特色的工具包：熟知它的特性的情况下并细心的使用，它在你开发优良的健壮的测试上市有帮助的。如果被盲目的使用，它可能就像一堆意大利面条，而不是测试集。本文给出了一些可以帮助你避免这些生面团恶梦的指导方针。这些指导方针有时看起来会相互矛盾————这是故意的。以我的经验，在开发中很少有硬性而方便的规则。任何声称是这种规则的指导方针都是误导。 </p>
<p>We'll also closely examine two useful additions to the developer's toolkit: <br />
我们同时还将深入检查开发者的工具包里的两个有用的附加物： </p>
<p><br />
A mechanism for automatically creating test suites from classfiles in part of a filesystem <br />
一种可以从部分文件系统里面自动创建测试集的机制 <br />
A new TestCase that better supports tests in multiple threads <br />
一种更好支持多线程的新测试用例。 <br />
When faced with unit testing, many teams end up producing some kind of testing framework. JUnit, available as open source, eliminates this onerous task by providing a ready-made framework for unit testing. JUnit, best used as an integral part of a development testing regime, provides a mechanism that developers can use to consistently write and execute tests. So, what are the JUnit best practices? <br />
当面对单元测试时，许多团队都会自己去完成某种测试框架。JUnit做为一种开放软件，通过为单元测试提供一种现成的测试框架，来消除这种繁重的任务。JUnit作为一个开发测试体制整体中的一部分给开发者提供了一种可以一致地编写和执行测试的机制。既然如此，那么，什么是JUnit的最佳实践？ </p>
<p>Do not use the test-case constructor to set up a test case <br />
不要使用测试用例构造器来创建一个测试用例</p>
<p>Setting up a test case in the constructor is not a good idea. Consider: <br />
使用构造器来建立一个测试用例并不是个好主意，例如： </p>
<p>public class SomeTest extends TestCase <br />
public SomeTest (String testName) { <br />
super (testName); <br />
// Perform test set-up <br />
} <br />
} </p>
<p><br />
Imagine that while performing the setup, the setup code throws an IllegalStateException. In response, JUnit would throw an AssertionFailedError, indicating that the test case could not be instantiated. Here is an example of the resulting stack trace: <br />
想象一下当执行安装时，代码抛出一个IllegalStateException异常。做为回应，JUnit也会抛出一个AssertionFailedError异常来指示测试用例无法实例化。下面是一个堆栈跟踪结果示例： </p>
<p>junit.framework.AssertionFailedError: Cannot instantiate test case: test1 at <br />
junit.framework.Assert.fail(Assert.java:143) at <br />
junit.framework.TestSuite$1.runTest(TestSuite.java:178) at <br />
junit.framework.TestCase.runBare(TestCase.java:129) at <br />
junit.framework.TestResult$1.protect(TestResult.java:100) at <br />
junit.framework.TestResult.runProtected(TestResult.java:117) at <br />
junit.framework.TestResult.run(TestResult.java:103) at <br />
junit.framework.TestCase.run(TestCase.java:120) at <br />
junit.framework.TestSuite.run(TestSuite.java, Compiled Code) at <br />
junit.ui.TestRunner$12.run(TestRunner.java:429) </p>
<p><br />
This stack trace proves rather uninformative; it only indicates that the test case could not be instantiated. It doesn't detail the original error's location or place of origin. This lack of information makes it hard to deduce the exception's underlying cause. <br />
这个堆栈跟踪没有提供多少有价值的信息。它只是表明测试用例不能被实例化。它并没有初始化时产生错误的错误位置和错误来源的详细信息。信息的缺乏使得推断该异常出现的原因变得困难。 </p>
<p>Instead of setting up the data in the constructor, perform test setup by overriding setUp(). Any exception thrown within setUp() is reported correctly. Compare this stack trace with the previous example: <br />
放弃在构造器中创建数据,通过重载setUp()来执行测试创建，。任何在setUp()中产生的异常都会被准确的报告。与前一个例子对照,比较下面的堆栈跟踪： </p>
<p>java.lang.IllegalStateException: Oops at bp.DTC.setUp(DTC.java:34) at <br />
junit.framework.TestCase.runBare(TestCase.java:127) at <br />
junit.framework.TestResult$1.protect(TestResult.java:100) at <br />
junit.framework.TestResult.runProtected(TestResult.java:117) at <br />
junit.framework.TestResult.run(TestResult.java:103) <br />
... </p>
<p><br />
This stack trace is much more informative; it shows which exception was thrown (IllegalStateException) and from where. That makes it far easier to explain the test setup's failure. <br />
这个堆栈跟踪含有更多的信息量。它表明了异常类型（IllegalStateException）， 以及产生位置。这使得可以更容易解释为何测试建立失败。 </p>
<p>Don't assume the order in which tests within a test case run <br />
不要推测一个测试用例运行中各测试的执行顺序</p>
<p>You should not assume that tests will be called in any particular order. Consider the following code segment: <br />
你不应该认为各测试用例会按照任何特定顺序被调用。考虑下面的代码片断： </p>
<p>public class SomeTestCase extends TestCase { <br />
public SomeTestCase (String testName) { <br />
super (testName); <br />
} <br />
public void testDoThisFirst () { <br />
... <br />
} <br />
public void testDoThisSecond () { <br />
} <br />
} </p>
<p><br />
In this example, it is not certain that JUnit will run these tests in any specific order when using reflection. Running the tests on different platforms and Java VMs may therefore yield different results, unless your tests are designed to run in any order. Avoiding temporal coupling will make the test case more robust, since changes in the order will not affect other tests. If the tests are coupled, the errors that result from a minor update may prove difficult to find. <br />
在这个例子中，当使用映射时，JUnit将按照何种顺序执行这些测试并不能确定。在不同的平台及Java VM上，可能产生不同的结果，除非你的测试被事先设计为按某种顺序执行。由于执行顺序的改变不会影响其它测试，避免这种短暂的耦合使得你的测试用例更加健壮。如果测试耦合在一起，由于一个小变动引起的错误也许会难于发现。 </p>
<p>In situations where ordering tests makes sense -- when it is more efficient for tests to operate on some shared data that establish a fresh state as each test runs -- use a static suite() method like this one to ensure the ordering: <br />
在某些情况下，测试的顺序还是有意义的————例如，测试们可以使用一些共享数据时来提高效率。这些共享数据对于每个测试运行时都会建立一个新的状态。————可以使用一个静态的 suite() 方法来保证执行顺序，如下： </p>
<p>public static Test suite() { <br />
suite.addTest(new SomeTestCase ("testDoThisFirst";)); <br />
suite.addTest(new SomeTestCase ("testDoThisSecond";)); <br />
return suite; <br />
} </p>
<p><br />
There is no guarantee in the JUnit API documentation as to the order your tests will be called in, because JUnit employs a Vector to store tests. However, you can expect the above tests to be executed in the order they were added to the test suite. <br />
在JUnit API 文档中并没有保证你的测试被调用的顺序，因为JUnit使用V一个区段来存放测试。 然而，你可以保证上面的测试按照它们被加入测试集的顺序被执行。 </p>
<p>Avoid writing test cases with side effects <br />
避免写带有副作用的测试用例 <br />
Test cases that have side effects exhibit two problems: <br />
带有副作用的测试用例会出现下面两个问题： </p>
<p><br />
They can affect data that other test cases rely upon <br />
它们会影响其他测试用例所依赖的数据 <br />
You cannot repeat tests without manual intervention <br />
你不能在没有手工干预的情况下重复测试 <br />
In the first situation, the individual test case may operate correctly. However, if incorporated into a TestSuite that runs every test case on the system, it may cause other test cases to fail. That failure mode can be difficult to diagnose, and the error may be located far from the test failure. <br />
在第一种情况下，独立的测试用例也许可以正确的执行，然而，当它们被置入一个执行 该系统中所有测试的测试集时，可能导致其他测试用例失败。但这种失败的做法很难 诊断出来，错误也许离失败的地方很远。 </p>
<p>In the second situation, a test case may have updated some system state so that it cannot run again without manual intervention, which may consist of deleting test data from the database (for example). Think carefully before introducing manual intervention. First, the manual intervention will need to be documented. Second, the tests could no longer be run in an unattended mode, removing your ability to run tests over</p>
<p><br />
本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考：http://www.zxbc.cn/html/rjgc/1414044383648.htm</font></p>
<img src ="http://www.blogjava.net/lcs/aggbug/189805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-31 16:36 <a href="http://www.blogjava.net/lcs/archive/2008/03/31/189805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Eclipse中建立自己的JUnit测试</title><link>http://www.blogjava.net/lcs/archive/2008/03/31/189799.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 31 Mar 2008 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/31/189799.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/189799.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/31/189799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/189799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/189799.html</trackback:ping><description><![CDATA[今天突然看到的，挺简单。<br />
可以不用管它使用的eclipse版本我用的3.1和他的也不一样但也调通了。<br />
&nbsp;TestThatWeGetHelloWorldPrompt.java源代码中的重载构造器是多余的，加上了不好用。 <br />
<br />
<br />
作者：<span>zhouyidingyan</span> 来源:CSDN<br />
转自：<font style="background-color: #dee0fe">http://www.builder.com.cn/2007/1220/687259.shtml<br />
<br />
</font><br />
<div class="artl_con">让我来提一个建议，在测试命名时：测试类的名字应该让人一眼就知道这是一个测试类，且能说明它要测试什么，注意是否和其他类重名。按照以上建议做，就很简单了，也不用担心名字太长或难听。<br />
<br />
　　即将在Eclipse中用JUnit工具创建我们第一个测试了。假设你已经下载了一个最新的Eclipse版本。如果还没有，你应该去官方站点http://www.eclipse.org下载。还需要JUnit，也可以从http://www.junit.org/下载。<br />
<br />
　　运行Eclipse。新建一个workplace项目，点击文件-&gt;新建-&gt;项目，选择Java项目，点击下一步。起一个项目名称，例如ProjectWithJUnit。点击完成。这样就完成新项目的建立了。再来配置一下Eclipse，在构建路径中添加JUnit类库。在工具条上点击项目-&gt;属性，选择Java构建路径，库，选择添加外部JAR，浏览Junit被存储的目录，选择junit.jar，点击打开。你将会看见JUnit出现在库的列表中。点击确定，让Eclipse重建路径。<br />
<br />
　　现在开发我们的&#8220;Hello World&#8221;例子。按照TDD的规则，应该在代码建立以前先把测试写好。为了能够在某出开始，我们假设未来的类名是HelloWorld，并且有一个方法Say()，这个方法返回String的值（例如&#8220;Hello World!&#8221;）。<br />
<br />
　　建立测试，在ProjectWithJUnit的标题上面点击右键，选择新建-&gt;其他，展开&#8220;Java&#8221;选项，选择JUnit。在右边的栏目对话框中选择测试案例，然后下一步。参考图1。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img alt="" hspace="3" src="http://www.yesky.com/image20010518/192393.gif" align="center" vspace="1" border="1" /><br />
            图1. 在Eclipse中建立JUnit测试<br />
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　在测试类这一栏中，写上将要被测试的类名HelloWorld。选择一个测试案例的名字，例如TestThatWeGetHelloWorldPrompt（是的，看上去很长，但是很清楚它的行为。）点击完成。<br />
<br />
　　TestThatWeGetHelloWorldPrompt的代码如下：<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>import junit.framework.TestCase;<br />
            <br />
            public class TestThatWeGetHelloWorldPrompt<br />
            extends TestCase {<br />
            　public TestThatWeGetHelloWorldPrompt(<br />
            　　String name) <br />
            　public void testSay() {<br />
            　　HelloWorld hi = new HelloWorld();<br />
            　　assertEquals("Hello World!", hi.say());<br />
            　}<br />
            　public static void main(String[] args) <br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　代码并不复杂；只是有点与众不同。然而，让我们考察一下细节。我们继承了JUnit的TestCase类，它在JUnit的javadocs定义为&#8220;运行众多测试的夹具。&#8221;JUnit也有TestSuite类，它是一组测试案例的集合，但在本文中不做讨论。<br />
<br />
　　建立测试案例的步骤如下：<br />
<br />
　　1、建立一个junit.framework.TestCase的实例。<br />
<br />
　　2、定义一些以&#8220;test&#8221;开头的无返回方法（例如testWasTransactionSuccessful()，testShow()，等等）。<br />
<br />
　　TestThatWeGetHelloWorldPrompt.java包含这些：TestCase的子类和一个叫做testSay()的方法。这个方法调用了assertEquals()函数，它用来比较我们预期的值和由say()返回的值。<br />
<br />
　　main()方法用来运行测试和显示输出的。JUnit的TestRunner处理测试，提供基于图像和文本的输出表现形式。我们使用基于文本的版本，因为Eclipse支持它，且也适合我们。当开始运行后，基于文本的版本测试会以文本形式输出，Eclipse会把这些输出自动变成图像界面的输出。<br />
<br />
　　按照TDD规范，首次运行测试，应该故意让它失败。点击运行-&gt;运行为-&gt;Junit测试（记住TestThatWeGetHelloWorldPrompt.java应该被突出的显示在包资源管理器中）。在左边窗口，应该看见JUnit窗口而不是包资源管理器，它显示一个红条，一次失败的测试，具体的失败原因参看图2。如果没有自动显示这些内容，点击JUnit标签（在底部的左边）。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img alt="" hspace="3" src="http://www.yesky.com/image20010518/192394.gif" align="center" vspace="1" border="1" /><br />
            图2. JUnit中失败的测试</div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　很好！但却失败了。现在我们来建立被测试代码：在包资源管理器窗口的ProjectWithJUnit标题上右击，选择新建-&gt;类。选择类名，我们已经假设了它叫HelloWorld，然后直接点击完成。为HelloWorld.java填入下列代码：<br />
<br />
<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public class HelloWorld {<br />
            　public String say() {<br />
            　　return("Hello World!");<br />
            　}<br />
            }</td>
        </tr>
    </tbody>
</table>
<br />
　　这段代码很简单，甚至不需要注解，我们再来看看结果。按照上面描述过的方式，在JUnit的窗口中显示了一个绿条，参看图3。绿条证明测试成功。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img alt="" hspace="3" src="http://www.yesky.com/image20010518/192397.gif" align="center" vspace="1" border="1" /><br />
            图3. JUnit中成功的测试</div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　现在，我们想再让测试失败一次，但原因不同。这有助于展示JUnit测试中不同的报错信息。修改assertEquals()代码，把&#8220;Hello World!&#8221;变成&#8220;Hello Me!&#8221;。当再次运行JUnit时，结果变成了红条，在JUnit窗口的底部输出了失败原因，参看图4。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img alt="" hspace="3" src="http://www.yesky.com/image20010518/192398.gif" align="center" vspace="1" border="1" /><br />
            图4. JUnit中的ComparisonError</div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　最后，我想说一下关于测试是开发过程中的必要部分的话题。测试代码一直是开发中的重要部分。经过近几年的发展，已得到了很大的提高，这要归功于强大的理论研究（比如&#8220;expectations-based development&#8221;等等），和快速发展的测试工具包，还有测试过程的改进。如果你对这篇文章感兴趣，那请你花一些时间来正式的学习一下测试理论吧，这对你的工作很有用。<br />
</div>
<img src ="http://www.blogjava.net/lcs/aggbug/189799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-31 16:22 <a href="http://www.blogjava.net/lcs/archive/2008/03/31/189799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>double精度小汇</title><link>http://www.blogjava.net/lcs/archive/2008/03/20/187475.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 20 Mar 2008 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/20/187475.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/187475.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/20/187475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/187475.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/187475.html</trackback:ping><description><![CDATA[代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.text.DecimalFormat;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.math.BigDecimal;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_86_874_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_874_Open_Text.style.display='none'; Codehighlighter1_86_874_Closed_Image.style.display='inline'; Codehighlighter1_86_874_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_86_874_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_86_874_Closed_Text.style.display='none'; Codehighlighter1_86_874_Open_Image.style.display='inline'; Codehighlighter1_86_874_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test_Double</span><span id="Codehighlighter1_86_874_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_86_874_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_127_872_Open_Image" onclick="this.style.display='none'; Codehighlighter1_127_872_Open_Text.style.display='none'; Codehighlighter1_127_872_Closed_Image.style.display='inline'; Codehighlighter1_127_872_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_127_872_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_127_872_Closed_Text.style.display='none'; Codehighlighter1_127_872_Open_Image.style.display='inline'; Codehighlighter1_127_872_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)</span><span id="Codehighlighter1_127_872_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_127_872_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">-----方法1--------四舍五入&nbsp;&nbsp;round对负数是五舍六入</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;d_1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">123.9</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">d_1&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Math.round(d_1));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">-------方法2------------------</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DecimalFormat&nbsp;decfmt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">##0.00</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(decfmt.format(</span><span style="color: #000000">1.33482222</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">--------方法3--------------</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1.33345</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.text.NumberFormat&nbsp;formate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;java.text.NumberFormat.getNumberInstance();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formate.setMaximumFractionDigits(</span><span style="color: #000000">3</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">设定小数最大为数&nbsp;&nbsp;&nbsp;，那么显示的最后会四舍五入的&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;formate.format(x);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(m);&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">--------方法4--------------</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;bd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(</span><span style="color: #000000">1.234543</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bd.setScale(</span><span style="color: #000000">3</span><span style="color: #000000">,BigDecimal.ROUND_HALF_EVEN);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bd.doubleValue();&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(d);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/lcs/aggbug/187475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-20 14:20 <a href="http://www.blogjava.net/lcs/archive/2008/03/20/187475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现精确的四舍五入[转]</title><link>http://www.blogjava.net/lcs/archive/2008/03/20/187473.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 20 Mar 2008 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/20/187473.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/187473.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/20/187473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/187473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/187473.html</trackback:ping><description><![CDATA[代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.math.BigDecimal;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_49_2303_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_2303_Open_Text.style.display='none'; Codehighlighter1_49_2303_Closed_Image.style.display='inline'; Codehighlighter1_49_2303_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_49_2303_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_49_2303_Closed_Text.style.display='none'; Codehighlighter1_49_2303_Open_Image.style.display='inline'; Codehighlighter1_49_2303_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Arith&nbsp;</span><span id="Codehighlighter1_49_2303_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_49_2303_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;DEF_DIV_SCALE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_117_122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_117_122_Open_Text.style.display='none'; Codehighlighter1_117_122_Closed_Image.style.display='inline'; Codehighlighter1_117_122_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_117_122_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_117_122_Closed_Text.style.display='none'; Codehighlighter1_117_122_Open_Image.style.display='inline'; Codehighlighter1_117_122_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Arith()&nbsp;</span><span id="Codehighlighter1_117_122_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_117_122_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_127_212_Open_Image" onclick="this.style.display='none'; Codehighlighter1_127_212_Open_Text.style.display='none'; Codehighlighter1_127_212_Closed_Image.style.display='inline'; Codehighlighter1_127_212_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_127_212_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_127_212_Closed_Text.style.display='none'; Codehighlighter1_127_212_Open_Image.style.display='inline'; Codehighlighter1_127_212_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_127_212_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_127_212_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;提供精确的加法运算。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v1&nbsp;被加数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v2&nbsp;加数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;两个参数的和<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_264_423_Open_Image" onclick="this.style.display='none'; Codehighlighter1_264_423_Open_Text.style.display='none'; Codehighlighter1_264_423_Closed_Image.style.display='inline'; Codehighlighter1_264_423_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_264_423_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_264_423_Closed_Text.style.display='none'; Codehighlighter1_264_423_Open_Image.style.display='inline'; Codehighlighter1_264_423_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;add(</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v1,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v2)&nbsp;</span><span id="Codehighlighter1_264_423_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_264_423_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v1));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v2));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b1.add(b2).doubleValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_428_513_Open_Image" onclick="this.style.display='none'; Codehighlighter1_428_513_Open_Text.style.display='none'; Codehighlighter1_428_513_Closed_Image.style.display='inline'; Codehighlighter1_428_513_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_428_513_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_428_513_Closed_Text.style.display='none'; Codehighlighter1_428_513_Open_Image.style.display='inline'; Codehighlighter1_428_513_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_428_513_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_428_513_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;提供精确的减法运算。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v1&nbsp;被减数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v2&nbsp;减数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;两个参数的差<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_565_729_Open_Image" onclick="this.style.display='none'; Codehighlighter1_565_729_Open_Text.style.display='none'; Codehighlighter1_565_729_Closed_Image.style.display='inline'; Codehighlighter1_565_729_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_565_729_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_565_729_Closed_Text.style.display='none'; Codehighlighter1_565_729_Open_Image.style.display='inline'; Codehighlighter1_565_729_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;sub(</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v1,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v2)&nbsp;</span><span id="Codehighlighter1_565_729_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_565_729_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v1));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v2));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b1.subtract(b2).doubleValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_734_819_Open_Image" onclick="this.style.display='none'; Codehighlighter1_734_819_Open_Text.style.display='none'; Codehighlighter1_734_819_Closed_Image.style.display='inline'; Codehighlighter1_734_819_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_734_819_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_734_819_Closed_Text.style.display='none'; Codehighlighter1_734_819_Open_Image.style.display='inline'; Codehighlighter1_734_819_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_734_819_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_734_819_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;提供精确的乘法运算。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v1&nbsp;被乘数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v2&nbsp;乘数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;两个参数的积<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_871_1035_Open_Image" onclick="this.style.display='none'; Codehighlighter1_871_1035_Open_Text.style.display='none'; Codehighlighter1_871_1035_Closed_Image.style.display='inline'; Codehighlighter1_871_1035_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_871_1035_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_871_1035_Closed_Text.style.display='none'; Codehighlighter1_871_1035_Open_Image.style.display='inline'; Codehighlighter1_871_1035_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;mul(</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v1,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v2)&nbsp;</span><span id="Codehighlighter1_871_1035_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_871_1035_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v1));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v2));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b1.multiply(b2).doubleValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1040_1169_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1040_1169_Open_Text.style.display='none'; Codehighlighter1_1040_1169_Closed_Image.style.display='inline'; Codehighlighter1_1040_1169_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1040_1169_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1040_1169_Closed_Text.style.display='none'; Codehighlighter1_1040_1169_Open_Image.style.display='inline'; Codehighlighter1_1040_1169_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_1040_1169_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_1040_1169_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;提供（相对）精确的除法运算，当发生除不尽的情况时，精确到<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;小数点以后10位，以后的数字四舍五入。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v1&nbsp;被除数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v2&nbsp;除数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;两个参数的商<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1221_1266_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1221_1266_Open_Text.style.display='none'; Codehighlighter1_1221_1266_Closed_Image.style.display='inline'; Codehighlighter1_1221_1266_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1221_1266_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1221_1266_Closed_Text.style.display='none'; Codehighlighter1_1221_1266_Open_Image.style.display='inline'; Codehighlighter1_1221_1266_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;div(</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v1,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v2)&nbsp;</span><span id="Codehighlighter1_1221_1266_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1221_1266_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;div(v1,&nbsp;v2,&nbsp;DEF_DIV_SCALE);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1271_1438_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1271_1438_Open_Text.style.display='none'; Codehighlighter1_1271_1438_Closed_Image.style.display='inline'; Codehighlighter1_1271_1438_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1271_1438_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1271_1438_Closed_Text.style.display='none'; Codehighlighter1_1271_1438_Open_Image.style.display='inline'; Codehighlighter1_1271_1438_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_1271_1438_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_1271_1438_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;定精度，以后的数字四舍五入。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v1&nbsp;被除数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v2&nbsp;除数<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;scale&nbsp;表示表示需要精确到小数点以后几位。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;两个参数的商<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1501_1827_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1501_1827_Open_Text.style.display='none'; Codehighlighter1_1501_1827_Closed_Image.style.display='inline'; Codehighlighter1_1501_1827_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1501_1827_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1501_1827_Closed_Text.style.display='none'; Codehighlighter1_1501_1827_Open_Image.style.display='inline'; Codehighlighter1_1501_1827_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;div(</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v1,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v2,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;scale)&nbsp;</span><span id="Codehighlighter1_1501_1827_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1501_1827_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1523_1632_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1523_1632_Open_Text.style.display='none'; Codehighlighter1_1523_1632_Closed_Image.style.display='inline'; Codehighlighter1_1523_1632_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1523_1632_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1523_1632_Closed_Text.style.display='none'; Codehighlighter1_1523_1632_Open_Image.style.display='inline'; Codehighlighter1_1523_1632_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(scale&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_1523_1632_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1523_1632_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IllegalArgumentException(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;scale&nbsp;must&nbsp;be&nbsp;a&nbsp;positive&nbsp;integer&nbsp;or&nbsp;zero</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v1));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v2));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b1.divide(b2,&nbsp;scale,&nbsp;BigDecimal.ROUND_HALF_UP).doubleValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1832_1938_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1832_1938_Open_Text.style.display='none'; Codehighlighter1_1832_1938_Closed_Image.style.display='inline'; Codehighlighter1_1832_1938_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1832_1938_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1832_1938_Closed_Text.style.display='none'; Codehighlighter1_1832_1938_Open_Image.style.display='inline'; Codehighlighter1_1832_1938_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span id="Codehighlighter1_1832_1938_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_1832_1938_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;提供精确的小数位四舍五入处理。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;v&nbsp;需要四舍五入的数字<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;scale&nbsp;小数点后保留几位<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;四舍五入后的结果<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1991_2300_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1991_2300_Open_Text.style.display='none'; Codehighlighter1_1991_2300_Closed_Image.style.display='inline'; Codehighlighter1_1991_2300_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1991_2300_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1991_2300_Closed_Text.style.display='none'; Codehighlighter1_1991_2300_Open_Image.style.display='inline'; Codehighlighter1_1991_2300_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;round(</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;v,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;scale)&nbsp;</span><span id="Codehighlighter1_1991_2300_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1991_2300_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_2013_2122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2013_2122_Open_Text.style.display='none'; Codehighlighter1_2013_2122_Closed_Image.style.display='inline'; Codehighlighter1_2013_2122_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2013_2122_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2013_2122_Closed_Text.style.display='none'; Codehighlighter1_2013_2122_Open_Image.style.display='inline'; Codehighlighter1_2013_2122_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(scale&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_2013_2122_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2013_2122_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IllegalArgumentException(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;scale&nbsp;must&nbsp;be&nbsp;a&nbsp;positive&nbsp;integer&nbsp;or&nbsp;zero</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(Double.toString(v));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;BigDecimal&nbsp;one&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b.divide(one,&nbsp;scale,&nbsp;BigDecimal.ROUND_HALF_UP).doubleValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/lcs/aggbug/187473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-20 14:12 <a href="http://www.blogjava.net/lcs/archive/2008/03/20/187473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]lucene简单实例&lt;一&gt;+&lt;二&gt;（2.0版）</title><link>http://www.blogjava.net/lcs/archive/2008/03/10/184982.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 10 Mar 2008 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/10/184982.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/184982.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/10/184982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/184982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/184982.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 搜索篇:lucene的简单实例&lt;一&gt;原文地址：http://www.javaeye.com/topic/39597说明一下,这一篇文章的用到的lucene,是用2.0版本的,主要在查询的时候2.0版本的lucene与以前的版本有了一些区别. 其实这一些代码都是早几个月写的,自己很懒,所以到今天才写到自己的博客上,高深的文章自己写不了，只能记录下一些简单的记录与点滴，其中...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2008/03/10/184982.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/184982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-10 11:04 <a href="http://www.blogjava.net/lcs/archive/2008/03/10/184982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Java中写文件的中文问题[转]</title><link>http://www.blogjava.net/lcs/archive/2008/02/14/179922.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 14 Feb 2008 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/02/14/179922.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/179922.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/02/14/179922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/179922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/179922.html</trackback:ping><description><![CDATA[<p>写出来的文件用浏览器打开后都是乱码。已经在XML的最前面加上了<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
而且浏览器的编码也是UTF-8的，这就排除了浏览器的问题。<br />
再用VIM打开，发现用GB2312看是没问题的，换成:set encoding=UTF-8以后开始乱码<br />
这时我尝试将字符串转码后写入文件，但在UTF-8，GBK和ISO8859_1中间怎么转也没有用。<br />
忽然想起前几天yiyayoyo同学和我提过Java写文件默认编码的问题，于是开始google，发现我用的写文件的方式无法指定编码，于是换用另一种写文件的方式指定UTF-8，遂搞定。代码如下：</p>
<p>老代码：<br />
PrintWriter pw = new PrintWriter(new FileWriter(path));<br />
pw.print(content);<br />
pw.close();</p>
<p>新代码：<br />
FileOutputStream fos = new FileOutputStream(path);<br />
Writer out = new OutputStreamWriter(fos, "UTF-8");<br />
out.write(content);<br />
out.close();<br />
fos.close();</p>
<p>顺便抱怨一句，Java中写文件的方式还真是多阿多&#8230;&#8230;我等一两年经验的小程序员看了都眼晕 </p>
<p>&nbsp;&nbsp; 库卡 说：<br />
&nbsp; 读代码也有编码的问题，如果要读取UTF-8的文件，应采用如下方式覆盖默认编码：<br />
&nbsp; FileInputStream fis = new FileInputStream(s);<br />
&nbsp; StringBuffer content = new StringBuffer();<br />
&nbsp; DataInputStream in = new DataInputStream(fis);<br />
&nbsp; BufferedReader d = new BufferedReader(new InputStreamReader(in, "UTF-8"));<br />
&nbsp; String line = null;<br />
&nbsp;&nbsp; while ((line = d.readLine()) != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content.append(line + "\n");<br />
&nbsp; d.close();<br />
&nbsp; in.close();<br />
&nbsp; fis.close();</p>
<img src ="http://www.blogjava.net/lcs/aggbug/179922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-02-14 14:20 <a href="http://www.blogjava.net/lcs/archive/2008/02/14/179922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[精华] md5算法的java源代码!</title><link>http://www.blogjava.net/lcs/archive/2008/02/13/179755.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 13 Feb 2008 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/02/13/179755.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/179755.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/02/13/179755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/179755.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/179755.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [精华] md5算法的java源代码!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2008/02/13/179755.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/179755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-02-13 11:16 <a href="http://www.blogjava.net/lcs/archive/2008/02/13/179755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 乱序（小汇）</title><link>http://www.blogjava.net/lcs/archive/2008/02/01/178801.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 01 Feb 2008 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/02/01/178801.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/178801.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/02/01/178801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/178801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/178801.html</trackback:ping><description><![CDATA[<p>/**<br />
&nbsp;*<br />
&nbsp;*问题或许可以是这样：产生m个随机正整数，要求范围是从1到n，平且它们互不相同。 <br />
问题或许可以这样解决： </p>
<p>假设我们已经有了经过排序的（升序），且满足要求的k个正整数，我们继续： <br />
1、在从1到n-k的区间范围内，产生一个随机的正整数i1； <br />
2、统计在已有序列中比i1小的数，将其个数加到i1上，得到i2；再统计从i1到i2数的个数，得到i3；一直循环，直到i不变为止。然后，把i插入已有的序列。这个过程相当于从头数出i1个空白，以此来保证新的数是随机的。 <br />
3、这时得到了k+1个满足要求的数，然后就循环吧。 <br />
上面的方法适用于n很大，但是m很小的时候。 </p>
<p>如果m和n都很大，并且希望一次性的产生，那么： <br />
1先产生有一定冗余的随机正整数，然后排序，然后去掉相同的数。 <br />
如果，产生了超额的数，可以将数列再打乱顺序，然后，取出符合规定的数目的数。 </p>
<p>当然，也可以两种方法相结合，就是： <br />
1、先产生超过需求的、有一定冗余的随机正整数，然后排序，然后去掉相同的数，并且保存下来。记录它的数目m1 &gt;m； <br />
2、当要用时，在产生一个从1到m的随机数j，然后取出数据库中第j个数，输出，并且把它从数据库中删除到。<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;*<br />
&nbsp;*数据有点大，用了128m <br />
start_1&nbsp;&nbsp; ();&nbsp;&nbsp; 是即时输出（因为用boolean数组，所以内存小得多） <br />
start_2&nbsp;&nbsp; ();&nbsp;&nbsp; 是把数据存进数组，以便再处理（需要内存很大，不赞成使用） <br />
如果要处理数据，可以用&nbsp;&nbsp; start_1&nbsp;&nbsp; ();&nbsp;&nbsp; 把数据保存进文件，再从文件中读取数据进行处理。 </p>
<p>&nbsp;*/<br />
public class Main{<br />
&nbsp;<br />
&nbsp;public final int n = 10000000;<br />
&nbsp;<br />
&nbsp;public Main () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start_1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //start_2 ();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void main (String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Main();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void start_1() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //布朗型默认为 false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean[] barr = new boolean[n];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Random r = new java.util.Random ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 0, x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int m = n;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(j &lt; m) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = r.nextInt (n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (! barr[x]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barr[x] = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void start_2() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //整型默认为 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] iarr = new int[n];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Random r = new java.util.Random ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 0, x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int m = n;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //少循环一次，因为要生成 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(j &lt; m-1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = r.nextInt (n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (iarr[x] == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iarr[x] = j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
/*<br />
&nbsp;*上面的算法，没有优化，生成数据耗时间。 <br />
下面的算法改进了一下。生成所有数据半分钟左右。 <br />
+---------- <br />
|&nbsp;&nbsp; 0...999999 <br />
|&nbsp;&nbsp; . <br />
|&nbsp;&nbsp; . <br />
|&nbsp;&nbsp; . <br />
|&nbsp;&nbsp; 99 </p>
<p>Java code <br />
public class Main {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Main () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start_1 ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start_2 ();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void main (String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Main ();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ** void start_1 () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; n; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte j = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(j &lt; m-1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = r.nextInt (m);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (barr_1[x] == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barr_1[x] = j;<br />
&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; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ** void start_2 () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(j &lt; n) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = r.nextInt (n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y = (int) barr_2[x];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (y &lt; m) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; barr_2[x]++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int z = ((int) barr_1[x][y]) * n;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println (x + z);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ** final int s = 10000*10000;<br />
&nbsp;&nbsp;&nbsp; ** final int m = 100;<br />
&nbsp;&nbsp;&nbsp; ** final int n = s/m;<br />
&nbsp;&nbsp;&nbsp; ** byte[][] barr_1 = new byte[n][m];<br />
&nbsp;&nbsp;&nbsp; ** byte[] barr_2 = new byte[n];<br />
&nbsp;&nbsp;&nbsp; ** java.util.Random r = new java.util.Random ();<br />
&nbsp;&nbsp;&nbsp; <br />
}<br />
*/</p>
<p>/*<br />
&nbsp;*和一位仁兄在另一个帖子争论中，受到启发。 <br />
终于悟出一种时间复杂度极低的算法。 <br />
（可以证明，任意一个数&nbsp;&nbsp; 在&nbsp;&nbsp; 任意位置的概率&nbsp;&nbsp; 都为&nbsp;&nbsp; 1/n） </p>
<p>因为内存不够，所以改成了7个9来算。总时间2秒 </p>
<p>Java code <br />
public class Main {<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Main () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start ();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void main (String args[]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Main ();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ** void start () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.util.Random r = new java.util.Random ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; n; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x = r.nextInt (i+1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iarr = iarr[x];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iarr[x] = i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int m = 10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; m; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print (iarr + " ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ** final int n = 1000*10000;<br />
&nbsp;&nbsp;&nbsp; ** int[] iarr = new int[n];<br />
&nbsp;&nbsp;&nbsp; <br />
}<br />
*/</p>
<img src ="http://www.blogjava.net/lcs/aggbug/178801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-02-01 11:20 <a href="http://www.blogjava.net/lcs/archive/2008/02/01/178801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>素数算法(小汇)</title><link>http://www.blogjava.net/lcs/archive/2008/02/01/178800.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 01 Feb 2008 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/02/01/178800.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/178800.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/02/01/178800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/178800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/178800.html</trackback:ping><description><![CDATA[<p>Java算法——判断素数 </p>
<p>public static boolean isPrimeNumber(int number){<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(number&lt;2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp; for(int i=2;i&lt;=Math.sqrt(number);i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(number%i==0&amp;&amp;number!=2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
&nbsp;} </p>
<p>素数算法（二）</p>
<p>上次讨论了简单的素数判定的算法，不过这个算法对于位数较大（一般小于108）的素数判定就显得相当力不从心了。比如在素数目前最广泛的应用领域-公共密钥体系中，一般选择的素数都是相当大的（通常在100位以上），如果采用上次的试除法来判定，那么可能要穷尽你一生的时间都还不够。所以在一般的应用领域，人们采用的是Rabin-Miller检验法。下面是该检验法的算法： </p>
<p>首先选择一个代测的随机数p，计算b，b是2整除p-1的次数。然后计算m，使得n=1+(2^b)m。</p>
<p>（1） 选择一个小于p的随机数a。<br />
（2） 设j=0且z=a^m mod p<br />
（3） 如果z=1或z=p-1，那麽p通过测试，可能使素数<br />
（4） 如果j&gt;0且z=1, 那麽p不是素数<br />
（5） 设j=j+1。如果j&lt;b且z&lt;&gt;p-1,设z=z^2 mod p，然后回到(4)。如果z=p-1，那麽p通过测试，可能为素数。<br />
（6） 如果j=b 且z&lt;&gt;p-1，不是素数</p>
<p>数a被当成证据的概率为75%。这意味着当迭代次数为t时，它产生一个假的素数所花费的时间不超过1/4^t。实际上，对大多数随机数，几乎99.99%肯定a是证据。</p>
<p>实际考虑：</p>
<p>在实际算法，产生素数是很快的。</p>
<p>（1） 产生一个n-位的随机数p<br />
（2） 设高位和低位为1（设高位是为了保证位数，设低位是为了保证位奇数）<br />
（3） 检查以确保p不能被任何小素数整除：如3，5，7，11等等。有效的方法是测试小于2000的素数。使用字轮方法更快<br />
（4） 对某随机数a运行Rabin-Miller检测，如果p通过，则另外产生一个随机数a,在测试。选取较小的a值，以保证速度。做5次 Rabin-Miller测试如果p在其中失败，从新产生p，再测试。</p>
<p>经测试，这个算法在sun的Sparc II工作站上实现： <br />
2 .8秒产生一个256位的素数<br />
24.0秒产生一个512位的素数<br />
2分钟产生一个768位的素数<br />
5.1分钟产生一个1024位的素数</p>
<p><br />
最近在网上看了不少关于素数的问题，也学习到了不少东西，决定整理一下，算是一个学习的总结吧。</p>
<p>首先想说明的是，虽然素数可以进行很深入的研究（如在RSA公共密钥系统的应用），但是由于我对数论的不甚熟悉，所以只能做一些浅尝辄止的探讨，主要就是对一些简单的素数相关算法进行一个讨论。</p>
<p>首先来说说素数的判定算法，如果你是读谭浩强老师的《c程序设计》入门的话，那么一谈到素数的判定算法，你首先应该想到的就是以下的算法：给定一个正整数n，用2到sqrt(n)之间的所有整数去除n，如果可以整除，则n不是素数，如果不可以整除，则n就是素数。这个算法的时间复杂度十分明了，为O（sqrt（n）），算法的描述相当简单，实现也一样不困难。</p>
<p># include &lt;stdio.h&gt;<br />
# include &lt;math.h&gt;</p>
<p>int isPrime(int n)<br />
{<br />
&nbsp;&nbsp;&nbsp; int i ;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; for(i=2; i &lt;= sqrt(n); i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(n%i == 0 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break ;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if(i &lt;= sqrt(n))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d is not a prime ! ", &amp;n) ;<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d is a prime ! ", &amp;n) ;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; return 0 ;<br />
}</p>
<p><br />
=====================================<br />
public class&nbsp; SuShu{&nbsp;&nbsp; <br />
&nbsp;private int num;&nbsp; <br />
&nbsp;SuShu(int n){&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;num=n;<br />
&nbsp;}&nbsp; <br />
&nbsp;public&nbsp; boolean isSuShu(){<br />
&nbsp;&nbsp;for(int i=2;i&lt;num;i++){<br />
&nbsp;&nbsp;&nbsp;if(num%i==0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;return true;&nbsp; <br />
&nbsp;}&nbsp; <br />
&nbsp;public static void main(String[] args){&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;for(int i=1;i&lt;=100;i++){<br />
&nbsp;&nbsp;&nbsp;SuShu su=new SuShu(i);<br />
&nbsp;&nbsp;&nbsp;if(su.isSuShu())<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i+"是素数");<br />
&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i+"不是素数");&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;} <br />
&nbsp;}<br />
}</p>
<p>=============================</p>
<p>/**&nbsp;&nbsp; <br />
* @param n&nbsp;&nbsp; <br />
* @return if n is a prime return true, else false&nbsp;&nbsp; <br />
*/&nbsp; <br />
public static boolean isPrime(int n) {<br />
&nbsp;// filte negative, zero, one&nbsp;&nbsp;&nbsp; <br />
&nbsp;if (1 &gt;= n) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;}<br />
&nbsp;// 2 is a prime, stop filter&nbsp;&nbsp;&nbsp; <br />
&nbsp;if (2 == n) {<br />
&nbsp;&nbsp;return true;<br />
&nbsp;}<br />
&nbsp;// filter evens <br />
&nbsp;if (0 == n % 2) {<br />
&nbsp;&nbsp;return false;<br />
&nbsp;}<br />
&nbsp;// go on filting...&nbsp;&nbsp;&nbsp; <br />
&nbsp;for (int a = 3; a &lt;= Math.sqrt(n); a += 2) {<br />
&nbsp;&nbsp;if (0 == n % a) {<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;// the rest is all prime, stop filting&nbsp;&nbsp;&nbsp; <br />
&nbsp;return true;<br />
}<br />
==============================<br />
//目前我认为最好的办法是<span style="color: red">:(不是lk的观点)<br />
</span>public boolean isPrime(int n){<br />
&nbsp;&nbsp;&nbsp; for(int i = 2; i * i &lt;= n; i++){<br />
&nbsp;&nbsp;if(n % i == 0)<br />
&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; return true;<br />
}<br />
===============================<br />
素数是这样的整数，它除了能表示为它自己和1的乘积以外，不能表示为任何其它两个整数的乘积。例如，15＝3＊5，所以15不是素数；又如，12＝6＊2＝4＊3，所以12也不是素数。另一方面，13除了等于13＊1以外，不能表示为其它任何两个整数的乘积，所以13是一个素数。 <br />
有的数，如果单凭印象去捉摸，是无法确定它到底是不是素数的。有些数则可以马上说出它不是素数。一个数，不管它有多大，只要它的个位数是2、4、5、6、8或0，就不可能是素数。此外，一个数的各位数字之和要是可以被3整除的话，它也不可能是素数。但如果它的个位数是1、3、7或9，而且它的各位数字之和不能被3整除，那么，它就可能是素数（但也可能不是素数）。没有任何现成的公式可以告诉你一个数到底是不是素数。你只能试试看能不能将这 <br />
个数表示为两个比它小的数的乘积。</p>
<p>代码如下：</p>
<p>package com.vo;</p>
<p>public class Sushu {</p>
<p><br />
&nbsp;public static void main(String[] args) {<br />
&nbsp; int s=0;<br />
&nbsp; int i;<br />
&nbsp; for(i=0;i&lt;=100;i++)<br />
&nbsp; {<br />
&nbsp;int j;<br />
&nbsp;for(j=2;j&lt;=i;j++){<br />
&nbsp; if(i%j==0)<br />
&nbsp;&nbsp; break;<br />
&nbsp;}<br />
&nbsp;if(i==j)<br />
&nbsp; System.out.println(i);<br />
&nbsp; }</p>
<p>&nbsp;}</p>
<p>}</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/lcs/aggbug/178800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-02-01 11:19 <a href="http://www.blogjava.net/lcs/archive/2008/02/01/178800.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MD5小汇一下</title><link>http://www.blogjava.net/lcs/archive/2008/01/30/178535.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 30 Jan 2008 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/01/30/178535.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/178535.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/01/30/178535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/178535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/178535.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: --------------------------第一个：简单明了-------------------http://www.ieee.org.cn/dispbbs.asp?boardID=41&amp;ID=13873代码：import&nbsp;java.security.*;&nbsp;import&nbsp;java.security.spec.*;&nbsp;c...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2008/01/30/178535.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/178535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-01-30 15:21 <a href="http://www.blogjava.net/lcs/archive/2008/01/30/178535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用XMLBean轻轻松松读写XML </title><link>http://www.blogjava.net/lcs/archive/2007/11/22/162316.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 22 Nov 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/22/162316.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/162316.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/22/162316.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/162316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/162316.html</trackback:ping><description><![CDATA[<span class="a14c" id="zoom">&nbsp;
<p style="text-indent: 2em">
<center><span style="font-size: 20px"><strong>利用XMLBean轻轻松松读写XML</strong></span></center><br />
<center>作者：叶枫</center><br />
<br />
<br />
<br />
<span style="color: red">版权声明：本文可以自由转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</span><br />
作者:叶枫(<a href="http://blog.matrix.org.cn/page/叶枫" target="_new">http://blog.matrix.org.cn/page/叶枫</a>)<br />
原文:[http://www.matrix.org.cn/resource/article/44/44027_XMLBean.html]http://www.matrix.org.cn/resource/article/44/44027_XMLBean.html[/url]<br />
关键字:XML XMLBean Parser<br />
<br />
<strong><span style="font-size: 16px">一、关于XML解析</span></strong><br />
<br />
&nbsp;&nbsp;XML在Java应用程序里变得越来越重要, 广泛应用于数据存储和<br />
交换. 比如我们常见的配置文件,都是以XML方式存储的. XML还应用<br />
于Java Message Service和Web Services等技术作为数据交换.<br />
因此,正确读写XML文档是XML应用的基础.<br />
&nbsp;&nbsp;Java提供了SAX和DOM两种方式用于解析XML,但即便如此,要读写一个<br />
稍微复杂的XML,也不是一件容易的事.<br />
<br />
<strong><span style="font-size: 16px">二、XMLBean简介</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Hibernate已经成为目前流行的面向Java环境的对象/关系数据库映射工具.<br />
在Hibernate等对象/关系数据库映射工具出现之前,对数据库的操作是<br />
通过JDBC来实现的,对数据库的任何操作,开发人员都要自己写SQL语句<br />
来实现. 对象/关系数据库映射工具出现后,对数据库的操作转成对<br />
JavaBean的操作,极大方便了数据库开发. 所以如果有一个类似的工具能够<br />
实现将对XML的读写转成对JavaBean的操作,将会简化XML的读写,即使对XML<br />
不熟悉的开发人员也能方便地读写XML. 这个工具就是XMLBean.<br />
<br />
<strong><span style="font-size: 16px">三、准备XMLBean和XML文档</span></strong><br />
<br />
&nbsp;&nbsp; XMLBean是Apache的一个开源项目,可以从http://www.apache.org下载,<br />
最新的版本是2.0. 解压后目录如下:<br />
<span style="color: blue">xmlbean2.0.0<br />
&nbsp;&nbsp;&nbsp;&nbsp; +---bin<br />
&nbsp;&nbsp;&nbsp;&nbsp; +---docs<br />
&nbsp;&nbsp;&nbsp;&nbsp; +---lib<br />
&nbsp;&nbsp;&nbsp;&nbsp; +---samples<br />
&nbsp;&nbsp;&nbsp;&nbsp; +---schemas</span><br />
<br />
另外还要准备一个XML文档(customers.xml),<br />
在本文的例子里,我们将对这个文档进行读写操作. 文档源码如下:<br />
<pre class="overflow"><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;Customers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;customer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;1&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;gender&gt;female&lt;/gender&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;firstname&gt;Jessica&lt;/firstname&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;lastname&gt;Lim&lt;/lastname&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;phoneNumber&gt;1234567&lt;/phoneNumber&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;primaryAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;postalCode&gt;350106&lt;/postalCode&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addressLine1&gt;#25-1&lt;/addressLine1&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addressLine2&gt;SHINSAYAMA 2-CHOME&lt;/addressLine2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/primaryAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;billingAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;receiver&gt;Ms Danielle&lt;/receiver&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;postalCode&gt;350107&lt;/postalCode&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addressLine1&gt;#167&lt;/addressLine1&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addressLine2&gt;NORTH TOWER HARBOUR CITY&lt;/addressLine2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/billingAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/customer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;customer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;2&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;gender&gt;male&lt;/gender&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;firstname&gt;David&lt;/firstname&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;lastname&gt;Bill&lt;/lastname&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;phoneNumber&gt;808182&lt;/phoneNumber&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;primaryAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;postalCode&gt;319087&lt;/postalCode&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addressLine1&gt;1033 WS St.&lt;/addressLine1&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addressLine2&gt;Tima Road&lt;/addressLine2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/primaryAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;billingAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;receiver&gt;Mr William&lt;/receiver&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;postalCode&gt;672993&lt;/postalCode&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addressLine1&gt;1033 WS St.&lt;/addressLine1&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;addressLine2&gt;Tima Road&lt;/addressLine2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/billingAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/customer&gt;<br />
&lt;/Customers&gt;<br />
</pre>
<br />
<br />
这是一个客户的数据模型,每个客户都有客户编号(ID),姓名,性别(gender),<br />
电话号码(phoneNumber)和地址,其中地址有两个: 首要地址(PrimaryAddress)<br />
和帐单地址(BillingAddress),每个地址有邮编,地址1,和地址2组成.<br />
其中帐单地址还有收件人(receiver).<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;此外,还要准备一个配置文件(文件名customer.xsdconfig),这个文件的<br />
作用我后面会讲,它的内容如下:<br />
<pre class="overflow"><br />
&lt;xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config"&gt;<br />
<br />
&nbsp;&nbsp;&lt;xb:namespace&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;xb:package&gt;sample.xmlbean&lt;/xb:package&gt;<br />
&nbsp;&nbsp;&lt;/xb:namespace&gt;<br />
<br />
&lt;/xb:config&gt;<br />
</pre>
<br />
<br />
<strong><span style="font-size: 16px">四、XMLBean使用步骤</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;和其他面向Java环境的对象/关系数据库映射工具的使用步骤一样,<br />
在正式使用XMLBean前,我们要作两个准备.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;1. 生成XML Schema文件<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么是XML Schema文件? 正常情况下,每个XML文件都有一个Schema文件,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XML Schema文件是一个XML的约束文件,它定义了XML文件的结构和元素.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以及对元素和结构的约束. 通俗地讲,如果说XML文件是数据库里的记录,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么Schema就是表结构定义.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么需要这个文件? XMLBean需要通过这个文件知道一个XML文件的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结构以及约束,比如数据类型等. 利用这个Schema文件,XMLBean将会产生<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一系列相关的Java Classes来实现对XML的操作. 而作为开发人员,则是<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用XMLBean产生的Java Classes来完成对XML的操作而不需要SAX或DOM.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 怎样产生这个Schema文件呢? 如果对于熟悉XML的开发人员,可以自己来<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 写这个Schema文件,对于不熟悉XML的开发人员,可以通过一些工具来完成.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比较有名的如XMLSPY和Stylus Studio都可以通过XML文件来生成Schema<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件. 加入我们已经生成这个Schema文件(customer.xsd):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elementFormDefault="qualified"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="Customers"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element maxOccurs="unbounded" name="customer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="customerType"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:element&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:complexType name="customerType"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="id" type="xs:int"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="gender" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="firstname" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="lastname" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="phoneNumber" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="address" type="addressType"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:complexType name="addressType"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="primaryAddress" type="primaryAddressType"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="billingAddress" type="billingAddressType"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:complexType&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:complexType name="primaryAddressType"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="postalCode" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="addressLine1" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="addressLine2" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:complexType name="billingAddressType"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="receiver" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="postalCode" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="addressLine1" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xs:element name="addressLine2" type="xs:string"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:sequence&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:complexType&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xs:schema&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;2. 利用scomp来生成Java Classes<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scomp是XMLBean提供的一个编译工具,它在bin的目录下. 通过这个工具,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以将以上的Schema文件生成Java Classes.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scomp的语法如下:-<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要参数说明:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -src [dir]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 生成的Java Classes存放目录<br />
&nbsp;&nbsp;&nbsp;&nbsp; -srconly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 不编译Java Classes,不产生Jar文件<br />
&nbsp;&nbsp;&nbsp;&nbsp; -out [jarFileName]&nbsp;&nbsp;-- 生成的Jar文件,缺省是xmltypes.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -compiler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Java编译器的路径,即Javac的位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; schemaFile.xsd&nbsp;&nbsp;&nbsp;&nbsp;-- XML Schema文件位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.xsdconfig&nbsp;&nbsp; -- xsdconfig文件的位置, 这个文件主要用来制定生成的Java Class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的一些文件名规则和Package的名称,在本文,package是sample.xmlbean<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在本文,我是这样运行的:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scomp -src build\src&nbsp;&nbsp;-out build\customerXmlBean.jar schema\customer.xsd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -compiler C:\jdk142_04\bin\javac customer.xsdconfig<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个命令行的意思是告诉scomp生成customerXmlBean.jar,放在build目录下,同时<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成源代码放在build\src下, Schema文件是customer.xsd,xsdconfig文件是customer.xsdconfig.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实, 生成的Java源代码没有多大作用,我们要的是jar文件.我们先看一下build\src\sample\xmlbean下生成的Classes.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomersDocument.java&nbsp;&nbsp;&nbsp;&nbsp;-- 整个XML文档的Java Class映射<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CustomerType.java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 节点sustomer的映射<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressType.java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 节点address的映射<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BillingAddressType.java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 节点billingAddress的映射<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrimaryAddressType.java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 节点primaryAddress的映射<br />
&nbsp;&nbsp;&nbsp;&nbsp; </pre>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了,到此我们所有的准备工作已经完成了. 下面就开始进入重点：利用刚才生成的jar文件读写XML.<br />
<br />
<strong><span style="font-size: 16px">五、利用XMLBean读XML文件</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;新建一个Java Project,将XMLBean2.0.0\lib\下的Jar文件和刚才我们生成的customerXmlBean.jar加入<br />
&nbsp;&nbsp;&nbsp;&nbsp;到Project的ClassPath.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;新建一个Java Class: CustomerXMLBean.&nbsp;&nbsp;源码如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;package com.sample.reader;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;import java.io.File;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import sample.xmlbean.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import org.apache.commons.beanutils.BeanUtils;<br />
&nbsp;&nbsp;&nbsp;&nbsp;import org.apache.xmlbeans.XmlOptions;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public class CustomerXMLBean {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private String filename = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public CustomerXMLBean(String filename) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.filename = filename;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void customerReader() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File xmlFile = new File(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerType[] customers = doc.getCustomers().getCustomerArray();<br />
&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;for (int i = 0; i &lt; customers.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerType customer = customers[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("Customer#" + i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("Customer ID:" + customer.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("First name:" + customer.getFirstname());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("Last name:" + customer.getLastname());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("Gender:" + customer.getGender());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("PhoneNumber:" + customer.getPhoneNumber());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Primary address<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrimaryAddressType primaryAddress = customer.getAddress().getPrimaryAddress();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("PrimaryAddress:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("PostalCode:" + primaryAddress.getPostalCode());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("AddressLine1:" + primaryAddress.getAddressLine1());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("AddressLine2:" + primaryAddress.getAddressLine2());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Billing address<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BillingAddressType billingAddress = customer.getAddress().getBillingAddress();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("BillingAddress:");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("Receiver:" + billingAddress.getReceiver());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("PostalCode:" + billingAddress.getPostalCode());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("AddressLine1:" + billingAddress.getAddressLine1());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("AddressLine2:" + billingAddress.getAddressLine2());<br />
&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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;private void println(String str) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers.xml";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; customerXMLBean.customerReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</pre>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;运行它,参看输出结果:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer#0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer ID:1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; First name:Jessica<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Last name:Lim<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Gender:female<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PhoneNumber:1234567<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrimaryAddress:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostalCode:350106<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLine1:#25-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLine2:SHINSAYAMA 2-CHOME<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BillingAddress:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Receiver:Ms Danielle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostalCode:350107<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLine1:#167<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLine2:NORTH TOWER HARBOUR CITY<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer#1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer ID:2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; First name:David<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Last name:Bill<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Gender:male<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PhoneNumber:808182<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrimaryAddress:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostalCode:319087<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLine1:1033 WS St.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLine2:Tima Road<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BillingAddress:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Receiver:Mr William<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostalCode:672993<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLine1:1033 WS St.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddressLine2:Tima Road<br />
&nbsp;&nbsp;&nbsp;&nbsp;</pre>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;怎么样,是不是很轻松? XMLBean的威力.<br />
<br />
<strong><span style="font-size: 16px">六、利用XMLBean写XML文件</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;利用XMLBean创建一个XML文档也是一件轻而易举的事.我们再增加一个Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;请看一下的Java Class:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;public void createCustomer() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Create Document<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomersDocument doc = CustomersDocument.Factory.newInstance();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Add new customer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerType customer = doc.addNewCustomers().addNewCustomer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// set customer info<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setId(3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setFirstname("Jessica");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setLastname("Lim");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setGender("female");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setPhoneNumber("1234567");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Add new address<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddressType address = customer.addNewAddress();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Add new PrimaryAddress<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrimaryAddressType primaryAddress = address.addNewPrimaryAddress();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primaryAddress.setPostalCode("350106");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primaryAddress.setAddressLine1("#25-1");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primaryAddress.setAddressLine2("SHINSAYAMA 2-CHOME");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Add new BillingAddress<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BillingAddressType billingAddress = address.addNewBillingAddress();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;billingAddress.setReceiver("Ms Danielle");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;billingAddress.setPostalCode("350107");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;billingAddress.setAddressLine1("#167");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;billingAddress.setAddressLine2("NORTH TOWER HARBOUR CITY");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File xmlFile = new File(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.save(xmlFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</pre>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;修改main method.<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customerXMLBean.createCustomer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</pre>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;运行,打开customers_new.xml:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Customers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;customer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;3&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;gender&gt;female&lt;/gender&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;firstname&gt;Jessica&lt;/firstname&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;lastname&gt;Lim&lt;/lastname&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;phoneNumber&gt;1234567&lt;/phoneNumber&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;primaryAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;postalCode&gt;350106&lt;/postalCode&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;addressLine1&gt;#25-1&lt;/addressLine1&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;addressLine2&gt;SHINSAYAMA 2-CHOME&lt;/addressLine2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/primaryAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;billingAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;receiver&gt;Ms Danielle&lt;/receiver&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;postalCode&gt;350107&lt;/postalCode&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;addressLine1&gt;#167&lt;/addressLine1&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;addressLine2&gt;NORTH TOWER HARBOUR CITY&lt;/addressLine2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/billingAddress&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/address&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/customer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Customers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</pre>
<br />
<br />
<br />
<strong><span style="font-size: 16px">七、利用XMLBean修改XML文件</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;我们再增加一个Method:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void updateCustomer(int id,String lastname) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File xmlFile = new File(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerType[] customers = doc.getCustomers().getCustomerArray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; customers.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CustomerType customer = customers[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(customer.getId()==id){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setLastname(lastname);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc.save(xmlFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</pre>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;main method:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;customerXMLBean.updateCustomer(3,"last");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</pre>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;运行之后,我们将会看到客户编号为3的客户的lastname已经改为last.<br />
<br />
<strong><span style="font-size: 16px">八、利用XMLBean删除一个customer</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;再增加一个Method:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;public void deleteCustomer(int id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File xmlFile = new File(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp; CustomersDocument doc = CustomersDocument.Factory.parse(xmlFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;CustomerType[] customers = doc.getCustomers().getCustomerArray();<br />
<br />
&nbsp;&nbsp; for (int i = 0; i &lt; customers.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CustomerType customer = customers[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(customer.getId()==id){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customer.setNil() ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; doc.save(xmlFile);<br />
&nbsp;&nbsp; } catch (Exception ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; }<br />
</pre>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; main method:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<pre class="overflow"><br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;String filename = "F://JavaTest//Eclipse//XMLBean//xml//customers_new.xml";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;CustomerXMLBean customerXMLBean = new CustomerXMLBean(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;customerXMLBean.deleteCustomer(3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</pre>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
运行,我们将会看到客户编号为3的客户的资料已经被删除.<br />
<br />
<strong><span style="font-size: 16px">九、查询XML</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;除了本文在以上讲述的,利用XMLBean能轻轻松松完成XML的读写操作外,结合XPath和XQuery,<br />
&nbsp;&nbsp; XMLBean还能完成象SQL查询数据库一样方便地查询XML数据. 关于XML查询以及如何创建XML数据库, 我将在另一篇文章里讨论.<br />
<br />
<br />
<br />
<strong><span style="font-size: 16px">十、结束语</span></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;XMLBean能帮助我们轻易读写XML,这将有助于我们降低XML的学习和使用,有了这个基础,<br />
&nbsp;&nbsp;&nbsp;&nbsp;开发人员将为学习更多地XML相关技术和Web Services,JMS等其他J2EE技术打下良好地基础.<br />
<br />
<br />
<strong>关于作者：</strong><br />
叶枫：热爱Java和Oracle. 在软件开发有近10年, 目前在国外一家美国大公司担任SA, 负责技术研究。作者Blog：<a href="http://blog.matrix.org.cn/page/叶枫" target="_new">http://blog.matrix.org.cn/page/叶枫</a><br />
</span>
<img src ="http://www.blogjava.net/lcs/aggbug/162316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-22 11:08 <a href="http://www.blogjava.net/lcs/archive/2007/11/22/162316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java  sax 解析 xml</title><link>http://www.blogjava.net/lcs/archive/2007/11/22/162304.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 22 Nov 2007 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/22/162304.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/162304.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/22/162304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/162304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/162304.html</trackback:ping><description><![CDATA[虽然有些方法没用，但还是保留了下来！String&nbsp; str是我加的<br />
<br />
代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.xml.sax.Attributes;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.xml.sax.SAXException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.xml.sax.Locator;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.xml.sax.ContentHandler;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.xml.sax.InputSource;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.xml.sax.helpers.DefaultHandler;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.parsers.SAXParser;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.parsers.SAXParserFactory;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_347_2465_Open_Image" onclick="this.style.display='none'; Codehighlighter1_347_2465_Open_Text.style.display='none'; Codehighlighter1_347_2465_Closed_Image.style.display='inline'; Codehighlighter1_347_2465_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_347_2465_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_347_2465_Closed_Text.style.display='none'; Codehighlighter1_347_2465_Open_Image.style.display='inline'; Codehighlighter1_347_2465_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestSAX&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;DefaultHandler</span><span id="Codehighlighter1_347_2465_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_347_2465_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;StringBuffer&nbsp;buf;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;str;<br />
<img id="Codehighlighter1_416_431_Open_Image" onclick="this.style.display='none'; Codehighlighter1_416_431_Open_Text.style.display='none'; Codehighlighter1_416_431_Closed_Image.style.display='inline'; Codehighlighter1_416_431_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_416_431_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_416_431_Closed_Text.style.display='none'; Codehighlighter1_416_431_Open_Image.style.display='inline'; Codehighlighter1_416_431_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;TestSAX()</span><span id="Codehighlighter1_416_431_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_416_431_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setDocumentLocator(Locator&nbsp;locator){}</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_538_613_Open_Image" onclick="this.style.display='none'; Codehighlighter1_538_613_Open_Text.style.display='none'; Codehighlighter1_538_613_Closed_Image.style.display='inline'; Codehighlighter1_538_613_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_538_613_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_538_613_Closed_Text.style.display='none'; Codehighlighter1_538_613_Open_Image.style.display='inline'; Codehighlighter1_538_613_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;startDocument()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SAXException</span><span id="Codehighlighter1_538_613_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_538_613_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuffer();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">*******开始解析文档*******</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_663_714_Open_Image" onclick="this.style.display='none'; Codehighlighter1_663_714_Open_Text.style.display='none'; Codehighlighter1_663_714_Closed_Image.style.display='inline'; Codehighlighter1_663_714_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_663_714_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_663_714_Closed_Text.style.display='none'; Codehighlighter1_663_714_Open_Image.style.display='inline'; Codehighlighter1_663_714_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;endDocument()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SAXException</span><span id="Codehighlighter1_663_714_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_663_714_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">*******文档解析结束*******</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_778_849_Open_Image" onclick="this.style.display='none'; Codehighlighter1_778_849_Open_Text.style.display='none'; Codehighlighter1_778_849_Closed_Image.style.display='inline'; Codehighlighter1_778_849_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_778_849_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_778_849_Closed_Text.style.display='none'; Codehighlighter1_778_849_Open_Image.style.display='inline'; Codehighlighter1_778_849_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;startPrefixMapping(&nbsp;String&nbsp;prefix,&nbsp;String&nbsp;uri&nbsp;)</span><span id="Codehighlighter1_778_849_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_778_849_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;前缀映射:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;prefix&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;开始!</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;它的URI是:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;uri);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_899_949_Open_Image" onclick="this.style.display='none'; Codehighlighter1_899_949_Open_Text.style.display='none'; Codehighlighter1_899_949_Closed_Image.style.display='inline'; Codehighlighter1_899_949_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_899_949_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_899_949_Closed_Text.style.display='none'; Codehighlighter1_899_949_Open_Image.style.display='inline'; Codehighlighter1_899_949_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;endPrefixMapping(&nbsp;String&nbsp;prefix&nbsp;)</span><span id="Codehighlighter1_899_949_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_899_949_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;前缀映射:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">prefix</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;结束!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;processingInstruction(&nbsp;String&nbsp;target,&nbsp;String&nbsp;instruction&nbsp;)throws&nbsp;SAXException{}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;ignorableWhitespace(&nbsp;char[]&nbsp;chars,&nbsp;int&nbsp;start,&nbsp;int&nbsp;length&nbsp;)&nbsp;throws&nbsp;SAXException&nbsp;{}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;skippedEntity(&nbsp;String&nbsp;name&nbsp;)&nbsp;throws&nbsp;SAXException&nbsp;{}</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1310_1514_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1310_1514_Open_Text.style.display='none'; Codehighlighter1_1310_1514_Closed_Image.style.display='inline'; Codehighlighter1_1310_1514_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1310_1514_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1310_1514_Closed_Text.style.display='none'; Codehighlighter1_1310_1514_Open_Image.style.display='inline'; Codehighlighter1_1310_1514_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;startElement(String&nbsp;namespaceURI,String&nbsp;localName,String&nbsp;qName,Attributes&nbsp;atts)</span><span id="Codehighlighter1_1310_1514_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1310_1514_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">*******开始解析元素*******</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">元素名</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">qName);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1433_1511_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1433_1511_Open_Text.style.display='none'; Codehighlighter1_1433_1511_Closed_Image.style.display='inline'; Codehighlighter1_1433_1511_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1433_1511_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1433_1511_Closed_Text.style.display='none'; Codehighlighter1_1433_1511_Open_Image.style.display='inline'; Codehighlighter1_1433_1511_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">atts.getLength();i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_1433_1511_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1433_1511_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">元素名</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">atts.getLocalName(i)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">属性值</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">atts.getValue(i));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1615_1929_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1615_1929_Open_Text.style.display='none'; Codehighlighter1_1615_1929_Closed_Image.style.display='inline'; Codehighlighter1_1615_1929_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1615_1929_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1615_1929_Closed_Text.style.display='none'; Codehighlighter1_1615_1929_Open_Image.style.display='inline'; Codehighlighter1_1615_1929_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;endElement(String&nbsp;namespaceURI,String&nbsp;localName,String&nbsp;fullName&nbsp;)</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SAXException</span><span id="Codehighlighter1_1615_1929_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1615_1929_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.trimToSize();</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;buf.toString();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">buf&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">buf</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;||&nbsp;length&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">buf.length());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">str&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str.trim()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;||&nbsp;length&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str.trim().length());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.delete(</span><span style="color: #000000">0</span><span style="color: #000000">,buf.length());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">******</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">namespaceURI</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">元素解析结束</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">localName</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">********</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">fullName);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_2014_2078_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2014_2078_Open_Text.style.display='none'; Codehighlighter1_2014_2078_Closed_Image.style.display='inline'; Codehighlighter1_2014_2078_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2014_2078_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2014_2078_Closed_Text.style.display='none'; Codehighlighter1_2014_2078_Open_Image.style.display='inline'; Codehighlighter1_2014_2078_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;characters(&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">[]&nbsp;chars,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;start,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;length&nbsp;)</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SAXException</span><span id="Codehighlighter1_2014_2078_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2014_2078_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">将元素内容累加到StringBuffer中&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append(chars,start,length);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_2121_2463_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2121_2463_Open_Text.style.display='none'; Codehighlighter1_2121_2463_Closed_Image.style.display='inline'; Codehighlighter1_2121_2463_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2121_2463_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2121_2463_Closed_Text.style.display='none'; Codehighlighter1_2121_2463_Open_Image.style.display='inline'; Codehighlighter1_2121_2463_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])</span><span id="Codehighlighter1_2121_2463_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2121_2463_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_2128_2311_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2128_2311_Open_Text.style.display='none'; Codehighlighter1_2128_2311_Closed_Image.style.display='inline'; Codehighlighter1_2128_2311_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2128_2311_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2128_2311_Closed_Text.style.display='none'; Codehighlighter1_2128_2311_Open_Image.style.display='inline'; Codehighlighter1_2128_2311_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_2128_2311_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2128_2311_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParserFactory&nbsp;sf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SAXParserFactory.newInstance();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXParser&nbsp;sp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sf.newSAXParser();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestSAX&nbsp;testsax</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TestSAX();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp.parse(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputSource(</span><span style="color: #000000">"</span><span style="color: #000000">test1.xml</span><span style="color: #000000">"</span><span style="color: #000000">),testsax);<br />
<img id="Codehighlighter1_2332_2361_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2332_2361_Open_Text.style.display='none'; Codehighlighter1_2332_2361_Closed_Image.style.display='inline'; Codehighlighter1_2332_2361_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2332_2361_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2332_2361_Closed_Text.style.display='none'; Codehighlighter1_2332_2361_Open_Image.style.display='inline'; Codehighlighter1_2332_2361_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(IOException&nbsp;e)</span><span id="Codehighlighter1_2332_2361_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2332_2361_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;<br />
<img id="Codehighlighter1_2383_2412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2383_2412_Open_Text.style.display='none'; Codehighlighter1_2383_2412_Closed_Image.style.display='inline'; Codehighlighter1_2383_2412_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2383_2412_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2383_2412_Closed_Text.style.display='none'; Codehighlighter1_2383_2412_Open_Image.style.display='inline'; Codehighlighter1_2383_2412_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(SAXException&nbsp;e)</span><span id="Codehighlighter1_2383_2412_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2383_2412_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;<br />
<img id="Codehighlighter1_2431_2460_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2431_2460_Open_Text.style.display='none'; Codehighlighter1_2431_2460_Closed_Image.style.display='inline'; Codehighlighter1_2431_2460_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2431_2460_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2431_2460_Closed_Text.style.display='none'; Codehighlighter1_2431_2460_Open_Image.style.display='inline'; Codehighlighter1_2431_2460_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_2431_2460_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2431_2460_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
xml文件，我读的时候有错误，用了自己的，希望其他人比我幸运！<br />
代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="GB2312"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">row</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">person</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">王小明</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">college</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">信息学院</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">college</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">telephone</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">6258113</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">telephone</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">notes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">男,1955年生,博士，95年调入海南大学</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">notes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">person</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">row</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">　</span></div>
<img src ="http://www.blogjava.net/lcs/aggbug/162304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-22 10:44 <a href="http://www.blogjava.net/lcs/archive/2007/11/22/162304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HashMap 使用小结</title><link>http://www.blogjava.net/lcs/archive/2007/11/20/161803.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Tue, 20 Nov 2007 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/20/161803.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/161803.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/20/161803.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/161803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/161803.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文重点介绍HashMap。首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的，而在Map中我们通过对象来对对象进行索引，用来索引的对象叫做key，其对应的对象叫做value。在下文中会有例子具体说明。再来看看HashMap和TreeMap有什么区别。HashMap通过hashcode对其内容进行快速查找，而TreeMap中所有的元素都保持着某种固定的顺序，如果你需要得到一个...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2007/11/20/161803.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/161803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-20 10:43 <a href="http://www.blogjava.net/lcs/archive/2007/11/20/161803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串数组连接例子（原创）</title><link>http://www.blogjava.net/lcs/archive/2007/11/16/161053.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 16 Nov 2007 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/16/161053.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/161053.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/16/161053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/161053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/161053.html</trackback:ping><description><![CDATA[代码<br />
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_21_574_Open_Image" onclick="this.style.display='none'; Codehighlighter1_21_574_Open_Text.style.display='none'; Codehighlighter1_21_574_Closed_Image.style.display='inline'; Codehighlighter1_21_574_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_21_574_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_21_574_Closed_Text.style.display='none'; Codehighlighter1_21_574_Open_Image.style.display='inline'; Codehighlighter1_21_574_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test_Str</span><span id="Codehighlighter1_21_574_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_21_574_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_62_572_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_572_Open_Text.style.display='none'; Codehighlighter1_62_572_Closed_Image.style.display='inline'; Codehighlighter1_62_572_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_62_572_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_62_572_Closed_Text.style.display='none'; Codehighlighter1_62_572_Open_Image.style.display='inline'; Codehighlighter1_62_572_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)</span><span id="Codehighlighter1_62_572_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_62_572_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_86_114_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_114_Open_Text.style.display='none'; Codehighlighter1_86_114_Closed_Image.style.display='inline'; Codehighlighter1_86_114_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_86_114_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_86_114_Closed_Text.style.display='none'; Codehighlighter1_86_114_Open_Image.style.display='inline'; Codehighlighter1_86_114_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;str_1</span><span style="color: #000000">=</span><span id="Codehighlighter1_86_114_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_86_114_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">"</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">2</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">3</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">4</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">5</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">6</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">7</span><span style="color: #000000">"</span><span style="color: #000000">}</span></span><span style="color: #000000">;<br />
<img id="Codehighlighter1_134_162_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_162_Open_Text.style.display='none'; Codehighlighter1_134_162_Closed_Image.style.display='inline'; Codehighlighter1_134_162_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_134_162_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_134_162_Closed_Text.style.display='none'; Codehighlighter1_134_162_Open_Image.style.display='inline'; Codehighlighter1_134_162_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;str_2</span><span style="color: #000000">=</span><span id="Codehighlighter1_134_162_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_134_162_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">b</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">c</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">d</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">e</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">f</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">g</span><span style="color: #000000">"</span><span style="color: #000000">}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;str_3</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[str_1.length</span><span style="color: #000000">+</span><span style="color: #000000">str_2.length];<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;str_1&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str_1.length);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;str_2&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str_2.length);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;str_3&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str_3.length);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(str_1,</span><span style="color: #000000">0</span><span style="color: #000000">,str_3,</span><span style="color: #000000">0</span><span style="color: #000000">,str_1.length);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(str_2,</span><span style="color: #000000">0</span><span style="color: #000000">,str_3,str_1.length,str_2.length);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_513_569_Open_Image" onclick="this.style.display='none'; Codehighlighter1_513_569_Open_Text.style.display='none'; Codehighlighter1_513_569_Closed_Image.style.display='inline'; Codehighlighter1_513_569_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_513_569_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_513_569_Closed_Text.style.display='none'; Codehighlighter1_513_569_Open_Image.style.display='inline'; Codehighlighter1_513_569_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">str_3.length;i</span><span style="color: #000000">++</span><span style="color: #000000">)</span><span id="Codehighlighter1_513_569_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_513_569_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;str_3[</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">]&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">str_3[i]);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/lcs/aggbug/161053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-16 16:36 <a href="http://www.blogjava.net/lcs/archive/2007/11/16/161053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Swing中键盘事件的处理</title><link>http://www.blogjava.net/lcs/archive/2007/11/15/160737.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 15 Nov 2007 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/15/160737.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/160737.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/15/160737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/160737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/160737.html</trackback:ping><description><![CDATA[<div class="content_text" id="content">
<p style="text-indent: 2em">在Java Swing编程过程中，经常需要处理键盘事件，例如处理快捷键等。这里就介绍如何定义键盘事件，以及如何处理这些事件。
<p style="text-indent: 2em">在jdk1.2中，分别针对Jcomponent和Text类的对象定制了不同的处理键盘事件的方法：在Jcomponent中，定义了registerKeyboardAction方法，使用这个方法来将需要处理的键盘事件以及处理事件的行为绑定在一起。Text类中具有keymap对象，同Jcomponent中的处理方法类似，这个对象保存着需要处理的键盘事件和对应的行为。
<p style="text-indent: 2em">而在jdk1.3中，使用一种新的方法来处理键盘事件，它将jdk1.2的两种方法整合在一起。不需要区分被处理的是Jcomponent还是Text类型的组件。它定义了两个新的类：InputMap和ActionMap。他们均是简单的表或映射。一个InputMap将一个Keystroke对应到一个对象，ActionMap将一个对象对应到一个行为（Action）。通常InputMap中KeyStroke所对应的对象是一个字符串，通过这个字符串可以在ActionMap中查找到相应的行为。
<p style="text-indent: 2em">InputMap和ActionMap中均有put方法。InputMap的put方法可以将Keystroke对应到一个对象，而ActionMap的put方法可以将一个对象对应到一个行为。
<p style="text-indent: 2em">在每一个Jcomponent组件中，会有三个缺省的InputMap和一个缺省的ActionMap。他们可以通过调用getInputMap(int condition)和getActionMap()得到。三个InputMap分别是当组件本身拥有焦点时的InputMap（WHEN_FOCUSED），当组件的祖先拥有焦点时的InputMap（WHEN_ANCESTOR_OF_FOCUSED_COMPONENT）和组件所在的窗体具有焦点时的InputMap（WHEN_IN_FOCUSED_WINDOW）（括号内表示为了得到这些InputMap，应该在getInputMap中设置的参数）。以下分别说明这三种InputMap：
<p style="text-indent: 2em">1. 组件本身拥有焦点时的InputMap：当组件拥有焦点时，键盘按键按下，则java在这个InputMap中查找键盘事件所对应的KeyStroke对象。
<p style="text-indent: 2em">2. 组件的祖先拥有焦点时的InputMap：当组件的祖先拥有焦点时，键盘按键按下，则java查找这个InputMap。
<p style="text-indent: 2em">3. 组件所在的窗口拥有焦点时的InputMap：当组件所在的窗口具有焦点时，键盘按键按下，则java查找这个InputMap。
<p style="text-indent: 2em">当一个键被按下，这个事件被转化成一个KeyStroke对象，java会查找这个Jcomponent的相应InputMap（例如，当组件的祖先具有焦点时，java就查找这个Jcomponent的祖先拥有焦点的InputMap）中是否有这个KeyStroke，如果有，取出它所对应的对象（通常是字符串），利用这个对象在这个Jcomponent的ActionMap中查找，如果找到对应的行为（Action），则java执行这个行为的actionPerformed方法（随后介绍这个方法）。从而达到处理键盘事件的目的。
<p style="text-indent: 2em">每一个InputMap可以具有parent属性，这个属性的值是一个InputMap。当在一个InputMap中查找不到键盘事件的KeyStroke时，java会自动在它的parent属性指定的InputMap中查找，依次向上查找，直至找到。使用parent的好处是：当有一些固定的，不希望用户进行改动的键盘映射可以存放在parent属性所指定的InputMap中，从而避免被意外修改；另外可以将多个Jcomponent的缺省InputMap设置具有相同的parent，使得可以共享一些键盘绑定的设置。可以通过InputMap类的setparent()方法设置它的parent属性。ActionMap也具有相同的parent属性，使用方法也相同。
<p style="text-indent: 2em">以上是如何将一个键盘事件对应到一个行为，以下就简单介绍行为（Action）。
<p style="text-indent: 2em">行为是一个实现了Action接口的类。在Action接口中定义了7个方法。其中最关键的是actionPerformed()方法。这个方法描述了这个行为的具体操作过程。其他几个方法包括setEnabled，isEnabled，putValue，getValue，addPropertyChangeListener，和removePropertyChangeListener方法。他们分别用来设置行为是否可用、判断行为可用的状态、设置和取得行为的一些属性，最后两个方法用来允许其他对象在行动对象的属性发生变化后得到通知。
<p style="text-indent: 2em">通常我们使用一个实现了Action接口的大部分方法的抽象类AbstractAction类作为基类，重载actionPerformed方法以实现我们的行为。
<p style="text-indent: 2em">我们用一个例子来具体说明如何进行实际的操作。
<p style="text-indent: 2em">首先编写一个具体的行为，对指定的键盘事件进行处理：
<p style="text-indent: 2em">
<center><ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>public class TextAction extends AbstractAction
            {
            　private String a;
            　public TextAction(String a)
            　{ this.a = a; }
            　　public void actionPerformed(ActionEvent parm1)
            　　{
            　　　String b = parm1.getActionCommand(); //得到行为的命令字符串
            　　　System.out.println("command="+b);
            　　　System.out.println("prompt="+this.a);
            　　}
            　}</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="text-indent: 2em">建立四个TextAction对象：
<p style="text-indent: 2em">TextAction whenFocusSon = new TextAction("focus son");
<p style="text-indent: 2em">TextAction whenFocusFather = new TextAction("focus father");
<p style="text-indent: 2em">TextAction window = new TextAction("window");
<p style="text-indent: 2em">TextAction ancestor = new TextAction("ancestor");
<p style="text-indent: 2em">随后，在一个窗体中加入两个面板，名为sonPanel和parentPanel，使得parentPanel是sonPanel的祖先。并在sonPanel中加入一个名为son的button，在parentPanel中加入名为parent的button。在fatherPanel外加入几个button。
<p style="text-indent: 2em">得到son组件的三个InputMap，并创建一个名为focusFatherIm的InputMap，使得这个InputMap成为focusIm的parent：
<p style="text-indent: 2em">
<center><ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>//get default inputMap (when focus inputmap) and set a parent InputMap
            focusIm = son.getInputMap();
            focusFatherIm = new InputMap();
            focusIm.setParent(focusFatherIm);
            //get WHEN_ANCESTOR_OF_FOCUSED_COMPONENT inputMap
            ancestorIm = son.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
            //get WHEN_IN_FOCUSED_WINDOW inputMap
            windowIm = son.getInputMap(WHEN_IN_FOCUSED_WINDOW);
            //在这些InputMap中分别加入键盘绑定：
            focusIm.put(KeyStroke.getKeyStroke('f'),"actionFocusSon");
            focusFatherIm.put(KeyStroke.getKeyStroke('F'),"actionFocusFather");
            ancestorIm.put(KeyStroke.getKeyStroke('a'),"actionAncestor");
            windowIm.put(KeyStroke.getKeyStroke('w'),"actionWindow");
            //得到son组件的缺省的ActionMap，并将已经建立的行为与特定的对象（字符串）进行绑定：
            am = son.getActionMap();
            am.put("actionFocusSon",whenFocusSon);
            am.put("actionFocusFather",whenFocusFather);
            am.put("actionAncestor",ancestor);
            am.put("actionWindow",window);</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center>
<p style="text-indent: 2em">运行程序及其相应结果：
<p style="text-indent: 2em">1. 单击son按钮，这时如果按下'f'，'F'，'a'，'w'，程序均会有相应的输出。这是因为，此时的焦点在son按钮上，而son按钮组件的三个InputMap都是有效的。所以他们对应的事件都会发生。
<p style="text-indent: 2em">2. 单击parent按钮，这时按下'w'，程序会有相应的输出。而按下'f'，'F'，'a'，程序没有反应。这是因为parent按钮具有焦点，这个按钮不是son按钮的祖先，而son所在的窗口具有焦点，所以只有组件所在窗口具有焦点的InputMap是有效的。
<p style="text-indent: 2em">3. 单击其他的按钮（parentPanel外的按钮），这时按下'w'，程序会有相应的输出。而按下'f'，'F'，'a'，程序没有反应。这是因为这些按钮具有焦点，他们不是son按钮的祖先，而son所在的窗口具有焦点，所以只有组件所在窗口具有焦点的InputMap是有效的。
<p style="text-indent: 2em">附：主要程序代码：
<p style="text-indent: 2em">
<center><ccid_nobr>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" style="font-size: 9pt" bgcolor="#e6e6e6">
            <pre><ccid_code>import java.awt.*;
            import javax.swing.*;
            import com.borland.jbcl.layout.*;
            import java.awt.event.ActionEvent;
            import java.awt.event.ActionListener;
            import com.sun.java.swing.plaf.motif.*;
            public class EventPanel extends JPanel implements ActionListener
            {
            　JButton btnYellow = new JButton();
            　JButton btnBlue = new JButton();
            　JButton btnRed = new JButton();
            　JPanel parentPanel = new JPanel();
            　JPanel sonPanel = new JPanel();
            　XYLayout xYLayout1 = new XYLayout();
            　JButton son = new JButton();
            　JButton parent = new JButton();
            　public EventPanel()
            　{
            　　try{
            　　　jbInit();
            　　}catch(Exception ex)
            　　{ ex.printStackTrace(); }
            　　}
            　void jbInit() throws Exception
            　{
            　　btnYellow.setText("Yellow");
            　　btnYellow.setBounds(new Rectangle(35, 23, 97, 29));
            　　this.setLayout(null);
            　　btnBlue.setBounds(new Rectangle(154, 21, 97, 29));
            　　btnBlue.setText("Blue");
            　　btnRed.setBounds(new Rectangle(272, 24, 97, 29));
            　　btnRed.setText("Red");
            　　parentPanel.setBorder(BorderFactory.createRaisedBevelBorder());
            　　parentPanel.setBounds(new Rectangle(27, 68, 358, 227));
            　　parentPanel.setLayout(xYLayout1);
            　　sonPanel.setBorder(BorderFactory.createLoweredBevelBorder());
            　　son.setText("son");
            　　parent.setText("parent");
            　　this.add(btnYellow, null);
            　　this.add(btnBlue, null);
            　　this.add(btnRed, null);
            　　this.add(parentPanel, null);
            　　parentPanel.add(sonPanel, new XYConstraints(58, 22, 229, 125));
            　　sonPanel.add(son, null);
            　　parentPanel.add(parent, new XYConstraints(150, 167, -1, -1));
            　　btnYellow.addActionListener(this);
            　　btnRed.addActionListener(this);
            　　btnBlue.addActionListener(this);
            　　InputMap focusIm,focusFatherIm,ancestorIm,windowIm;
            　　ActionMap am;
            　　//create four TextAction for diff purpose
            　　TextAction whenFocusSon = new TextAction("focus son");
            　　TextAction whenFocusFather = new TextAction("focus father");
            　　TextAction window = new TextAction("window");
            　　TextAction ancestor = new TextAction("ancestor");
            　　//get default inputMap (when focus inputmap) and set a parent InputMap
            　　focusIm = son.getInputMap();
            　　focusFatherIm = new InputMap();
            　　focusIm.setParent(focusFatherIm);
            　　//get WHEN_ANCESTOR_OF_FOCUSED_COMPONENT inputMap
            　　ancestorIm = son.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
            　　//get WHEN_IN_FOCUSED_WINDOW inputMap
            　　windowIm = son.getInputMap(WHEN_IN_FOCUSED_WINDOW);
            　　//put the keyStroke to the InputMap
            　　focusIm.put(KeyStroke.getKeyStroke('f'),"actionFocusSon");
            　　focusFatherIm.put(KeyStroke.getKeyStroke('F'),"actionFocusFather");
            　　ancestorIm.put(KeyStroke.getKeyStroke('a'),"actionAncestor");
            　　windowIm.put(KeyStroke.getKeyStroke('w'),"actionWindow");
            　　//get the actionMap
            　　am = son.getActionMap();
            　　am.put("actionFocusSon",whenFocusSon);
            　　am.put("actionFocusFather",whenFocusFather);
            　　am.put("actionAncestor",ancestor);
            　　am.put("actionWindow",window);
            　}
            　public void actionPerformed(ActionEvent e)
            　{
            　　//this code is used to change the backgracolor
            　　Object source=e.getSource();
            　　Color color=null;//=getBackground();
            　　if (source==btnYellow) color=Color.yellow;
            　　else if (source==btnRed) color = Color.red;
            　　else if (source == btnBlue) color = Color.blue;
            　　setBackground(color);
            　　repaint();
            　}
            }</ccid_code></pre>
            </td>
        </tr>
    </tbody>
</table>
</ccid_nobr></center></div>
<script type="text/javascript"><!-- google_ad_client="pub-8580786230834296" ; google_ad_width="728;
google_ad_height" = 90; google_ad_format="728x90_as" ; google_ad_type="text_image" ; google_ad_channel="" ; google_color_border="FFFFFF" ; google_color_bg="FFFFFF" ; google_color_link="000000" ; google_color_text="000000" ; google_color_url="000000" ;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
<img src ="http://www.blogjava.net/lcs/aggbug/160737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-15 13:52 <a href="http://www.blogjava.net/lcs/archive/2007/11/15/160737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用 Java 的 Properties 类读取配置文件信息（转）</title><link>http://www.blogjava.net/lcs/archive/2007/11/12/159956.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Mon, 12 Nov 2007 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/12/159956.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/159956.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/12/159956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/159956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/159956.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 利用 Java 的 Properties 类读取配置文件信息 &nbsp; 在我们平时写程序的时候，有些参数是经常改变的，而这种改变不是我们预知的。比如说我们开发了一个操作数据库的模块，在开发的时候我们连接本地的数据库那么 IP ，数据库名称，表名称，数据库主机等信息是我们本地的，要使得这个操作数据的模块具有通用性，那么以上信息就不能写死在程序里。通常我们的做法是用配置文件来解决。 &...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2007/11/12/159956.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/159956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-12 14:07 <a href="http://www.blogjava.net/lcs/archive/2007/11/12/159956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程编程——实战篇</title><link>http://www.blogjava.net/lcs/archive/2007/11/09/159351.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 09 Nov 2007 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/09/159351.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/159351.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/09/159351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/159351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/159351.html</trackback:ping><description><![CDATA[<span class="h1b">多线程编程——实战篇(一)<br />
<br />
</span>时间：2006-09-12<br />
作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />
<br />
在进入实战篇以前,我们简单说一下多线程编程的一般原则。
<p>　　<strong>[安全性]</strong>是多线程编程的首要原则，如果两个以上的线程访问同一对象时，一个线程会损坏另一个线程的数据，这就是违反了安全性原则，这样的程序是不能进入实际应用的。</p>
<p>　　安全性的保证可以通过设计安全的类和程序员的手工控制。如果多个线程对同一对象访问不会危及安全性，这样的类就是线程安全的类，在JAVA中比如String类就被设计为线程安全的类。而如果不是线程安全的类，那么就需要程序员在访问这些类的实例时手工控制它的安全性。</p>
<p>　　<strong>[可行性]</strong>是多线程编程的另一个重要原则，如果仅仅实现了安全性，程序却在某一点后不能继续执行或者多个线程发生死锁，那么这样的程序也不能作为真正的多线程程序来应用。</p>
<p>　　相对而言安全性和可行性是相互抵触的，安全性越高的程序，可性行会越低。要综合平衡。</p>
<p>　　<strong>[高性能]</strong>&nbsp;多线程的目的本来就是为了增加程序运行的性能，如果一个多线程完成的工作还不如单线程完成得快。那就不要应用多线程了。</p>
<p>　　高性能程序主要有以下几个方面的因素：</p>
<p>　　<strong>数据吞吐率</strong>，在一定的时间内所能完成的处理能力。</p>
<p>　　<strong>响应速度</strong>，从发出请求到收到响应的时间。</p>
<p>　　<strong>容量</strong>，指同时处理雅致同任务的数量。</p>
<p>　　安全性和可行性是必要条件，如果达到不这两个原则那就不能称为真正的多线程程序。而高性是多线程编程的目的，也可以说是充要条件。否则，为什么采用多线程编程呢？</p>
<p>&nbsp;</p>
<p><strong>[生产者与消费者模式]</strong></p>
<p>　　首先以一个生产者和消费者模式来进入实战篇的第一节。</p>
<p>　　生产者和消费者模式中保护的是谁？</p>
<p>　　多线程编程都在保护着某些对象，这些个对象是"紧俏资源"，要被最大限度地利用，这也是采用多线程方式的理由。在生产者消费者模式中，我们要保护的是"仓库"，在我下面的这个例子中，</p>
<p>就是桌子(table)。</p>
<p>　　我这个例子的模式完全是生产者-消费者模式，但我换了个名字。厨师-食客模式，这个食堂中只有1张桌子，同时最多放10个盘子，现在有4个厨师做菜，每做好一盘就往桌子上放(生产者将产品往仓库中放)，而有6个食客不停地吃(消费者消费产品，为了说明问题，他们的食量是无限的)。</p>
<p>　　一般而言，厨师200-400ms做出一盘菜，而食客要400-600ms吃完一盘。当桌子上放满了10个盘子后，所有厨师都不能再往桌子上放，而当桌子是没有盘子时，所有的食客都只好等待。</p>
<p>　　下面我们来设计这个程序：</p>
<p>　　因为我们不知道具体是什么菜，所以叫它food：</p>
<pre class="code"> class Food{}
</pre>
<p>　　然后是桌子，因为它要有序地放而且要有序地取(不能两个食客同时争取第三盘菜)，所以我们扩展LinkedList，或者你用聚合把一个LinkedList作为属性也能达到同样的目的，例子中我是用</p>
<p>继承，从构造方法中传入一个可以放置的最大值。</p>
<pre class="code">class Table extends java.util.LinkedList{
int maxSize;
public Table(int maxSize){
this.maxSize = maxSize;
}
}
</pre>
<p>现在我们要为它加两个方法，一是厨师往上面放菜的方法，一是食客从桌子上拿菜的方法。</p>
<p><strong>放菜</strong>：因为一张桌子由多个厨师放菜，所以厨师放菜的要被同步，如果桌子上已经有十盘菜了。所有厨师就要等待：</p>
<pre class="code"> public synchronized void putFood(Food f){
while(this.size() &gt;= this.maxSize){
try{
this.wait();
}catch(Exception e){}
}
this.add(f);
notifyAll();
}
</pre>
<p><strong>拿菜</strong>：同上面，如果桌子上一盘菜也没有，所有食客都要等待：</p>
<pre class="code"> public synchronized Food getFood(){
while(this.size() &lt;= 0){
try{
this.wait();
}catch(Exception e){}
}
Food f = (Food)this.removeFirst();
notifyAll();
return f;
}
</pre>
<p>厨师类：</p>
<p>　　由于多个厨师要往一张桌子上放菜，所以他们要操作的桌子应该是同一个对象，我们从构造方法中将桌子对象传进去以便控制在主线程中只产生一张桌子。</p>
<p>厨师做菜要用一定的时候，我用在make方法中用sleep表示他要消耗和时候，用200加上200的随机数保证时间有200-400ms中。做好后就要往桌子上放。</p>
<p>这里有一个非常重要的问题一定要注意，就是对什么范围同步的问题，因为产生竞争的是桌子，所以所有putFood是同步的，而我们不能把厨师自己做菜的时间也放在同步中，因为做菜是各自做的。同样食客吃菜的时候也不应该同步，只有从桌子中取菜的时候是竞争的，而具体吃的时候是各自在吃。所以厨师类的代码如下：</p>
<pre class="code"> class Chef extends Thread{
Table t;
Random r = new Random(12345);
public Chef(Table t){
this.t = t;
}
public void run(){
while(true){
Food f = make();
t.putFood(f);
}
}
private Food make(){
try{
Thread.sleep(200+r.nextInt(200));
}catch(Exception e){}
return new Food();
}
}
</pre>
<p>同理我们产生食客类的代码如下：</p>
<pre class="code">class Eater extends Thread{
Table t;
Random r = new Random(54321);
public Eater(Table t){
this.t = t;
}
public void run(){
while(true){
Food f = t.getFood();
eat(f);
}
}
private void eat(Food f){
try{
Thread.sleep(400+r.nextInt(200));
}catch(Exception e){}
}
}
</pre>
<p>完整的程序在这儿：</p>
<pre class="code">package debug;
import java.util.regex.*;
import java.util.*;
class Food{}
class Table extends LinkedList{
int maxSize;
public Table(int maxSize){
this.maxSize = maxSize;
}
public synchronized void putFood(Food f){
while(this.size() &gt;= this.maxSize){
try{
this.wait();
}catch(Exception e){}
}
this.add(f);
notifyAll();
}
public synchronized Food getFood(){
while(this.size() &lt;= 0){
try{
this.wait();
}catch(Exception e){}
}
Food f = (Food)this.removeFirst();
notifyAll();
return f;
}
}
class Chef extends Thread{
Table t;
String name;
Random r = new Random(12345);
public Chef(String name,Table t){
this.t = t;
this.name = name;
}
public void run(){
while(true){
Food f = make();
System.out.println(name+" put a Food:"+f);
t.putFood(f);
}
}
private Food make(){
try{
Thread.sleep(200+r.nextInt(200));
}catch(Exception e){}
return new Food();
}
}
class Eater extends Thread{
Table t;
String name;
Random r = new Random(54321);
public Eater(String name,Table t){
this.t = t;
this.name = name;
}
public void run(){
while(true){
Food f = t.getFood();
System.out.println(name+" get a Food:"+f);
eat(f);
}
}
private void eat(Food f){
try{
Thread.sleep(400+r.nextInt(200));
}catch(Exception e){}
}
}
public class Test {
public static void main(String[] args) throws Exception{
Table t = new Table(10);
new Chef("Chef1",t).start();
new Chef("Chef2",t).start();
new Chef("Chef3",t).start();
new Chef("Chef4",t).start();
new Eater("Eater1",t).start();
new Eater("Eater2",t).start();
new Eater("Eater3",t).start();
new Eater("Eater4",t).start();
new Eater("Eater5",t).start();
new Eater("Eater6",t).start();
}
}
</pre>
<p>&nbsp;</p>
<p>这一个例子中，我们主要关注以下几个方面：</p>
<p>　　1.同步方法要保护的对象，本例中是保护桌子，不能同时往上放菜或同时取菜。</p>
<p>　　假如我们把putFood方法和getFood方法在厨师类和食客类中实现，那么我们应该如此：</p>
<p>(以putFood为例)</p>
<pre class="code">class Chef extends Thread{
Table t;
String name;
public Chef(String name,Table t){
this.t = t;
this.name = name;
}
public void run(){
while(true){
Food f = make();
System.out.println(name+" put a Food:"+f);
putFood(f);
}
}
private Food make(){
Random r = new Random(200);
try{
Thread.sleep(200+r.nextInt());
}catch(Exception e){}
return new Food();
}
public void putFood(Food f){//方法本身不能同步,因为它同步的是this.即Chef的实例
synchronized (t) {//要保护的是t
while (t.size() &gt;= t.maxSize) {
try {
t.wait();
}
catch (Exception e) {}
}
t.add(f);
t.notifyAll();
}
}
}
</pre>
<p>　　2.同步的范围，在本例中是放和取两个方法，不能把做菜和吃菜这种各自不相干的工作放在受保护的范围中。</p>
<p>　　3.参与者与容积比</p>
<p>　　&nbsp;对于生产者和消费者的比例，以及桌子所能放置最多菜的数量三者之间的关系是影响性能的重要因素，如果是过多的生产者在等待，则要增加消费者或减少生产者的数据，反之则增加生产者或减少消费者的数量。</p>
<p>　　另外如果桌子有足够的容量可以很大程序提升性能，这种情况下可以同时提高生产者和消费者的数量，但足够大的容时往往你要有足够大的物理内存。</p>
<br />
=========================================================================<br />
<span class="h1b">多线程编程——实战篇(二)</span><br />
<br />
时间：2006-11-21<br />
作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />
<br />
本节继续上一节的讨论。
<p>　　<strong>[一个线程在进入对象的休息室(调用该对象的wait()方法)后会释放对该对象的锁]</strong>，基于这个原因。在同步中，除非必要，否则你不应用使用Thread.sleep(long&nbsp;l)方法，因为sleep方法并不释放对象的锁。</p>
<p>　　这是一个极其恶劣的品德，你自己什么事也不干，进入sleep状态，却抓住竞争对象的监视锁不让其它需要该对象监视锁的线程运行，简单说是极端自私的一种行为。但我看到过很多程序员仍然有在同步方法中调用sleep的代码。</p>
<p>　　看下面的例子：</p>
<pre class="code">package debug;
class SleepTest{
public synchronized void wantSleep(){
try{
Thread.sleep(1000*60);
}catch(Exception e){}
System.out.println("111");
}
public synchronized void say(){
System.out.println("123");
}
}
class T1 extends Thread{
SleepTest st;
public T1(SleepTest st){
this.st = st;
}
public void run(){
st.wantSleep();
}
}
class T2 extends Thread{
SleepTest st;
public T2(SleepTest st){
this.st = st;
}
public void run(){
st.say();
}
}
public class Test {
public static void main(String[] args) throws Exception{
SleepTest st = new SleepTest();
new T1(st).start();
new T2(st).start();
}
}
</pre>
<p>　　我们看到，线程T1的实例运行后，当前线程抓住了st实例的锁，然后进入了sleep。直到它睡满60秒后才运行到System.out.println("111");然后run方法运行完成释放了对st的监视锁，线程T2的实例才得到运行的机会。</p>
<p>　　而如果我们把wantSleep方法改成：</p>
<pre class="code">  public synchronized void wantSleep(){
try{
//Thread.sleep(1000*60);
this.wait(1000*60);
}catch(Exception e){}
System.out.println("111");
}
</pre>
<p>　　我们看到，T2的实例所在的线程立即就得到了运行机会，首先打印了123，而T1的实例所在的线程仍然等待，直到等待60秒后运行到System.out.println("111");方法。</p>
<p>　　所以，调用wait(long&nbsp;l)方法不仅达到了阻塞当前线程规定时间内不运行，而且让其它有竞争需求的线程有了运行机会，这种利人不损己的方法，何乐而不为？这也是一个有良心的程序员应该遵循的原则。</p>
<p>　　当一个线程调用wait(long&nbsp;l)方法后，线程如果继续运行，你无法知道它是等待时间完成了还是在wait时被其它线程唤醒了，如果你非常在意它一定要等待足够的时间才执行某任务，而不希望是中途被唤醒，这里有一个不是非常准确的方法：</p>
<pre class="code"> long l = System.System.currentTimeMillis();
wait(1000);//准备让当前线程等待1秒
while((System.System.currentTimeMillis() - l) &lt; 1000)//执行到这里说明它还没有等待到1秒
//是让其它线程给闹醒了
wait(1000-(System.System.currentTimeMillis()-l));//继续等待余下的时间.
</pre>
<p>　　这种方法不是很准确，但基本上能达到目的。</p>
<p>　　所以在同步方法中，除非你明确知道自己在干什么，非要这么做的话，你没有理由使用sleep，wait方法足够达到你想要的目的。而如果你是一个很保守的人，看到上面这段话后，你对sleep方法深恶痛绝，坚决不用sleep了，那么在非同步的方法中(没有和其它线程竞争的对象)，你想让当前线程阻塞一定时间后再运行，应该如何做呢？(这完全是一种卖弄，在非同步的方法中你就应该合理地应用sleep嘛，但如果你坚决不用sleep，那就这样来做吧)</p>
<pre class="code">    public static mySleep(long l){
Object o = new Object();
synchronized(o){
try{
o.wait(l);
}catch(Exception e){}
}
}
</pre>
<p>　　放心吧，没有人能在这个方法外调用o.notify[All]，所以o.wait(l)会一直等到设定的时间才会运行完成。</p>
<h3>[虚拟锁的使用]</h3>
<p>　　虚拟锁简单说就是不要调用synchronized方法(它等同于synchronized(this))和不要调用synchronized(this)，这样所有调用在这个实例上的所有同步方法的线程只能有一个线程可以运行。也就是说：</p>
<p>　　如果一个类有两个同步方法&nbsp;m1，m2，那么不仅是两个以上线调用m1方法的线程只有一个能运行，就是两个分别调用m1，m2的线程也只有一个能运行。当然非同步方法不存在任何竞争，在一个线程获取该对象的监视锁后这个对象的非同步方法可以被任何线程调用。</p>
<p>　　而大多数时候，我们可能会出现这种情况，多个线程调用m1时需要保护一种资源，而多个线程调用M2时要保护的是另一种资源，如果我们把m1,m2都设成同步方法。两个分别调用这两个方法的线程其实并不产生冲突，但它们都要获取这个实例的锁(同步方法是同步this)而产生了不必要竞争。</p>
<p>　　所以这里应该采用虚拟锁。</p>
<p>　　即将m1和m2方法中各自保护的对象作为属性a1,a2传进来，然后将同步方法改为方法的同步块分别以a1,a2为参数，这样到少是不同线程调用这两个不同方法时不会产生竞争，当然如果m1,m2方法都操作同一受保护对象则两个方法还是应该作为同步方法。这也是应该将方法同步还是采用同步块的理由之一。</p>
<pre class="code">package debug;
class SleepTest{
public synchronized void m1(){
System.out.println("111");
try{
Thread.sleep(10000);
}catch(Exception e){}
}
public synchronized void m2(){
System.out.println("123");
}
}
class T1 extends Thread{
SleepTest st;
public T1(SleepTest st){
this.st = st;
}
public void run(){
st.m1();
}
}
class T2 extends Thread{
SleepTest st;
public T2(SleepTest st){
this.st = st;
}
public void run(){
st.m2();
}
}
public class Test {
public static void main(String[] args) throws Exception{
SleepTest st = new SleepTest();
new T1(st).start();
new T2(st).start();
}
}
</pre>
<p>　　这个例子可以看到两个线程分别调用st实例的m1和m2方法却因为都要获取st的监视锁而产生了竞争。T2实例要在T1运行完成后才能运行(间隔了10秒)。而假设m1方法要操作操作一个文件&nbsp;f1，m2方法要操作一个文件f2，当然我们可以在方法中分别同步f1,f2，但现在还不知道f2,f2是否存在，如果不存在我们就同步了一个null对象，那么我们可以使用虚拟锁：</p>
<pre class="code">package debug;
class SleepTest{
String vLock1 = "vLock1";
String vLock2 = "vLock2";
public void m1(){
synchronized(vLock1){
System.out.println("111");
try {
Thread.sleep(10000);
}
catch (Exception e) {}
//操作f1
}
}
public void m2(){
synchronized(vLock2){
System.out.println("123");
//操作f2
}
}
}
class T1 extends Thread{
SleepTest st;
public T1(SleepTest st){
this.st = st;
}
public void run(){
st.m1();
}
}
class T2 extends Thread{
SleepTest st;
public T2(SleepTest st){
this.st = st;
}
public void run(){
st.m2();
}
}
public class Test {
public static void main(String[] args) throws Exception{
SleepTest st = new SleepTest();
new T1(st).start();
new T2(st).start();
}
}
</pre>
<p>　　我们看到两个分别调用m1和m2的线程由于它们获取不同对象的监视锁，它们没有任何竞争就正常运行，只有这两个线程同时调用m1或m2才会产生阻塞。 </p>
<br />
<br />
=========================================================================<br />
<span class="h1b">多线程编程——实战篇(三)</span><br />
<br />
时间：2006-12-28<br />
作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />
<br />
<h3>[深入了解线程对象与线程,线程与运行环境]</h3>
<p>　　在基础篇中的第一节，我就强调过，要了解多线程编程，首要的两个概念就是线程对象和线程。现在我们来深入理解线程对象，线程，运行环境之间的关系，弄清Runnable与Thread的作用。</p>
<p>&nbsp;</p>
<p>　　在JAVA平台中，序列化机制是一个非常重要的机制，如果不能理解并熟练应用序列化机制，你就不能称得上一个java程序员。</p>
<p>　　在JAVA平台中，为什么有些对象中可序列化的，而有些对象就不能序列化？</p>
<p>　　能序列化的对象，简单说是一种可以复制(意味着可以按一定机制进行重构它)的对象，这种对象说到底就是内存中一些数据的组合。只要按一定位置和顺序组合就能完整反映这个对象。</p>
<p>　　而有些对象，是和当前环境相关的，它反映了当前运行的环境和时序，所以不能被序列，否则在另外的环境和时序中就无法&#8220;还原&#8221;。</p>
<p>　　比如，一个Socket对象：</p>
<pre class="code">Socket&nbsp;sc&nbsp;=&nbsp;new&nbsp;Socket("111.111.111.111",80);</pre>
<p>　　这个sc对象表示当前正在运行这段代码的主机和IP为"111.111.111.111"的80端口之间建立的一个物理连结，如果它被序列化，那么在另一个时刻在另一个主机上它如何能被还原？Socket连结一旦断开，就已经不存在，它不可能在另一个时间被另一个主机所重现。重现的已经不是原来那个sc对象了。</p>
<p>　　线程对象也是这种不可序列化对象，当我们new&nbsp;Thread时，已经初始化了当前这个线程对象所在有主机的运行环境相关的信息，线程调度机制，安全机制等只特定于当前运行环境的信息，假如它被序列化，在另一个环境中运行的时候原来初始化的运行环境的信息就不可能在新的环境中运行。而假如要重新初始化，那它已经不是原来那个线程对象了。</p>
<p>　　正如Socket封装了两个主机之间的连结，但它们并不是已经连结关传送数据了。要想传送数据，你还要getInputStream和getOutputStream，并read和write，两台主机之间才开始真正的&#8220;数据连结&#8221;。</p>
<p>　　一个Thread对象并建立后，只是有了可以"运行"的令牌，仅仅只是一个"线程对象"。只有当它调用start()后，当前环境才会分配给它一个运行的"空间"，让这段代码开始运行。这个运行的"空间"，才叫真正的"线程"。也就是说，真正的线程是指当前正在执行的那一个"事件"。是那个线程对象所在的运行环境。</p>
<p>　　明白了上面的概念，我们再来看看JAVA中为什么要有Runnable对象和Thread对象。</p>
<p>　　一、从设计技巧上说，JAVA中为了实现回调，无法调用方法指针，那么利用接口来约束实现者强制提供匹配的方法，并将实现该接口的类的实例作为参数来提供给调用者，这是JAVA平台实现回调的重要手段。</p>
<p>　　二、但是从实际的操作来看，对于算法和数据，是不依赖于任何环境的。所以把想要实现的操作中的算法和数据封装到一个run方法中(由于算法本身是数据的一个部分，所以我把它们合并称为数据)，可以将离数据和环境的逻辑分离开来。使程序员只关心如何实现我想做的操作，而不要关心它所在的环境。当真正的需要运行的时候再将这段"操作"传给一个具体当前环境的Thread对象。</p>
<p>　　三、这是最最重要的原因：<strong>实现数据共享</strong></p>
<p>　　因为一个线程对象不对多次运行。所以把数据放在Thread对象中，不会被多个线程同时访问。简单说：</p>
<pre class="code">    class T extends Thread{
Object x;
public void run(){//......;}
}
T t = new T();
</pre>
<p>　　当T的实例t运行后，t所包含的数据x只能被一个t.start();对象共享，除非声明成&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;Object&nbsp;x;</p>
<p>　　一个t的实例数据只能被一个线程访问。意思是"一个数据实例对应一个线程"。</p>
<p>　　而假如我们从外部传入数据，比如</p>
<pre class="code">  class T extends Thread{
private Object x;
public T(Object x){
this.x = x;
}
public void run(){//......;}
}
</pre>
<p>　　这样我们就可以先生成一个x对象传给多个Thread对象，多个线程共同操作一个数据。也就是"一个数据实例对应多个线程"。</p>
<p>　　现在我们把数据更好地组织一下，把要操作的数据Object&nbsp;x和要进行的操作一个封装到Runnable的run()方法中，把Runnable实例从外部传给多个Thread对象。这样，我们就有了：</p>
<p>　　[一个对象的多个线程]</p>
<p>　　这是以后我们要介绍的线程池的重要概念。</p>
<br />
========================================================================<br />
<span class="h1b">多线程编程——实战篇（四）</span><br />
<br />
时间：2007-02-08<br />
作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />
<br />
<br />
不客气地说，至少有一半人认为，线程的&#8220;中断&#8221;就是让线程停止。如果你也这么认为，那你对多线程编程还没有入门。
<p>　　在java中，线程的中断(interrupt)只是改变了线程的中断状态，至于这个中断状态改变后带来的结果，那是无法确定的，有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行，反而是继续执行线程的手段。</p>
<p>　　对于执行一般逻辑的线程，如果调用它的interrupt()方法，那么对这个线程没有任何影响，比如线程a正在执行：while(条件)&nbsp;x&nbsp;++;这样的语句，如果其它线程调用a.interrupt();那么并不会影响a对象上运行的线程，如果在其它线程里测试a的中断状态它已经改变，但并不会停止这个线程的运行。在一个线程对象上调用interrupt()方法，真正有影响的是wait,join,sleep方法，当然这三个方法包括它们的重载方法。</p>
<p>　　请注意：<strong>[上面这三个方法都会抛出InterruptedException]</strong>，记住这句话，下面我会重复。一个线程在调用interrupt()后，自己不会抛出InterruptedException异常，所以你看到interrupt()并没有抛出这个异常，所以我上面说如果线程a正在执行while(条件)&nbsp;x&nbsp;++;你调用a.interrupt();后线程会继续正常地执行下去。</p>
<p>　　但是，如果一个线程被调用了interrupt()后，它的状态是已中断的。这个状态对于正在执行wait,join,sleep的线程，却改变了线程的运行结果。</p>
<p>　　一、对于wait中等待notify/notifyAll唤醒的线程，其实这个线程已经&#8220;暂停&#8221;执行，因为它正在某一对象的休息室中，这时如果它的中断状态被改变，那么它就会抛出异常。这个InterruptedException异常不是线程抛出的，而是wait方法，也就是对象的wait方法内部会不断检查在此对象上休息的线程的状态，如果发现哪个线程的状态被置为已中断，则会抛出InterruptedException，意思就是这个线程不能再等待了，其意义就等同于唤醒它了。</p>
<p>　　这里唯一的区别是，被notify/All唤醒的线程会继续执行wait下面的语句，而在wait中被中断的线程则将控制权交给了catch语句。一些正常的逻辑要被放到catch中来运行。但有时这是唯一手段，比如一个线程a在某一对象b的wait中等待唤醒，其它线程必须获取到对象b的监视锁才能调用b.notify()[All]，否则你就无法唤醒线程a，但在任何线程中可以无条件地调用a.interrupt();来达到这个目的。只是唤醒后的逻辑你要放在catch中，当然同notify/All一样，继续执行a线程的条件还是要等拿到b对象的监视锁。</p>
<p>　　二、对于sleep中的线程，如果你调用了Thread.sleep(一年);现在你后悔了，想让它早些醒过来，调用interrupt()方法就是唯一手段，只有改变它的中断状态，让它从sleep中将控制权转到处理异常的catch语句中，然后再由catch中的处理转换到正常的逻辑。同样地，于join中的线程你也可以这样处理。</p>
<p>　　对于一般介绍多线程模式的书上，他们会这样来介绍：当一个线程被中断后，在进入wait,sleep,join方法时会抛出异常。是的，这一点也没有错，但是这有什么意义呢？如果你知道那个线程的状态已经处于中断状态，为什么还要让它进入这三个方法呢？当然有时是必须这么做的，但大多数时候没有这么做的理由，所以我上面主要介绍了在已经调用这三个方法的线程上调用interrupt()方法让它从"暂停"状态中恢复过来。这个恢复过来就可以包含两个目的：</p>
<p>　　一、<strong>[可以使线程继续执行]</strong>，那就是在catch语句中招待醒来后的逻辑，或由catch语句转回正常的逻辑。总之它是从wait,sleep,join的暂停状态活过来了。</p>
<p>　　二、<strong>[可以直接停止线程的运行]</strong>，当然在catch中什么也不处理，或return，那么就完成了当前线程的使命，可以使在上面&#8220;暂停&#8221;的状态中立即真正的&#8220;停止&#8221;。</p>
<p>　　<strong>中断线程</strong></p>
<p>　　有了上一节[线程的中断]，我们就好进行如何[中断线程]了。这绝对不是玩一个文字游戏。是因为&#8220;线程的中断&#8221;并不能保证&#8220;中断线程&#8221;，所以我要特别地分为两节来说明。这里说的&#8220;中断线程&#8221;意思是&#8220;停止线程&#8221;，而为什么不用&#8220;停止线程&#8221;这个说法呢？因为线程有一个明确的stop方法，但它是反对使用的，所以请大家记住，在java中以后不要提停止线程这个说法，忘记它！但是，作为介绍线程知识的我，我仍然要告诉你为什么不用&#8220;停止线程&#8221;的理由。</p>
<p>　　<strong>[停止线程]</strong></p>
<p>　　当在一个线程对象上调用stop()方法时，这个线程对象所运行的线程就会立即停止，并抛出特殊的ThreadDeath()异常。这里的&#8220;立即&#8221;因为太&#8220;立即&#8221;了，就象一个正在摆弄自己的玩具的孩子，听到大人说快去睡觉去，就放着满地的玩具立即睡觉去了。这样的孩子是不乖的。</p>
<p>　　假如一个线程正在执行：</p>
<pre class="code">synchronized void {
x = 3;
y = 4;
}
</pre>
<p>　　由于方法是同步的，多个线程访问时总能保证x,y被同时赋值，而如果一个线程正在执行到x = 3;时，被调用了 stop()方法，即使在同步块中，它也干脆地stop了，这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性，所以请忘记线程的stop方法，以后我们再也不要说&#8220;停止线程&#8221;了。</p>
<p>　　&nbsp;如何才能&#8220;结束&#8221;一个线程？</p>
<p>　　<strong>[中断线程]</strong></p>
<p>　　结束一个线程，我们要分析线程的运行情况。也就是线程正在干什么。如果那个孩子什么事也没干，那就让他立即去睡觉。而如果那个孩子正在摆弄他的玩具，我们就要让它把玩具收拾好再睡觉。</p>
<p>　　所以一个线程从运行到真正的结束，应该有三个阶段：</p>
<ol>
    <li>正常运行.
    <li>处理结束前的工作,也就是准备结束.
    <li>结束退出. </li>
</ol>
<p>　　在我的JDBC专栏中我N次提醒在一个SQL逻辑结束后，无论如何要保证关闭Connnection那就是在finally从句中进行。同样，线程在结束前的工作应该在finally中来保证线程退出前一定执行：</p>
<pre class="code"> try{
正在逻辑
}catch(){}
finally{
清理工作
}
</pre>
<p>　　那么如何让一个线程结束呢？既然不能调用stop，可用的只的interrupt()方法。但interrupt()方法只是改变了线程的运行状态，如何让它退出运行？对于一般逻辑，只要线程状态已经中断，我们就可以让它退出，所以这样的语句可以保证线程在中断后就能结束运行：</p>
<pre class="code"> while(!isInterrupted()){
正常逻辑
}
</pre>
<p>　　这样如果这个线程被调用interrupt()方法，isInterrupted()为true，就会退出运行。但是如果线程正在执行wait,sleep,join方法，你调用interrupt()方法，这个逻辑就不完全了。</p>
<p>　　如果一个有经验的程序员来处理线程的运行的结束：</p>
<pre class="code"> public void run(){
try{
while(!isInterrupted()){
正常工作
}
}
catch(Exception e){
return;
}
finally{
清理工作
}
}
</pre>
<p>　　我们看到，如果线程执行一般逻辑在调用innterrupt后，isInterrupted()为true，退出循环后执行清理工作后结束，即使线程正在wait,sleep,join,也会抛出异常执行清理工作后退出。</p>
<p>　　这看起来非常好，线程完全按最我们设定的思路在工作。但是，并不是每个程序员都有这种认识，如果他聪明的自己处理异常会如何？事实上很多或大多数程序员会这样处理：</p>
<pre class="code"> public void run(){
while(!isInterrupted()){
try{
正常工作
}catch(Exception e){
//nothing
}
finally{
}
}
}
}
</pre>
<p>　　想一想，如果一个正在sleep的线程，在调用interrupt后，会如何？wait方法检查到isInterrupted()为true，抛出异常，而你又没有处理。而一个抛出了InterruptedException的线程的状态马上就会被置为非中断状态，如果catch语句没有处理异常，则下一次循环中isInterrupted()为false，线程会继续执行，可能你N次抛出异常，也无法让线程停止。</p>
<p>　　那么如何能确保线程真正停止？在线程同步的时候我们有一个叫&#8220;二次惰性检测&#8221;(double check)，能在提高效率的基础上又确保线程真正中同步控制中。那么我把线程正确退出的方法称为&#8220;双重安全退出&#8221;，即不以isInterrupted()为循环条件。而以一个标记作为循环条件：</p>
<pre class="code">class MyThread extend Thread{
private boolean isInterrupted = false;//这一句以后要修改
public void interrupt(){
isInterrupted = true;
super.interrupt();
}
public void run(){
while(!isInterrupted){
try{
正常工作
}catch(Exception e){
//nothing
}
finally{
}
}
}
}
</pre>
<p>　　试试这段程序,可以正确工作吗?</p>
<p>　　对于这段程序仍然还有很多可说的地方，先到这里吧。</p>
<!--文章其他信息--><br />
=======================================================================<br />
http://dev2dev.bea.com.cn/bbsdoc/20070208338913.html 
<img src ="http://www.blogjava.net/lcs/aggbug/159351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-09 13:44 <a href="http://www.blogjava.net/lcs/archive/2007/11/09/159351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线程编程——基础篇</title><link>http://www.blogjava.net/lcs/archive/2007/11/09/159349.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 09 Nov 2007 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/09/159349.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/159349.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/09/159349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/159349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/159349.html</trackback:ping><description><![CDATA[<span class="h1b">多线程编程——基础篇 （一）</span><br />
时间：2006-08-08<br />
作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />
<strong>[写在前面]</strong>
<p>　　随着计算机技术的发展，编程模型也越来越复杂多样化。但多线程编程模型是目前计算机系统架构的最终模型。随着CPU主频的不断攀升，X86架构的硬件已经成为瓶，在这种架构的CPU主频最高为4G。事实上目前3.6G主频的CPU已经接近了顶峰。</p>
<p>　　如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能)，那么继续提高CPU性能的方法就是超线程CPU模式。那么，作业系统、应用程序要发挥CPU的最大性能，就是要改变到以多线程编程模型为主的并行处理系统和并发式应用程序。</p>
<p>　　所以，掌握多线程编程模型，不仅是目前提高应用性能的手段，更是下一代编程模型的核心思想。多线程编程的目的，就是"最大限度地利用CPU资源"，当某一线程的处理不需要占用CPU而只和I/O,OEMBIOS等资源打交道时，让需要占用CPU资源的其它线程有机会获得CPU资源。从根本上说，这就是多线程编程的最终目的。</p>
<p>　　<strong>[第一需要弄清的问题]</strong></p>
<p>　　如同程序和进程的区别，要掌握多线程编程，第一要弄清的问题是：<strong>线程对象和线程的区别</strong>。</p>
<p>　　线程对象是可以产生线程的对象。比如在java平台中Thread对象，Runnable对象。线程，是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始，运行run方法体中的那一段相对独立的过程。</p>
<p>　　鉴于作者的水平，无法用更确切的词汇来描述它们的定义。但这两个有本质区别的概念请初学者细细体会，随着介绍的深入和例程分析的增加，就会慢慢明白它们所代表的真实含义。</p>
<p>　　天下难事必始于易，天下大事必始于细。</p>
<p>　　让我们先从最简单的"单线程"来入手：(1)带引号说明只是相对而言的单线程，(2)基于java。</p>
<pre class="code">    class BeginClass{
public static void main(String[] args){
for(int i=0;i&lt;100;i++)
System.out.println("Hello,World!");
}
}
</pre>
<p>　　如果我们成功编译了该java文件，然后在命令行上敲入：</p>
<p>　　java&nbsp;BeginClass</p>
<p>　　现在发生了什么呢？每一个java程序员，从他开始学习java的第一分钟里都会接触到这个问</p>
<p>　　题，但是，你知道它到底发生发什么？</p>
<p>　　JVM进程被启动，在同一个JVM进程中，有且只有一个进程，就是它自己。然后在这个JVM环境中，所有程序的运行都是以线程来运行。JVM最先会产生一个主线程，由它来运行指定程序的入口点。在这个程序中，就是主线程从main方法开始运行。当main方法结束后，主线程运行完成。JVM进程也随之退出。 </p>
<p>　　我们看到的是一个主线程在运行main方法，这样的只有一个线程执行程序逻辑的流程我们称</p>
<p>　　之为<strong>单线程</strong>。这是JVM提供给我们的单线程环境，事实上，JVM底层还至少有垃圾回收这样的后台线程以及其它非java线程，但这些线程对我们而言不可访问，我们只认为它是单线程的。</p>
<p>　　主线程是JVM自己启动的，在这里它不是从线程对象产生的。在这个线程中，它运行了main方法这个指令序列。理解它，但它没有更多可以研究的内容。</p>
<p>　　<strong>[接触多线程]</strong></p>
<pre class="code">    class MyThread extends Thread{
public void run(){
System.out.println("Thread say:Hello,World!");
}
}
public class MoreThreads{
public static void main(String[] args){
new MyThread();
new MyThread().start();
System.out.println("Main say:Hello,World");
}
}
</pre>
<p>　　执行这个程序，main方法第一行产生了一个线程对象，但并没有线程启动。</p>
<p>　　main方法第二行产生了一个线程对象，并启动了一个线程。</p>
<p>　　main方法第三行，产生并启动一个线程后，主线程自己也继续执行其它语句。</p>
<p>　　我们先不研究Thread对象的具体内容，稍微来回想一下上面的两个概念，<strong>线程对象</strong>和<strong>线程</strong>。在JAVA中，线程对象是JVM产生的一个普通的Object子类。而线程是CPU分配给这个对象的一个运行过程。我们说的这个线程在干什么，不是说一个线程对象在干什么，而是这个运行过程在干什么。如果一时想不明白，不要急，但你要记得它们不是一回事就行了。</p>
<p>　　累了吧？为不么不继续了？</p>
<p>　　基于这种风格来介绍多线程，并不是每个人都喜欢和接受的，如果你不喜欢，正好不浪费你的时间了，而如果你接受的话，那就看下一节吧。 </p>
<br />
========================================================================<br />
<span class="h1b">多线程编程——基础篇 （二）</span><br />
<br />
时间：2006-08-16<br />
作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />
在进入java平台的线程对象之前，基于<a href="http://dev2dev.bea.com.cn/bbsdoc/20060808312.html" target="_blank">基础篇（一）</a>的一些问题，我先插入两个基本概念。
<h3>[线程的并发与并行]</h3>
<p>　　在单CPU系统中，系统调度在某一时刻只能让一个线程运行，虽然这种调试机制有多种形式(大多数是时间片轮巡为主)，但无论如何，要通过不断切换需要运行的线程让其运行的方式就叫<strong>并发(concurrent)</strong>。而在多CPU系统中，可以让两个以上的线程同时运行，这种可以同时让两个以上线程同时运行的方式叫做<strong>并行(parallel)</strong>。</p>
<p>　　在上面包括以后的所有论述中，请各位朋友谅解，我无法用最准确的词语来定义储如并发和并行这类术语，但我以我的经验能通俗地告诉大家它是怎么一回事，如果您看到我说的一些"标准"文档上说的不一样，只要意思一致，那您就不要挑刺了。</p>
<h3>[JAVA线程对象]</h3>
<p>　　现在我们来开始考察JAVA中线程对象。 </p>
<p>　　在JAVA中，要开始一个线程，有两种方式。一是直接调用Thread实例的start()方法，二是<br />
将Runable实例传给一个Thread实例然后调用它的start()方法。</p>
<p>　　在前面已经说过，线程对象和线程是两个完全不同的概念。这里我们再次深入一下，生成一个线程的实例，并不代表启动了线程。而启动线程是说在某个线程对象上启动了该实例对应的线程，当该线程结束后，并不会就立即消失。</p>
<p>　　对于从很多书籍上可以看到的基础知识我就不用多说了。既然是基础知识，我也着重于从普通文档上读不到的内容。所以本节我重点要说的是两种线程对象产生线程方式的区别。</p>
<pre class="code">class MyThread extends Thread{
public int x = 0;
public void run(){
for(int i=0;i&lt;100;i++){
try{
Thread.sleep(10);
}catch(Exception e){}
System.out.println(x++);
}
}
}
</pre>
<p>　　如果我们生成MyThread的一个实例，然后调用它的start()方法，那么就产生了这个实例对应的线程：</p>
<pre class="code">public class Test {
public static void main(String[] args) throws Exception{
MyThread mt = new MyThread();
mt.start();
}
}
</pre>
<p>　　不用说，最终会打印出0到99，现在我们稍微玩一点花样：</p>
<pre class="code">public class Test {
public static void main(String[] args) throws Exception{
MyThread mt = new MyThread();
mt.start();
System.out.println(101);
}
}
</pre>
<p>　　也不用说，在<a href="http://dev2dev.bea.com.cn/bbsdoc/20060808312.html" target="_blank">基础篇（一）</a>中我们知道由于单CPU的原因，一般会先打印101，然后打印0到99。不过我们可以控制线程让它按我们的意思来运行：</p>
<pre class="code">public class Test {
public static void main(String[] args) throws Exception{
MyThread mt = new MyThread();
mt.start();
mt.join();
System.out.println(101);
}
}
</pre>
<p>　　好了，我们终于看到，mt实例对应的线程(假如我有时说mt线程请你不要怪我，不过我尽量不这么说)。在运行完成后，主线程才打印101。因为我们让当前线程(这里是主线程)等待mt线程的运行结束。"在线程对象a上调用join()方法，就是让当前正在执行的线程等待线程对象a对应的线程运行完成后才继续运行。"&nbsp;请大家一定要深刻理解并熟记这句话，而我这里引出这个知识点的目的是为了让你继续看下面的例子：</p>
<pre class="code">public class Test {
public static void main(String[] args) throws Exception{
MyThread mt = new MyThread();
mt.start();
mt.join();
Thread.sleep(3000);
mt.start();
}
}
</pre>
<p>　　当线程对象mt运行完成后，我们让主线程休息一下，然后我们再次在这个线程对象上启动线程。结果我们看到：</p>
<p>　　Exception&nbsp;in&nbsp;thread&nbsp;"main"&nbsp;java.lang.IllegalThreadStateException</p>
<p>　　也就是这种线程对象一时运行一次完成后，它就再也不能运行第二次了。我们可以看一下它有具体实现:</p>
<pre class="code">    public synchronized void start() {
if (started)
throw new IllegalThreadStateException();
started = true;
group.add(this);
start0();
}
</pre>
<p>　　一个Thread的实例一旦调用start()方法，这个实例的started标记就标记为true，事实中不管这个线程后来有没有执行到底，只要调用了一次start()就再也没有机会运行了，这意味着：</p>
<h3>[通过Thread实例的start()，一个Thread的实例只能产生一个线程]</h3>
<p>　　那么如果要在一个实例上产生多个线程(也就是我们常说的线程池)，我们应该如何做呢？这就是Runnable接口给我们带来的伟大的功能。</p>
<pre class="code">class R implements Runnable{
private int x = 0;
public void run(){
for(int i=0;i&lt;100;i++){
try{
Thread.sleep(10);
}catch(Exception e){}
System.out.println(x++);
}
}
}
</pre>
<p>　　<br />
正如它的名字一样，Runnable的实例是可运行的，但它自己并不能直接运行，它需要被Thread对象来包装才行运行：</p>
<pre class="code">public class Test {
public static void main(String[] args) throws Exception{
new Thread(new R()).start();
}
}
</pre>
<p>　　当然这个结果和mt.start()没有什么区别。但如果我们把一个Runnable实例给Thread对象多次包装，我们就可以看到它们实际是在同一实例上启动线程：</p>
<pre class="code">public class Test {
public static void main(String[] args) throws Exception{
R r = new R();
for(int i=0;i&lt;10;i++)
new Thread(r).start();
}
}
</pre>
<p>　　x是实例对象，但结果是x被加到了999，说明这10个线程是在同一个r对象上运行的。请大家注意，因为这个例子是在单CPU上运行的，所以没有对多个线程同时操作共同的对象进行同步。这里是为了说明的方便而简化了同步，而真正的环境中你无法预知程序会在什么环境下运行，所以一定要考虑同步。</p>
<p>　　到这里我们做一个完整的例子来说明线程产生的方式不同而生成的线程的区别：</p>
<pre class="code">package debug;
import java.io.*;
import java.lang.Thread;
class MyThread extends Thread{
public int x = 0;
public void run(){
System.out.println(++x);
}
}
class R implements Runnable{
private int x = 0;
public void run(){
System.out.println(++x);
}
}
public class Test {
public static void main(String[] args) throws Exception{
for(int i=0;i&lt;10;i++){
Thread t = new MyThread();
t.start();
}
Thread.sleep(10000);//让上面的线程运行完成
R r = new R();
for(int i=0;i&lt;10;i++){
Thread t = new Thread(r);
t.start();
}
}
}
</pre>
<p>　　上面10个线程对象产生的10个线程运行时打印了10次1。下面10个线程对象产生的10个线程运行时打印了1到10。我们把下面的10个线程称为<strong>同一实例(Runnable实例)的多个线程</strong>。</p>
<p>　　下节我们将研究线程对象方法，还是那句话，一般文档中可以读到的内容我不会介绍太多<br />
请大家自己了解。</p>
<br />
========================================================================<br />
<span class="h1b">多线程编程——基础篇 （三）<br />
</span><br />
时间：2006-08-22<br />
作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />
<br />
线程对象的几个重要的方法
<p>　　尽管线程对象的常用方法可以通过API文档来了解,但是有很多方法仅仅从API说明是无法详细了解的。</p>
<p>　　本来打算用一节的篇幅来把线程方法中一些重要的知识说完,但这样下来估计要很常的篇幅,可能要用好几节才能说把和线程方法相关的一些重要的知识说完。</p>
<p>　　首先我们接基础篇(二)来说明start()方法。</p>
<p>　　一个线程对象生成后,如果要产生一个执行的线程,就一定要调用它的start()方法.在介绍这个方法时不得不同时说明run方法.其实线程对象的run方法完全是一个接口回调方法,它是你这个线程对象要完成的具体逻辑.简单说你要做什么就你在run中完成,而如何做,什么时候做就不需要你控制了,你只要调用start()方法,JVM就会管理这个线程对象让它产生一个线程并注册到线程处理系统中。</p>
<p>　　从表面上看,start()方法调用了run()方法,事实上,start()方法并没有直接调用run方法.在JDK1.5以前start()方法是本地方法,它如何最终调用run方法已经不是JAVA程序员所能了解的.而在JDK1.5中,原来的那个本地start()方法被start0()代替,另个一个纯JAVA的start()中调用本地方法start0(),而在start()方法中做了一个验证,就是对一个全局变量(对象变量)started做检验,如果为true,则start()抛出异常,不会调用本地方法start0(),否则,先将该变量设有true,然后调用start0()。</p>
<p>　　从中我们可以看到这个为了控制一个线程对象只能运行成功一次start()方法.这是因为线程的运行要获取当前环境,包括安全,父线程的权限,优先级等条件,如果一个线程对象可以运行多次,那么定义一个static 的线程在一个环境中获取相应权限和优先级,运行完成后它在另一个环境中利用原来的权限和优先级等属性在当前环境中运行,这样就造成无法预知的结果.简单说来,让一个线程对象只能成功运行一次,是基于对线程管理的需要。<br />
<br />
start()方法最本质的功能是从CPU中申请另一个线程空间来执行run()方法中的代码,它和当前的线程是两条线,在相对独立的线程空间运行,也就是说,如果你直接调用线程对象的run()方法,当然也会执行,但那是在当前线程中执行,run()方法执行完成后继续执行下面的代码.而调用start()方法后,run()方法的代码会和当前线程并发(单CPU)或并行(多CPU)执行。</p>
<p>　　所以请记住一句话[调用线程对象的run方法不会产生一个新的线程],虽然可以达到相同的执行结果,但执行过程和执行效率不同。</p>
<p>　　[线程的interrupt()方法,interrupted()和isInterrupted()]</p>
<p>　　这三个方法是关系非常密切而且又比较复杂的,虽然它们各自的功能很清楚,但它们之间的关系有大多数人不是真正的了解。</p>
<p>　　先说interrupt()方法,它是实例方法,而它也是最奇怪的方法,在java语言中,线程最初被设计为"隐晦难懂"的东西,直到现在它的语义不没有象它的名字那样准确。大多数人以为,一个线程象调用了interrupt()方法,那它对应的线程就应该被中断而抛出异常,事实中,当一个线程对象调用interrupt()方法,它对应的线程并没有被中断,只是改变了它的中断状态。</p>
<p>　　使当前线程的状态变以中断状态,如果没有其它影响,线程还会自己继续执行。</p>
<p>　　只有当线程执行到sleep,wait,join等方法时,或者自己检查中断状态而抛出异常的情况下,线程才会抛出异常。<br />
<br />
如果线程对象调用interrupt()后它对应的线程就立即中断,那么interrupted()方法就不可能执行。</p>
<p>　　 因为interrupted()方法是一个static方法,就是说只能在当前线程上调用,而如果一个线程interrupt()后它已经中断了,那它又如何让自己interrupted()?</p>
<p>　　正因为一个线程调用interrupt()后只是改变了中断状态,它可以继续执行下去,在没有调用sleep,wait,join等法或自己抛出异常之前,它就可以调用interrupted()来清除中断状态(还会原状)interrupted()方法会检查当前线程的中断状态,如果为 "被中断状态"则改变当前线程为"非中断状态"并返回true,如果为"非中断状态"则返回false,它不仅检查当前线程是否为中断状态,而且在保证当前线程回来非中断状态,所以它叫"interrupted",是说中断的状态已经结束(到非中断状态了)isInterrupted()方法则仅仅检查线程对象对应的线程是否是中断状态,并不改变它的状态。</p>
<p>　　目前大家只能先记住这三个方法的功能,只有真正深入到多线程编程实践中,才会体会到它们为什么是对象方法,为什么是类方法。</p>
<p>　　线程到底什么时候才被中断抛出InterruptedException异常,我们将在提高篇中详细讨论。 </p>
<p>　　[sleep(),join(),yield()方法]</p>
<p>　　在现在的环节中,我只能先说明这些方法的作用和调用原则,至于为什么,在基础篇中无法深入,只能在提高篇中详细说明。</p>
<p>　　sleep()方法中是类方法,也就是对当前线程而言的,程序员不能指定某个线程去sleep,只能是当前线程执行到sleep()方法时,睡眠指定的时间(让其它线程运行).事实上也只能是类方法,在当前线程上调用.试想如果你调用一个线程对象的sleep()方法,那么这个对象对应的线程如果不是正在运行,它如何sleep()?所以只有当前线程,因为它正在执行,你才能保证它可以调用sleep()方法。</p>
<p>　　原则:[在同步方法中尽量不要调用线程的sleep()方法],或者简单说,对于一般水平的程序员你基本不应该调用sleep()方法。</p>
<p>　　join()方法,正如第一节所言,在一个线程对象上调用join方法,是当前线程等待这个线程对象对应的线程结束,比如有两个工作,工作A要耗时10秒钟,工作B要耗时10秒或更多。我们在程序中先生成一个线程去做工作B,然后做工作A。</p>
<p>　　new?B().start();//做工作B</p>
<p>　　A();//做工作A</p>
<p>　　工作A完成后,下面要等待工作B的结果来进行处理.如果工作B还没有完成我就不能进行下面的工作C,所以</p>
<p>　　B?b?=?new?B();</p>
<p>　　b.start();//做工作B</p>
<p>　　A();//做工作A</p>
<p>　　b.join();//等工作B完成。</p>
<p>　　C();//继续工作C。</p>
<p>　　原则:[join是测试其它工作状态的唯一正确方法],我见过很多人,甚至有的是博士生,在处理一项工作时如果另一项工作没有完成,说让当前工作线程sleep(x),我问他,你这个x是如何指定的,你怎么知道是100毫秒而不是99毫秒或是101毫秒?其实这就是OnXXX事件的实质,我们不是要等多长时间才去做什么事,而是当等待的工作正好完成的时候去做。</p>
<p>　　yield()方法也是类方法,只在当前线程上调用,理由同上,它主是让当前线程放弃本次分配到的时间片原则:[不是非常必要的情况下,没有理由调用它].调用这个方法不会提高任何效率,只是降低了CPU的总周期上面介绍的线程一些方法,基于(基础篇)而言只能简单提及.以后具体应用中我会结合实例详细论述。</p>
<p>　　线程本身的其它方法请参看API文档.下一节介绍非线程的方法,但和线程密切相关的两[三]个对象方法:</p>
<p>　　[wait(),notify()/notifyAll()]</p>
<p>　　这是在多线程中非常重要的方法。</p>
<br />
=========================================================================<br />
<span class="h1b">多线程编程 ——&nbsp; 基础篇 (四)</span><br />
<br />
时间：2006-08-31<br />
作者：<a href="http://dev2dev.bea.com.cn/author/536.html">axman</a><br />
<br />
<h1>[wait(),notify()/notityAll()方法]</h1>
<p>　　关于这两个方法,有很多的内容需要说明.在下面的说明中可能会有很多地方不能一下子明白,但在看完本节后,即使不能完全明白,你也一定要回过头来记住下面的两句话:</p>
<p>　　<strong>[wait(),notify()/notityAll()方法是普通对象的方法(Object超类中实现),而不是线程对象的方法]</strong></p>
<p>　　<strong>[wait(),notify()/notityAll()方法只能在同步方法中调用]</strong></p>
<h1>[线程的互斥控制]</h1>
<p>　　多个线程同时操作某一对象时,一个线程对该对象的操作可能会改变其状态,而该状态会影响另一线程对该对象的真正结果.</p>
<p>　　这个例子我们在太多的文档中可以看到,就象两个操售票员同时售出同一张票一样.</p>
<table class="tabel-general" cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <th class="left" width="50%">线程A</th>
            <th class="right" width="50%">线程B</th>
        </tr>
        <tr>
            <td class="left">1.线程A在数据库中查询存票,发现票C可以卖出</td>
            <td class="right">&nbsp;</td>
        </tr>
        <tr>
            <td>class="left"2.线程A接受用户订票请求,准备出票.</td>
            <td class="right">&nbsp;</td>
        </tr>
        <tr>
            <td class="left">&nbsp;</td>
            <td class="right">3.这时切换到了线程B执行</td>
        </tr>
        <tr>
            <td class="left">&nbsp;</td>
            <td class="right">4.线程B在数据库中查询存票,发现票C可以卖出</td>
        </tr>
        <tr>
            <td class="left">&nbsp;</td>
            <td class="right">5.线程B将票卖了出去</td>
        </tr>
        <tr>
            <td class="left">6.切换到线程A执行,线程A卖了一张已经卖出的票</td>
            <td class="right">&nbsp;</td>
        </tr>
    </tbody>
</table>
<p>　　所以需要一种机制来管理这类问题的发生,当某个线程正在执行一个不可分割的部分时,其它线程不能不能同时执行这一部分.</p>
<p>　　象这种控制某一时刻只能有一个线程执行某个执行单元的机制就叫互斥控制或共享互斥(mutual exclusion)</p>
<p>　　在JAVA中,用synchornized关键字来实现互斥控制(暂时这样认为,JDK1.5已经发展了新的机制)</p>
<h1>[synchornized关键字]</h1>
<p>　　把一个单元声明为synchornized,就可以让在同一时间只有一个线程操作该方法.</p>
<p>　　有人说synchornized就是一把锁,事实上它确实存在锁,但是是谁的锁,锁谁,这是一个非常复杂的问题.</p>
<p>　　每个对象只有一把监视锁(monitor lock),一次只能被一个线程获取.当一个线程获取了这一个锁后,其它线程就只能等待这个线程释放锁才能再获取.<br />
<br />
那么synchornized关键字到底锁什么?得到了谁的锁?<br />
<br />
对于同步块,synchornized获取的是参数中的对象锁:</p>
<pre class="code">synchornized(obj){
//...............
}</pre>
<p>　　线程执行到这里时,首先要获取obj这个实例的锁,如果没有获取到线程只能等待.如果多个线程执行到这里,只能有一个线程获取obj的锁,然后执行{}中的语句,所以,obj对象的作用范围不同,控制程序不同.</p>
<p>　　假如:</p>
<pre class="code">public void test(){
Object o = new Object();
synchornized(obj){
//...............
}
}
</pre>
<p>　　这段程序控制不了任何,多个线程之间执行到Object o = new Object();时会各自产生一个对象然后获取这个对象有监视锁,各自皆大欢喜地执行.</p>
<p>　　而如果是类的属性:</p>
<pre class="code">class Test{
Object o = new Object();
public void test(){
synchornized(o){
//...............
}
}
}</pre>
<p>　　所有执行到Test实例的synchornized(o)的线程,只有一个线程可以获取到监视锁.</p>
<p>　　有时我们会这样:</p>
<pre class="code">public void test(){
synchornized(this){
//...............
}
}</pre>
<p>　　那么所有执行Test实例的线程只能有一个线程执行.而synchornized(o)和synchornized(this)的范围是不同的,因为执行到Test实例的synchornized(o)的线程等待时,其它线程可以执行Test实例的synchornized(o1)部分,但多个线程同时只有一个可以执行Test实例的synchornized(this).]</p>
<p>　　而对于</p>
<pre class="code">synchornized(Test.class){
//...............
}</pre>
<p>　　这样的同步块而言,所有调用Test多个实例的线程赐教只能有一个线程可以执行.</p>
<h1>[synchornized方法]</h1>
<p>　　如果一个方法声明为synchornized的,则等同于把在为个方法上调用synchornized(this).</p>
<p>　　如果一个静态方法被声明为synchornized,则等同于把在为个方法上调用synchornized(类.class).</p>
<p>　　现在进入wait方法和notify/notifyAll方法.这两个(或叫三个)方法都是Object对象的方法,而不是线程对象的方法.如同锁一样,它们是在线程中调用某一对象上执行的.</p>
<pre class="code">class Test{
public synchornized void test(){
//获取条件,int x 要求大于100;
if(x &lt; 100)
wait();
}
}</pre>
<p>　　这里为了说明方法没有加在try{}catch(){}中,如果没有明确在哪个对象上调用wait()方法,则为this.wait();</p>
<p>　　假如:</p>
<p>　　Test t = new Test();</p>
<p>　　现在有两个线程都执行到t.test();方法.其中线程A获取了t的对象锁,进入test()方法内.</p>
<p>　　这时x小于100,所以线程A进入等待.</p>
<p>　　当一个线程调用了wait方法后,这个线程就进入了这个对象的休息室(waitset),这是一个虚拟的对象,但JVM中一定存在这样的一个数据结构用来记录当前对象中有哪些程线程在等待.</p>
<p>　　当一个线程进入等待时,它就会释放锁,让其它线程来获取这个锁.</p>
<p>　　所以线程B有机会获得了线程A释放的锁,进入test()方法,如果这时x还是小于100,线程B也进入了t的休息室.</p>
<p>　　这两个线程只能等待其它线程调用notity[All]来唤醒.</p>
<p>　　但是如果调用的是有参数的wait(time)方法,则线程A,B都会在休息室中等待这个时间后自动唤醒.</p>
<h1>[为什么真正的应用都是用while(条件)而不用if(条件)]</h1>
<p>　　在实际的编程中我们看到大量的例子都是用?</p>
<p>　　while(x &lt; 100)</p>
<p>　　wait();go();而不是用if,为什么呢?</p>
<p>　　在多个线程同时执行时,if(x &lt;100)是不安全的.因为如果线程A和线程B都在t的休息室中等待,这时另一个线程使x==100了,并调用notifyAll方法,线程A继续执行下面的go().而它执行完成后,x有可能又小于100,比如下面的程序中调用了--x,这时切换到线程B,线程B没有继续判断,直接执行go();就产生一个错误的条件,只有while才能保证线程B又继续检查一次.</p>
<h1>[notify/notifyAll方法]</h1>
<p>　　这两个方法都是把某个对象上休息区内的线程唤醒,notify只能唤醒一个,但究竟是哪一个不能确定,而notifyAll则唤醒这个对象上的休息室中所有的线程.</p>
<p>　　一般有为了安全性,我们在绝对多数时候应该使用notifiAll(),除非你明确知道只唤醒其中的一个线程.</p>
<p>　　那么是否是只要调用一个对象的wait()方法,当前线程就进入了这个对象的休息室呢?事实中,要调用一个对象的wait()方法,只有当前线程获取了这个对象的锁,换句话说一定要在这个对象的同步方法或以这个对象为参数的同步块中.</p>
<pre class="code">class MyThread extends Thread{
Test t = new Test();
public void run(){
t.test();
System.out.println("Thread say:Hello,World!");
}
}
public class Test {
int x = 0;
public  void test(){
if(x==0)
try{
wait();
}catch(Exception e){}
}
public static void main(String[] args) throws Exception{
new MyThread().start();
}
}
</pre>
<p>　　这个线程就不会进入t的wait方法而直接打印出Thread say:Hello,World!.</p>
<p>　　而如果改成:</p>
<pre class="code">public class Test {
int x = 0;
public synchornized void test(){
if(x==0)
try{
wait();
}catch(Exception e){}
}
public static void main(String[] args) throws Exception{
new MyThread().start();
}
}</pre>
<p>　　我们就可以看到线程一直等待,注意这个线程进入等待后没有其它线程唤醒,除非强行退出JVM环境,否则它一直等待.</p>
<p>　　所以请记住:</p>
<p>　　[线程要想调用一个对象的wait()方法就要先获得该对象的监视锁,而一旦调用wait()后又立即释放该锁]</p>
<p>　　以上是对线程基础知识的简单介绍,不进入实例,我们无法真正了解它的真实意义.下节我们就会以实例来进入多线程编程的<strong> 实战篇</strong></p>
<p><strong>转载自dev2dev网友axman的go deep into java专栏。</strong></p>
<br />
<br />
<img src ="http://www.blogjava.net/lcs/aggbug/159349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-09 13:37 <a href="http://www.blogjava.net/lcs/archive/2007/11/09/159349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>volatile 关键字</title><link>http://www.blogjava.net/lcs/archive/2007/11/08/159001.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 08 Nov 2007 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/08/159001.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/159001.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/08/159001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/159001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/159001.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"></font>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">Volatile</font><span style="font-family: 宋体">修饰的成员变量在每次被线程访问时，都强迫从共享内存中重读该成员变量的值。而且，当成员变量发生变化时，强迫线程将变化值回写到共享内存。这样在任何时刻，两个不同的线程总是看到某个成员变量的同一个值。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><font face="Times New Roman">Java</font><span style="font-family: 宋体">语言规范中指出：为了获得最佳速度，允许线程保存共享成员变量的私有拷贝，而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体"><font size="3">这样当多个线程同时与某个对象交互时，就必须要注意到要让线程及时的得到共享成员变量的变化。</font></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">而</span><font face="Times New Roman">volatile</font><span style="font-family: 宋体">关键字就是提示</span><font face="Times New Roman">VM</font><span style="font-family: 宋体">：对于这个成员变量不能保存它的私有拷贝，而应直接与共享成员变量交互。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">使用建议：在两个或者更多的线程访问的成员变量上使用</span><font face="Times New Roman">volatile</font><span style="font-family: 宋体">。当要访问的变量已在</span><font face="Times New Roman">synchronized</font><span style="font-family: 宋体">代码块中，或者为常量时，不必使用。</span></font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="3"><span style="font-family: 宋体">由于使用</span><font face="Times New Roman">volatile</font><span style="font-family: 宋体">屏蔽掉了</span><font face="Times New Roman">VM</font><span style="font-family: 宋体">中必要的代码优化，所以在效率上比较低，因此一定在必要时才使用此关键字。</span></font></p>
<img src ="http://www.blogjava.net/lcs/aggbug/159001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-08 09:28 <a href="http://www.blogjava.net/lcs/archive/2007/11/08/159001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>swing使用进度条的一个例子（整理）</title><link>http://www.blogjava.net/lcs/archive/2007/11/07/158734.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 07 Nov 2007 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/07/158734.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/158734.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/07/158734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/158734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/158734.html</trackback:ping><description><![CDATA[代码
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.swing.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.event.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_123_1886_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_1886_Open_Text.style.display='none'; Codehighlighter1_123_1886_Closed_Image.style.display='inline'; Codehighlighter1_123_1886_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_123_1886_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_1886_Closed_Text.style.display='none'; Codehighlighter1_123_1886_Open_Image.style.display='inline'; Codehighlighter1_123_1886_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ProgressSample&nbsp;</span><span id="Codehighlighter1_123_1886_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_123_1886_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_172_946_Open_Image" onclick="this.style.display='none'; Codehighlighter1_172_946_Open_Text.style.display='none'; Codehighlighter1_172_946_Closed_Image.style.display='inline'; Codehighlighter1_172_946_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_172_946_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_172_946_Closed_Text.style.display='none'; Codehighlighter1_172_946_Open_Image.style.display='inline'; Codehighlighter1_172_946_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BarThread&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Thread&nbsp;</span><span id="Codehighlighter1_172_946_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_172_946_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;DELAY&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">500</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;JProgressBar&nbsp;progressBar;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_284_315_Open_Image" onclick="this.style.display='none'; Codehighlighter1_284_315_Open_Text.style.display='none'; Codehighlighter1_284_315_Closed_Image.style.display='inline'; Codehighlighter1_284_315_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_284_315_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_284_315_Closed_Text.style.display='none'; Codehighlighter1_284_315_Open_Image.style.display='inline'; Codehighlighter1_284_315_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;BarThread(JProgressBar&nbsp;bar)&nbsp;</span><span id="Codehighlighter1_284_315_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_284_315_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;progressBar&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bar;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_340_942_Open_Image" onclick="this.style.display='none'; Codehighlighter1_340_942_Open_Text.style.display='none'; Codehighlighter1_340_942_Closed_Image.style.display='inline'; Codehighlighter1_340_942_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_340_942_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_340_942_Closed_Text.style.display='none'; Codehighlighter1_340_942_Open_Image.style.display='inline'; Codehighlighter1_340_942_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_340_942_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_340_942_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;minimum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;progressBar.getMinimum();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maximum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;progressBar.getMaximum();<br />
<img id="Codehighlighter1_473_606_Open_Image" onclick="this.style.display='none'; Codehighlighter1_473_606_Open_Text.style.display='none'; Codehighlighter1_473_606_Closed_Image.style.display='inline'; Codehighlighter1_473_606_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_473_606_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_473_606_Closed_Text.style.display='none'; Codehighlighter1_473_606_Open_Image.style.display='inline'; Codehighlighter1_473_606_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runnable&nbsp;runner&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Runnable()&nbsp;</span><span id="Codehighlighter1_473_606_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_473_606_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_501_598_Open_Image" onclick="this.style.display='none'; Codehighlighter1_501_598_Open_Text.style.display='none'; Codehighlighter1_501_598_Closed_Image.style.display='inline'; Codehighlighter1_501_598_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_501_598_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_501_598_Closed_Text.style.display='none'; Codehighlighter1_501_598_Open_Image.style.display='inline'; Codehighlighter1_501_598_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_501_598_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_501_598_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;progressBar.getValue();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;progressBar.setValue(value</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br />
<img id="Codehighlighter1_651_936_Open_Image" onclick="this.style.display='none'; Codehighlighter1_651_936_Open_Text.style.display='none'; Codehighlighter1_651_936_Closed_Image.style.display='inline'; Codehighlighter1_651_936_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_651_936_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_651_936_Closed_Text.style.display='none'; Codehighlighter1_651_936_Open_Image.style.display='inline'; Codehighlighter1_651_936_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">minimum;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">maximum;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_651_936_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_651_936_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_665_807_Open_Image" onclick="this.style.display='none'; Codehighlighter1_665_807_Open_Text.style.display='none'; Codehighlighter1_665_807_Closed_Image.style.display='inline'; Codehighlighter1_665_807_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_665_807_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_665_807_Closed_Text.style.display='none'; Codehighlighter1_665_807_Open_Image.style.display='inline'; Codehighlighter1_665_807_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_665_807_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_665_807_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SwingUtilities.invokeAndWait(runner);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Our&nbsp;task&nbsp;for&nbsp;each&nbsp;step&nbsp;is&nbsp;to&nbsp;just&nbsp;sleep</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(DELAY);<br />
<img id="Codehighlighter1_855_865_Open_Image" onclick="this.style.display='none'; Codehighlighter1_855_865_Open_Text.style.display='none'; Codehighlighter1_855_865_Closed_Image.style.display='inline'; Codehighlighter1_855_865_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_855_865_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_855_865_Closed_Text.style.display='none'; Codehighlighter1_855_865_Open_Image.style.display='inline'; Codehighlighter1_855_865_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(InterruptedException&nbsp;ignoredException)&nbsp;</span><span id="Codehighlighter1_855_865_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_855_865_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_918_928_Open_Image" onclick="this.style.display='none'; Codehighlighter1_918_928_Open_Text.style.display='none'; Codehighlighter1_918_928_Closed_Image.style.display='inline'; Codehighlighter1_918_928_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_918_928_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_918_928_Closed_Text.style.display='none'; Codehighlighter1_918_928_Open_Image.style.display='inline'; Codehighlighter1_918_928_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(InvocationTargetException&nbsp;ignoredException)&nbsp;</span><span id="Codehighlighter1_918_928_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_918_928_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img id="Codehighlighter1_995_1882_Open_Image" onclick="this.style.display='none'; Codehighlighter1_995_1882_Open_Text.style.display='none'; Codehighlighter1_995_1882_Closed_Image.style.display='inline'; Codehighlighter1_995_1882_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_995_1882_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_995_1882_Closed_Text.style.display='none'; Codehighlighter1_995_1882_Open_Image.style.display='inline'; Codehighlighter1_995_1882_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])&nbsp;</span><span id="Codehighlighter1_995_1882_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_995_1882_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Initialize</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;JProgressBar&nbsp;aJProgressBar&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JProgressBar(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">100</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;JButton&nbsp;aJButton&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JButton(</span><span style="color: #000000">"</span><span style="color: #000000">Start</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;aJProgressBar.setStringPainted(</span><span style="color: #0000ff">true</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;显示百分比字符</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;aJProgressBar.setIndeterminate(</span><span style="color: #0000ff">false</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;不确定的进度条</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1301_1482_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1301_1482_Open_Text.style.display='none'; Codehighlighter1_1301_1482_Closed_Image.style.display='inline'; Codehighlighter1_1301_1482_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1301_1482_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1301_1482_Closed_Text.style.display='none'; Codehighlighter1_1301_1482_Open_Image.style.display='inline'; Codehighlighter1_1301_1482_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ActionListener&nbsp;actionListener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ActionListener()&nbsp;</span><span id="Codehighlighter1_1301_1482_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1301_1482_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_1352_1476_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1352_1476_Open_Text.style.display='none'; Codehighlighter1_1352_1476_Closed_Image.style.display='inline'; Codehighlighter1_1352_1476_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1352_1476_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1352_1476_Closed_Text.style.display='none'; Codehighlighter1_1352_1476_Open_Image.style.display='inline'; Codehighlighter1_1352_1476_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;</span><span id="Codehighlighter1_1352_1476_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1352_1476_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aJButton.setEnabled(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;stepper&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BarThread(aJProgressBar);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stepper.start();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;aJButton.addActionListener(actionListener);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;JFrame&nbsp;theFrame&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JFrame(</span><span style="color: #000000">"</span><span style="color: #000000">Progress&nbsp;Bars</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Container&nbsp;contentPane&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;theFrame.getContentPane();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;contentPane.setLayout(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GridLayout(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;contentPane.add(aJProgressBar);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;contentPane.add(aJButton);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;theFrame.setSize(</span><span style="color: #000000">300</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">100</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;theFrame.setVisible(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
 <img src ="http://www.blogjava.net/lcs/aggbug/158734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-07 09:58 <a href="http://www.blogjava.net/lcs/archive/2007/11/07/158734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA程序实现监视----JAVA程序内存使用情况（转）不知道好不好用有空研究一下</title><link>http://www.blogjava.net/lcs/archive/2007/11/07/158732.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 07 Nov 2007 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/07/158732.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/158732.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/07/158732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/158732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/158732.html</trackback:ping><description><![CDATA[代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;myprojects.jmemorydemo;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.swing.UIManager;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_106_725_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_725_Open_Text.style.display='none'; Codehighlighter1_106_725_Closed_Image.style.display='inline'; Codehighlighter1_106_725_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_106_725_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_106_725_Closed_Text.style.display='none'; Codehighlighter1_106_725_Open_Image.style.display='inline'; Codehighlighter1_106_725_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;JMemoryDemo&nbsp;</span><span id="Codehighlighter1_106_725_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_106_725_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;packFrame&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_164_661_Open_Image" onclick="this.style.display='none'; Codehighlighter1_164_661_Open_Text.style.display='none'; Codehighlighter1_164_661_Closed_Image.style.display='inline'; Codehighlighter1_164_661_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_164_661_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_164_661_Closed_Text.style.display='none'; Codehighlighter1_164_661_Open_Image.style.display='inline'; Codehighlighter1_164_661_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;JMemoryDemo()&nbsp;</span><span id="Codehighlighter1_164_661_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_164_661_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />MainFrame&nbsp;frame&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MainFrame();<br />
<img id="Codehighlighter1_216_232_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_232_Open_Text.style.display='none'; Codehighlighter1_216_232_Closed_Image.style.display='inline'; Codehighlighter1_216_232_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_216_232_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_216_232_Closed_Text.style.display='none'; Codehighlighter1_216_232_Open_Image.style.display='inline'; Codehighlighter1_216_232_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(packFrame)&nbsp;</span><span id="Codehighlighter1_216_232_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_216_232_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />frame.pack();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_239_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_239_259_Open_Text.style.display='none'; Codehighlighter1_239_259_Closed_Image.style.display='inline'; Codehighlighter1_239_259_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_239_259_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_239_259_Closed_Text.style.display='none'; Codehighlighter1_239_259_Open_Image.style.display='inline'; Codehighlighter1_239_259_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_239_259_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_239_259_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />frame.validate();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />Dimension&nbsp;screenSize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Toolkit.getDefaultToolkit().getScreenSize();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />Dimension&nbsp;frameSize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;frame.getSize();<br />
<img id="Codehighlighter1_410_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_410_450_Open_Text.style.display='none'; Codehighlighter1_410_450_Closed_Image.style.display='inline'; Codehighlighter1_410_450_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_410_450_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_410_450_Closed_Text.style.display='none'; Codehighlighter1_410_450_Open_Image.style.display='inline'; Codehighlighter1_410_450_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(frameSize.height&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;screenSize.height)&nbsp;</span><span id="Codehighlighter1_410_450_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_410_450_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />frameSize.height&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;screenSize.height;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_492_530_Open_Image" onclick="this.style.display='none'; Codehighlighter1_492_530_Open_Text.style.display='none'; Codehighlighter1_492_530_Closed_Image.style.display='inline'; Codehighlighter1_492_530_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_492_530_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_492_530_Closed_Text.style.display='none'; Codehighlighter1_492_530_Open_Image.style.display='inline'; Codehighlighter1_492_530_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(frameSize.width&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;screenSize.width)&nbsp;</span><span id="Codehighlighter1_492_530_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_492_530_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />frameSize.width&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;screenSize.width;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />frame.setLocation((screenSize.width&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;frameSize.width)&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;(screenSize.height&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;frameSize.height)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />frame.setVisible(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)<br />
<img id="Codehighlighter1_702_723_Open_Image" onclick="this.style.display='none'; Codehighlighter1_702_723_Open_Text.style.display='none'; Codehighlighter1_702_723_Closed_Image.style.display='inline'; Codehighlighter1_702_723_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_702_723_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_702_723_Closed_Text.style.display='none'; Codehighlighter1_702_723_Open_Image.style.display='inline'; Codehighlighter1_702_723_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_702_723_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_702_723_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JMemoryDemo();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">===================================================</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;myprojects.jmemorydemo;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.swing.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_876_1643_Open_Image" onclick="this.style.display='none'; Codehighlighter1_876_1643_Open_Text.style.display='none'; Codehighlighter1_876_1643_Closed_Image.style.display='inline'; Codehighlighter1_876_1643_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_876_1643_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_876_1643_Closed_Text.style.display='none'; Codehighlighter1_876_1643_Open_Image.style.display='inline'; Codehighlighter1_876_1643_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ProgressThread&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Thread&nbsp;</span><span id="Codehighlighter1_876_1643_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_876_1643_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />JProgressBar&nbsp;pbar;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />JLabel&nbsp;label;<br />
<img id="Codehighlighter1_965_1001_Open_Image" onclick="this.style.display='none'; Codehighlighter1_965_1001_Open_Text.style.display='none'; Codehighlighter1_965_1001_Closed_Image.style.display='inline'; Codehighlighter1_965_1001_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_965_1001_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_965_1001_Closed_Text.style.display='none'; Codehighlighter1_965_1001_Open_Image.style.display='inline'; Codehighlighter1_965_1001_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ProgressThread(JProgressBar&nbsp;pbar,JLabel&nbsp;label)&nbsp;</span><span id="Codehighlighter1_965_1001_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_965_1001_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.pbar</span><span style="color: #000000">=</span><span style="color: #000000">pbar;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.label</span><span style="color: #000000">=</span><span style="color: #000000">label;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1021_1641_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1021_1641_Open_Text.style.display='none'; Codehighlighter1_1021_1641_Closed_Image.style.display='inline'; Codehighlighter1_1021_1641_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1021_1641_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1021_1641_Closed_Text.style.display='none'; Codehighlighter1_1021_1641_Open_Image.style.display='inline'; Codehighlighter1_1021_1641_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_1021_1641_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1021_1641_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;min</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max</span><span style="color: #000000">=</span><span style="color: #000000">100</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;free</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;totle</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;status</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />pbar.setMinimum(min);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />pbar.setMaximum(max);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />pbar.setValue(status);<br />
<img id="Codehighlighter1_1164_1639_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1164_1639_Open_Text.style.display='none'; Codehighlighter1_1164_1639_Closed_Image.style.display='inline'; Codehighlighter1_1164_1639_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1164_1639_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1164_1639_Closed_Text.style.display='none'; Codehighlighter1_1164_1639_Open_Image.style.display='inline'; Codehighlighter1_1164_1639_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #0000ff">true</span><span style="color: #000000">)</span><span id="Codehighlighter1_1164_1639_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1164_1639_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_1169_1277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1169_1277_Open_Text.style.display='none'; Codehighlighter1_1169_1277_Closed_Image.style.display='inline'; Codehighlighter1_1169_1277_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1169_1277_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1169_1277_Closed_Text.style.display='none'; Codehighlighter1_1169_1277_Open_Image.style.display='inline'; Codehighlighter1_1169_1277_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">try</span><span id="Codehighlighter1_1169_1277_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1169_1277_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />totle</span><span style="color: #000000">=</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">)(Runtime.getRuntime().totalMemory()</span><span style="color: #000000">/</span><span style="color: #000000">1024</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />free</span><span style="color: #000000">=</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">)(Runtime.getRuntime().freeMemory()</span><span style="color: #000000">/</span><span style="color: #000000">1024</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_1296_1319_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1296_1319_Open_Text.style.display='none'; Codehighlighter1_1296_1319_Closed_Image.style.display='inline'; Codehighlighter1_1296_1319_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1296_1319_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1296_1319_Closed_Text.style.display='none'; Codehighlighter1_1296_1319_Open_Image.style.display='inline'; Codehighlighter1_1296_1319_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_1296_1319_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1296_1319_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />label.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Free&nbsp;Memory&nbsp;:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">)(Runtime.getRuntime().freeMemory()</span><span style="color: #000000">/</span><span style="color: #000000">1024</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">K</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;Totle&nbsp;Memory&nbsp;Allo</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">cated&nbsp;:</span><span style="color: #000000">"<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">+</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">)(Runtime.getRuntime().totalMemory()</span><span style="color: #000000">/</span><span style="color: #000000">1024</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">K</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />status</span><span style="color: #000000">=</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">)(free</span><span style="color: #000000">*</span><span style="color: #000000">100</span><span style="color: #000000">/</span><span style="color: #000000">totle);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />pbar.setValue(status);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />pbar.setString(</span><span style="color: #000000">"</span><span style="color: #000000">Free&nbsp;Momery&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;status</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">%</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_1584_1604_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1584_1604_Open_Text.style.display='none'; Codehighlighter1_1584_1604_Closed_Image.style.display='inline'; Codehighlighter1_1584_1604_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1584_1604_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1584_1604_Closed_Text.style.display='none'; Codehighlighter1_1584_1604_Open_Image.style.display='inline'; Codehighlighter1_1584_1604_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">try</span><span id="Codehighlighter1_1584_1604_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1584_1604_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.sleep(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_1636_1637_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1636_1637_Open_Text.style.display='none'; Codehighlighter1_1636_1637_Closed_Image.style.display='inline'; Codehighlighter1_1636_1637_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1636_1637_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1636_1637_Closed_Text.style.display='none'; Codehighlighter1_1636_1637_Open_Image.style.display='inline'; Codehighlighter1_1636_1637_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(InterruptedException&nbsp;err)</span><span id="Codehighlighter1_1636_1637_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1636_1637_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">===============================================</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;myprojects.jmemorydemo;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.event.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.swing.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_1829_3209_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1829_3209_Open_Text.style.display='none'; Codehighlighter1_1829_3209_Closed_Image.style.display='inline'; Codehighlighter1_1829_3209_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1829_3209_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1829_3209_Closed_Text.style.display='none'; Codehighlighter1_1829_3209_Open_Image.style.display='inline'; Codehighlighter1_1829_3209_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MainFrame&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;JFrame&nbsp;</span><span id="Codehighlighter1_1829_3209_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1829_3209_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;JPanel&nbsp;contentPane;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;BorderLayout&nbsp;borderLayout1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BorderLayout();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;JProgressBar&nbsp;jProgressBar1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JProgressBar();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;JLabel&nbsp;jLabel1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JLabel();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;JLabel&nbsp;jLabel2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JLabel();<br />
<img id="Codehighlighter1_2070_2176_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2070_2176_Open_Text.style.display='none'; Codehighlighter1_2070_2176_Closed_Image.style.display='inline'; Codehighlighter1_2070_2176_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2070_2176_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2070_2176_Closed_Text.style.display='none'; Codehighlighter1_2070_2176_Open_Image.style.display='inline'; Codehighlighter1_2070_2176_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MainFrame()&nbsp;</span><span id="Codehighlighter1_2070_2176_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2070_2176_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />enableEvents(AWTEvent.WINDOW_EVENT_MASK);<br />
<img id="Codehighlighter1_2118_2130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2118_2130_Open_Text.style.display='none'; Codehighlighter1_2118_2130_Closed_Image.style.display='inline'; Codehighlighter1_2118_2130_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2118_2130_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2118_2130_Closed_Text.style.display='none'; Codehighlighter1_2118_2130_Open_Image.style.display='inline'; Codehighlighter1_2118_2130_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_2118_2130_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2118_2130_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jbInit();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_2151_2174_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2151_2174_Open_Text.style.display='none'; Codehighlighter1_2151_2174_Closed_Image.style.display='inline'; Codehighlighter1_2151_2174_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2151_2174_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2151_2174_Closed_Text.style.display='none'; Codehighlighter1_2151_2174_Open_Image.style.display='inline'; Codehighlighter1_2151_2174_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_2151_2174_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2151_2174_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_2217_3060_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2217_3060_Open_Text.style.display='none'; Codehighlighter1_2217_3060_Closed_Image.style.display='inline'; Codehighlighter1_2217_3060_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2217_3060_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2217_3060_Closed_Text.style.display='none'; Codehighlighter1_2217_3060_Open_Image.style.display='inline'; Codehighlighter1_2217_3060_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;jbInit()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_2217_3060_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2217_3060_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />(MainFrame.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getResource(</span><span style="color: #000000">"</span><span style="color: #000000">[Your&nbsp;Icon]</span><span style="color: #000000">"</span><span style="color: #000000">)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />contentPane&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(JPanel)&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getContentPane();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />contentPane.setLayout(borderLayout1);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.setSize(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Dimension(</span><span style="color: #000000">304</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">215</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.setTitle(</span><span style="color: #000000">"</span><span style="color: #000000">JMemoryDemo</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jLabel1.setFont(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.awt.Font(</span><span style="color: #000000">"</span><span style="color: #000000">Dialog</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jLabel1.setHorizontalAlignment(SwingConstants.CENTER);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jLabel1.setText(</span><span style="color: #000000">"</span><span style="color: #000000">Memory&nbsp;Monitor</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jProgressBar1.setOrientation(JProgressBar.VERTICAL);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jProgressBar1.setFont(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.awt.Font(</span><span style="color: #000000">"</span><span style="color: #000000">Dialog</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jProgressBar1.setToolTipText(</span><span style="color: #000000">""</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jProgressBar1.setStringPainted(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jLabel2.setFont(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.awt.Font(</span><span style="color: #000000">"</span><span style="color: #000000">Dialog</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">14</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />jLabel2.setText(</span><span style="color: #000000">""</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />contentPane.add(jProgressBar1,&nbsp;BorderLayout.CENTER);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />contentPane.add(jLabel1,&nbsp;BorderLayout.NORTH);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />contentPane.add(jLabel2,&nbsp;BorderLayout.SOUTH);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />ProgressThread&nbsp;pThread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ProgressThread(</span><span style="color: #0000ff">this</span><span style="color: #000000">.jProgressBar1,</span><span style="color: #0000ff">this</span><span style="color: #000000">.jLabel2);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />pThread.start();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_3111_3207_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3111_3207_Open_Text.style.display='none'; Codehighlighter1_3111_3207_Closed_Image.style.display='inline'; Codehighlighter1_3111_3207_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3111_3207_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3111_3207_Closed_Text.style.display='none'; Codehighlighter1_3111_3207_Open_Image.style.display='inline'; Codehighlighter1_3111_3207_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;processWindowEvent(WindowEvent&nbsp;e)&nbsp;</span><span id="Codehighlighter1_3111_3207_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3111_3207_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">super</span><span style="color: #000000">.processWindowEvent(e);<br />
<img id="Codehighlighter1_3187_3205_Open_Image" onclick="this.style.display='none'; Codehighlighter1_3187_3205_Open_Text.style.display='none'; Codehighlighter1_3187_3205_Closed_Image.style.display='inline'; Codehighlighter1_3187_3205_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_3187_3205_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_3187_3205_Closed_Text.style.display='none'; Codehighlighter1_3187_3205_Open_Image.style.display='inline'; Codehighlighter1_3187_3205_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(e.getID()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;WindowEvent.WINDOW_CLOSING)&nbsp;</span><span id="Codehighlighter1_3187_3205_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_3187_3205_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />System.exit(</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
　问题的关键：
<p>　　totle=(int)(Runtime.getRuntime().totalMemory()/1024);</p>
<p>　　free=(int)(Runtime.getRuntime().freeMemory()/1024);</p>
<!-- 分页 --><!-- 分页end -->
<img src ="http://www.blogjava.net/lcs/aggbug/158732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-07 09:57 <a href="http://www.blogjava.net/lcs/archive/2007/11/07/158732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Merlin 的魔力: 不确定的进度条</title><link>http://www.blogjava.net/lcs/archive/2007/11/07/158730.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 07 Nov 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/07/158730.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/158730.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/07/158730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/158730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/158730.html</trackback:ping><description><![CDATA[<blockquote>
<h1><span style="color: #999999">Merlin 的魔力: </span>不确定的进度条</h1>
<p id="subtitle"><em>JProgressBar 的一个细微但是重要的更新</em><br />
<br />
级别： 初级<br />
<a href="http://www.ibm.com/developerworks/cn/java/j-mer11183/index.html#author">John Zukowski</a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#122;&#64;&#122;&#117;&#107;&#111;&#119;&#115;&#107;&#105;&#46;&#110;&#101;&#116;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#19981;&#30830;&#23450;&#30340;&#36827;&#24230;&#26465;&#38;&#97;&#109;&#112;&#59;&#99;&#99;&#61;&#106;&#97;&#122;&#64;&#122;&#117;&#107;&#111;&#119;&#115;&#107;&#105;&#46;&#110;&#101;&#116;">jaz@zukowski.net</a>), 总裁, JZ Ventures, Inc<br />
2003 年 12 月 01 日<br />
<br />
开发人员用 <code>JProgressBar</code> 组件向用户显示一项任务的进度。针对非常长的任务或者难于精确确定完成进度的任务，Merlin版本对 <code>JProgressBar</code> 增加了一个不确定模式。本月，专栏作者 John Zukowski 对 <code>JProgressBar</code> 的使用作了重新介绍，并讨论了它的新的不确定模式。您可以在本文的 <a href="javascript:void forumWindow()">讨论论坛</a>中与作者以及其他读者共享您的想法（您也可以单击文章顶部或者底部的 <strong>讨论</strong>进入论坛）。 </p>
</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p>在 Java 2 SDK, Standard Edition，版本 1.4 中，有了一些大的变化，如增加了像 <code>JSpinner</code> 这样的新组件、像 <code>SpringLayout</code> 这样的新布局管理器、或者像 Java Logging API 这样的新 API。而另一些变化则没有这么显著，如小的改进或者对现有 API 的优化。本月关于 <code>SpringLayout</code> 组件的技巧就属于后一种情况。它是细微的，但是很重要。 </p>
<p><a name="1"><span class="atitle">进度条的基本用法</span></a></p>
<p><code>JProgressBar</code> 是原来的 Swing 组件集中的一个。它提供了一种以图形方式显示进程完成进度的简单方式。当进程进行时，一个长条就会在该组件上逐渐延伸，直到任务完成并且长条全部填满。长条的移动通常是某个多线程任务的一部分，这有助于避免阻塞应用程序其余部分的进度，如常规的屏幕更新。虽然没有哪一条特定的规则说进度条必须进行线性移动，但是如果看到进程从 10% 移动到 35%，然后又回到 27%，然后再增加到 80%，最后以 0% 结束，作为用户我会觉得多少有些古怪。 </p>
<p>用五个构造函数中的一个来构造 <code>JProgressBar</code> ，如清单 1 所示： </p>
<br />
<a name="code1"><strong>清单 1. JProgressBar 构造函数</strong></a><br />
<table cellspacing="0" cellpadding="0" width="500" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">  public JProgressBar()
            public JProgressBar(int orientation)
            public JProgressBar(int minimum, int maximum)
            public JProgressBar(int orientation, int minimum, int maximum)
            public JProgressBar(BoundedRangeModel model)
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><code>JProgressBar</code> 需要初始化方向和值范围。方向是通过 <code>JProgressBar</code> 的 <code>VERTICAL</code> 或者 <code>HORIZONTAL</code> 常量确定的。默认为 <code>HORIZONTAL</code> 。 </p>
<p>在创建了这个组件并在屏幕上显示它后，启动第二个线程以执行需要测量其进度的任务。然后定期用 <code>setValue()</code> 方法更新进度条的值以显示任务的当前进展。清单 2 显示了 <code>setValue()</code> 的一个简单例子： </p>
<br />
<a name="code2"><strong>清单 2. 简单的 JProgressBar 使用方法</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">import javax.swing.*;
            import java.awt.*;
            import java.awt.event.*;
            import java.lang.reflect.*;
            public class ProgressSample {
            static class BarThread extends Thread {
            private static int DELAY = 500;
            JProgressBar progressBar;
            public BarThread(JProgressBar bar) {
            progressBar = bar;
            }
            public void run() {
            int minimum = progressBar.getMinimum();
            int maximum = progressBar.getMaximum();
            Runnable runner = new Runnable() {
            public void run() {
            int value = progressBar.getValue();
            progressBar.setValue(value+1);
            }
            };
            for (int i=minimum; i&lt;maximum; i++) {
            try {
            SwingUtilities.invokeAndWait(runner);
            // Our task for each step is to just sleep
            Thread.sleep(DELAY);
            } catch (InterruptedException ignoredException) {
            } catch (InvocationTargetException ignoredException) {
            }
            }
            }
            }
            public static void main(String args[]) {
            // Initialize
            final JProgressBar aJProgressBar = new JProgressBar(0, 100);
            final JButton aJButton = new JButton("Start");
            ActionListener actionListener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            aJButton.setEnabled(false);
            Thread stepper = new BarThread(aJProgressBar);
            stepper.start();
            }
            };
            aJButton.addActionListener(actionListener);
            JFrame theFrame = new JFrame("Progress Bars");
            theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container contentPane = theFrame.getContentPane();
            contentPane.add(aJProgressBar, BorderLayout.NORTH);
            contentPane.add(aJButton, BorderLayout.SOUTH);
            theFrame.setSize(300, 100);
            theFrame.show();
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>第一次运行这段代码时，您会看到类似于图 1 的屏幕。</p>
<br />
<a name="fig1"><strong>图 1. 开始屏幕 </strong></a><br />
<img height="100" alt="开始屏幕" src="http://www.ibm.com/developerworks/cn/java/j-mer11183/images/start.jpg" width="300" /> <br />
<p>单击这个按钮，启动第二个任务，并在它运行时更新进度条。图 2 显示了运行到一半时的进度条。</p>
<br />
<a name="fig2"><strong>图 2. 屏幕显示进度 </strong></a><br />
<img height="100" alt="屏幕显示进度" src="http://www.ibm.com/developerworks/cn/java/j-mer11183/images/half.jpg" width="300" /> <br />
<p>这里没什么特别的。主要代码创建带有一个按钮和进度条的 GUI。当您选择按钮时，它就引发操作以更新进度条。进度条用来对某些任务进行测量。在示例程序中，这个任务就是休眠半秒 100 次。</p>
<p>在默认情况下，除了进度条外，没有其他关于进度的图形指示。添加如下的一行代码，您就可以在任务完成过程中，让进度条显示任务完成的百分比：</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">  aJProgressBar.setStringPainted(true);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>图 3 显示了我们增加了新代码的屏幕：</p>
<br />
<a name="fig3"><strong>图 3. 显示完成百分比 </strong></a><br />
<img height="100" alt="显示完成百分比" src="http://www.ibm.com/developerworks/cn/java/j-mer11183/images/percent.jpg" width="300" /> <br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-mer11183/index.html#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="2"><span class="atitle">使用不确定模式</span></a></p>
<p>从 Merlin 版本开始， <code>JProgressBar</code> 还支持另一种模式 ―― <em>确定</em>。对于非固定步数的长任务，可以使用这种模式。它显示固定的动画以表明有些事情正在发生，但是它不表明完成的百分比。如果您确定了任务所要花费的时间，就可以切换回确定模式。在不确定模式下， <code>JProgressBar</code> 显示一个长条，在显示区域中来回移动。 </p>
<p><a href="http://www.ibm.com/developerworks/cn/java/j-mer11183/index.html#code3">清单 3</a> 显示了这种模式的一个例子。这个新方法就是 <code>setIndeterminate()</code> 。值为 <code>true</code> 意味着不确定，而值为 <code>false</code> 则意味着普通或者确定。 </p>
<br />
<a name="code3"><strong>清单 3. 不确定进度条</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">import javax.swing.*;
            import java.awt.*;
            import java.awt.event.*;
            public class ProgressSample2 {
            public static void main(String args[]) {
            final JProgressBar aJProgressBar = new JProgressBar(0, 100);
            aJProgressBar.setIndeterminate(true);
            JButton aJButton = new JButton("Toggle");
            ActionListener actionListener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            boolean indeterminate = aJProgressBar.isIndeterminate();
            aJProgressBar.setIndeterminate(!indeterminate);
            }
            };
            aJButton.addActionListener(actionListener);
            JFrame theFrame = new JFrame("Indeterminate");
            theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container contentPane = theFrame.getContentPane();
            contentPane.add(aJProgressBar, BorderLayout.NORTH);
            contentPane.add(aJButton, BorderLayout.SOUTH);
            theFrame.setSize(300, 100);
            theFrame.show();
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a href="http://www.ibm.com/developerworks/cn/java/j-mer11183/index.html#fig4">图 4</a>显示相关的屏幕（您需要想像这个长条是来回移动的）。按钮用于在进度条的不确定和确定模式之间进行切换。 </p>
<br />
<a name="fig4"><strong>图 4. 不确定模式 </strong></a><br />
<img height="100" alt="不确定模式" src="http://www.ibm.com/developerworks/cn/java/j-mer11183/images/indeterminate.jpg" width="300" /> <br />
<p>有两种新的 UI 默认值用于改变重绘时间间隔和循环时间： <code>ProgressBar.repaintInterval</code> 和 <code>ProgressBar.cycleTime</code> 。改变这些设置 ―― 如下所示 ―― 会改变显示速度。循环时间必须是重绘时间间隔的偶数倍，所以如果间隔为 100，那么循环时间应该是 200、500 或者 1000 ―― 但不能是 750。 </p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">  UIManager.put("ProgressBar.repaintInterval", new Integer(150));
            UIManager.put("ProgressBar.cycleTime", new Integer(1050));
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>注意您需要在创建进度条 <em>之前</em>设置这些值。 </p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="3"><span class="atitle">结束语</span></a></p>
<p><code>ProgressBar</code> 还有很多内容，但是其他特性在 1.4 版中都没有改变。我们简单回顾了这个组件的原有使用方式，并介绍了在 Merlin 版本中它的新特性。您也可以考虑用 <code>ProgressMonitor</code> 或者 <code>ProgressMonitorInputStream</code> 监视这些长任务的进度。它们都在内部利用了 <code>JProgressBar</code> 的优点。 </p>
<br />
<br />
原文：http://www.ibm.com/developerworks/cn/java/j-mer11183/index.html
<img src ="http://www.blogjava.net/lcs/aggbug/158730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-07 09:54 <a href="http://www.blogjava.net/lcs/archive/2007/11/07/158730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 打包 （个人整理）</title><link>http://www.blogjava.net/lcs/archive/2007/11/06/158563.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Tue, 06 Nov 2007 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/06/158563.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/158563.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/06/158563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/158563.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/158563.html</trackback:ping><description><![CDATA[<p>好久没玩这个了！复习一下！&nbsp;<br />
D盘根目录下写&nbsp; Test.java<br />
&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_17_120_Open_Image" onclick="this.style.display='none'; Codehighlighter1_17_120_Open_Text.style.display='none'; Codehighlighter1_17_120_Closed_Image.style.display='inline'; Codehighlighter1_17_120_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_17_120_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_17_120_Closed_Text.style.display='none'; Codehighlighter1_17_120_Open_Image.style.display='inline'; Codehighlighter1_17_120_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test</span><span id="Codehighlighter1_17_120_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_17_120_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_58_118_Open_Image" onclick="this.style.display='none'; Codehighlighter1_58_118_Open_Text.style.display='none'; Codehighlighter1_58_118_Closed_Image.style.display='inline'; Codehighlighter1_58_118_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_58_118_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_58_118_Closed_Text.style.display='none'; Codehighlighter1_58_118_Open_Image.style.display='inline'; Codehighlighter1_58_118_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)</span><span id="Codehighlighter1_58_118_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_58_118_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">*******--TEST&nbsp;&nbsp;JAVA!--*********</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
javac Test.java<br />
<br />
试一下 java Test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OK!<br />
<br />
jar cvf&nbsp; test1.jar Test.class，回车后去D盘，OK多了 test1.jar&nbsp;<br />
jar cvf&nbsp;&nbsp; jar文件名&nbsp; mf&nbsp;文件名&nbsp;&nbsp;&nbsp;.class文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
第二种玩法 做一个*.mf文件内容如下：<br />
&nbsp;<br />
Manifest-Version: 1.0<br />
Created-By: 1.6.0-beta2 (Sun Microsystems Inc.)<br />
Main-Class: Test<br />
<br />
可以根据第一种方法生成的 MANIFEST.MF&nbsp; 改<br />
<br />
将*.mf 和.class放在一个目录中<br />
<br />
jar cvfm h.jar 11.mf&nbsp; Test.class <br />
jar cvfm&nbsp;&nbsp; jar文件名&nbsp; mf&nbsp;文件名&nbsp;&nbsp;&nbsp;.class文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
执行<br />
java -jar hello.jar&nbsp;&nbsp;&nbsp;&nbsp; <br />
java -jar jar文件全名 <br />
<br />
package&nbsp; com.lk.test打包<br />
<br />
jar cvfm hh.jar test.mf com<br />
<br />
package&nbsp; com.lk.test打包+配置文件<br />
<br />
jar cvfm hh.jar test.mf com&nbsp;db.properties<br />
<br />
就可以将db.properties放在和com并列的目录下<br />
<br />
<br />
<p>如果使用了第三方jar包 : 要写入.mf文件中 </p>
<p>Manifest-Version: 1.0<br />
Main-Class: lk.Test<br />
Class-Path: lib/jxl.jar<br />
</p>
另外在写manifest.mf 文件的时候也有两点务必注意<br />
Main-Class: test.test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class: test.test 之间的一个空格，另外，行尾务必回车换行<br />
<br />
<br />
===========jar帮助================<br />
<p>用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...<br />
选项包括：<br />
&nbsp;&nbsp;&nbsp; -c&nbsp; 创建新的归档文件<br />
&nbsp;&nbsp;&nbsp; -t&nbsp; 列出归档目录<br />
&nbsp;&nbsp;&nbsp; -x&nbsp; 解压缩已归档的指定（或所有）文件<br />
&nbsp;&nbsp;&nbsp; -u&nbsp; 更新现有的归档文件<br />
&nbsp;&nbsp;&nbsp; -v&nbsp; 在标准输出中生成详细输出<br />
&nbsp;&nbsp;&nbsp; -f&nbsp; 指定归档文件名<br />
&nbsp;&nbsp;&nbsp; -m&nbsp; 包含指定清单文件中的清单信息<br />
&nbsp;&nbsp;&nbsp; -e&nbsp; 为捆绑到可执行 jar 文件的独立应用程序指定应用程序入口点<br />
<br />
&nbsp;&nbsp;&nbsp; -0&nbsp; 仅存储；不使用任何 ZIP 压缩<br />
&nbsp;&nbsp;&nbsp; -M&nbsp; 不创建条目的清单文件<br />
&nbsp;&nbsp;&nbsp; -i&nbsp; 为指定的 jar 文件生成索引信息<br />
&nbsp;&nbsp;&nbsp; -C&nbsp; 更改为指定的目录并包含其中的文件<br />
<br />
如果有任何目录文件，则对其进行递归处理。<br />
清单文件名、归档文件名和入口点名的指定顺序与 "m"、"f" 和 "e" 标志的指定顺序相同。</p>
<p>示例 1：将两个类文件归档到一个名为 classes.jar 的归档文件中：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jar cvf classes.jar Foo.class Bar.class<br />
示例 2：使用现有的清单文件 "mymanifest" 并<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将 foo/ 目录中的所有文件归档到 "classes.jar" 中：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jar cvfm classes.jar mymanifest -C foo/ .</p>
<br />
补充： <br />
############ <br />
<br />
jar基本操作： <br />
<br />
############ <br />
<br />
1. 创建jar文件 <br />
jar cf jar-file input-file(s) <br />
c---want to Create a JAR file. <br />
f---want the output to go to a file rather than to stdout. <br />
eg: 1)jar cf myjar.jar query_maintain_insert.htm <br />
2)jar cvf myjar.jar query_maintain_insert.htm <br />
v---Produces verbose(详细的) output. <br />
3)jar cvf myjar.jar query_maintain_insert.htm mydirectory <br />
4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory <br />
0---don't want the JAR file to be compressed. <br />
5)jar cmf MANIFEST.MF myjar.jar yahh.txt <br />
m---Used to include manifest information from an existing manifest file. <br />
6)jar cMf MANIFEST.MF myjar.jar yahh.txt <br />
M---the default manifest file should not be produced. <br />
7)jar cvf myjar.jar * <br />
*---create all contents in current directory. <br />
2. 察看jar文件 <br />
jar tf jar-file <br />
t---want to view the Table of contents of the JAR file. <br />
eg: 1)jar vft yahh.jar <br />
v---Produces verbose(详细的) output. <br />
3. 提取jar文件 <br />
jar xf jar-file [archived-file(s)] <br />
x---want to extract files from the JAR archive. <br />
eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt) <br />
2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文件yahhalex.txt) <br />
3)jar xf yahh.jar(提取该jar包中的所有文件或目录) <br />
4. 修改Manifest文件 <br />
jar cmf manifest-addition jar-file input-file(s) <br />
m---Used to include manifest information from an existing manifest file. <br />
<br />
5. 更新jar文件 <br />
<br />
jar uf jar-file input-file(s) <br />
u---want to update an existing JAR file. 
<img src ="http://www.blogjava.net/lcs/aggbug/158563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-06 15:22 <a href="http://www.blogjava.net/lcs/archive/2007/11/06/158563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JTable中放置JTextarea</title><link>http://www.blogjava.net/lcs/archive/2007/11/06/158486.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Tue, 06 Nov 2007 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/06/158486.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/158486.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/06/158486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/158486.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/158486.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: package&nbsp;com.ideal.ieai.adaptors.taskadaptor.usertask.view.timeout;import&nbsp;java.awt.BorderLayout;import&nbsp;java.awt.Component;import&nbsp;java.awt.FlowLayout;import&nbsp;java.awt.G...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2007/11/06/158486.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/158486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-06 11:29 <a href="http://www.blogjava.net/lcs/archive/2007/11/06/158486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Swing之JTable的详细介绍</title><link>http://www.blogjava.net/lcs/archive/2007/11/06/158416.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Tue, 06 Nov 2007 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/06/158416.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/158416.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/06/158416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/158416.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/158416.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 8-1:使用JTable组件:类层次结构图：java.lang.Object--java.awt.Component--java.awt.Container--javax.swing.JComponent--javax.swing.JTabel在使用JTable以前，我们先看一下它的构造函数有哪些， 以及应该如何使用：JTabel构造函数：JTable():...&nbsp;&nbsp;<a href='http://www.blogjava.net/lcs/archive/2007/11/06/158416.html'>阅读全文</a><img src ="http://www.blogjava.net/lcs/aggbug/158416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-06 09:06 <a href="http://www.blogjava.net/lcs/archive/2007/11/06/158416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Properties  例子（原创）</title><link>http://www.blogjava.net/lcs/archive/2007/11/02/157700.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Fri, 02 Nov 2007 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2007/11/02/157700.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/157700.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2007/11/02/157700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/157700.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/157700.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.FileInputStream;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.InputStream;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Hashtable;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Properties;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Enumeration;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_179_2452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_179_2452_Open_Text.style.display='none'; Codehighlighter1_179_2452_Closed_Image.style.display='inline'; Codehighlighter1_179_2452_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_179_2452_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_179_2452_Closed_Text.style.display='none'; Codehighlighter1_179_2452_Open_Image.style.display='inline'; Codehighlighter1_179_2452_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LKDB_ParameterLoad</span><span id="Codehighlighter1_179_2452_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_179_2452_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;LKDB_ParameterLoad&nbsp;lkdb_parameterload;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Hashtable&nbsp;register&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Hashtable();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_345_346_Open_Image" onclick="this.style.display='none'; Codehighlighter1_345_346_Open_Text.style.display='none'; Codehighlighter1_345_346_Closed_Image.style.display='inline'; Codehighlighter1_345_346_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_345_346_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_345_346_Closed_Text.style.display='none'; Codehighlighter1_345_346_Open_Image.style.display='inline'; Codehighlighter1_345_346_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;LKDB_ParameterLoad()</span><span id="Codehighlighter1_345_346_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_345_346_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_399_538_Open_Image" onclick="this.style.display='none'; Codehighlighter1_399_538_Open_Text.style.display='none'; Codehighlighter1_399_538_Closed_Image.style.display='inline'; Codehighlighter1_399_538_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_399_538_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_399_538_Closed_Text.style.display='none'; Codehighlighter1_399_538_Open_Image.style.display='inline'; Codehighlighter1_399_538_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;LKDB_ParameterLoad&nbsp;getInstance()</span><span id="Codehighlighter1_399_538_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_399_538_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(lkdb_parameterload&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lkdb_parameterload&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LKDB_ParameterLoad();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;lkdb_parameterload;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_593_1667_Open_Image" onclick="this.style.display='none'; Codehighlighter1_593_1667_Open_Text.style.display='none'; Codehighlighter1_593_1667_Closed_Image.style.display='inline'; Codehighlighter1_593_1667_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_593_1667_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_593_1667_Closed_Text.style.display='none'; Codehighlighter1_593_1667_Open_Image.style.display='inline'; Codehighlighter1_593_1667_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Properties&nbsp;getProperties(String&nbsp;fileName)</span><span id="Codehighlighter1_593_1667_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_593_1667_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">根据&nbsp;fileName&nbsp;获取&nbsp;Properties</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_670_1571_Open_Image" onclick="this.style.display='none'; Codehighlighter1_670_1571_Open_Text.style.display='none'; Codehighlighter1_670_1571_Closed_Image.style.display='inline'; Codehighlighter1_670_1571_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_670_1571_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_670_1571_Closed_Text.style.display='none'; Codehighlighter1_670_1571_Open_Image.style.display='inline'; Codehighlighter1_670_1571_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_670_1571_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_670_1571_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Properties)register.get(fileName);<br />
<img id="Codehighlighter1_749_1561_Open_Image" onclick="this.style.display='none'; Codehighlighter1_749_1561_Open_Text.style.display='none'; Codehighlighter1_749_1561_Closed_Image.style.display='inline'; Codehighlighter1_749_1561_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_749_1561_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_749_1561_Closed_Text.style.display='none'; Codehighlighter1_749_1561_Open_Image.style.display='inline'; Codehighlighter1_749_1561_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(p&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_749_1561_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_749_1561_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">根据&nbsp;fileName&nbsp;获取&nbsp;Properties&nbsp;不存在新建&nbsp;存在直接返回</span><span style="color: #008000"><br />
<img id="Codehighlighter1_810_934_Open_Image" onclick="this.style.display='none'; Codehighlighter1_810_934_Open_Text.style.display='none'; Codehighlighter1_810_934_Closed_Image.style.display='inline'; Codehighlighter1_810_934_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_810_934_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_810_934_Closed_Text.style.display='none'; Codehighlighter1_810_934_Open_Image.style.display='inline'; Codehighlighter1_810_934_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_810_934_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_810_934_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("is&nbsp;=&nbsp;&nbsp;");&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileInputStream(fileName);<br />
<img id="Codehighlighter1_953_1360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_953_1360_Open_Text.style.display='none'; Codehighlighter1_953_1360_Closed_Image.style.display='inline'; Codehighlighter1_953_1360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_953_1360_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_953_1360_Closed_Text.style.display='none'; Codehighlighter1_953_1360_Open_Image.style.display='inline'; Codehighlighter1_953_1360_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_953_1360_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_953_1360_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_1003_1154_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1003_1154_Open_Text.style.display='none'; Codehighlighter1_1003_1154_Closed_Image.style.display='inline'; Codehighlighter1_1003_1154_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1003_1154_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1003_1154_Closed_Text.style.display='none'; Codehighlighter1_1003_1154_Open_Image.style.display='inline'; Codehighlighter1_1003_1154_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(fileName.startsWith(</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">))</span><span id="Codehighlighter1_1003_1154_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1003_1154_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("is&nbsp;=&nbsp;if&nbsp;");&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getResourceAsStream(fileName);<br />
<img id="Codehighlighter1_1159_1318_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1159_1318_Open_Text.style.display='none'; Codehighlighter1_1159_1318_Closed_Image.style.display='inline'; Codehighlighter1_1159_1318_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1159_1318_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1159_1318_Closed_Text.style.display='none'; Codehighlighter1_1159_1318_Open_Image.style.display='inline'; Codehighlighter1_1159_1318_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">else</span><span id="Codehighlighter1_1159_1318_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1159_1318_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("is&nbsp;=&nbsp;else&nbsp;");&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getResourceAsStream(</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;fileName);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Properties();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.load(is);</span><span style="color: #008000">//</span><span style="color: #008000">载入&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;register.put(fileName,&nbsp;p);</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;对应&nbsp;p&nbsp;=&nbsp;(Properties)register.get(fileName);</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_1590_1643_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1590_1643_Open_Text.style.display='none'; Codehighlighter1_1590_1643_Closed_Image.style.display='inline'; Codehighlighter1_1590_1643_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1590_1643_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1590_1643_Closed_Text.style.display='none'; Codehighlighter1_1590_1643_Open_Image.style.display='inline'; Codehighlighter1_1590_1643_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_1590_1643_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1590_1643_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(System.out);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;p;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_1719_1883_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1719_1883_Open_Text.style.display='none'; Codehighlighter1_1719_1883_Closed_Image.style.display='inline'; Codehighlighter1_1719_1883_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1719_1883_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1719_1883_Closed_Text.style.display='none'; Codehighlighter1_1719_1883_Open_Image.style.display='inline'; Codehighlighter1_1719_1883_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getPropertyValue(String&nbsp;strKey)</span><span id="Codehighlighter1_1719_1883_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1719_1883_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_1732_1784_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1732_1784_Open_Text.style.display='none'; Codehighlighter1_1732_1784_Closed_Image.style.display='inline'; Codehighlighter1_1732_1784_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1732_1784_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1732_1784_Closed_Text.style.display='none'; Codehighlighter1_1732_1784_Open_Image.style.display='inline'; Codehighlighter1_1732_1784_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span id="Codehighlighter1_1732_1784_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1732_1784_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;p.getProperty(strKey);<br />
<img id="Codehighlighter1_1803_1856_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1803_1856_Open_Text.style.display='none'; Codehighlighter1_1803_1856_Closed_Image.style.display='inline'; Codehighlighter1_1803_1856_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1803_1856_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1803_1856_Closed_Text.style.display='none'; Codehighlighter1_1803_1856_Open_Image.style.display='inline'; Codehighlighter1_1803_1856_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)</span><span id="Codehighlighter1_1803_1856_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1803_1856_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(System.out);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1944_2449_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1944_2449_Open_Text.style.display='none'; Codehighlighter1_1944_2449_Closed_Image.style.display='inline'; Codehighlighter1_1944_2449_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1944_2449_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1944_2449_Closed_Text.style.display='none'; Codehighlighter1_1944_2449_Open_Image.style.display='inline'; Codehighlighter1_1944_2449_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)</span><span id="Codehighlighter1_1944_2449_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1944_2449_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LKDB_ParameterLoad&nbsp;pl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;LKDB_ParameterLoad.getInstance();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pl.getProperties(</span><span style="color: #000000">"</span><span style="color: #000000">/database.properties</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_2166_2360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2166_2360_Open_Text.style.display='none'; Codehighlighter1_2166_2360_Closed_Image.style.display='inline'; Codehighlighter1_2166_2360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2166_2360_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2166_2360_Closed_Text.style.display='none'; Codehighlighter1_2166_2360_Open_Image.style.display='inline'; Codehighlighter1_2166_2360_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(Enumeration&nbsp;propNames&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.propertyNames();&nbsp;propNames.hasMoreElements();)</span><span id="Codehighlighter1_2166_2360_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2166_2360_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;temp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)propNames.nextElement();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">propNames&nbsp;[</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">]&nbsp;=</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">temp);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">getProperty&nbsp;[</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">]&nbsp;=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;p.getProperty(temp));&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pl.register.clear();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("&nbsp;="+p.getProperty(""));&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<img src ="http://www.blogjava.net/lcs/aggbug/157700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2007-11-02 11:11 <a href="http://www.blogjava.net/lcs/archive/2007/11/02/157700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>