﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java Tools-随笔分类-J2SE</title><link>http://www.blogjava.net/simie/category/23718.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 31 Jul 2007 19:55:45 GMT</lastBuildDate><pubDate>Tue, 31 Jul 2007 19:55:45 GMT</pubDate><ttl>60</ttl><item><title> java中相对路径，绝对路径问题总结</title><link>http://www.blogjava.net/simie/archive/2007/07/29/133094.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Sun, 29 Jul 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/29/133094.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/133094.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/29/133094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/133094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/133094.html</trackback:ping><description><![CDATA[1.基本概念的理解
<p>　　绝对路径：绝对路径就是你的主页上的文件或目录在硬盘上真正的路径，(URL和物理路径)例如：<br>C:\xyz\test.txt&nbsp;代表了test.txt文件的绝对路径。<a href="http://www.sun.com/index.htm"><u><font color=#0000ff>http://www.sun.com/index.htm</font></u></a>也代表了一个<br>URL绝对路径。</p>
<p>　　相对路径：相对与某个基准目录的路径。包含Web的相对路径（HTML中的相对目录），例如：在<br>Servlet中，"/"代表Web应用的跟目录。和物理路径的相对表示。例如："./" 代表当前目录,<br>"../"代表上级目录。这种类似的表示，也是属于相对路径。</p>
<p>另外关于URI，URL,URN等内容，请参考RFC相关文档标准。</p>
<p>RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax, <br>(<a href="http://www.ietf.org/rfc/rfc2396.txt"><u><font color=#0000ff>http://www.ietf.org/rfc/rfc2396.txt</font></u></a>)</p>
<p><br>2.关于JSP/Servlet中的相对路径和绝对路径。</p>
<p>2.1服务器端的地址 </p>
<p>　　&nbsp;服务器端的相对地址指的是相对于你的web应用的地址，这个地址是在服务器端解析的<br>（不同于html和javascript中的相对地址，他们是由客户端浏览器解析的）也就是说这时候<br>在jsp和servlet中的相对地址应该是相对于你的web应用，即相对于<a href="http://192.168.0.1/webapp/"><u><font color=#0000ff>http://192.168.0.1/webapp/</font></u></a>的。 </p>
<p>　　其用到的地方有： <br>&nbsp;forward：servlet中的request.getRequestDispatcher(address);这个address是<br>在服务器端解析的，所以，你要forward到a.jsp应该这么写：<br>request.getRequestDispatcher(&#8220;/user/a.jsp&#8221;)这个/相对于当前的web应用webapp，<br>其绝对地址就是：<a href="http://192.168.0.1/webapp/user/a.jsp"><u><font color=#0000ff>http://192.168.0.1/webapp/user/a.jsp</font></u></a>。 <br>sendRedirect：在jsp中&lt;%response.sendRedirect("/rtccp/user/a.jsp");%&gt; </p>
<p>2.22、客户端的地址 <br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有的html页面中的相对地址都是相对于服务器根目录(<a href="http://192.168.0.1/"><u><font color=#0000ff>http://192.168.0.1/</font></u></a>)的，<br>而不是(跟目录下的该Web应用的目录)http://192.168.0.1/webapp/的。 <br>&nbsp;Html中的form表单的action属性的地址应该是相对于服务器根目录(<a href="http://192.168.0.1/"><u><font color=#0000ff>http://192.168.0.1/</font></u></a>)的，<br>所以，如果提交到a.jsp为：action＝"/webapp/user/a.jsp"或action="&lt;%=request.getContextPath()%&gt;"/user/a.jsp；<br>　　提交到servlet为actiom＝"/webapp/handleservlet" &nbsp;<br>&nbsp;　　Javascript也是在客户端解析的，所以其相对路径和form表单一样。 <br>&nbsp;</p>
<p>　　因此，一般情况下，在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上<br>&lt;%=request.getContextPath()%&gt;,以确保所引用的文件都属于Web应用中的目录。<br>另外，应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径，这样<br>当文件移动时，很容易出问题。</p>
<p><br>3. JSP/Servlet中获得当前应用的相对路径和绝对路径<br>3.1 JSP中获得当前应用的相对路径和绝对路径<br>&nbsp;根目录所对应的绝对路径:request.getRequestURI()<br>&nbsp;文件的绝对路径&nbsp;&nbsp;&nbsp; 　:application.getRealPath(request.getRequestURI());<br>&nbsp;当前web应用的绝对路径 :application.getRealPath("/");<br>&nbsp;取得请求文件的上层目录:new File(application.getRealPath(request.getRequestURI())).getParent()</p>
<p>3.2 Servlet中获得当前应用的相对路径和绝对路径<br>&nbsp;根目录所对应的绝对路径:request.getServletPath();<br>&nbsp;文件的绝对路径&nbsp;&nbsp;&nbsp; :request.getSession().getServletContext().getRealPath<br>(request.getRequestURI())&nbsp;&nbsp;&nbsp;<br>&nbsp;当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ServletContext对象获得几种方式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.http.HttpSession.getServletContext() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.jsp.PageContext.getServletContext() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.ServletConfig.getServletContext() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)</p>
<p>4.java 的Class中获得相对路径，绝对路径的方法<br>4.1单独的Java类中获得绝对路径<br>　　根据java.io.File的Doc文挡，可知:<br>&nbsp;默认情况下new File("/")代表的目录为：System.getProperty("user.dir")。<br>&nbsp;一下程序获得执行类的当前路径<br>package org.cheng.file;<br>import java.io.File;</p>
<p>public class FileTest {<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;System.out.println(FileTest.class.getClassLoader().getResource(""));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>　　System.out.println(ClassLoader.getSystemResource(""));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;System.out.println(FileTest.class.getResource(""));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;System.out.println(FileTest.class.getResource("/")); //Class文件所在路径&nbsp; <br>&nbsp;&nbsp;System.out.println(new File("/").getAbsolutePath());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;System.out.println(System.getProperty("user.dir"));&nbsp;&nbsp;&nbsp; <br>&nbsp;}<br>}</p>
<p>4.2服务器中的Java类获得当前路径（来自网络）<br>(1).Weblogic</p>
<p>WebApplication的系统文件根目录是你的weblogic安装所在根目录。<br>例如：如果你的weblogic安装在c:\bea\weblogic700.....<br>那么，你的文件根路径就是c:\.<br>所以，有两种方式能够让你访问你的服务器端的文件：<br>a.使用绝对路径：<br>比如将你的参数文件放在c:\yourconfig\yourconf.properties，<br>直接使用 new FileInputStream("yourconfig/yourconf.properties");<br>b.使用相对路径：<br>相对路径的根目录就是你的webapplication的根路径，即WEB-INF的上一级目录，将你的参数文件放</p>
<p>在yourwebapp\yourconfig\yourconf.properties，<br>这样使用：<br>new FileInputStream("./yourconfig/yourconf.properties");<br>这两种方式均可，自己选择。</p>
<p>(2).Tomcat</p>
<p>在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin</p>
<p>(3).Resin</p>
<p>不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET<br>的路径为根.比如用新建文件法测试File f = new File("a.htm");<br>这个a.htm在resin的安装目录下 </p>
<p>(4).如何读相对路径哪？</p>
<p>在Java文件中getResource或getResourceAsStream均可</p>
<p>例：getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web</p>
<p>发布根路径下WEB-INF/classes</p>
<p>默认使用该方法的路径是：WEB-INF/classes。已经在Tomcat中测试。</p>
<p>5.读取文件时的相对路径，避免硬编码和绝对路径的使用。（来自网络）<br>5.1 采用Spring的DI机制获得文件，避免硬编码。<br>&nbsp; &nbsp;参考下面的连接内容：<br>&nbsp; &nbsp;<a href="http://www.javajia.net/viewtopic.php?p=90213"><u><font color=#0000ff>http://www.javajia.net/viewtopic.php?p=90213</font></u></a>&amp;<br>5.2 配置文件的读取<br>&nbsp;参考下面的连接内容：<br>&nbsp;<a href="http://dev.csdn.net/develop/article/39/39681.shtm"><u><font color=#0000ff>http://dev.csdn.net/develop/article/39/39681.shtm</font></u></a><br>5.3 通过虚拟路径或相对路径读取一个xml文件，避免硬编码<br>&nbsp;参考下面的连接内容：<br>&nbsp;<a href="http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8"><u><font color=#0000ff>http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8</font></u></a><br>&nbsp;<br>6.Java中文件的常用操作（复制，移动，删除，创建等）（来自网络）<br>&nbsp;常用 java File 操作类 <br>&nbsp;<a href="http://www.easydone.cn/014/200604022353065155.htm"><u><font color=#0000ff>http://www.easydone.cn/014/200604022353065155.htm</font></u></a><br>&nbsp;<br>&nbsp;Java文件操作大全（JSP中）<br>&nbsp;<a href="http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html"><u><font color=#0000ff>http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html</font></u></a></p>
<p>&nbsp;java文件操作详解（Java中文网）<br>&nbsp;<a href="http://www.51cto.com/html/2005/1108/10947.htm"><u><font color=#0000ff>http://www.51cto.com/html/2005/1108/10947.htm</font></u></a></p>
<p>&nbsp;JAVA 如何创建\删除\修改\复制目录及文件<br>&nbsp;<a href="http://www.gamvan.com/developer/java/2005/2/264.html"><u><font color=#0000ff>http://www.gamvan.com/developer/java/2005/2/264.html</font></u></a></p>
<p>总结：<br>&nbsp;通过上面内容的使用，可以解决在Web应用服务器端，移动文件，查找文件，复制<br>&nbsp;删除文件等操作，同时对服务器的相对地址，绝对地址概念更加清晰。<br>建议参考URI,的RFC标准文挡。同时对Java.io.File. Java.net.URI.等内容了解透彻<br>对其他方面的理解可以更加深入和透彻。<br>==================================================================================</p>
<p>参考资料:<br>java/docs/</p>
<p>java.io.File<br>java.io.InputStream<br>java.io.OutputStream<br>java.io.FileInputStream<br>java.io.FileReader;<br>java.io.FileOutputStream<br>java.io.FileWriter;<br>java.net.URI<br>java.net.URL</p>
<p><br>绝对路径与相对路径祥解<br><a href="http://www.webjx.com/htmldata/2005-02-26/1109430310.html"><u><font color=#0000ff>http://www.webjx.com/htmldata/2005-02-26/1109430310.html</font></u></a></p>
<p>[『J道习练』]JSP和Servlet中的绝对路径和相对路径<br><a href="http://w3china.org/blog/more.asp?name=pcthomas&amp;id=9122&amp;commentid=12376"><u><font color=#0000ff>http://w3china.org/blog/more.asp?name=pcthomas&amp;id=9122&amp;commentid=12376</font></u></a></p>
<p>JSP,Servlet,Class获得当前应用的相对路径和绝对路径<br><a href="http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&amp;tID=886&amp;ccID=77"><u><font color=#0000ff>http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&amp;tID=886&amp;ccID=77</font></u></a></p>
<p>如何获得当前文件路径<br><a href="http://www.matrix.org.cn/resource/article/44/44113_java.html"><u><font color=#0000ff>http://www.matrix.org.cn/resource/article/44/44113_java.html</font></u></a></p>
<p>通过Spring注入机制，取得文件<br><a href="http://www.javajia.net/viewtopic.php?p=90213"><u><font color=#0000ff>http://www.javajia.net/viewtopic.php?p=90213</font></u></a>&amp;</p>
<p>配置文件的读取 <br><a href="http://dev.csdn.net/develop/article/39/39681.shtm"><u><font color=#0000ff>http://dev.csdn.net/develop/article/39/39681.shtm</font></u></a></p>
<p>读取配置文件,通过虚拟路径或相对路径读取一个xml文件，避免硬编码！ <br><a href="http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8"><u><font color=#0000ff>http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8</font></u></a></p>
<p>常用 java File 操作类<br><a href="http://www.easydone.cn/014/200604022353065155.htm"><u><font color=#0000ff>http://www.easydone.cn/014/200604022353065155.htm</font></u></a></p>
<p>Java文件操作大全<br><a href="http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html"><u><font color=#0000ff>http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html</font></u></a></p>
<p>Java文件操作详解<br><a href="http://www.51cto.com/html/2005/1108/10947.htm"><u><font color=#0000ff>http://www.51cto.com/html/2005/1108/10947.htm</font></u></a>&nbsp;</p>
<img src ="http://www.blogjava.net/simie/aggbug/133094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-29 11:08 <a href="http://www.blogjava.net/simie/archive/2007/07/29/133094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JDK5.0自带工具解决实际工作中的问题</title><link>http://www.blogjava.net/simie/archive/2007/07/10/129169.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 09 Jul 2007 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/10/129169.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/129169.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/10/129169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/129169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/129169.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td vAlign=top><em>By <a href="http://developers.sun.com.cn/home/export/sites/default/home/ISVs/docs/docs/jdk5_tools.html#author"><font color=#3e6b8a><strong><u>Benny.luo@Sun.com</u></strong></font></a>, 6/19/07 </em></td>
            <td width=10>&nbsp;</td>
            <td vAlign=bottom align=right>
            <div class=sitelinks style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"></div>
            </td>
        </tr>
    </tbody>
</table>
<div class=contentdivider>
<table class=grey4 cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=4 alt=" " src="http://developers.sun.com.cn/home/export/system/modules/com.sdn.china/resources/im/a.gif" width=1 border=0></td>
        </tr>
    </tbody>
</table>
</div>
<div>SUN中国软件技术中心 罗浩/Benny Luo</div>
<h5>&nbsp;简介：</h5>
<div>JDK 5.0, 代号老虎，在以往的Java传统上加入了许多新的设计，给Java语言带来了一些较大的变化，比如泛型，元数据，可变个数参数，静态导入类，新线程架构，自动装箱/拆箱等等新的以往没有的新特性。同时，在调试程序和解决性能各种问题方面，JDK5.0同样加入了多个分析工具来让开发者更加方便地调试他们自己的程序，它们包括了命令行调试工具，图形界面调试工具等等.
<div>&nbsp;</div>
<h5>JDK5.0包括的调试工具：</h5>
<div>我们在这里对JDK5.0的调试工具做大致的概念性的介绍，然后希望通过介绍我自己在实际工作中使用这些工具解决问题的实例来让大家对这些工具有更深入的了解。</div>
<div>&nbsp;</div>
<div>JDK5.0里面加入了jstack, jconsole, jinfo, jmap, jdb, jstat, jps, 下面对这些工具做简单介绍：</div>
<ul>
    <li>jstack -- 如果java程序崩溃生成core文件，jstack工具可以用来获得core文件的java stack和native stack的信息，从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外，jstack工具还可以附属到正在运行的java程序中，看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态，jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。
    <li>jconsole &#8211; jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具，这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控，包括了Java程序的内存使用，Heap size, 线程的状态，类的分配状态和空间使用等等。
    <li>jinfo &#8211; jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息，目前只有在Solaris和Linux的JDK版本里面才有。
    <li>jmap &#8211; jmap 可以从core文件或进程中获得内存的具体匹配情况，包括Heap size, Perm size等等，目前只有在Solaris和Linux的JDK版本里面才有。&lt; /li&gt;
    <li>jdb &#8211; jdb 用来对core文件和正在运行的Java进程进行实时地调试，里面包含了丰富的命令帮助您进行调试，它的功能和Sun studio里面所带的dbx非常相似，但 jdb是专门用来针对Java应用程序的。
    <li>jstat &#8211; jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控，包括了对Heap size和垃圾回收状况的监控等等。
    <li>jps &#8211; jps是用来查看JVM里面所有进程的具体状态, 包括进程ID，进程启动的路径等等。 </li>
</ul>
<p>另外，还有些其他附带的工具在这里没有列出，比如Heap Analysis Tool, kill -3 方法等等，这些在JDK5.0之前就有，同样也是非常有用的性能调优工具，大家可以参照相应的文档资料来学习，在文章后面也会推荐一些相应的文档给大家作为参考。</p>
<p>&nbsp;好，说了这么多，让我们来看看JDK5.0自带的这些工具在现实工作能给我们带来什么帮助，下面是我和ISV一起共同工作的实际例子，在这里把它们简单阐述出来，希望对大家有所帮助。</p>
<h5>jconsole和jstack使用实例：</h5>
<p>在做过的项目中，曾经有几个是使用jstack和jconsole来解决问题的。在下面的例子中，由于部分代码涉及到公司名字，我使用了xxx来代替。</p>
<div>1. 其中的一个是Web2.0的客户，由于目前Sun Microsystem公司推出的Niagara服务器系列非常适合网络方面的多线程应用，并且已经在业界非常出名，所以他们决定使用T2000服务器来测试一下如果应用到他们自己的应用是否能够获得出众的性能。</div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div>整个应用的架构如下：</div>
<div>Apache 2.0.59 + Resin EE 2.1.17 + Jdk 1.5.0.07 + Oracle 9 <br>运行的操作系统:</div>
<div>Solaris 10 Update 3 (11/06), EIS patches包. <br>测试工具：</div>
<div>Apache benchmark tool.</div>
</blockquote>
<div>在客户的测试环境中，我们分别做了Apache, Resin, Solaris的相应调整，其中包括了Apache使用Prefork模式，并且调整了httpd.conf文件里面相应的ServerLimit, ListenBacklog,Maxclient等等值，Resin服务器调整Jvm heap size, 并行回收new generation和old generation, 最大线程数，oracle连接数等等参数，Solaris操作系统做了网络和系统的相应调整，最终把整套系统搬进了生产环境，一切顺利进行，但当进入其中的一个论坛系统时却发现系统响应时间非常缓慢，用Apache Benchmark Tool加少量压力得到结果如下，由于是在生产环境下所以不敢使用大的压力：</div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div><br>This is ApacheBench, Version 2.0.41-dev &lt;$Revision: 1.121.2.12 $&gt; apache-2.0 <br>Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, <a href="http://www.zeustech.net/"><font color=#3e6b8a><strong><u>http://www.zeustech.net/</u></strong></font></a> <br>Copyright (c) 2006 The Apache Software Foundation, <a href="http://www.apache.org/"><font color=#3e6b8a><strong><u>http://www.apache.org/</u></strong></font></a></div>
<div>Benchmarking free.xxx.com (be patient).....done</div>
<div>Server Software: Resin/2.1.17 <br>Server Hostname: free.xxx.com <br>Server Port: 8080</div>
<div>Document Path: /forum/bbsMessageList.act?bbsThreadId=1580107 <br>Document Length: 27012 bytes</div>
<div>Concurrency Level: 10 <br>Time taken for tests: 92.148883 seconds <br>Complete requests: 100 <br>Failed requests: 0 <br>Write errors: 0 <br>Keep-Alive requests: 0 <br>Total transferred: 2722500 bytes <br>HTML transferred: 2701200 bytes <br>Requests per second: 1.09 [#/sec] (mean) <br>Time per request: 9214.888 [ms] (mean) <br>Time per request: 921.489 [ms] (mean, across all concurrent requests) <br>Transfer rate: 28.84 [Kbytes/sec] received</div>
<div>Connection Times (ms) <br>min mean[+/-sd] median max <br>Connect: 0 0 0.0 0 0 <br>Processing: 9089 9187 139.4 9140 9789 <br>Waiting: 3067 3163 138.3 3117 3766 <br>Total: 9089 9187 139.4 9140 9789</div>
<div>Percentage of the requests served within a certain time (ms) <br>50% 9140 <br>66% 9178 <br>75% 9189 <br>80% 9201 <br>90% 9281 <br>95% 9560 <br>98% 9739 <br>99% 9789</div>
<div>100% 9789 (longest request)</div>
</blockquote>
<div><br>每一个请求的响应时间大概去到8-9秒时间，这个是客户所不能接受的。</div>
<div>&nbsp;</div>
<div>这时我们决定采用JDK5.0自带的jstack来进行trouble-shoot,首先重新做加压测试，并行请求为10个，总共100个请求，这时对Resin服务器所起的Java进程间隔10秒用jstack做一次采集工作。为什么要间隔10秒？主要是想看看在这三十秒内Java进程是否都阻塞在同一个地方。结果如下：</div>
<div>&nbsp;</div>
<div>大部分的线程都阻塞在同一个java stack上面:</div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div><br>Thread <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#64;&#51;&#56;"><font color=#3e6b8a><strong><u>t@38</u></strong></font></a>: (state = BLOCKED)</div>
<div>- java.lang.Object.wait(long) @bci=0 (Interpreted frame) <br>- java.lang.Object.wait(long) @bci=0 (Interpreted frame) <br>- com._xxx.vportal.common.rpc.session.RemoteServiceGroupFactory.getMaxBalanceFactoryEntry() @bci=165, <br>line=180 (Interpreted frame) <br>- com._xxx.vportal.common.rpc.session.RemoteServiceGroupFactory.getService() @bci=80, line=195 (Interpreted <br>frame) <br>- com._xxx.vportal.common.rpc.session.RemoteServiceFactory.getSynSender() @bci=1, line=331 (Interpreted <br>frame) <br>- com._xxx.vportal.common.rpc.session.RemoteServiceSupport.synRequestHardTask(java.lang.String, <br>java.lang.Object) @bci=6, line=35 (Interpreted frame) <br>- com._xxx.vportal.amus.user.client.UserClientRpcImpl.getIconSigner(int, int) @bci=36, line=90 (Interpreted frame) <br>- net._xxx.forum.model.user.UserInfo.getLogoPath() @bci=109, line=546 (Interpreted frame) <br>- sun.reflect.GeneratedMethodAccessor13.invoke(java.lang.Object, java.lang.Object[]) @bci=36 (Interpreted frame) <br>- sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6, line=25 <br>(Compiled frame) <br>- org.apache.velocity.runtime.parser.node.ASTReference.execute(java.lang.Object, <br>org.apache.velocity.context.InternalContextAdapter) @bci=40, line=207 (Compiled frame)</div>
<div>- org.apache.velocity.runtime.parser.node.ASTBlock.render(org.apache.velocity.context.InternalContextAdapter, <br>java.io.Writer) @bci=18, line=94 (Compiled frame)</div>
<div>- org.apache.velocity.runtime.parser.node.SimpleNode.render(org.apache.velocity.context.InternalContextAdapter, <br>java.io.Writer) @bci=18, line=271 (Interpreted frame)</div>
<div>- <br>org.apache.velocity.runtime.parser.node.ASTIfStatement.render(org.apache.velocity.context.InternalContextAdapter, <br>java.io.Writer) @bci=63, line=128 (Interpreted frame)</div>
<div>- org.apache.velocity.runtime.parser.node.ASTBlock.render(org.apache.velocity.context.InternalContextAdapter, <br>java.io.Writer) @bci=18, line=94 (Compiled frame)</div>
<div>- org.apache.velocity.runtime.directive.Foreach.render(org.apache.velocity.context.InternalContextAdapter, <br>java.io.Writer, org.apache.velocity.runtime.parser.node.Node) @bci=95, line=344 (Interpreted frame)</div>
<div>- org.apache.velocity.runtime.parser.node.ASTDirective.render(org.apache.velocity.context.InternalContextAdapter, <br>java.io.Writer) @bci=14, line=153 (Interpreted frame)</div>
<div>- org.apache.velocity.runtime.parser.node.SimpleNode.render(org.apache.velocity.context.InternalContextAdapter, <br>java.io.Writer) @bci=18, line=271 (Interpreted frame)</div>
<div>- org.apache.velocity.app.Velocity.evaluate(org.apache.velocity.context.Context, java.io.Writer, java.lang.String, <br>java.io.Reader) @bci=102, line=359 (Interpreted frame)</div>
<div>- org.apache.velocity.app.Velocity.evaluate(org.apache.velocity.context.Context, java.io.Writer, <br>java.lang.String, java.lang.String) @bci=18, line=253 (Interpreted frame)</div>
<div dir=ltr>- net._xxx.forum.util.velocity.VelocityUtil.getVelocityEvaluate(java.util.Map, java.io.Writer, <br>java.lang.String) @bci=14, line=35 (Interpreted frame) <br>- net._xxx.forum.action.forum.BbsMessageListAction.go() @bci=1284, line=268 (Interpreted <br>frame) <br>&#8211; <br>net._xxx.forum.action.AbstractAction.execute() @bci=1, line=39 (<br>&#8211; <br>..............</div>
</blockquote>
<div dir=ltr><br>&nbsp;和应用的开发人员交流后，发现这些有问题的程序，都是和论坛系统中Socket调用有关，当用户打开一个页面是，页面中的用户信息需要同过Socket的方式调用相册那边的数据，这个操作存在bug，经过用户的重新同步更新程序，问题解决。</div>
<div dir=ltr>&nbsp;</div>
<div>解决后的实测的数据如下, 效果非常理想：</div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div>This is ApacheBench, Version 2.0.41-dev &lt;$Revision: 1.121.2.12 $&gt; apache-2.0 <br>Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, <a href="http://www.zeustech.net/"><font color=#3e6b8a><strong><u>http://www.zeustech.net/</u></strong></font></a> <br>Copyright (c) 2006 The Apache Software Foundation, <a href="http://www.apache.org/"><font color=#3e6b8a><strong><u>http://www.apache.org/</u></strong></font></a></div>
<div>Benchmarking free.xxx.com (be patient) <br>Completed 5000 requests <br>Completed 10000 requests <br>Completed 15000 requests <br>Completed 20000 requests <br>Completed 25000 requests <br>Completed 30000 requests <br>Completed 35000 requests <br>Completed 40000 requests <br>Completed 45000 requests <br>Finished 50000 requests <br>Server Software: Apache/2.0.59 <br>Server Hostname: free.xxx.com <br>Server Port: 80</div>
<div>Document Path: /forum/bbsMessageList.act?bbsThreadId=1581280 <br>Document Length: 27508 bytes <br>Concurrency Level: 30 <br>Time taken for tests: 252.583749 seconds <br>Complete requests: 50000 <br>Failed requests: 0 <br>Write errors: 0 <br>Total transferred: 1384158363 bytes <br>HTML transferred: 1375408188 bytes <br>Requests per second: 197.95 [#/sec] (mean) <br>Time per request: 151.550 [ms] (mean) <br>Time per request: 5.052 [ms] (mean, across all concurrent requests) <br>Transfer rate: 5351.56 [Kbytes/sec] received</div>
<div>Connection Times (ms) <br>min mean[+/-sd] median max <br>Connect: 0 0 0.4 0 11 <br>Processing: 45 150 154.1 117 4349 <br>Waiting: 41 145 153.7 112 4346 <br>Total: 45 150 154.1 117 4349 <br>Percentage of the requests served within a certain time (ms) <br>50% 117 <br>66% 142 <br>75% 163 <br>80% 180 <br>90% 241 <br>95% 321 <br>98% 478 <br>99% 764 <br>100% 4349 (longest re</div>
</blockquote>
<div>2. 另外的一个是最近做的，我们有个教育行业方面的ISV上来实验室做T2000的Benchmark实验，我们花了一天的时间部署整个架构，包括安装Solaris操作系统，应用服务器，数据库。&amp; amp; amp; lt; /div&gt;
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div>整个应用的架构如下：</div>
<div>Tomcat + Jdk 1.5 + Oracle 10g <br>运行的操作系统:</div>
<div>Solaris 10 Update 3 (11/06), EIS patches包. <br>测试工具：</div>
<div>LoadRunner 8.1</div>
</blockquote>
<div>在实验的初段，Tomcat, Oracle 10g服务器都是架设在T2000上，我们在对T2000服务器的OS，网络，应用服务器做了必要的调整后，发现其表现还是不尽如人意。&amp; #160;</div>
<div>&nbsp;</div>
<div>我们使用Loadrunner做测试，用户上到了100个同时并发10个迭代时已经出现问题,有许多的请求都被阻塞住，不能正常地进行。</div>
<div>&nbsp;</div>
<div>这时我们决定使用jconsole和jstack来看看系统出现了什么问题。</div>
<blockquote dir=ltr style="MARGIN-RIGHT: 0px">
<div>A. 首先我们需要在Tomcat的启动脚本catalina.sh里面加入JVM选项： <br>&nbsp;&nbsp;&nbsp;&nbsp; Dcom.sun.management.jmxremote</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; 把tomcat服务器java进程置于JDK5.0的性能监控范围之内。</div>
<div>&nbsp;</div>
<div>B. 然后我们用jconsole连接到tomcat服务器的java进程，发现基本上Heap size, 垃圾回收都比较正常，但发现tomcat服务器的大部分线程有问题，都处于被Block的状态。 <br>&nbsp;&nbsp;&nbsp;&nbsp; 观察每条线程的stack trace, 发现它们基本上都被堵塞在uk.org.primrose.pool.core.Pool.put和uk.org.primrose.pool.core.Pool.get()的SyncHack同步机制上，我们尝试了改大数据连接池的大小，发现结果是一样的。 <br><img height=714 alt=jdk5_1 src="http://developers.sun.com.cn/home/export/pics/isv/jdk5_1.JPG" width=900 border=0> <br></div>
<div>C.这个结论在jstack的结果中同样得到了验证，使用jstack连接到tomcat服务器java进程，并观察结果。 <br><img height=540 alt=jdk5_2 src="http://developers.sun.com.cn/home/export/pics/isv/jdk5_2.JPG" width=1051 border=0></div>
<div><br>D. 最后我们决定用tomcat服务器的连接池配置来代替Primrose数据库连接池，更改以后，发现结果比较理想。</div>
<div><br>E. 后来，我们把Oracle数据库建立在另外的一台服务器X4200上，而Tomcat应用服务器依然放在T2000上，使用千兆网络交换机，同样地，使用Tomcat服务器自己的连接池配置表现较为理想。</div>
</blockquote>
<div>以上两个是我对JDK5.0工具的一些实际操作的例子，在这里和大家分享一下，希望对大家有所帮助。而Sun Microsystem公司也在不断地完善JDK，在新的JDK版本里面加入越来越多的实用的方便开发者开发和调试的新特性，比如在最新的JDK6.0里面就内嵌了Dtrace里面许多关于Java程序中内存，方法，线程等等新的探针，通过这些探针和Dtrace,我们可以更加方便地调试Java程序。</div>
<div>文档资料：</div>
<div><a href="http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf"><font color=#3e6b8a><strong><u>http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf</u></strong></font></a> <br><a href="http://developers.sun.com.cn/home/sdnchina/home/export/sites/default/home/ISVs/docs/docs/thead.html"><font color=#3e6b8a><strong><u>http://developers.sun.com.cn/home/export/sites/default/home/ISVs/docs/docs/thead.html</u></strong></font></a> <br><a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html"><font color=#3e6b8a><strong><u>http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html</u></strong></font></a> <br><a href="http://java.sun.com/docs/hotspot/gc5.0/ergo5.html#0.0.Behavior%20based%20tuning%7Coutline"><font color=#3e6b8a><strong><u>http://java.sun.com/docs/hotspot/gc5.0/ergo5.html#0.0.Behavior%20based%20tuning%7Coutline</u></strong></font></a> <br><a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html"><font color=#3e6b8a><strong><u>http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html</u></strong></font></a> <br><a href="http://java.sun.com/"><font color=#917e9c><strong><u>http://java.sun.com/</u></strong></font></a> <br><a href="http://www.java.net/"><font color=#3e6b8a><strong><u>http://www.java.net/</u></strong></font></a></div>
</div>
</div>
<img src ="http://www.blogjava.net/simie/aggbug/129169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-10 00:04 <a href="http://www.blogjava.net/simie/archive/2007/07/10/129169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JAVA操作EXCEL文件</title><link>http://www.blogjava.net/simie/archive/2007/07/08/128853.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Sun, 08 Jul 2007 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/08/128853.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/128853.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/08/128853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/128853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/128853.html</trackback:ping><description><![CDATA[<blockquote>使用Windows操作系统的朋友对Excel（电子表格）一定不会陌生，但是要使用Java语言来操纵Excel文件并不是一件容易的事。在Web应用日益盛行的今天，通过Web来操作Excel文件的需求越来越强烈，目前较为流行的操作是在JSP或Servlet 中创建一个CSV （comma separated values）文件，并将这个文件以MIME，text/csv类型返回给浏览器，接着浏览器调用Excel并且显示CSV文件。这样只是说可以访问到Excel文件，但是还不能真正的操纵Excel文件，本文将给大家一个惊喜，向大家介绍一个开放源码项目，Java Excel API，使用它大家就可以方便地操纵Excel文件了。</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><a name=1><span class=atitle>JAVA EXCEL API简介</span></a></p>
<p>
<p>Java Excel是一开放源码项目，通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的，所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。</p>
<p>现在发布的稳定版本是V2.0，提供以下功能：</p>
<ul>
    <li>从Excel 95、97、2000等格式的文件中读取数据；
    <li>读取Excel公式（可以读取Excel 97以后的公式）；
    <li>生成Excel数据表（格式为Excel 97）；
    <li>支持字体、数字、日期的格式化；
    <li>支持单元格的阴影操作，以及颜色操作；
    <li>修改已经存在的数据表； </li>
</ul>
<p>现在还不支持以下功能，但不久就会提供了：</p>
<ol>
    <li>不能够读取图表信息；
    <li>可以读，但是不能生成公式，任何类型公式最后的计算值都可以读出； </li>
</ol>
<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=center><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/l-javaExcel/?ca=j-t10#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=2><span class=atitle>应用示例</span></a></p>
<p>
<p><a name=N10070><span class=smalltitle><strong><font face=Arial>1 从Excel文件读取数据表</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>Java Excel API既可以从本地文件系统的一个文件(.xls)，也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语：工作薄)，下面的代码片段举例说明了应该如何操作：(完整代码见ExcelReading.java)</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>import java.io.*;
            import jxl.*;
            &#8230; &#8230; &#8230; &#8230;
            try
            {
            //构建Workbook对象, 只读Workbook对象
            //直接从本地文件创建Workbook
            //从输入流创建Workbook
            InputStream is = new FileInputStream(sourcefile);
            jxl.Workbook rwb = Workbook.getWorkbook(is);
            }
            catch (Exception e)
            {
            e.printStackTrace();
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>一旦创建了Workbook，我们就可以通过它来访问Excel Sheet(术语：工作表)。参考下面的代码片段：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>//获取第一张Sheet表
            Sheet rs = rwb.getSheet(0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>我们既可能通过Sheet的名称来访问它，也可以通过下标来访问它。如果通过下标来访问的话，要注意的一点是下标从0开始，就像数组一样。</p>
<p>一旦得到了Sheet，我们就可以通过它来访问Excel Cell(术语：单元格)。参考下面的代码片段：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>//获取第一行，第一列的值
            Cell c00 = rs.getCell(0, 0);
            String strc00 = c00.getContents();
            //获取第一行，第二列的值
            Cell c10 = rs.getCell(1, 0);
            String strc10 = c10.getContents();
            //获取第二行，第二列的值
            Cell c11 = rs.getCell(1, 1);
            String strc11 = c11.getContents();
            System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
            System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
            System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果仅仅是取得Cell的值，我们可以方便地通过getContents()方法，它可以将任何类型的Cell值都作为一个字符串返回。示例代码中Cell(0, 0)是文本型，Cell(1, 0)是数字型，Cell(1,1)是日期型，通过getContents()，三种类型的返回值都是字符型。</p>
<p>如果有需要知道Cell内容的确切类型，API也提供了一系列的方法。参考下面的代码片段：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>String strc00 = null;
            double strc10 = 0.00;
            Date strc11 = null;
            Cell c00 = rs.getCell(0, 0);
            Cell c10 = rs.getCell(1, 0);
            Cell c11 = rs.getCell(1, 1);
            if(c00.getType() == CellType.LABEL)
            {
            LabelCell labelc00 = (LabelCell)c00;
            strc00 = labelc00.getString();
            }
            if(c10.getType() == CellType.NUMBER)
            {
            NmberCell numc10 = (NumberCell)c10;
            strc10 = numc10.getValue();
            }
            if(c11.getType() == CellType.DATE)
            {
            DateCell datec11 = (DateCell)c11;
            strc11 = datec11.getDate();
            }
            System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
            System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
            System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>在得到Cell对象后，通过getType()方法可以获得该单元格的类型，然后与API提供的基本类型相匹配，强制转换成相应的类型，最后调用相应的取值方法getXXX()，就可以得到确定类型的值。API提供了以下基本类型，与Excel的数据格式相对应，如下图所示：</p>
<br><br><img height=218 alt="" src="http://www.ibm.com/developerworks/cn/java/l-javaExcel/image001.jpg" width=365> <br>
<p>每种类型的具体意义，请参见Java Excel API Document。</p>
<p>当你完成对Excel电子表格数据的处理后，一定要使用close()方法来关闭先前创建的对象，以释放读取数据表的过程中所占用的内存空间，在读取大量数据时显得尤为重要。参考如下代码片段：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>//操作完成时，关闭对象，释放占用的内存空间
            rwb.close();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>Java Excel API提供了许多访问Excel数据表的方法，在这里我只简要地介绍几个常用的方法，其它的方法请参考附录中的Java Excel API Document。</p>
<p><strong>Workbook类提供的方法</strong> </p>
<p>1. int getNumberOfSheets() <br>获得工作薄（Workbook）中工作表（Sheet）的个数，示例： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            int sheets = rwb.getNumberOfSheets();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2. Sheet[] getSheets() <br>返回工作薄（Workbook）中工作表（Sheet）对象数组，示例： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            Sheet[] sheets = rwb.getSheets();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>3. String getVersion() <br>返回正在使用的API的版本号，好像是没什么太大的作用。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            String apiVersion = rwb.getVersion();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><strong>Sheet接口提供的方法</strong> </p>
<p>1) String getName() <br>获取Sheet的名称，示例： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            String sheetName = rs.getName();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>2) int getColumns() <br>获取Sheet表中所包含的总列数，示例： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            int rsColumns = rs.getColumns();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>3) Cell[] getColumn(int column) <br>获取某一列的所有单元格，返回的是单元格对象数组，示例： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell[] cell = rs.getColumn(0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>4) int getRows() <br>获取Sheet表中所包含的总行数，示例： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            int rsRows = rs.getRows();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>5) Cell[] getRow(int row) <br>获取某一行的所有单元格，返回的是单元格对象数组，示例子： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell[] cell = rs.getRow(0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>6) Cell getCell(int column, int row) <br>获取指定单元格的对象引用，需要注意的是它的两个参数，第一个是列数，第二个是行数，这与通常的行、列组合有些不同。 </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell cell = rs.getCell(0, 0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N10115><span class=smalltitle><strong><font face=Arial>2 生成新的Excel工作薄</font></strong></span></a></p>
<p><strong><font face=Arial></font></strong>
<p>下面的代码主要是向大家介绍如何生成简单的Excel工作表，在这里单元格的内容是不带任何修饰的(如：字体，颜色等等)，所有的内容都作为字符串写入。(完整代码见ExcelWriting.java)</p>
<p>与读取Excel工作表相似，首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象，这里要注意的是，只能通过API提供的工厂方法来创建Workbook，而不能使用WritableWorkbook的构造函数，因为类WritableWorkbook的构造函数为protected类型。示例代码片段如下：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>import java.io.*;
            import jxl.*;
            import jxl.write.*;
            &#8230; &#8230; &#8230; &#8230;
            try
            {
            //构建Workbook对象, 只读Workbook对象
            //Method 1：创建可写入的Excel工作薄
            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
            //Method 2：将WritableWorkbook直接写入到输出流
            /*
            OutputStream os = new FileOutputStream(targetfile);
            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
            */
            }
            catch (Exception e)
            {
            e.printStackTrace();
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>API提供了两种方式来处理可写入的输出流，一种是直接生成本地文件，如果文件名不带全路径的话，缺省的文件会定位在当前目录，如果文件名带有全路径的话，则生成的Excel文件则会定位在相应的目录；另外一种是将Excel对象直接写入到输出流，例如：用户通过浏览器来访问Web服务器，如果HTTP头设置正确的话，浏览器自动调用客户端的Excel应用程序，来显示动态生成的Excel电子表格。</p>
<p>接下来就是要创建工作表，创建工作表的方法与创建工作薄的方法几乎一样，同样是通过工厂模式方法获得相应的对象，该方法需要两个参数，一个是工作表的名称，另一个是工作表在工作薄中的位置，参考下面的代码片段：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>//创建Excel工作表
            jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>"这锅也支好了，材料也准备齐全了，可以开始下锅了！"，现在要做的只是实例化API所提供的Excel基本数据类型，并将它们添加到工作表中就可以了，参考下面的代码片段：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>//1.添加Label对象
            jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
            ws.addCell(labelC);
            //添加带有字型Formatting的对象
            jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
            jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
            jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
            ws.addCell(labelCF);
            //添加带有字体颜色Formatting的对象
            jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
            UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
            jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
            jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
            ws.addCell(labelCF);
            //2.添加Number对象
            jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
            ws.addCell(labelN);
            //添加带有formatting的Number对象
            jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
            jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
            jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
            ws.addCell(labelNF);
            //3.添加Boolean对象
            jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
            ws.addCell(labelB);
            //4.添加DateTime对象
            jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
            ws.addCell(labelDT);
            //添加带有formatting的DateFormat对象
            jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
            jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
            jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
            ws.addCell(labelDTF);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这里有两点大家要引起大家的注意。第一点，在构造单元格时，单元格在工作表中的位置就已经确定了。一旦创建后，单元格的位置是不能够变更的，尽管单元格的内容是可以改变的。第二点，单元格的定位是按照下面这样的规律(column, row)，而且下标都是从0开始，例如，A1被存储在(0, 0)，B1被存储在(1, 0)。</p>
<p>最后，不要忘记关闭打开的Excel工作薄对象，以释放占用的内存，参见下面的代码片段：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>//写入Exel工作表
            wwb.write();
            //关闭Excel工作薄对象
            wwb.close();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这可能与读取Excel文件的操作有少少不同，在关闭Excel对象之前，你必须要先调用write()方法，因为先前的操作都是存储在缓存中的，所以要通过该方法将操作的内容保存在文件中。如果你先关闭了Excel对象，那么只能得到一张空的工作薄了。</p>
<p><a name=N10145><span class=smalltitle><strong><font face=Arial>3 拷贝、更新Excel工作薄</font></strong></span></a></p>
<p>接下来简要介绍一下如何更新一个已经存在的工作薄，主要是下面二步操作，第一步是构造只读的Excel工作薄，第二步是利用已经创建的Excel工作薄创建新的可写入的Excel工作薄，参考下面的代码片段：(完整代码见ExcelModifying.java)</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>//创建只读的Excel工作薄的对象
            jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
            //创建可写入的Excel工作薄对象
            jxl.write.WritableWorkbook  wwb = Workbook.createWorkbook(new File(targetfile), rw);
            //读取第一张工作表
            jxl.write.WritableSheet ws = wwb.getSheet(0);
            //获得第一个单元格对象
            jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
            //判断单元格的类型, 做出相应的转化
            if(wc.getType() == CellType.LABEL)
            {
            Label l = (Label)wc;
            l.setString("The value has been modified.");
            }
            //写入Excel对象
            wwb.write();
            //关闭可写入的Excel对象
            wwb.close();
            //关闭只读的Excel对象
            rw.close();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>之所以使用这种方式构建Excel对象，完全是因为效率的原因，因为上面的示例才是API的主要应用。为了提高性能，在读取工作表时，与数据相关的一些输出信息，所有的格式信息，如：字体、颜色等等，是不被处理的，因为我们的目的是获得行数据的值，既使没有了修饰，也不会对行数据的值产生什么影响。唯一的不利之处就是，在内存中会同时保存两个同样的工作表，这样当工作表体积比较大时，会占用相当大的内存，但现在好像内存的大小并不是什么关键因素了。</p>
<p>一旦获得了可写入的工作表对象，我们就可以对单元格对象进行更新的操作了，在这里我们不必调用API提供的add()方法，因为单元格已经于工作表当中，所以我们只需要调用相应的setXXX()方法，就可以完成更新的操作了。</p>
<p>尽单元格原有的格式化修饰是不能去掉的，我们还是可以将新的单元格修饰加上去，以使单元格的内容以不同的形式表现。</p>
<p>新生成的工作表对象是可写入的，我们除了更新原有的单元格外，还可以添加新的单元格到工作表中，这与示例2的操作是完全一样的。</p>
<p>最后，不要忘记调用write()方法，将更新的内容写入到文件中，然后关闭工作薄对象，这里有两个工作薄对象要关闭，一个是只读的，另外一个是可写入的。</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>
<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=center><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/l-javaExcel/?ca=j-t10#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=3><span class=atitle>小结</span></a></p>
<p>
<p>本文只是对Java Excel API中常用的方法作了介绍，要想更详尽地了解API，请大家参考API文档，或源代码。Java Excel API是一个开放源码项目，请大家关注它的最新进展，有兴趣的朋友也可以申请加入这个项目，或者是提出宝贵的意见。</p>
<br><br>
<p><a name=resources><span class=atitle>参考资料 </span></a></p>
<ol>
    <li>Java Excel API 文档
    <li><a href="http://www.andykhan.com/jexcelapi/"><font color=#996699>http://www.andykhan.com/jexcelapi/</font></a> </li>
</ol>
<br><br>
<p><a name=author><span class=atitle>关于作者</span></a></p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td colSpan=3><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width="100%"></td>
        </tr>
        <tr vAlign=top align=left>
            <td>
            <p>&#160;</p>
            </td>
            <td><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width=4></td>
            <td width="100%">
            <p>就叫我Rubber吧，我是一个Java迷，希望我们能成为朋友，我的Eamil： <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#105;&#109;&#64;&#116;&#114;&#101;&#110;&#100;&#46;&#99;&#111;&#109;&#46;&#99;&#110;&#63;&#99;&#99;&#61;&#117;&#115;&#101;&#114;&#105;&#100;&#64;&#117;&#115;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;"><font color=#5c81a7>tim@trend.com.cn</font></a>，我的联系电话0755-83501377 </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/simie/aggbug/128853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-08 10:18 <a href="http://www.blogjava.net/simie/archive/2007/07/08/128853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Web Start入门基础教程</title><link>http://www.blogjava.net/simie/archive/2007/07/06/128526.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Fri, 06 Jul 2007 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/06/128526.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/128526.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/06/128526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/128526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/128526.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 版权所有：(xiaodaoxiaodao)蓝小刀 &nbsp;&nbsp; xiaodaoxiaodao@gmail.com http://www.blogjava.net/xiaodaoxiaodao/articles/103469.html &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 转载请注明来源/作者 Java Web Start 入门基础教程 &nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/simie/archive/2007/07/06/128526.html'>阅读全文</a><img src ="http://www.blogjava.net/simie/aggbug/128526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-06 11:34 <a href="http://www.blogjava.net/simie/archive/2007/07/06/128526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中四种操作xml方式的比较</title><link>http://www.blogjava.net/simie/archive/2007/07/06/128525.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Fri, 06 Jul 2007 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/06/128525.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/128525.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/06/128525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/128525.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/128525.html</trackback:ping><description><![CDATA[&nbsp;<strong>1. 介绍</strong>
<p>&nbsp;&nbsp;&nbsp; <strong>1）DOM（JAXP Crimson解析器）</strong></p>
<p>&nbsp;&nbsp;&nbsp; DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>2）SAX</strong></p>
<p>&nbsp;&nbsp;&nbsp; SAX处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，SAX还比它的替代者DOM快许多。</p>
<p>&nbsp;&nbsp;&nbsp; 选择DOM还是选择SAX？ 对于需要自己编写代码来处理XML文档的开发人员来说， 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档，而SAX采用的事件模型。</p>
<p>&nbsp;&nbsp;&nbsp; DOM解析器把XML文档转化为一个包含其内容的树，并可以对树进行遍历。用DOM解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档，所以对性能和内存的要求比较高，尤其是遇到很大的XML文件的时候。由于它的遍历能力，DOM解析器常用于XML文档需要频繁的改变的服务中。</p>
<p>&nbsp;&nbsp;&nbsp; SAX解析器采用了基于事件的模型，它在解析XML文档的时候可以触发一系列的事件，当发现给定的tag的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时，SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>3）JDOM </strong><a href="http://www.jdom.org/"><strong><u><font color=#0000ff>http://www.jdom.org</font></u></strong></a></p>
<p>&nbsp;&nbsp;&nbsp; JDOM的目的是成为Java特定文档模型，它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型，JDOM一直得到大力推广和促进。正在考虑通过&#8220;Java规范请求JSR-102&#8221;将它最终用作&#8220;Java标准扩展&#8221;。从2000年初就已经开始了JDOM开发。</p>
<p>&nbsp;&nbsp;&nbsp; JDOM与DOM主要有两方面不同。首先，JDOM仅使用具体类而不使用接口。这在某些方面简化了API，但是也限制了灵活性。第二，API大量使用了Collections类，简化了那些已经熟悉这些类的Java开发者的使用。</p>
<p>&nbsp;&nbsp;&nbsp; JDOM文档声明其目的是&#8220;使用20%（或更少）的精力解决80%（或更多）Java/XML问题&#8221;（根据学习曲线假定为20%）。JDOM对于大多数Java/XML应用程序来说当然是有用的，并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而，它仍需要您充分理解XML以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习DOM或JDOM接口都更有意义的工作。</p>
<p>&nbsp;&nbsp;&nbsp; JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档（尽管它还可以将以前构造的DOM表示作为输入）。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。</p>
<p>&nbsp;&nbsp;&nbsp; <strong>4）DOM4J </strong><a href="http://dom4j.sourceforge.net/"><strong><u><font color=#0000ff>http://dom4j.sourceforge.net</font></u></strong></a></p>
<p>&nbsp;&nbsp;&nbsp; 虽然DOM4J代表了完全独立的开发结果，但最初，它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能，包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始，它就一直处于开发之中。</p>
<p>&nbsp;&nbsp;&nbsp; 为支持所有这些功能，DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类，但是在许多情况下，它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是，虽然DOM4J付出了更复杂的API的代价，但是它提供了比JDOM大得多的灵活性。</p>
<p>&nbsp;&nbsp;&nbsp; 在添加灵活性、XPath集成和对大文档处理的目标时，DOM4J的目标与JDOM是一样的：针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案，实现在本质上处理所有Java/XML问题的目标。在完成该目标时，它比JDOM更少强调防止不正确的应用程序行为。</p>
<p>&nbsp;&nbsp;&nbsp; DOM4J是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML，特别值得一提的是连Sun的JAXM也在用DOM4J.</p>
<p>&nbsp;&nbsp;&nbsp;<strong> 2&#8230;&#8230; 比较</strong></p>
<p>&nbsp;&nbsp;&nbsp; 1）DOM4J性能最好，连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J，例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性，那就采用DOM4J.</p>
<p>&nbsp;&nbsp;&nbsp; 2）JDOM和DOM在性能测试时表现不佳，在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM.虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题，但是从性能观点来看，它确实没有值得推荐之处。另外，DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础，因为它正式获得W3C推荐（与基于非标准的Java模型相对），所以在某些类型的项目中可能也需要它（如在JavaScript中使用DOM）。</p>
<p>&nbsp;&nbsp;&nbsp; 3）SAX表现较好，这要依赖于它特定的解析方式－事件驱动。一个SAX检测即将到来的XML流，但并没有载入到内存（当然当XML流被读入时，会有部分文档暂时隐藏在内存中）。</p>
3. <span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">四种</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">xml</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作方式的基本使用方法</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman"> <br><br>xml</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件：<br clear=all></span><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><br style="mso-special-character: line-break"><br style="mso-special-character: line-break"><o:p></o:p></font></span>
<div style="BORDER-RIGHT: #cccccc 0.75pt solid; PADDING-RIGHT: 4pt; BORDER-TOP: #cccccc 0.75pt solid; PADDING-LEFT: 4pt; BACKGROUND: #fdfddf; PADDING-BOTTOM: 4pt; BORDER-LEFT: #cccccc 0.75pt solid; PADDING-TOP: 4pt; BORDER-BOTTOM: #cccccc 0.75pt solid">
<p class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 3.75pt 15pt; BORDER-LEFT: medium none; WORD-BREAK: break-all; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-border-alt: solid #CCCCCC .75pt; mso-padding-alt: 4.0pt 4.0pt 4.0pt 4.0pt"><font size=3><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">?xml version="1.0" encoding="GB2312"?</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">RESULT</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">VALUE</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">NO</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">A1234</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/NO</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">ADDR</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞四川省</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">县</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">镇</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">路</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">X</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">段</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">号＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/ADDR</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/VALUE</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">VALUE</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">NO</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">B1234</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/NO</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">ADDR</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞四川省</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">市</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">乡</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">村</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">XX</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">组＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/ADDR</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/VALUE</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">/RESULT</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＞</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> <br><br>1</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">）</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">DOM <br><br>import java.io.*; <br>import java.util.*; <br>import org.w3c.dom.*; <br>import javax.xml.parsers.*; <br><br>public class MyXMLReader{ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public static void main(String arge[]){ <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">long lasting =System.currentTimeMillis(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">try{ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">File f=new File("data_10k.xml"); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">DocumentBuilder builder=factory.newDocumentBuilder(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Document doc = builder.parse(f); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">NodeList nl = doc.getElementsByTagName("VALUE"); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">for (int i=0;i</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">nl.getLength();i++){ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.print("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车牌号码</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车主地址</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> </span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">}catch(Exception e){ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">e.printStackTrace(); <br>} <br><br>2</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">）</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAX <br><br>import org.xml.sax.*; <br>import org.xml.sax.helpers.*; <br>import javax.xml.parsers.*; <br><br>public class MyXMLReader extends DefaultHandler { <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">java.util.Stack tags = new java.util.Stack(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public MyXMLReader() { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">super(); <br>} <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public static void main(String args[]) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">long lasting = System.currentTimeMillis(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">try { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAXParserFactory sf = SAXParserFactory.newInstance(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAXParser sp = sf.newSAXParser(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">MyXMLReader reader = new MyXMLReader(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">sp.parse(new InputSource("data_10k.xml"), reader); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} catch (Exception e) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">e.printStackTrace(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">运行时间：</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">" + (System.currentTimeMillis() - lasting) + "</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">毫秒</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">");} <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public void characters(char ch[], int start, int length) throws SAXException { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">String tag = (String) tags.peek(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">if (tag.equals("NO")) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.print("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车牌号码：</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">" + new String(ch, start, length)); <br>} <br>if (tag.equals("ADDR")) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">地址</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + new String(ch, start, length)); <br>} <br>} <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public void startElement(String uri,String localName,String qName,Attributes attrs) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">tags.push(qName);} <br>} <br><br>3</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">）</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"> JDOM <br><br>import java.io.*; <br>import java.util.*; <br>import org.jdom.*; <br>import org.jdom.input.*; <br><br>public class MyXMLReader { <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public static void main(String arge[]) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">long lasting = System.currentTimeMillis(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">try { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAXBuilder builder = new SAXBuilder(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Document doc = builder.build(new File("data_10k.xml")); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Element foo = doc.getRootElement(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">List allChildren = foo.getChildren(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">for(int i=0;i</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">＜</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">allChildren.size();i++) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.print("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车牌号码</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + ((Element)allChildren.get(i)).getChild("NO").getText()); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车主地址</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + ((Element)allChildren.get(i)).getChild("ADDR").getText()); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} catch (Exception e) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">e.printStackTrace(); <br>} <br><br>} <br><br>4</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">）</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">DOM4J <br><br>import java.io.*; <br>import java.util.*; <br>import org.dom4j.*; <br>import org.dom4j.io.*; <br><br>public class MyXMLReader { <br><br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">public static void main(String arge[]) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">long lasting = System.currentTimeMillis(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">try { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">File f = new File("data_10k.xml"); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">SAXReader reader = new SAXReader(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Document doc = reader.read(f); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Element root = doc.getRootElement(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">Element foo; <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">for (Iterator i = root.elementIterator("VALUE"); i.hasNext()<v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"> <v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id=_x0000_i1025 style="WIDTH: 24pt; HEIGHT: 24pt" alt="" type="#_x0000_t75"></v:shape>{ <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">foo = (Element) i.next(); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.print("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车牌号码</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + foo.elementText("NO")); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　　</span></em></strong><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">System.out.println("</span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">车主地址</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">:" + foo.elementText("ADDR")); <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　</span></em></strong></font><font size=3><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt">} catch (Exception e) { <br></span></em></strong><strong><em><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: Tahoma">　　　</span></em></strong></font><strong><em><span lang=EN-US style="COLOR: black; FONT-FAMILY: Tahoma; mso-bidi-font-size: 10.5pt"><font size=3>e.printStackTrace(); <br>} <br>) <o:p></o:p></font></span></em></strong></p>
</div>
<img src ="http://www.blogjava.net/simie/aggbug/128525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-06 11:31 <a href="http://www.blogjava.net/simie/archive/2007/07/06/128525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个读取xml文件内容的类</title><link>http://www.blogjava.net/simie/archive/2007/07/03/127844.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Tue, 03 Jul 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/03/127844.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127844.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/03/127844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127844.html</trackback:ping><description><![CDATA[一个读取xml文件内容的类&nbsp;<br>package&nbsp;project.util.xml;<br><br>import&nbsp;java.io.*;<br>import&nbsp;java.util.*;<br>import&nbsp;javax.servlet.http.*;<br>import&nbsp;org.apache.log4j.*;<br>import&nbsp;org.jdom.*;<br>import&nbsp;org.jdom.input.*;<br><br>/**<br>*&nbsp;&lt;p&gt;Title:&nbsp;&lt;font&nbsp;color="steelblue"&nbsp;size="10"&gt;读取xml文件信息&lt;/font&gt;&lt;/p&gt;<br>*&nbsp;&lt;p&gt;Description:&nbsp;&lt;font&nbsp;color="steelblue"&gt;从XML配置文件中获得配置信息。excerpt&nbsp;form&nbsp;jdom。&lt;/font&gt;&lt;/p&gt;<br>*&nbsp;&lt;p&gt;Copyright:&nbsp;&lt;font&nbsp;color="steelblue"&gt;Copyright&nbsp;(c)&nbsp;2004&lt;/font&gt;&lt;/p&gt;<br>*&nbsp;&lt;p&gt;Company:&nbsp;&lt;font&nbsp;color="steelblue"&gt;Harmonious&lt;/font&gt;&lt;/p&gt;<br>*&nbsp;@author&nbsp;&lt;font&nbsp;color="steelblue"&gt;TZL&lt;/font&gt;<br>*&nbsp;@version&nbsp;&lt;font&nbsp;color="steelblue"&gt;1.0&lt;/font&gt;<br>*/<br><br>public&nbsp;class&nbsp;XMLReader&nbsp;{<br>/*<br>#设置根的输出配置，格式为&nbsp;"info&nbsp;[2004-05-01&nbsp;22:35:30]&nbsp;[name]logname(b.c)&nbsp;[line]&nbsp;86&nbsp;msg--&gt;log信息"<br>log4j.rootLogger=DEBUG,&nbsp;rootAppender<br>log4j.appender.rootAppender=org.apache.log4j.RollingFileAppender<br>log4j.appender.rootAppender.File=e:/MapXtremeSmpl.log<br>log4j.appender.rootAppender.MaxFileSize=1000KB<br>log4j.appender.rootAppender.layout=org.apache.log4j.PatternLayout<br>log4j.appender.rootAppender.layout.ConversionPattern=%-5p&nbsp;[%d{yyyy-mm-dd&nbsp;HH:mm:ss}]&nbsp;[name]&nbsp;%c{2}&nbsp;[line]&nbsp;%L&nbsp;msg--&gt;&nbsp;%m%n<br>*/<br>static&nbsp;public&nbsp;Logger&nbsp;log&nbsp;=&nbsp;Logger.getLogger(XMLReader.class);<br>protected&nbsp;Element&nbsp;m_RootElement&nbsp;=&nbsp;null;<br>protected&nbsp;String&nbsp;m_webAppPath&nbsp;=&nbsp;null;<br><br>/**<br>*&nbsp;&lt;font&nbsp;color="orange"&gt;构造函数。&lt;/font&gt;<br>*&nbsp;@param&nbsp;xmlFile&nbsp;&lt;font&nbsp;color="steelblue"&gt;要读取的配置文件的绝对路径。&lt;/font&gt;<br>*/<br>public&nbsp;XMLReader(String&nbsp;xmlFile)&nbsp;{<br>m_webAppPath&nbsp;=&nbsp;null;<br>try&nbsp;{<br>PatternLayout&nbsp;layout&nbsp;=&nbsp;new&nbsp;PatternLayout("%-5p&nbsp;%d{yyyy-MM-dd&nbsp;HH:mm:ss}&nbsp;[name]&nbsp;%c{2}&nbsp;[line]&nbsp;%L&nbsp;[msg]&nbsp;%m%n");<br>ConsoleAppender&nbsp;appender&nbsp;=&nbsp;new&nbsp;ConsoleAppender(/*new&nbsp;SimpleLayout(),*/layout,&nbsp;"System.err");<br>log.addAppender(appender);<br><br>SAXBuilder&nbsp;builder&nbsp;=&nbsp;new&nbsp;SAXBuilder();<br>document．nbspdoc&nbsp;=&nbsp;null;<br>doc&nbsp;=&nbsp;builder.build(new&nbsp;FileInputStream(xmlFile));<br>m_RootElement&nbsp;=&nbsp;doc.getRootElement();<br>}<br>catch&nbsp;(IOException&nbsp;ex)&nbsp;{<br>log.error("XMLReader构造时出现IO错误:"&nbsp;+&nbsp;ex.toString());<br>}<br>catch&nbsp;(JDOMException&nbsp;ex1)&nbsp;{<br>log.error("XMLReader构造时分析XML文件出错:"&nbsp;+&nbsp;ex1.toString());<br>}<br>catch&nbsp;(Exception&nbsp;ex)&nbsp;{<br>log.error("XMLReader&nbsp;构造出错:"&nbsp;+&nbsp;ex.toString());<br>}<br>}<br><br>/**<br>*&nbsp;&lt;font&nbsp;color="orange"&gt;构造函数。配置文件必须指定为发布的应用的根目录下的/XmlConfig/Config.xml。&lt;/font&gt;<br>*&nbsp;@param&nbsp;servletObj&nbsp;&lt;font&nbsp;color="steelblue"&gt;随便一个HttpServlet对象。&lt;/font&gt;<br>*/<br>public&nbsp;XMLReader(HttpServlet&nbsp;servletObj)&nbsp;{<br>m_webAppPath&nbsp;=&nbsp;servletObj.getServletContext().getRealPath("/");<br>String&nbsp;configFileName&nbsp;=&nbsp;m_webAppPath&nbsp;+&nbsp;"XmlConfig/Config.xml";<br><br>try&nbsp;{<br>PatternLayout&nbsp;layout&nbsp;=&nbsp;new&nbsp;PatternLayout("%-5p&nbsp;%d{yyyy-MM-dd&nbsp;HH:mm:ss}&nbsp;[name]&nbsp;%c{2}&nbsp;[line]&nbsp;%L&nbsp;[msg]&nbsp;%m%n");<br>ConsoleAppender&nbsp;appender&nbsp;=&nbsp;new&nbsp;ConsoleAppender(&nbsp;/*new&nbsp;SimpleLayout(),*/layout,&nbsp;"System.err");<br>log.addAppender(appender);<br><br>SAXBuilder&nbsp;builder&nbsp;=&nbsp;new&nbsp;SAXBuilder();<br>document．nbspdoc&nbsp;=&nbsp;null;<br>doc&nbsp;=&nbsp;builder.build(new&nbsp;FileInputStream(configFileName));<br>m_RootElement&nbsp;=&nbsp;doc.getRootElement();<br>}<br>catch&nbsp;(IOException&nbsp;ex)&nbsp;{<br>log.error("XMLReader构造时出现IO错误（/XmlConfig/Config.xml）:"&nbsp;+&nbsp;ex.toString());<br>}<br>catch&nbsp;(JDOMException&nbsp;ex1)&nbsp;{<br>log.error("XMLReader构造时分析XML文件出错（/XmlConfig/Config.xml）:"&nbsp;+&nbsp;ex1.toString());<br>}<br>catch&nbsp;(Exception&nbsp;ex)&nbsp;{<br>log.error("XMLReader构造出错（/XmlConfig/Config.xml）:"&nbsp;+&nbsp;ex.toString());<br>}<br>}<br><br>/**<br>*&nbsp;&lt;font&nbsp;color="orange"&gt;web应用发布在web服务器的绝对路径根目录，最后已经有目录分割符。&lt;/font&gt;<br>*&nbsp;@return&nbsp;&lt;font&nbsp;color="tomato"&gt;返回web应用发布在web服务器的绝对路径的根目录。&lt;/font&gt;<br>*/<br>public&nbsp;String&nbsp;getWebAppPath()&nbsp;{<br>return&nbsp;m_webAppPath;<br>}<br><br>/**<br>*&nbsp;&lt;font&nbsp;color="orange"&gt;从配置文件中获得配置信息。&lt;/font&gt;<br>*&nbsp;@param&nbsp;key&nbsp;&lt;font&nbsp;color="steelblue"&gt;要获取的配置名称。&lt;/font&gt;<br>*&nbsp;@param&nbsp;curRootName&nbsp;&lt;font&nbsp;color="steelblue"&gt;查找的起始节点名称，如果为null从根开始查找。&lt;/font&gt;<br>*&nbsp;@return&nbsp;&lt;font&nbsp;color="tomato"&gt;配置的字符串。&lt;/font&gt;<br>*/<br>public&nbsp;String&nbsp;getElementvalue(String&nbsp;curRootName,&nbsp;String&nbsp;key)&nbsp;{<br>String&nbsp;value&nbsp;=&nbsp;null;<br>Element&nbsp;curRoot&nbsp;=&nbsp;getElement(null,&nbsp;curRootName);<br>if&nbsp;(null&nbsp;==&nbsp;curRoot)&nbsp;{<br>curRoot&nbsp;=&nbsp;m_RootElement;<br>}<br>Element&nbsp;keyNode&nbsp;=&nbsp;getElement(curRoot,&nbsp;key);<br>if&nbsp;(null&nbsp;!=&nbsp;keyNode)&nbsp;{<br>value&nbsp;=&nbsp;keyNode.getTextTrim();<br><br>}<br>return&nbsp;value;<br>}<br><br>/**<br>*&nbsp;&lt;font&nbsp;color="orange"&gt;根据名字获得节点。广度遍历，递归调用。&lt;/font&gt;<br>*&nbsp;@param&nbsp;nodeName&nbsp;&lt;font&nbsp;color="steelblue"&gt;节点的名字。&lt;/font&gt;<br>*&nbsp;@param&nbsp;curRoot&nbsp;&lt;font&nbsp;color="steelblue"&gt;&nbsp;从开始查找的起始节点，如果为null从根开始查找。&lt;/font&gt;<br>*&nbsp;@return&nbsp;&lt;font&nbsp;color="tomato"&gt;返回从指定节点下找到的第一个节点。如果没有返回null。&lt;/font&gt;<br>*/<br>private&nbsp;Element&nbsp;getElement(Element&nbsp;curRoot,&nbsp;String&nbsp;nodeName)&nbsp;{<br>Element&nbsp;retElement&nbsp;=&nbsp;null;<br><br>if&nbsp;(null&nbsp;==&nbsp;nodeName)<br>return&nbsp;m_RootElement;<br><br>if&nbsp;(null&nbsp;==&nbsp;curRoot)&nbsp;{<br>curRoot&nbsp;=&nbsp;m_RootElement;<br>}<br><br>if&nbsp;(null&nbsp;!=&nbsp;curRoot)&nbsp;{<br>retElement&nbsp;=&nbsp;curRoot.getChild(nodeName);<br>if&nbsp;(null&nbsp;==&nbsp;retElement)&nbsp;{<br>List&nbsp;nestElements&nbsp;=&nbsp;curRoot.getChildren();<br>Iterator&nbsp;iterator&nbsp;=&nbsp;nestElements.iterator();<br>while&nbsp;(iterator.hasNext()&nbsp;&amp;&amp;&nbsp;null&nbsp;==&nbsp;retElement)&nbsp;{<br>retElement&nbsp;=&nbsp;getElement(&nbsp;(Element)&nbsp;iterator.next(),&nbsp;nodeName);<br>}<br>}<br>}<br><br>return&nbsp;retElement;<br>}<br><br>/**<br>*&nbsp;&lt;font&nbsp;color="orange"&gt;获得指定节点的属性。&lt;/font&gt;<br>*&nbsp;@param&nbsp;elementName&nbsp;&lt;font&nbsp;color="steelblue"&gt;节点的名称。&lt;/font&gt;<br>*&nbsp;@param&nbsp;attName&nbsp;&lt;font&nbsp;color="steelblue"&gt;要获得的属性的名称。&lt;/font&gt;<br>*&nbsp;@return&nbsp;&lt;font&nbsp;color="tomato"&gt;要查找的属性的值。&lt;/font&gt;<br>*/<br>public&nbsp;String&nbsp;getElementAtrribute(String&nbsp;elementName,&nbsp;String&nbsp;attName)<br>{<br>Element&nbsp;el&nbsp;=&nbsp;getElement(null,&nbsp;elementName);<br>if&nbsp;(null&nbsp;==&nbsp;el)<br>return&nbsp;null;<br><br>return&nbsp;el.getAttributevalue(attName);<br>}<br><br>}
<img src ="http://www.blogjava.net/simie/aggbug/127844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-03 14:55 <a href="http://www.blogjava.net/simie/archive/2007/07/03/127844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从网上抓取指定URL源码的方案</title><link>http://www.blogjava.net/simie/archive/2007/07/03/127841.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Tue, 03 Jul 2007 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/03/127841.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127841.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/03/127841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127841.html</trackback:ping><description><![CDATA[<strong>引言<br></strong>　　在做无线项目的时候，与通讯公司的数据通讯有一部分是通过ＸＭＬ交互的，所以必须要动态抓取通讯公司提供的固定的Internet上的数据，便研究了一下如何抓取固定url上的数据，现与大家分享一下。<br><br>　　类名GetPageCode，有一个方法GetSource，通过属性传递参数，入参控制的是要取得URL的地址，代理服务器的设置及输出方式的控制，这里大家可以再扩展自己的需要，我这里只提供了两种方式，一种是直接写到本地的某个文件中，另外一种就是返回字符串的。类里已经作了比较详细的注释，我想大家很容易就看明白了，如果实在不明白，&nbsp;那就ｍｓｎ上问吧，ＭＳＮ：yubo@x263.net。<br><br>&nbsp;&nbsp;调用方式：<br>&nbsp;&nbsp;#region&nbsp;测试获取远程网页<br><br><br>
<table borderColor=#666666 cellSpacing=4 borderColorDark=#cccccc cellPadding=0 width="100%" bgColor=#cccccc borderColorLight=#666666 border=1>
    <tbody>
        <tr>
            <td style="WORD-BREAK: break-all" align=left><br>GetPageCode&nbsp;gpc&nbsp;=&nbsp;new&nbsp;GetPageCode();<br>&nbsp;&nbsp;gpc.Url="http://ppcode.com";<br>&nbsp;&nbsp;gpc.ProxyState=1;//使用代理服务器，0为不使用，设置为1后下面的代理设置才起作用<br>&nbsp;&nbsp;gpc.ProxyAddress="http://proxyName.com";//代理服务器地址<br>&nbsp;&nbsp;gpc.ProxyPort="80";//代理服务器的端口<br>&nbsp;&nbsp;gpc.ProxyAccount="proxy";//代理服务器账号<br>&nbsp;&nbsp;gpc.ProxyPassword="password";//代理服务器密码<br>&nbsp;&nbsp;gpc.ProxyDomain="bqc";//代理服务器域<br>&nbsp;&nbsp;gpc.OutFilePath=filePath;//设置输出文件路径的地方，如果不设置，则返回字符串<br>&nbsp;&nbsp;gpc.GetSource();//处理<br>&nbsp;&nbsp;string&nbsp;tempErr=gpc.NoteMessage;//如果出错，这里会提示<br>&nbsp;&nbsp;string&nbsp;tempCode=gpc.OutString;//返回的字符串<br>&nbsp;&nbsp;#endregion<br>&nbsp;&nbsp;类代码：<br>&nbsp;&nbsp;using&nbsp;System;<br>&nbsp;&nbsp;using&nbsp;System.Collections;<br>&nbsp;&nbsp;using&nbsp;System.ComponentModel;<br>&nbsp;&nbsp;using&nbsp;System.Data;<br>&nbsp;&nbsp;using&nbsp;System.Drawing;<br>&nbsp;&nbsp;using&nbsp;System.IO;<br>&nbsp;&nbsp;using&nbsp;System.Net;<br>&nbsp;&nbsp;using&nbsp;System.Text;<br>&nbsp;&nbsp;using&nbsp;System.Web;<br>&nbsp;&nbsp;namespace&nbsp;Test.Com<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;&nbsp;///&nbsp;功能：取得Internet上的URL页的源码<br>&nbsp;&nbsp;&nbsp;///&nbsp;创建：2004-03-22<br>&nbsp;&nbsp;&nbsp;///&nbsp;作者：Rexsp&nbsp;MSN:yubo@x263.net<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;GetPageCode<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;#region&nbsp;私有变量<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;网页URL地址<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;url=null;<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;是否使用代码服务器：0&nbsp;不使用&nbsp;&nbsp;1&nbsp;使用代理服务器<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;int&nbsp;proxyState=0;<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器地址<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;proxyAddress=null;<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器端口<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;proxyPort=null;<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器用户名<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;proxyAccount=null;<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器密码<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;proxyPassword=null;<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器域<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;proxyDomain=null;<br>&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;输出文件路径<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;outFilePath=null;<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;输出的字符串<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;outString=null;<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;提示信息<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;private&nbsp;string&nbsp;noteMessage;<br><br>&nbsp;&nbsp;#endregion<br><br>&nbsp;&nbsp;#region&nbsp;公共属性<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;欲读取的URL地址<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;Url<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;url;}<br>&nbsp;&nbsp;&nbsp;set{url=value;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;是否使用代理服务器标志<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;int&nbsp;ProxyState<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;proxyState;}<br>&nbsp;&nbsp;&nbsp;set{proxyState=value;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器地址<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;ProxyAddress<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;proxyAddress;}<br>&nbsp;&nbsp;&nbsp;set{proxyAddress=value;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br><br>&nbsp;&nbsp;///&nbsp;代理服务器端口<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;ProxyPort<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;proxyPort;}<br>&nbsp;&nbsp;&nbsp;set{proxyPort=value;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器账号<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;ProxyAccount<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;proxyAccount;}<br>&nbsp;&nbsp;&nbsp;set{proxyAccount=value;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器密码<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;ProxyPassword<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;proxyPassword;}<br>&nbsp;&nbsp;&nbsp;set{proxyPassword=value;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;代理服务器域<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;ProxyDomain<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;proxyDomain;}<br>&nbsp;&nbsp;&nbsp;set{proxyDomain=value;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;输出文件路径<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;OutFilePath<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;outFilePath;}<br><br>&nbsp;&nbsp;set{outFilePath=value;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;返回的字符串<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;OutString<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;outString;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;返回提示信息<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;string&nbsp;NoteMessage<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;get{return&nbsp;noteMessage;}<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;#endregion<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;#region&nbsp;构造函数<br>&nbsp;&nbsp;public&nbsp;GetPageCode()<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;#endregion<br><br>&nbsp;&nbsp;#region&nbsp;公共方法<br>&nbsp;&nbsp;///&nbsp;&lt;summary&gt;<br>&nbsp;&nbsp;///&nbsp;读取指定URL地址，存到指定文件中<br>&nbsp;&nbsp;///&nbsp;&lt;/summary&gt;<br>&nbsp;&nbsp;public&nbsp;void&nbsp;GetSource()&nbsp;<br>&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;WebRequest&nbsp;request&nbsp;=&nbsp;WebRequest.Create(this.url);<br>&nbsp;&nbsp;&nbsp;//使用代理服务器的处理<br>&nbsp;&nbsp;&nbsp;if(this.proxyState==1)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;//默认读取80端口的数据<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if(this.proxyPort==null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ProxyPort="80";<br><br>&nbsp;&nbsp;&nbsp;&nbsp;WebProxy&nbsp;myProxy=new&nbsp;WebProxy();&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;myProxy&nbsp;=&nbsp;(WebProxy)request.Proxy;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;myProxy.Address&nbsp;=&nbsp;new&nbsp;Uri(this.ProxyAddress+":"+this.ProxyPort);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;myProxy.Credentials&nbsp;=&nbsp;new&nbsp;NetworkCredential(this.proxyAccount,&nbsp;this.proxyPassword,&nbsp;this.ProxyDomain);<br>&nbsp;&nbsp;&nbsp;&nbsp;request.Proxy&nbsp;=&nbsp;myProxy;&nbsp;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;//请求服务<br>&nbsp;&nbsp;&nbsp;&nbsp;WebResponse&nbsp;response&nbsp;=&nbsp;request.GetResponse();<br>&nbsp;&nbsp;&nbsp;&nbsp;//返回信息<br>&nbsp;&nbsp;&nbsp;&nbsp;Stream&nbsp;resStream&nbsp;=&nbsp;response.GetResponseStream();&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;StreamReader&nbsp;sr&nbsp;=&nbsp;new&nbsp;StreamReader(resStream,&nbsp;System.Text.Encoding.Default);<br>&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;tempCode=&nbsp;sr.ReadToEnd();<br>&nbsp;&nbsp;&nbsp;&nbsp;resStream.Close();&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;sr.Close();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;//如果输出文件路径为空，便将得到的内容赋给OutString属性<br>&nbsp;&nbsp;&nbsp;&nbsp;if(this.outFilePath==null)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.outString=tempCode;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInfo&nbsp;fi&nbsp;=&nbsp;new&nbsp;FileInfo(this.outFilePath);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果存在文件则先干掉<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fi.Exists)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi.Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StreamWriter&nbsp;sw&nbsp;=&nbsp;new&nbsp;StreamWriter(this.outFilePath,true,Encoding.Default);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Write(tempCode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Flush();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sw.Close();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;this.noteMessage="出错了，请检查网络是否连通;";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;#endregion<br><br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/simie/aggbug/127841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-03 14:52 <a href="http://www.blogjava.net/simie/archive/2007/07/03/127841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java SE 6中的JDBC 4.0增强</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127660.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 11:39:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127660.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127660.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127660.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127660.html</trackback:ping><description><![CDATA[<span class=h1b>Java SE 6中的JDBC 4.0增强</span><br><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td height=64>时间：2006-10-25<br>作者：<a href="http://dev2dev.bea.com.cn/author/499.html"><u><font color=#0000ff>Srini Penchikala</font></u></a><br>浏览次数：
            <script language=JavaScript src="/beadevcount.jsp?d_id=162472" type=text/JavaScript></script>
            5760 <br>本文关键字：<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=JDO"><u><font color=#0000ff>JDO</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=JDBC"><u><font color=#0000ff>JDBC</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=SQLJ"><u><font color=#0000ff>SQLJ</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=Java"><u><font color=#0000ff>Java</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=Srini Penchikala"><u><font color=#0000ff>Srini Penchikala</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=jdbc"><u><font color=#0000ff>jdbc</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=mustang"><u><font color=#0000ff>mustang</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=java se 6"><u><font color=#0000ff>java se 6</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=RowID"><u><font color=#0000ff>RowID</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=driver"><u><font color=#0000ff>driver</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=annotation"><u><font color=#0000ff>annotation</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=驱动程序"><u><font color=#0000ff>驱动程序</font></u></a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=注释"><u><font color=#0000ff>注释</font></u></a></td>
            <td>
            <table class=box_content cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td><span class=h2b>文章工具</span><br><img height=10 alt=推荐给朋友 src="http://dev2dev.bea.com.cn/images/letter001.gif" width=19 align=absMiddle>&nbsp;<a href="javascript:sendmail()"><u><font color=#0000ff>推荐给朋友</font></u></a><br><u><font color=#0000ff><img height=18 alt=打印文章 src="http://dev2dev.bea.com.cn/images/print001.gif" width=19 align=absMiddle></font></u>&nbsp;<a href="javascript:window.print()"><u><font color=#0000ff>打印文章</font></u></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<!-- 提取技术文章 -->
<div class=beas><u><font color=#0000ff><img height=1 alt="" src="http://dev2dev.bea.com.cn/images/dot6B6B6B.gif" width="100%"></font></u></div>
<p>　　 <a href="http://www.onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html##" target=_blank><u><font color=#0000ff>Java</font></u></a> Platform, Standard Edition（Java SE）版本6（代码名称<a href="http://mustang.dev.java.net/"><u><font color=#0000ff>Mustang</font></u></a>）现在已经推出了第二个<a href="http://java.sun.com/javase/6/"><u><font color=#0000ff>beta</font></u></a>版本，并计划于今年十月份交付使用。Java SE 6包括几处对<a href="http://java.sun.com/javase/technologies/database.jsp"><u><font color=#0000ff>Java Database Connectivity</font></u></a> （<a href="http://www.onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html##" target=_blank><u><font color=#0000ff>JDBC</font></u></a>）API的增强。这些增强将被发布为JDBC 4.0版本。新JDBC功能的主要目标是提供更为简单的设计方式和更好的开发人员体验。本文概要说明了JDBC 4.0增强，以及它们给企业Java开发人员带来的好处。我们将借助一个使用Apache Derby作为后端数据库而构建的贷款处理示例应用程序，对新的JDBC功能进行探讨。</p>
<h3>Java SE 6.0</h3>
<p>　　Java SE 6.0版本的主要目标是提供兼容性、稳定性和高质量。这个版本中有几处有趣的增强，尤其是在监控与管理（JMX）、Web service、脚本语言支持（使用Rhino脚本引擎<a href="http://www.jcp.org/en/jsr/detail?id=223"><u><font color=#0000ff>JSR 223</font></u></a>将JavaScript技术与Java源代码集成在一起）、数据库<a href="http://www.onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html##" target=_blank><u><font color=#0000ff>连接性</font></u></a>、注释支持和安全性方面。JDBC API中还增加了几个新功能，从新的RowId支持到更多的SQLException子类。</p>
<h3>JDBC 4.0功能</h3>
<p>　　借助Mustang中包含的Java SE <em>Service Provider</em>机制，Java开发人员不再需要使用像Class.forName()这样的代码显式地加载JDBC驱动程序，就能注册JDBC驱动程序。通过在调用DriverManager.getConnection()方法时自动定位合适的驱动程序，DriverManager类可以做到这一点。这个功能是向后兼容的，所以无需修改现有的JDBC代码。</p>
<p>　　 在访问关系数据库的Java应用程序中，通过最小化我们需要编写的&#8220;模板&#8221;代码，JDBC 4.0还改善了开发人员体验。它还提供实用程序类，以改进JDBC驱动程序的注册和卸载机制，以及管理数据源和连接对象。</p>
<p>　　 借助JDBC 4.0，Java开发人员现在可以使用Annotations指定SQL查询，从而利用Java SE 5.0（<a href="http://java.sun.com/j2se/1.5.0/docs/index.html"><u><font color=#0000ff>Tiger</font></u></a>）版本中提供的元数据支持。基于注释的SQL查询允许在Java代码中使用Annotation关键字指定SQL查询字符串。这样，我们就不必在两个不同文件中查看JDBC代码以及这些代码中调用的数据库查询了。例如，如果有一个叫做getActiveLoans()的方法，用于获取贷款处理数据库中的当前贷款，可以使用@Query(sql="SELECT * FROM LoanApplicationDetails WHERE LoanStatus = 'A'")注释来修饰它。</p>
<p>　　 此外，Java SE 6开发工具包（JDK 6）的最后版本——与运行时环境（JRE 6）相反——将会有一个基于与它绑定在一起的<a href="http://db.apache.org/derby/"><u><font color=#800080>Apache Derby</font></u></a>的数据库。这将帮助开发人员理解新的JDBC功能，而不必单独下载、安装和配置数据库产品。</p>
<p>　　 JDBC 4.0中加入的主要功能包括：</p>
<ul>
    <li>自动加载JDBC驱动程序类。
    <li>连接管理增强。
    <li>支持RowId SQL 类型。
    <li>使用Annotations的DataSet SQL实现。
    <li>处理增强的SQL异常。
    <li>支持SQL XML。 </li>
</ul>
<p>　　还存在其他功能，比如对大对象（BLOB/CLOB）的改进支持和National Character Set Support。接下来的内容将会详细分析这些功能。</p>
<h3>自动加载JDBC驱动程序</h3>
<p>　　在JDBC 4.0中，调用getConnection方法时，不再需要使用Class.forName()显式地加载JDBC驱动程序，因为DriverManager将会试着从初始化时加载的以及使用与当前应用程序相同的类加载器显式加载的JDBC驱动程序中，找出合适的驱动程序来。</p>
<p>　　 DriverManager方法getConnection和getDrivers已经增强为支持Java SE Service Provider机制（SPM）。根据SPM，服务被定义为一组众所周知的接口和抽象类，而服务提供程序则是服务的特定实现。它还指定在META-INF/services目录中保存服务提供程序配置文件。JDBC 4.0驱动程序必须包含文件META-INF/services/java.sql.Driver。这个文件包含JDBC驱动程序的java.sql.Driver实现的名称。例如，要加载JDBC驱动程序以连接到Apache Derby数据库，META-INF/services/java.sql.Driver文件就要包含以下项：</p>
<p>　　 org.apache.derby.jdbc.EmbeddedDriver</p>
<p>　　 让我们尽快了解如何使用这项新功能加载JDBC驱动程序管理器。下面的列表显示了加载JDBC驱动程序通常使用的示例代码。我们假定需要连接到一个Apache Derby数据库，因为我们在文章后面提到的示例应用程序中将使用这个数据库：</p>
<pre class=code> Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection conn
<br>=DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
</pre>
<p>　　但是在JDBC 4.0中，我们不需要Class.forName()这一行。我们只要调用getConnection()就可以获得数据库连接。</p>
<p>　　 注意，这仅适用于在单机模式中获得数据库连接。如果使用某种数据库连接池来管理连接，代码将会有所区别。</p>
<h3>连接管理</h3>
<p>　　在JDBC 4.0之前，我们依赖于JDBC URL来定义数据源连接。现在有了JDBC 4.0，我们只要提供一组参数（比如主机名称和端口号）给标准的连接工厂机制，就能获得到任意数据源的连接。Connection和Statement接口中加入了新的方法，以便在管理池环境中的Statement对象时可以支持连接状态跟踪改进和更大的灵活性。元数据工具（<a href="http://www.jcp.org/en/jsr/detail?id=175"><u><font color=#0000ff>JSR-175</font></u></a>）用于管理活动连接。我们还可以获得元数据信息，比如活动连接的状态，还可以把连接指定为标准的（Connection，用于单机应用程序）、池化的（PooledConnection）或者甚至是用于XA事务的分布式连接（XAConnection）。注意，我们没有直接使用XAConnection。它是由诸如WebLogic、WebSphere或JBoss这样的Java EE应用服务器内部的事务管理器来使用的。</p>
<h3>RowId支持</h3>
<p>　　RowID接口被添加到JDBC 4.0中以支持ROWID数据类型，Oracle和DB2等数据库也支持这种数据类型。当有多条记录没有惟一标识符列，而且需要在不允许复制的Collection（比如Hashtable）中保存查询输出时，RowId很有用。我们可以使用ResultSet的getRowId()方法来获得RowId，并使用PreparedStatement的setRowId()方法在查询中使用RowId。</p>
<p>　　 关于RowId对象要记住的一件重要事情是，分别在PreparedStatement和ResultSet中使用set或update方法时，RowId对象的值无法在数据源之间移植，可以认为它是特定于数据源的。所以，禁止在不同的Connection和ResultSet对象之间共享它。</p>
<p>　　 DatabaseMetaData中的getRowIdLifetime()方法可用于确定RowId对象的生存期有效性。表1中列出了返回值或行id可能取的值。</p>
<table class=tabel-general cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <th class=left>RowId 值</th>
            <th class=right>描述</th>
        </tr>
        <tr>
            <td class=left>ROWID_UNSUPPORTED</td>
            <td class=right>不支持ROWID数据类型。</td>
        </tr>
        <tr>
            <td class=left>ROWID_VALID_OTHER</td>
            <td class=right>RowID的生存期依赖于数据库厂商实现。</td>
        </tr>
        <tr>
            <td class=left>ROWID_VALID_TRANSACTION</td>
            <td class=right>只要在数据库表中行未被删除，RowID的生存期在当前的事务中。</td>
        </tr>
        <tr>
            <td class=left>ROWID_VALID_SESSION</td>
            <td class=right>只要在数据库表中行未被删除，RowID的生存期在当前会话的持续时间中。</td>
        </tr>
        <tr>
            <td class=left>ROWID_VALID_FOREVER</td>
            <td class=right>只要在数据库表中行未被删除，RowID的生存期是无限的。</td>
        </tr>
    </tbody>
</table>
<h3>基于注释的SQL查询</h3>
<p>　　JDBC 4.0规范利用注释（Java SE 5中加入）允许开发人员把SQL查询与Java类关联在一起，同时不用编写大量的代码。此外，通过使用Generics（<a href="http://www.jcp.org/en/jsr/detail?id=014"><u><font color=#0000ff>JSR 014</font></u></a>）和元数据（<a href="http://www.jcp.org/en/jsr/detail?id=175"><u><font color=#0000ff>JSR 175</font></u></a>）API，我们可以把SQL查询与Java对象关联在一起，从而指定查询输入和输出参数。我们还可以把查询结果绑定到Java类，以加速对查询输出的处理。我们无需编写通常用于把查询结果填充到Java对象中的所有代码。在Java代码中指定SQL查询时，有2种主要的注释：Select和Update。</p>
<h4>Select注释 </h4>
<p>　　Select注释用于在Java类中指定选择查询，以便使用get方法从数据库表中获取数据。表2显示了Select注释的各种属性以及它们的用法。</p>
<table class=tabel-general cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <th class=left>名称</th>
            <th class=center>类型</th>
            <th class=right>描述</th>
        </tr>
        <tr>
            <td class=left>sql</td>
            <td class=center>String</td>
            <td class=right>SQL Select查询字符串。</td>
        </tr>
        <tr>
            <td class=left>value</td>
            <td class=center>String</td>
            <td class=right>与sql属性相同。</td>
        </tr>
        <tr>
            <td class=left>tableName</td>
            <td class=center>String</td>
            <td class=right>在其上调用sql的数据库表的名称。</td>
        </tr>
        <tr>
            <td class=left>readOnly、connected、 scrollable</td>
            <td class=center>Boolean</td>
            <td class=right>标志，分别用于指示返回的DataSet是只读的还是可更新的，是否连接到后端数据库，在connected模式中使用时是否可以滚动。</td>
        </tr>
        <tr>
            <td class=left>allColumnsMapped</td>
            <td class=center>Boolean</td>
            <td class=right>标志，用于指示sql注释元素中的列名是否一对一地映射到DataSet中的字段。</td>
        </tr>
    </tbody>
</table>
<p>　　下面是Select注释的一个例子，用于从贷款数据库获得所有当前贷款：</p>
<pre class=code>interface LoanAppDetailsQuery extends BaseQuery {
@Select("SELECT * FROM LoanDetais where LoanStatus = 'A'")
DataSet&lt;LoanApplication&gt; getAllActiveLoans();
}
</pre>
<p>　　sql注释也支持I/O参数（参数标记由一个问号后面跟一个整数来表示）。下面是参数化sql查询的一个例子：</p>
<pre class=code>interface LoanAppDetailsQuery extends BaseQuery {
@Select(sql="SELECT * from LoanDetails
where borrowerFirstName= 1 and borrowerLastName= 2")
DataSet&lt;LoanApplication&gt; getLoanDetailsByBorrowerName(String borrFirstName,
String borrLastName);
}
</pre>
<h4>Update注释 </h4>
<p>　　Update注释用于修饰Query接口方法，用于更新数据库表中的一条或多条记录。每个Update注释都必须包含一个sql注释类型的元素。下面是Update注释的一个例子：</p>
<pre class=code>interface LoanAppDetailsQuery extends BaseQuery {
@Update(sql="update LoanDetails set LoanStatus = 1
where loanId = 2")
boolean updateLoanStatus(String loanStatus, int loanId);
}
</pre>
<h3>处理增强的SQL异常</h3>
<p>　　异常处理是Java编程的一个重要组成部分，特别是当连接到后端关系数据库或在后端关系数据库上运行查询的时候。我们一直使用SQLException类来指示与数据库相关的错误。<a href="http://www.onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html?page=2#" target=_blank><u><font color=#0000ff>JDBC</font></u></a> 4.0在SQLException处理方面有几处增强。下面是JDBC 4.0版本中的一些增强，在处理SQLExceptions时它们可以为开发人员带来更好的体验：</p>
<ul>
    <li>新的SQLException子类
    <li>支持因果关系
    <li>支持增强的for-each循环 </li>
</ul>
<h4>新的SQLException类 </h4>
<p>　　JDBC 4.0中创建了SQLException的新子类，以便为Java程序员提供一种编写更多可移植错误处理代码的手段。JDBC 4.0中引入了2类新的SQLException：</p>
<ul type=disc>
    <li>SQL非瞬时异常
    <li>SQL瞬时异常 </li>
</ul>
<p>　　<strong>非瞬时异常：</strong>同一项操作重试失败时抛出此异常，直到SQLException的原因得到纠正为止。表3显示了JDBC 4.0中加入的新异常类，它们都是SQLNonTransientException的子类（SQLState类值定义在SQL 2003规范中。）：</p>
<table class=tabel-general cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <th class=left>异常类</th>
            <th class=right>SQLState值</th>
        </tr>
        <tr>
            <td class=left>SQLFeatureNotSupportedException</td>
            <td class=right>0A</td>
        </tr>
        <tr>
            <td class=left>SQLNonTransientConnectionException</td>
            <td class=right>08</td>
        </tr>
        <tr>
            <td class=left>SQLDataException</td>
            <td class=right>22</td>
        </tr>
        <tr>
            <td class=left>SQLIntegrityConstraintViolationException</td>
            <td class=right>23</td>
        </tr>
        <tr>
            <td class=left>SQLInvalidAuthorizationException</td>
            <td class=right>28</td>
        </tr>
        <tr>
            <td class=left>SQLSyntaxErrorException</td>
            <td class=right>42</td>
        </tr>
    </tbody>
</table>
<p>　　<strong>瞬时异常：</strong>当操作在没有任何应用程序级功能进行干涉的情况下重试，前面失败的JDBC操作能够成功时抛出此异常。表4中列出了对SQLTransientException进行扩展的新异常。</p>
<table class=tabel-general cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <th class=left>异常类</th>
            <th class=right>SQLState值</th>
        </tr>
        <tr>
            <td class=left>SQLTransientConnectionException</td>
            <td class=right>08</td>
        </tr>
        <tr>
            <td class=left>SQLTransactionRollbackException</td>
            <td class=right>40</td>
        </tr>
        <tr>
            <td class=left>SQLTimeoutException</td>
            <td class=right>None</td>
        </tr>
    </tbody>
</table>
<h4>因果关系 </h4>
<p>　　现在，SQLException类支持配备有异常机制（也称为Cause工具）的Java SE，这种机制让我们能够处理JDBC操作中抛出的多种异常（如果后端数据库支持多异常功能）。这种场景发生在执行一条可能抛出多个SQLException的语句时。</p>
<p>　　 我们可以使用SQLException中的getNextException()方法，通过异常链进行迭代。下面给出一些用于处理SQLException因果关系的示例代码：</p>
<pre class=code>catch(SQLException ex) {
while(ex != null) {
LOG.error("SQL State:" + ex.getSQLState());
LOG.error("Error Code:" + ex.getErrorCode());
LOG.error("Message:" + ex.getMessage());
Throwable t = ex.getCause();
while(t != null) {
LOG.error("Cause:" + t);
t = t.getCause();
}
ex = ex.getNextException();
}
}
</pre>
<h4>增强的For-Each循环 </h4>
<p>　　SQLException类实现了Iterable接口，为Java SE 5中加入的for-each循环功能提供支持。循环的导航将遍历SQLException及其原因。下面给出一个代码片段，对SQLException中加入的for-each循环进行了说明。</p>
<pre class=code>catch(SQLException ex) {
for(Throwable e : ex ) {
LOG.error("Error occurred: " + e);
}
}</pre>
<h3>对国家字符集转换的支持</h3>
<p>　　下面列出了处理国家字符集（National Character Set）时JDBC类中所做的增强：</p>
<ul>
    <li>JDBC数据类型：加入了新的JDBC数据类型，比如NCHAR、NVARCHAR、LONGNVARCHAR和NCLOB。
    <li>PreparedStatement：加入了新方法setNString、setNCharacterStream和setNClob。
    <li>CallableStatement：加入了新方法getNClob、getNString和getNCharacterStream。
    <li>ResultSet：接口加入了新方法updateNClob、updateNString和updateNCharacterStream。 </li>
</ul>
<h3>对大对象（BLOB和CLOB）的增强支持</h3>
<p>　　下面列出了JDBC 4.0中对处理LOB所做的增强：</p>
<ul>
    <li>Connection：加入了新方法（createBlob()、createClob()和createNClob()）以创建BLOB、CLOB和NCLOB对象的新实例。
    <li>PreparedStatement：加入了新方法setBlob()、setClob()和setNClob()，以便使用InputStream对象插入BLOB对象，以及使用Reader对象插入CLOB和NCLOB对象。
    <li>LOB：Blob、Clob和NClob接口中加入了新方法（free()），以便释放这些对象占用的资源。 </li>
</ul>
<p>　　现在，让我们看一看java.sql和javax.jdbc包中加入的一些新类，以及它们提供了哪些服务。</p>
<h3>JDBC 4.0 API：新类</h3>
<h4>RowId (java.sql)</h4>
<p>　　正如前面提过的那样，这个接口代表着数据库中的一个SQL ROWID值。ROWID是一个内置的SQL数据类型，用于识别数据库表中的特定数据行。ROWID通常用在这样的查询中：该查询从输出行没有惟一ID列的表中返回行。</p>
<p>　　 CallableStatement、PreparedStatement和ResultSet接口中的方法，比如getRowId和setRowId，允许程序员访问SQL ROWID值。接口还提供一个方法（叫做getBytes()）把ROWID的值返回为字节数组。DatabaseMetaData接口有一个叫做getRowIdLifetime的新方法，可用于确定RowId对象的生存期。RowId的作用域可以是下列3种类型之一：</p>
<ul>
    <li>在其中创建RowId的数据库事务的持续时间。
    <li>在其中创建RowId的会话的持续时间。
    <li>数据库表中的标识行，只要它尚未被删除。 </li>
</ul>
<h4>DataSet (java.sql) </h4>
<p>　　<a href="http://download.java.net/jdk6/docs/api/java/sql/DataSet.html"><u><font color=#0000ff>DataSet</font></u></a>接口为从执行SQL查询返回的数据提供类型安全的视图。DataSet可以在已连接或未连接模式中进行操作。当在已连接模式中使用时，其功能类似于ResultSet。而在未连接模式中使用时，DataSet的功能则类似于CachedRowSet。因为DataSet扩展了List接口，我们可以遍历查询返回的行。</p>
<p>　　 现有的类中还加入了几个新方法，比如Connection（createSQLXML、isValid）和ResultSet（getRowId）。</p>
<h3>示例应用程序</h3>
<p>　　本文中使用的示例应用程序是一个贷款处理应用程序，它包含一个贷款查找页面，用户可以在这个页面上输入一个贷款ID以获得有关贷款的详细信息，然后提交表单。贷款查找页面调用一个控制器对象，而此控制器对象又调用DAO对象来访问后端数据库，从而获得有关贷款的详细信息。这些详细信息包括借款人姓名、贷款金额和贷款到期时间，它们均会显示在一个贷款详细信息页面上。在后端数据库中，我们使用一个叫做LoanApplicationDetails的表来保存贷款应用程序的详细信息。</p>
<p>　　 示例应用程序的用例是获得特定贷款ID的贷款详细信息。在注册贷款并针对抵押产品和利率锁定它之后，就可以获得这些贷款详细信息了。贷款处理应用程序的项目细节如表5所示。</p>
<table class=tabel-general cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <th class=left>名称</th>
            <th class=right>值</th>
        </tr>
        <tr>
            <td class=left>Project Name</td>
            <td class=right>JdbcApp</td>
        </tr>
        <tr>
            <td class=left>Project Directory</td>
            <td class=right>c:\dev\projects\JdbcApp</td>
        </tr>
        <tr>
            <td class=left>DB Directory</td>
            <td class=right>c:\dev\dbservers\apache\derby</td>
        </tr>
        <tr>
            <td class=left>JDK Directory</td>
            <td class=right>c:\dev\java\jdk_1.6.0</td>
        </tr>
        <tr>
            <td class=left>IDE Directory</td>
            <td class=right>c:\dev\tools\eclipse</td>
        </tr>
        <tr>
            <td class=left>Database</td>
            <td class=right>Apache Derby 10.1.2.1</td>
        </tr>
        <tr>
            <td class=left>JDK</td>
            <td class=right>6.0 (beta 2 release)</td>
        </tr>
        <tr>
            <td class=left>IDE</td>
            <td class=right>Eclipse 3.1</td>
        </tr>
        <tr>
            <td class=left>Unit Testing</td>
            <td class=right>JUnit 4</td>
        </tr>
        <tr>
            <td class=left>Build</td>
            <td class=right>Ant 1.6.5</td>
        </tr>
    </tbody>
</table>
<p>　　下表列出了连接贷款详细信息Apache Derby数据库时需要用到的JDBC参数。这些参数都保存在一个叫做<em>derby.properties</em>的文本文件中，该文件位于项目基目录下的<em>etc/jdbc</em>目录中（参见表6）。</p>
<table class=tabel-general cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <th class=left>名称</th>
            <th class=right>值</th>
        </tr>
        <tr>
            <td class=left>JDBC Driver File</td>
            <td class=right>LoanApp\META-INF\services\java.sql.driver</td>
        </tr>
        <tr>
            <td class=left>Driver</td>
            <td class=right>org.apache.derby.ClientDriver</td>
        </tr>
        <tr>
            <td class=left>URL</td>
            <td class=right>jdbc:derby:derbyDB</td>
        </tr>
        <tr>
            <td class=left>User Id</td>
            <td class=right>user1</td>
        </tr>
        <tr>
            <td class=left>Password</td>
            <td class=right>user1</td>
        </tr>
    </tbody>
</table>
<p>　　注意：Apache Derby数据库提供2类JDBC驱动程序：Embedded Driver（org.apache.derby.jdbc.EmbeddedDriver）和Client/Server Driver（org.apache.derby.jdbc.ClientDriver）。在示例应用程序中我使用的是Client/Server Driver版本。</p>
<p>　　 下面给出用于启动Derby<a href="http://www.onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html?page=3#" target=_blank><u><font color=#0000ff>数据库服务器</font></u></a>和使用ij工具创建新数据库的命令。</p>
<p>　　 要启动Derby Network Server，打开一个命令提示，然后运行以下命令（修改DERBY_INSTALL和JAVA_HOME环境变量，从而影响本地环境）。</p>
<pre class=code>set DERBY_INSTALL=C:\dev\dbservers\db-derby-10.1.2.1-bin
set JAVA_HOME=C:\dev\java\jdk1.6.0
set DERBY_INSTALL=C:\dev\dbservers\db-derby-10.1.3.1-bin
set CLASSPATH=%CLASSPATH%;%DERBY_INSTALL%\lib\derby.jar;
%DERBY_INSTALL%\lib\derbytools.jar;
%DERBY_INSTALL%\lib\derbynet.jar;
cd %DERBY_INSTALL%\frameworks\ NetworkServer\bin
startNetworkServer.bat
</pre>
<p>　　要连接到数据库服务器和创建测试数据库，打开另一个命令提示，然后运行以下命令。确保修改了DERBY_INSTALL和JAVA_HOME环境变量，以适应环境。</p>
<pre class=code>set JAVA_HOME=C:\dev\java\jdk1.6.0
set DERBY_INSTALL=C:\dev\dbservers\db-derby-10.1.3.1-bin
set CLASSPATH=%DERBY_INSTALL%\lib\derbyclient.jar;
%DERBY_INSTALL%\lib\derbytools.jar;.
%JAVA_HOME%\bin\java org.apache.derby.tools.ij
connect 'jdbc:derby://localhost:1527/LoanDB;create=true';
</pre>
<h3>测试</h3>
<p>　　用于编译Java源代码的classpath设置应该包含位于项目主目录下<em>lib</em>目录中的<em>derby.jar</em>和<em>junit4.jar</em>文件。我们还需要在classpath中包含<em>etc</em>、<em>etc/jdbc</em>和<em>etc/log4j</em>目录，这样应用程序就能访问JDBC属性和Log4J配置文件。我创建了一个Ant编译脚本（位于<em>JdbcApp/build</em>目录中），以自动化编译和打包Java代码的任务。</p>
<p>　　 用于测试贷款详细信息数据访问对象的测试类叫做LoanAppDetailsDAOTest。我们传入参数（比如贷款ID和借款人姓名）以获得贷款详细信息。</p>
<p>　　 下面的内容给出了一些代码示例，这些代码是关于JDBC 4.0规范的JDBC驱动程序自动加载和给予注释的SQL查询功能的。</p>
<h4>自动加载JDBC驱动程序 </h4>
<p>　　BaseDAO抽象类有一个叫做getConnection的方法，用于获得一个数据库连接。下面的代码片段显示了这个方法（注意，我们不必注册JDBC驱动程序）。只要<em>java.sql.Driver</em>文件中存在正确的驱动程序名称（org.apache.derby.jdbc.ClientDriver），就可以自动加载JDBC驱动程序。</p>
<pre class=code>protected Connection getConnection() throws DAOException {
// Load JDBC properties first
if (jdbcUrl == null || jdbcUser == null ||
jdbcPassword == null) {
loadJdbcProperties();
}
// Get Connection
Connection conn = null;
try {
conn = DriverManager.getConnection(jdbcUrl, jdbcUser,
jdbcPassword);
} catch (SQLException sqle) {
throw new DAOException("Error in getting a DB connection.",
sqle);
}
return conn;
}
</pre>
<h4>SQL注释 </h4>
<p>　　LoanAppDetailsQuery接口有带有注释的SQL查询，用于获得当前贷款（条件是loanstatus="A"）的列表和基于贷款人姓名的贷款详细信息（在一个贷款人借贷多笔款项的情况下）。我们在本文的前面部分曾见过这些SQL注释。下面给出的示例代码说明了如何调用使用Annotation定义的SQL查询。</p>
<pre class=code>public DataSet&lt;LoanAppDetails&gt; getAllActiveLoans() throws Exception {
// Get Connection
Connection conn = getConnection();
LoanAppDetailsQuery query = null;
DataSet&lt;LoanAppDetails&gt; loanDetails = null;
query = QueryObjectFactory.createQueryObject(
LoanAppDetailsQuery.class, conn);
loanDetails = query.getAllActiveLoans();
return loanDetails;
}
</pre>
<pre class=code>public DataSet&lt;LoanAppDetails&gt; getLoanDetailsByBorrowerName(
String borrFirstName, String borrLastName) throws Exception {
// Get Connection
Connection conn = getConnection();
LoanAppDetailsQuery query = null;
DataSet&lt;LoanAppDetails&gt; loanDetails = null;
query = QueryObjectFactory.createQueryObject(
LoanAppDetailsQuery.class, conn);
loanDetails = query.getLoanDetailsByBorrowerName(
borrFirstName,borrLastName);
return loanDetails;
}
</pre>
<h3>结束语</h3>
<p>　　在使用SQL时，JDBC 4.0可以提供开发的简便性并改善开发人员体验。JDBC 4.0的另一个目标是提供企业级的JDBC功能，把API公开给涵盖范围更广的工具集，以便更好地管理JDBC资源。此外，JDBC 4.0 API为JDBC驱动程序提供了一条迁移路径，从而与J2EE Connector架构（JCA）保持兼容。这使得JDBC厂商能够继续实现JDBC技术Connector API。当在企业级面向服务架构（Service Oriented Architecture，SOA）应用程序中使用JDBC数据源时，这一点很重要，因为在企业级SOA应用程序中，可以把JDBC数据源部署为企业服务总线（Enterprise Service Bus，ESB）架构中的另一个适配器，而不必为JDBC数据源编写ESB特定实现代码。</p>
<p>　　 在本文中，我们讨论了JDBC 4.0中的增强，比如RowId支持、JDBC驱动程序加载和基于Annotations的SQL。JDBC 4.0中还将加入其他功能，以便在未来支持SQL 2003规范。要了解有关JDBC 4.0规范的更多信息，请参考<a href="http://java.sun.com/products/jdbc/download.html"><u><font color=#800080>规范</font></u></a>文档。</p>
<h3>参考资料</h3>
<ul type=disc>
    <li><a href="http://www.onjava.com/onjava/2006/08/02/examples/jdbc40app.zip"><u><font color=#0000ff>示例应用程序代码</font></u></a>
    <li><a href="http://java.sun.com/javase/6/"><u><font color=#0000ff>Java SE 6主页</font></u></a>
    <li><a href="https://mustang.dev.java.net/"><u><font color=#0000ff>Java SE 6参考实现（Mustang）Web站点</font></u></a>
    <li><a href="http://java.sun.com/javase/6/download.jsp"><u><font color=#0000ff>Java SE 6下载页面</font></u></a>
    <li><a href="http://java.sun.com/javase/6/docs/api/"><u><font color=#0000ff>API规范</font></u></a>
    <li><a href="http://db.apache.org/derby/"><u><font color=#800080>Apache Derby主页</font></u></a>
    <li><a href="http://tomcat.apache.org/"><u><font color=#0000ff>Tomcat 5.5主页</font></u></a> </li>
</ul>
<!--文章其他信息-->
<div class=dot001><img height=1 alt="" src="http://dev2dev.bea.com.cn/images/_.gif" width="100%"></div>
<table cellSpacing=0 cellPadding=3 width="100%" border=0>
    <tbody>
        <tr vAlign=bottom>
            <td colSpan=2 height=20>&nbsp;<span class=h2b>作者简介</span></td>
        </tr>
        <tr>
            <td vAlign=top align=middle width=0></td>
            <td><a href="http://www.onjava.com/pub/au/1418" target=_blank><u><font color=#0000ff>Srini Penchikala</font></u></a> 是一位在Flagstar银行工作的信息系统学科问题专家。</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/simie/aggbug/127660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 19:39 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java NIO API详解 </title><link>http://www.blogjava.net/simie/archive/2007/07/02/127524.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127524.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127524.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127524.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JDK 1.4以前，Java的IO操作集中在java.io这个包中，是基于流的阻塞（blocking）API。对于大多数应用来说，这样的API使用很方便，然而，一些对性能要求较高的应用，尤其是服务端应用，往往需要一个更为有效的方式来处理IO。从JDK 1.4起，NIO API作为一个基于缓冲区，并能提供非阻塞(non-blocking)IO操作的API被引入。本文对其进行深入的介绍。&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/simie/archive/2007/07/02/127524.html'>阅读全文</a><img src ="http://www.blogjava.net/simie/aggbug/127524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 13:07 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA反编译工具精选（转载）</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127512.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127512.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127512.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127512.html</trackback:ping><description><![CDATA[<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">最近整理以前写的东东，发现2004年底的时候对比各类Java反编译器时记下来的一篇心得，也不知道是不是有点儿过时了，仅供大家参考吧。</font></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">=====================================================================</font></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言是</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">1995</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">年</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">5</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">月由</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">SUN</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司发布的，由于其安全性高、代码优化、跨平台等特性，迅速取代了很多传统高级语言，占据了企业级网络应用开发等诸多领域的霸主地位。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不过，</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最突出的跨平台优势使得它不能被编译成本地代码，而要以中间代码的形式运行在虚拟机环境中，这使得</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的反编译要比别的高级语言容易实现，并且反编译的代码经过优化后几乎可以与源代码相媲美。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了更好地保护知识产权，避免本公司的智力成果轻易被人窃取，开发者有必要对反编译工具深入了解，以便有针对性地采取保护措施。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目前，比较流行的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译工具超过</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">30</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">种，其中有三款堪称精品：</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">一、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用广泛的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD<o:p></o:p></font></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在众多的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译工具中，有几种非常著名的工具使用了相同的核心引擎——</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，其中主要包括：</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Front End Plus</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">mDeJava</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Decafe Pro</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Cavaj Java Decompiler</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">DJ Java Decompiler</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">NMI&#8217;s Java Class Viewer</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和国产的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源代码反编译专家等等。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身是一个命令行工具，没有图形界面，上述的这些工具大多是在</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内核的基础之上加了一个图形界面而已。这么多种产品的共同选择，足可证明</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译领域中的尊贵地位。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">笔者用来测试的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本是</span><font face="Times New Roman"><st1:chsdate ISROCDATE="False" ISLUNARDATE="False" DAY="30" MONTH="12" YEAR="1899" W:ST="on"><span lang=EN-US style="FONT-SIZE: 14pt">1.5.8</span></st1:chsdate><span lang=EN-US style="FONT-SIZE: 14pt">f。</span></font></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 14pt"><img src="http://www.360doc.com/DownloadImg/2633/488247_1.jpg"></span></font></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是使用</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Microsoft Visual C++</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发的，运行速度非常快，可以处理很复杂的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译文件。众多的参数使</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以灵活应付多种加密手段，令反编译的代码更加优化和易读。由于</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数太多，没必要一一解释，其中有几个最常用的如下：</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-d
<dir>- </font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于指定输出文件的目录</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span><font face="宋体, MS Song" size=3> </font>
<p>&nbsp;</p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-s <ext>- </font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输出文件扩展名</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">(</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">默认为</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">: .jad)</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，通常都会把输出文件扩展名直接指定为</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">.java</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，以方便修改的重新编译。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-8<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>- </font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Unicode</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符转换为</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">ANSI</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符串，如果输出字符串是中文的话一定要加上这个参数才能正确显示。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最常用的反编译指令如下所示：</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Jad &#8211;d c:\javasource &#8211;s .java -8 javatest.class<o:p></o:p></font></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这条指令将当前目录下的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">javatest.class</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译为</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">javatest.java</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并保存在</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">c:\javasource</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录里，其中的提示输出为中文，而不是</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Unicode</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">二、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源码开放的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE<o:p></o:p></font></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是全球最大的开源项目网站</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Sourceforge.net</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的成员，不要以为源码开放就小瞧它，在所有的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译器中，</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的反编译效果是最好的，尤其是对付一些常见的加密手段，例如混淆技术等，更是出类拔粹。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身也是纯</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发的，最近越来越多的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译软件也选择</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来做它们的核心引擎，例如</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JCavaj Java Decompiler</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">BTJ (Back To Java)</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">jEdit's JavaInsight plugin</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个可运行的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAR</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，在</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">windows</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境下双击即可运行。</span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img src="http://www.360doc.com/DownloadImg/2633/488247_2.jpg"></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要特别说明的是，</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是通过常规的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Open-&gt;File</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式来加载</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译后的类文件（</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">*.class</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）或是类包（</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">*.jar</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）的，而是通过在</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Options</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">菜单中的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Set Classpath</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现的，单独的类文件可以将它的上一级目录作为</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Classpath</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输入，然后再选择</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Reload Classpath</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即可。</span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img src="http://www.360doc.com/DownloadImg/2633/488247_3.jpg">&nbsp;&nbsp; <img src="http://www.360doc.com/DownloadImg/2633/488247_4.jpg"></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">新加入的类包或是类的名字会在左侧窗口出现，双击类包名可以展开目录树结构，双击需要反编译的类名则在右上角的窗口中直接显示反编译后的源代码。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; mso-list: l0 level1 lfo1; tab-stops: list 21.0pt"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-family: 宋体"><span style="mso-list: Ignore"><font face="Times New Roman">三、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">独树一帜的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">DAVA<o:p></o:p></font></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">DAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是一个独立的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反编译器，而是</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码优化工具</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一部分。</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JODE</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一样是纯</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发的，也是一个独立的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAR</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包，但却不能通过双击直接运行，而是象</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一样在命令行状态运行。</span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p><img src="http://www.360doc.com/DownloadImg/2633/488247_5.jpg"></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对环境变量的配置要求非常严格，通常情况下要对</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">CLASSPATH</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做如下设置：</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Set CLASSPATH=%CLASSPATH%;c:\sootdir\sootclasses-<st1:chsdate ISROCDATE="False" ISLUNARDATE="False" DAY="30" MONTH="12" YEAR="1899" W:ST="on">2.1.0</st1:chsdate>.jar;.;<o:p></o:p></font></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">c:\sootdir\</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是下载的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类包放置的路径，</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">CLASSPATH</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">末尾的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">.;</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代表了当前目录，如果不加上这个的话</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">经常会报一个找不到类的错误。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是作为</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Soot</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个参数使用的，通常的用法如下：</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">Java soot.Main &#8211;f dava &#8211;d c:\javasource javatest<o:p></o:p></font></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意最后的类名不用带</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">.class</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后缀，因为它默认是处理</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">class</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，这个操作与前述的</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JAD</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的参数效果相同。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">DAVA</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采取了流程优化的方式进行反编译，与传统反编译思路不尽相同，但却对改变流程类的加密方法有独特的反编译效果。</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上述的三种工具各有千秋，但效果都非常不错。经测试，它们基本上都可以把</span><span lang=EN-US style="FONT-SIZE: 14pt"><font face="Times New Roman">JDK</font></span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自带的一些例程完全反编译，然后不加任何修改可再编译成功，并能正常运行！</span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（文中工具均经过本人亲手测试，当时用的是jdk1.4.2_03，现在离写文章的时候过了一年多了，jdk都出到1.5了，怕是有些程序也不太好反编了）</span></p>
<p class=MSONORMAL style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">/*原创作品，转载请注明出处*/</span></p>
</dir>
<img src ="http://www.blogjava.net/simie/aggbug/127512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:50 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Java应用程序中动态分配CPU资源</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127510.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127510.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127510.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127510.html</trackback:ping><description><![CDATA[<span class=font14 id=xydwtext>&nbsp;
<p>Java的线程调度操作在运行时是与平台无关的。一个多任务系统需要在任务之间实现QoS(Quality of Service)管理时，如果CPU资源的分配基于Java线程的优先级，那么它在不同平台上运行时的效果是很难预测的。本文利用协调式多任务模型，提出一个与平台无关、并且能在任务间动态分配CPU资源的方案。 <br>　　现在，由于计算机系统已经从人机交互逐步向机机交互转化，计算机和计算机之间的业务对于时间的要求非常高。软件系统对于业务的支持已经不仅表现为对不同业务的逻辑和数据(算法+数据结构)支持，而且还表现为对同时处理不同任务的时效性(任务响应速度)支持。一般，任务响应的速度可以通过算法优化及并行运算分担负载等手段来提高。但是，用户业务逻辑的复杂度决定了算法优化的发挥空间，硬件规模决定了所能够承担负载的大小。我们利用Java平台的特点，借鉴协调式多任务思想，使CPU资源能够在任务间动态分配，从而为时间要求强的任务分配更多的CPU运行资源。这也可以充分利用现有硬件，为用户业务提供最大的保障。</p>
<p><strong>　　用Java解决问题</strong></p>
<p>　　本着软件系统结构和现实系统结构一致的思想，开发复杂业务服务的程序一般按照计算机任务和现实业务对应的思路，最终形成一个大规模的多任务系统。由于其跨平台性，Java系统可以随着业务的扩大，平滑地升级到各种硬件平台上。由于Java自身的发展及其应用场合的不断扩大，用它实现多任务系统已经成为当前的应用方向。在J2EE(Java2 Enterprise Edition)推出以后，Sun公司已经将Java的重心放在了服务器端(Server Side)系统的构造上。由于客户/服务器模型固有的多对一的关系，服务器端程序也必然是一个多任务系统。</p>
<p>　　在Java多任务应用中，动态地将CPU资源在任务间分配有很重要的意义。比如一个Inte.Net服务商的系统往往有多种任务同时运行，有HTTP、FTP、MAIL等协议的支持，也有商务、娱乐、生活、咨询等业务的服务。在白天，网站希望系统的CPU资源尽量保障网上用户的服务质量，提高电子商务等任务的响应速度;晚上则希望让自己的娱乐服务和资料下载尽可能满足下班后人们的需要。另外，在新兴的网管(比如TMN， Telecommunication Management.Network)等应用领域中，服务程序往往需要支持成千上万个并发响应事件的被管理对象(MO，Managed Object)。对于被管理对象执行的操作，不同用户在不同时刻往往有不同的时间要求。</p>
<p>　<strong>　方案选择</strong></p>
<p>　　在考虑动态分配CPU资源的实施方案时，往往有以下两点要求：</p>
<p>　　1. 须充分利用现有硬件资源，在系统空闲时，让低优先级任务也能够得到系统所能给予的最快响应。</p>
<p>　　2.当硬件资源超负荷运行时，虽然系统中有大规模、多数量的任务不能处理，但它不应受影响，而能够顺利处理那些能够被处理的、最重要的高优先级任务。</p>
<p>　　多任务系统要用多线程实现的最简单方法就是将线程和任务一一对应，动态调整线程的优先级，利用线程调度来完成CPU资源在不同任务间动态分配。这种思路在以前使用本地化代码(Native Code)，充分利用特定硬件和操作系统技巧的基础上是基本可行的。但在跨平台的Java环境中，这个思路对仅有小规模任务数的简单系统才可行，原因有以下两点：</p>
<p>　　1. Java的线程虽然在编程角度(API)是与平台无关的，但它的运行效果却和不同操作系统平台密切相关。为了利用更多的CPU资源，Java中的一个线程(Thread)就对应着不同操作系统下的一个真实线程。因为Java虚拟机没有实现线程的调度，所以这些Java的线程在不同操作系统调度下运行的差异性也就比较明显。例如在Windows系统中，不仅线程的优先级少于Java API参数规定的十个优先级，而且微软明确反对程序员动态调整线程优先级。即使在操作系统中有足够的优先权，让线程优先级的参数和真实线程的优先级对应，不同操作系统的调度方式也会有许多不同。这最终会造成代码在不同平台上的行为变得不可预测。这就很难满足复杂的、大规模并发任务的众多优先级需求，从而很难达到用户业务需要达到的效果。</p>
<p>　　2. 由于在Java系统中，线程被包装在一个Java语言的对象类—Thread中，所以为了完成Java语言对象和操作系统线程的对应，Java线程的系统开销还是比较大的(在NT 4.0中，平均每个线程大致占用30KB内存)。因此如果让Thread对象个数和成千上万的任务数同比例增长，就显然是不合理的。</p>
<p>　　综上所述，根据并发多任务的大规模需求和Java平台固有的特点，想要利用Java Thread对象的优先级调整CPU资源的分配是非常困难的，所以应该尽量避免让线程和任务直接对应，也尽量避免使用操作系统线程优先级的调度机制。</p>
<p>　<strong>　解决方案</strong></p>
<p>　　根据以上分析，问题的症结在于：多任务系统中的任务在Java语言中的对应以及任务间的相互调度。</p>
<p>　　从本质上看，一个任务就是一系列对象方法的调用序列，与Java的Thread对象或者别的类的对象没有必然联系。在避免使用不同操作系统线程调度且同时Java虚拟机又没有线程调度能力的情况下，要想构造一个协调式多任务系统，让各个任务相互配合就成了最直接的思路。协调式多任务系统一般有以下特点：</p>
<p>　　1. 任务由消息驱动，消息的响应代码完成任务逻辑的处理;</p>
<p>　　2. 消息队列完成消息的存储和管理，从而利用消息处理的次序体现任务优先级的不同;</p>
<p>　　3. 任务中耗时的消息响应逻辑能够主动放弃CPU资源，让别的任务执行(像Windows 3.1中的Yield函数、Visual Basic中的DoEvents语句)。</p>
<p>　　可能出于巧合，Java语言具有构造协调式多任务系统天然的条件。Java对象的方法不仅是一个函数调用，它还是一个Java.lang.reflect.Method类的对象。而所有对象的方法都可以通过Method类的invoke方法调用。如果能使每个任务所对应的一系列方法全部以对象形式包装成消息，放到消息队列中，然后再按照自己的优先级算法将队列中的消息取出，执行其Method对象的invoke调用，那么一个基本的协调式多任务系统就形成了。其中，任务的优先级和线程的优先级没有绑定关系。该系统的主体调度函数可以设置成一个&#8220;死循环&#8221;，按照需要的优先级算法处理消息队列。对于有多重循环、外设等待等耗时操作的消息响应函数，可以在响应函数内部递归调用主体调度函数,这一次调用把原来的&#8220;死循环&#8221;改成在消息队列长度减少到一定程度(或者为空)后退出。退出后，函数返回，执行刚才没有完成的消息响应逻辑，这样就非常自然地实现了协调式系统中任务主动放弃CPU资源的要求。</p>
<p>　　如果仅仅做到这一步，完成一个像Windows 3.1中的多任务系统，实际只用了一个线程，没有利用Java多线程的特点。应该注意到，虽然Java系统中线程调度与平台相关，但是相同优先级的线程之间分时运行的特点基本上是不受特定平台影响的。各个相同优先级的线程共享CPU资源，而线程又被映射成了Java语言中的Thread对象。这些对象就可以被认为是CPU资源的代表。Thread与线程执行代码主体的接口—Runnable之间是多对一的关系。一个Runnable可以被多个Thread执行。只要将Runnable的执行代码设置成上述的消息调度函数，并和消息队列对应上，那么就可以通过控制为它服务的Thread个数来决定消息队列执行的快慢，并且在运行时可以动态地新增(new)和退出Thread对象。这样就能任意调整不同消息队列在执行时所占用CPU资源的多少。至此，任何一个Java调用都可以在Thread个数不同的消息队列中选择，并可以调整这些消息队列服务的Thread个数，从而实现在运行时调整任务所占用的CPU资源。</p>
<p>　　纵观整个方案，由于仅仅基于Java语言固有的Method对象，不同任务间动态分配CPU资源并没有对任务的性质及其处理流程有任何限制，那么在消息队列中没有高优先级消息时，低优先级消息的处理函数自然会全部占用CPU资源。在不同消息队列处理速度任意设置时，并没有将特定的消息限制在快的或者慢的消息队列上。如果系统的负荷超出(比如消息队列长度超过一定限制)，只要将队列中低优先级消息换出或者拒绝不能处理的消息进入，那么系统的运行就可以基本上不受负荷压力的影响，从而最大保障用户的关键业务需求。</p>
<p>　　当然，协调式多任务的思想也有其局限性，主要就是它的调度粒度比较大。系统能够保证的粒度是一次消息处理过程。如果消息处理逻辑非常费时，那么编程人员就必须再处理函数内部，让系统主动让出CPU资源。这虽然需要在处理消息响应逻辑时增加一个考虑因素，但是，在Windows系统盛行的今天，这是一个已经被普遍接受的思路。由于方案中并没有局限为消息队列服务的线程数目，所以一个长时间的消息响应只会影响一个线程，而不会对整个系统产生致命的影响。除了调度粒度的问题以外，还有访问消息队列操作在各个线程间互斥的问题。取出消息的过程是串行化的，因此对于这一瓶颈的解决方案就是：假设取出一条消息的操作相对于处理消息的消耗可以忽略不计，那么对于多次调用且仅有两三行响应逻辑的消息，编程人员通过函数调用就可以直接执行。</p>
<p>　　前面比较详细地阐述了多任务系统中任务的划分以及执行等内容。虽然这些是一个系统的核心，但是在一个实用的系统中，还需要任务间的同步、互斥等机制。在上述框架内，互斥可以简单地用Java的Synchronized机制实现。由于任务可以主动让出执行权限，要实现等待(Wait任务中止)和通知(Notify任务继续)，从而实现任务同步也就比较容易了。</p>
</span>
<img src ="http://www.blogjava.net/simie/aggbug/127510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:48 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>