﻿<?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-SIMONE-随笔分类-JAVA</title><link>http://www.blogjava.net/wangxinsh55/category/9223.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 05 Apr 2008 04:36:59 GMT</lastBuildDate><pubDate>Sat, 05 Apr 2008 04:36:59 GMT</pubDate><ttl>60</ttl><item><title>关于JavaScript的gzip静态压缩方法 </title><link>http://www.blogjava.net/wangxinsh55/archive/2008/04/03/190693.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 03 Apr 2008 11:57:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2008/04/03/190693.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/190693.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2008/04/03/190693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/190693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/190693.html</trackback:ping><description><![CDATA[<p>传统的JS压缩(删除注释,删除多余空格等)提供的压缩率有时还是不尽不意,幸亏现在的浏览器都支持压缩传输(通过设置http header的Content-Encoding=gzip),可以通过服务器的配置(如apache)为你的js提供压缩传输,或是appfuse中使用的GZipFilter使tomcat也提供这种能力</p>
<p>现在的问题是这种动态的压缩会导致CPU占用率过高,现在我想到的解决辨法是通过提供静态压缩(就是将js预先通过gzip.exe压缩好)</p>
<p>一.下面描述在tomcat中的应用</p>
<p>1.将prototype.js通过gzip.exe压缩保存成prototype.gzjs<br />
2.设置header,我编写了一个简单的AddHeadersFilter来将所有以gzjs结尾的文件增加设置header Content-Encoding=gzip<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;web.xml中的配置<br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AddHeaderFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;badqiu.web.filter.AddHeaderFilter<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">headers</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Content-Encoding=gzip</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AddHeaderFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.gzjs</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span></div>
<p>测试prototype是否正常的代码 </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;type="text/javascript"不可少,有些浏览器缺少这个不能运行,具体已经忘记了&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">script&nbsp;</span><span style="color: #ff0000">src</span><span style="color: #0000ff">="prototype.gzjs"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="text/javascript"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="username"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="username"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="badqiu"</span><span style="color: #0000ff">/&gt;&lt;</span><span style="color: #800000">br&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="email"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="badqiu@gmail.com"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000; background-color: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">&lt;!--</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;测试prototype的方法是否正常</span><span style="color: #000000; background-color: #f5f5f5">--&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000; background-color: #f5f5f5">&nbsp;&nbsp;&nbsp;&nbsp;alert($F('username'))<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
在Apache httpd中可以直接通过在httpd.conf增加AddEncoding x-gzip .gzjs来映射.gzjs文件的header</p>
<p>二.相关压缩率数据<br />
1. prototype.js 1.5.0_rc0原始大小56KB,未经任何处理直接使用gzip压缩为12KB,总压缩率79%<br />
2. 通过js压缩工具压缩过的protytype.js为20KB,使用gzip压缩为10KB,总压缩率为83%<br />
3. 实际项目中的多个js合并成的文件 439KB,直接通过gzip压缩为85KB,总压缩率81%<br />
4. 439KB经过js压缩为165KB,再经过gzip压缩为65KB,总压缩率86%<br />
基本上你都可以忽略js压缩工具的压缩率,直接使用gzip压缩</p>
<p>gzip下载地址 <a href="http://www.gzip.org/">http://www.gzip.org</a><br />
tomcat的压缩配置示例下载地址: <span class="nobr"><strong><font color="#003366"><a href="http://www.blogjava.net/Files/badqiu/gziptest.rar">http://www.blogjava.net/Files/badqiu/gziptest.rar</a><br />
</font></strong></span></p>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/190693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2008-04-03 19:57 <a href="http://www.blogjava.net/wangxinsh55/archive/2008/04/03/190693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Ext的Js太大的问题研究解决</title><link>http://www.blogjava.net/wangxinsh55/archive/2008/04/03/190691.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 03 Apr 2008 11:51:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2008/04/03/190691.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/190691.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2008/04/03/190691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/190691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/190691.html</trackback:ping><description><![CDATA[久别大家一年了，其实这一年我从简单实现了一个Yui-Ext0.33项目后，基本没有在Ajax表现层花太多的时间，而是转向研究Jbpm和WebService在项目中的应用，而且大半年前Ext推出1.0版本，感觉在项目中升级使用还不够成熟，所以在项目中继续应用小巧的0.33版，基本满足需要。 <br />
<br />
由于现在项目越来越大，而且Ext2已经推出，界面实在充满诱惑，相信商业化的Ext2将更适合项目开发，所以现在对Ext2一些关键问题进行研究，首当其冲要解决的就是ext-all.js(512K)太大的问题。 <br />
<br />
针对js包太大的问题，有两个现在比较流行的解决方案： <br />
1. 使用jsbuild等工具把需要调用的js重新包装，此方法的缺点是Ext用的最多的是form和grid等控件，删减后包容量减少不明显，而且我是打包了几次失败，就没耐心了，当然，要做到最好调优，这个方案是要考虑的，基本方法就是页面调用核心的ext-core.js，然后再把页面要用的包自己包装。 <br />
<br />
2. 使用gzip在服务器端牺牲一点cpu资源进行压缩，有效减低传输流量，由浏览器解压处理后执行。这个解决方案另我眼前一亮，其实也不是什么新东西，2005年的老东西了，只是当时没有想到js会如此庞大，但现在老技术还是很实用的。下面将重点研究这个解决方案。 <br />
<br />
第一步，在web.xml增加一个gzipfilter，不用自己写，有现成的，到地址：<a href="http://sourceforge.net/projects/filterlib" target="_blank">http://sourceforge.net/projects/filterlib</a>下载，新建一个测试项目，最简单就在index.jsp直接调用ext-all.js，把tk-filters.jar拷贝到项目的lib目录，然后在web.xml加入： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/post/490653#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;filter&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;CompressingFilter&lt;/filter-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-</span><span class="keyword">class</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.tacitknowledge.filters.gzipfilter.GZIPFilter &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/filter-</span><span class="keyword">class</span><span>&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;/filter&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;这里按自己许多针对不同文件进行filter-mapping配置，比如*.css&nbsp;--&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;filter-mapping&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;CompressingFilter&lt;/filter-name&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.js&lt;/url-pattern&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&lt;/filter-mapping&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">	&lt;filter&gt;
&lt;filter-name&gt;CompressingFilter&lt;/filter-name&gt;
&lt;filter-class&gt;
com.tacitknowledge.filters.gzipfilter.GZIPFilter
&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;!-- 这里按自己许多针对不同文件进行filter-mapping配置，比如*.css --&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;CompressingFilter&lt;/filter-name&gt;
&lt;url-pattern&gt;*.js&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
<br />
<br />
第二步，调试，调试js现在发现最好的工具应该是FireFox+firebug(插件),FireFox我用1.5版本，调试足够了，我使用Weblogic作调试服务器，tomcat也可以，但我的tomcat在server.xml直接配置gzip压缩功能，所以用weblogic免得测试不出来。启动项目后，用Firefox打开index.jsp页面，页面调出后可能会有脚本错误，但可以不管，关键看文件的大小，打开工具-&gt;firebug-&gt;open firebug,寻找net项，即可看到调用的ext-all.js的压缩效果，如附图的比较，效果不错吧，512K =&gt; 137K，如果发现js压缩没效果，注意打开工具-&gt;清除私隐数据，清掉可能存在的cache，再刷新页面重试。 <br />
<br />
第三步，压力测试，我使用loadrunner7.8测试，简单实用，没有8.0以上版本的华丽和慢。使用1000个进程测试，发现了意外的结果(见附图)，在本机测试，不用gzip压缩只用了36秒，而使用gzip压缩后则是1分49秒，流量在压缩后从1,315,914,600降到313，125，680，流量随着文件的压缩而减少，效果也很明显，查其原因，应该是因为压缩和解压对服务器和浏览器的资源消耗，而且是在本机测试，本机排除了带宽的影响，所以压缩前性能反而高了。 <br />
<br />
由于我研究的时间不长，在压力测试方面还没在实际项目中测试，不能一概而论，初步分析，如果是局域网项目，带宽不受限制，不使用压缩性能会好点，而对于互联网环境则要考虑压缩方案，也希望有兴趣的开发者共同研究一下这个解决方案在实际项目中的可行性，希望大家讨论。
<div class="attachments">
<ul>
    <li><a href="http://www.javaeye.com/topics/download/37a8d707-44d1-369f-b393-0564db55c4a4" target="_blank"><img class="magplus" title="点击查看原始大小图片" alt="37a8d707-44d1-369f-b393-0564db55c4a4-thumb" src="http://www.javaeye.com/upload/attachment/17020/37a8d707-44d1-369f-b393-0564db55c4a4-thumb.jpg?1205438818" /></a>
    <li>描述:
    <li>大小: 50.7 KB
    <li>查看次数: 58 </li>
</ul>
<ul>
    <li><a href="http://www.javaeye.com/topics/download/73e56e32-afb4-33a5-82bc-5bfaa57aa328" target="_blank"><img class="magplus" title="点击查看原始大小图片" alt="73e56e32-afb4-33a5-82bc-5bfaa57aa328-thumb" src="http://www.javaeye.com/upload/attachment/17022/73e56e32-afb4-33a5-82bc-5bfaa57aa328-thumb.jpg?1205438819" /></a>
    <li>描述:
    <li>大小: 76.8 KB
    <li>查看次数: 36 </li>
</ul>
<ul>
    <li><a href="http://www.javaeye.com/topics/download/1d6c71a8-0f87-351e-9a37-2bd5a292264c" target="_blank"><img class="magplus" title="点击查看原始大小图片" alt="1d6c71a8-0f87-351e-9a37-2bd5a292264c-thumb" src="http://www.javaeye.com/upload/attachment/17024/1d6c71a8-0f87-351e-9a37-2bd5a292264c-thumb.jpg?1205438819" /></a>
    <li>描述:
    <li>大小: 75.5 KB
    <li>查看次数: 26 </li>
</ul>
</div>
<div id="topic_copyright">&nbsp;</div>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/190691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2008-04-03 19:51 <a href="http://www.blogjava.net/wangxinsh55/archive/2008/04/03/190691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中文件下载的实现</title><link>http://www.blogjava.net/wangxinsh55/archive/2008/01/17/176006.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 17 Jan 2008 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2008/01/17/176006.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/176006.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2008/01/17/176006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/176006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/176006.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsp中实现文件下载的最简单的方式是在网页上做超级链接，如：&lt;a href="music/abc.mp3"&gt;点击下载&lt;/a&gt;。但是这样服务器上的目录资源会直接暴露给最终用户，会给网站带来一些不安全的因素。因此可以采用其它方式实现下载，可以采用：1、RequestDispatcher的方式进行；2、采用文件流输出的方式下载。</p>
<p>1、采用RequestDispatcher的方式进行</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsp页面中添加如下代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("application/x-download");//设置为下载application/x-download<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filedownload = "/要下载的文件名";//即将下载的文件的相对路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestDispatcher dis = application.getRequestDispatcher(filedownload);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dis!= null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis.forward(request,response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.flushBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
%&gt;</p>
<p>2、采用文件流输出的方式下载</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%@page language="java" contentType="application/x-msdownload"&nbsp;&nbsp;&nbsp; pageEncoding="gb2312"%&gt;&lt;%<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //关于文件下载时采用文件流输出的方式处理：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="color: red">加上response.reset()，并且<strong><em>所有的％&gt;后面不要换行，包括最后一个</em></strong>；<br />
</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.reset();//可以加也可以不加<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setContentType("application/x-download");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filedownload = "想办法找到要提供下载的文件的物理路径＋文件名";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filedisplay = "给用户提供的下载文件名";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filedisplay = URLEncoder.encode(filedisplay,"UTF-8");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream outp = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream in = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp = response.getOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in = new FileInputStream(filenamedownload);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] b = new byte[1024];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((i = in.read(b)) &gt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp.write(b, 0, i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Error!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(in != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(outp != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outp = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
%&gt;<br />
<br />
在wsad里面写JSP文件下载,总是出现这个异常,getOutputStream() has already been called for this response,输出流已经被调用了. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;上网查半天终于明白一点,JSP早下载文件的时候用到了OutputStream,而在Application Server在处理编译jsp时对于％&gt;和&lt;％之间的内容一般是原样输出，而且默认是PrintWriter.</p>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/176006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2008-01-17 17:10 <a href="http://www.blogjava.net/wangxinsh55/archive/2008/01/17/176006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java SE 6 新特性: 对脚本语言的支持</title><link>http://www.blogjava.net/wangxinsh55/archive/2007/10/08/150973.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Mon, 08 Oct 2007 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2007/10/08/150973.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/150973.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2007/10/08/150973.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/150973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/150973.html</trackback:ping><description><![CDATA[<blockquote>
<p>2006 年底，Sun 公司发布了 Java Standard Edition 6（Java SE 6）的最终正式版，代号 Mustang（野马）。跟 Tiger（Java SE 5）相比，Mustang 在性能方面有了不错的提升。与 Tiger 在 API 库方面的大幅度加强相比，虽然 Mustang 在 API 库方面的新特性显得不太多，但是也提供了许多实用和方便的功能：在脚本，WebService，XML，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse64/index.html">编译器 API</a>，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse65/index.html">数据库</a>，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse63/index.html">JMX</a>，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse62/index.html">网络</a> 和 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse61/index.html">Instrumentation</a> 方面都有不错的新特性和功能加强。 </p>
<p><a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse6/"><em>本系列</em> </a>文章主要介绍 Java SE 6 在 API 库方面的部分新特性，通过一些例子和讲解，帮助开发者在编程实践当中更好的运用 Java SE 6，提高开发效率。本文是系列文章的第 6 篇，介绍了 Java SE 6 在脚本编程方面的新特性。</p>
</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name="N10076"><span class="atitle">Java 脚本 API 概述</span></a></p>
<table cellspacing="0" cellpadding="0" width="300" align="right" border="0">
    <tbody>
        <tr>
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tbody>
                    <tr>
                        <td bgcolor="#eeeeee"><a name="N1007F"><strong>脚本引擎</strong></a><br />
                        脚本引擎就是指脚本的运行环境，它能能够把运行其上的解释性语言转换为更底层的汇编语言，没有脚本引擎，脚本就无法被运行。</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p>Java SE 6 引入了对 Java Specification Request（JSR）233 的支持，<a href="http://www.jcp.org/en/jsr/detail?id=223">JSR 233</a> 旨在定义一个统一的规范，使得 Java 应用程序可以通过一套固定的接口与各种脚本引擎交互，从而达到在 Java 平台上调用各种脚本语言的目的。<code>javax.script</code> 包定义了这些接口，即 Java 脚本编程 API。Java 脚本 API 的目标与 Apache 项目 Bean Script Framework（BSF）类似，通过它 Java 应用程序就能通过虚拟机调用各种脚本，同时，脚本语言也能访问应用程序中的 Java 对象和方法。Java 脚本 API 是连通 Java 平台和脚本语言的桥梁。首先，通过它为数众多的现有 Java 库就能被各种脚本语言所利用，节省了开发成本缩短了开发周期；其次，可以把一些复杂异变的业务逻辑交给脚本语言处理，这又大大提高了开发效率。</p>
<p>在 <code>javax.script</code> 包中定义的实现类并不多，主要是一些接口和对应的抽象类，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#fig001">图 1</a> 显示了其中包含的各个接口和类。</p>
<br />
<a name="fig001"><strong>图 1. javax.script 包概况</strong></a><br />
<img alt="图 1. javax.script 包概况" src="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/fig001.jpg" /> <br />
<p>这个包的具体实现类少的根本原因是这个包只是定义了一个编程接口的框架规范，至于对如何解析运行具体的脚本语言，还需要由第三方提供实现。虽然这些脚本引擎的实现各不相同，但是对于 Java 脚本 API 的使用者来说，这些具体的实现被很好的隔离隐藏了。Java 脚本 API 为开发者提供了如下功能：</p>
<ol>
    <li>获取脚本程序输入，通过脚本引擎运行脚本并返回运行结果，这是最核心的接口。
    <li>发现脚本引擎，查询脚本引擎信息。
    <li>通过脚本引擎的运行上下文在脚本和 Java 平台间交换数据。
    <li>通过 Java 应用程序调用脚本函数。 </li>
</ol>
<p>在详细介绍这四个功能之前，我们先通过一个简单的例子来展示如何通过 Java 语言来运行脚本程序，这里仍然以经典的&#8220;Hello World&#8221;开始。</p>
<br />
<a name="listing1"><strong>清单 1. Hello World</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            import javax.script.*;
            public class HelloWorld {
            public static void main(String[] args) throws ScriptException {
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("JavaScript");
            engine.eval("print ('Hello World')");
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>这个例子非常直观，只要通过 <code>ScriptEngineManager</code> 和 <code>ScriptEngine</code> 这两个类就可以完成最简单的调用。首先，<code>ScriptEngineManager</code> 实例创建一个 <code>ScriptEngine</code> 实例，然后返回的 <code>ScriptEngine</code> 实例解析 JavaScript 脚本，输出运行结果。运行这段程序，终端上会输出&#8220;Hello World&#8220;。在执行 <code>eval</code> 函数的过程中可能会有 <code>ScriptEngine</code> 异常抛出，引发这个异常被抛出的原因一般是由脚本输入语法有误造成的。在对整个 API 有了大致的概念之后，我们就可以开始介绍各个具体的功能了。</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="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N100E6"><span class="atitle">使用脚本引擎运行脚本</span></a></p>
<p>Java 脚本 API 通过脚本引擎来运行脚本，整个包的目的就在于统一 Java 平台与各种脚本引擎的交互方式，制定一个标准，Java 应用程序依照这种标准就能自由的调用各种脚本引擎，而脚本引擎按照这种标准实现，就能被 Java 平台支持。每一个脚本引擎就是一个脚本解释器，负责运行脚本，获取运行结果。<code>ScriptEngine</code> 接口是脚本引擎在 Java 平台上的抽象，Java 应用程序通过这个接口调用脚本引擎运行脚本程序，并将运行结果返回给虚拟机。</p>
<p><code>ScriptEngine</code> 接口提供了许多 <code>eval</code> 函数的变体用来运行脚本，这个函数的功能就是获取脚本输入，运行脚本，最后返回输出。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#listing1">清单 1</a> 的例子中直接通过字符串作为 <code>eval</code> 函数的参数读入脚本程序。除此之外，<code>ScriptEngine</code> 还提供了以一个 <code>java.io.Reader</code> 作为输入参数的 <code>eval</code> 函数。脚本程序实质上是一些可以用脚本引擎执行的字节流，通过一个 <code>Reader</code> 对象，<code>eval</code> 函数就能从不同的数据源中读取字节流来运行，这个数据源可以来自内存、文件，甚至直接来自网络。这样 Java 应用程序就能直接利用项目原有的脚本资源，无需以 Java 语言对其进行重写，达到脚本程序与 Java 平台无缝集成的目的。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#listing2">清单 2</a> 即展示了如何从一个文件中读取脚本程序并运行，其中如何通过 <code>ScriptEngineManager</code> 获取 <code>ScriptEngine</code> 实例的细节会在后面详细介绍。</p>
<br />
<a name="listing2"><strong>清单 2. Run Script</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            public class RunScript {
            public static void main(String[] args) throws Exception {
            String script = args[0];
            String file = args[1];
            FileReader scriptReader = new FileReader(new File(file));
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName(script);
            engine.eval(scriptReader);
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#listing2">清单 2</a> 代码，从命令行分别获取脚本名称和脚本文件名，程序通过脚本名称创建对应的脚本引擎实例，通过脚本名称指定的脚本文件名读入脚本程序运行。运行下面这个命令，就能在 Java 平台上运行所有的 JavaScript 脚本。</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">java RunScript javascript run.js
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>通过这种方式，Java 应用程序可以把一些复杂易变的逻辑过程，用更加灵活的弱类型的脚本语言来实现，然后通过 <code>javax.Script</code> 包提供的 API 获取运行结果，当脚本改变时，只需替换对应的脚本文件，而无需重新编译构建项目，好处是显而易见的，即节省了开发时间又提高了开发效率。</p>
<p><code>EngineScript</code> 接口分别针对 <code>String</code> 输入和 <code>Reader</code> 输入提供了三个不同形态的 <code>eval</code> 函数，用于运行脚本：</p>
<br />
<a name="table1"><strong>表 1. ScriptEngine 的 eval 函数</strong></a><br />
<table class="data-table-1" cellspacing="0" cellpadding="0" width="90%" summary="ScriptEngine 的 eval 函数" border="0">
    <tbody>
        <tr>
            <th>函数</th>
            <th>描述</th>
        </tr>
        <tr>
            <td><code>Object eval(Reader reader)</code> </td>
            <td>从一个 <code>Reader</code> 读取脚本程序并运行</td>
        </tr>
        <tr>
            <td><code>Object eval(Reader reader, Bindings n)</code> </td>
            <td>以 <code>n</code> 作为脚本级别的绑定，从一个 <code>Reader</code> 读取脚本程序并运行</td>
        </tr>
        <tr>
            <td><code>Object eval(Reader reader, ScriptContext context)</code> </td>
            <td>在 <code>context</code> 指定的上下文环境下，从一个 <code>Reader</code> 读取脚本程序并运行</td>
        </tr>
        <tr>
            <td><code>Object eval(String script)</code> </td>
            <td>运行字符串表示的脚本</td>
        </tr>
        <tr>
            <td><code>Object eval(String script, Bindings n)</code> </td>
            <td>以 <code>n</code> 作为脚本级别的绑定，运行字符串表示的脚本</td>
        </tr>
        <tr>
            <td><code>Object eval(String script, ScriptContext context)</code> </td>
            <td>在 <code>context</code> 指定的上下文环境下，运行字符串表示的脚本</td>
        </tr>
    </tbody>
</table>
<p>Java 脚本 API 还为 <code>ScriptEngine</code> 接口提供了一个抽象类 —— <code>AbstractScriptEngine</code>，这个类提供了其中四个 <code>eval</code> 函数的默认实现，它们分别通过调用 <code>eval(Reader,ScriptContext)</code> 或 <code>eval(String, ScriptContext)</code> 来实现。这样脚本引擎提供者，只需继承这个抽象类并提供这两个函数实现即可。<code>AbstractScriptEngine</code> 有一个保护域 <code>context</code> 用于保存默认上下文的引用，<code>SimpleScriptContext</code> 类被作为 <code>AbstractScriptEngine</code> 的默认上下文。关于上下文环境，将在后面进行详细介绍。</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="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N101FE"><span class="atitle">发现和创建脚本引擎</span></a></p>
<p>在前面的两个例子中，<code>ScriptEngine</code> 实例都是通过调用 <code>ScriptEngineManager</code> 实例的方法返回的，而不是常见的直接通过 <code>new</code> 操作新建一个实例。JSR 233 中引入 <code>ScriptEngineManager</code> 类的意义就在于，将 <code>ScriptEngine</code> 的寻找和创建任务委托给 <code>ScriptEngineManager</code> 实例处理，达到对 API 使用者隐藏这个过程的目的，使 Java 应用程序在无需重新编译的情况下，支持脚本引擎的动态替换。通过 <code>ScriptEngineManager</code> 类和 <code>ScriptEngineFactory</code> 接口即可完成脚本引擎的发现和创建：</p>
<ul>
    <li><strong><code>ScriptEngineManager</code> 类：</strong>自动寻找 <code>ScriptEngineFactory</code> 接口的实现类
    <li><strong><code>ScriptEngineFactory</code> 接口：</strong>创建合适的脚本引擎实例 </li>
</ul>
<table cellspacing="0" cellpadding="0" width="300" align="right" border="0">
    <tbody>
        <tr>
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="5" width="100%" border="1">
                <tbody>
                    <tr>
                        <td bgcolor="#eeeeee"><a name="N10245"><strong>Service Provider</strong></a><br />
                        服务（service）是指那些成为事实上标准的接口，服务提供者（service provider）则提供了这个接口的具体实现。不同的提供者会遵循同样的接口提供实现，客户可以自由选择不同的实现。可以从 Sun 提供的文档 <a href="http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Service%20Provider">Jar 文件规约</a> 中获取有关 Service Provider 更详细的信息。 </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p><code>ScriptEngineManager</code> 类本身并不知道如何创建一个具体的脚本引擎实例，它会依照 Jar 规约中定义的服务发现机制，查找并创建一个合适的 <code>ScriptEngineFactory</code> 实例，并通过这个工厂类来创建返回实际的脚本引擎。首先，<code>ScriptEngineManager</code> 实例会在当前 classpath 中搜索所有可见的 Jar 包；然后，它会查看每个 Jar 包中的 META -INF/services/ 目录下的是否包含 <code>javax.script.ScriptEngineFactory</code> 文件，脚本引擎的开发者会提供在 Jar 包中包含一个 <code>ScriptEngineFactory</code> 接口的实现类，这个文件内容即是这个实现类的完整名字；<code>ScriptEngineManager</code> 会根据这个类名，创建一个 <code>ScriptEngineFactory</code> 接口的实例；最后，通过这个工厂类来实例化需要的脚本引擎，返回给用户。举例来说，第三方的引擎提供者可能升级更新了新版的脚本引擎实现，通过 <code>ScriptEngineManager</code> 来管理脚本引擎，无需修改一行 Java 代码就能替换更新脚本引擎。用户只需在 classpath 中加入新的脚本引擎实现（Jar 包的形式），<code>ScriptEngineManager</code> 就能通过 Service Provider 机制来自动查找到新版本实现，创建并返回对应的脚本引擎实例供调用。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#fig002">图 2</a> 所示时序图描述了其中的步骤：</p>
<br />
<a name="fig002"><strong>图 2. 脚本引擎发现机制时序图</strong></a><br />
<img alt="图 2. 脚本引擎发现机制时序图" src="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/fig002.jpg" /> <br />
<p><code>ScriptEngineFactory</code> 接口的实现类被用来描述和实例化 <code>ScriptEngine</code> 接口，每一个实现 <code>ScriptEngine</code> 接口的类会有一个对应的工厂类来描述其元数据（meta data），<code>ScriptEngineFactory</code> 接口定义了许多函数供 <code>ScriptEngineManager</code> 查询这些元数据，<code>ScriptEngineManager</code> 会根据这些元数据查找需要的脚本引擎，<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#table2">表 2 </a>列出了可供使用的函数：</p>
<br />
<a name="table2"><strong>表 2. ScriptEngineFactory 提供的查询函数</strong></a><br />
<table class="data-table-1" cellspacing="0" cellpadding="0" width="100%" summary="ScriptEngineFactory 提供的查询函数" border="0">
    <tbody>
        <tr>
            <th>函数</th>
            <th>描述</th>
        </tr>
        <tr>
            <td><code>String getEngineName()</code> </td>
            <td>返回脚本引擎的全称</td>
        </tr>
        <tr>
            <td><code>String getEngineVersion()</code> </td>
            <td>返回脚本引擎的版本信息</td>
        </tr>
        <tr>
            <td><code>String getLanguageName()</code> </td>
            <td>返回脚本引擎所支持的脚本语言的名称</td>
        </tr>
        <tr>
            <td><code>String getLanguageVersion()</code> </td>
            <td>返回脚本引擎所支持的脚本语言的版本信息</td>
        </tr>
        <tr>
            <td><code>List&lt;String&gt; getExtensions()</code> </td>
            <td>返回一个脚本文件扩展名组成的 List，当前脚本引擎支持解析这些扩展名对应的脚本文件</td>
        </tr>
        <tr>
            <td><code>List&lt;String&gt; getMimeTypes()</code> </td>
            <td>返回一个与当前引擎关联的所有 mimetype 组成的 List</td>
        </tr>
        <tr>
            <td><code>List&lt;String&gt; getNames()</code> </td>
            <td>返回一个当前引擎所有名称的 List，<code>ScriptEngineManager</code> 可以根据这些名字确定对应的脚本引擎</td>
        </tr>
    </tbody>
</table>
<p>通过 <code>getEngineFactories()</code> 函数，<code>ScriptEngineManager</code> 会返回一个包含当前环境中被发现的所有实现 <code>ScriptEngineFactory</code> 接口的具体类，通过这些工厂类中保存的脚本引擎信息检索需要的脚本引擎。第三方提供的脚本引擎实现的 Jar 包中除了包含 <code>ScriptEngine</code> 接口的实现类之外，还需要提供 <code>ScriptEngineFactory</code> 接口的实现类，以及一个 <code>javax.script.ScriptEngineFactory</code> 文件用于指明这个工厂类。这样，Java 平台就能通过 <code>ScriptEngineManager</code> 寻找到这个工厂类，并通过这个工厂类为用户提供一个脚本引擎实例。Java SE 6 默认提供了 JavaScirpt 脚本引擎的实现，如果需要支持其他脚本引擎，需要将它们对应的 Jar 包包含在 classpath 中，比如对于前面 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#listing2">清单 2</a> 中的代码，只需在运行程序前将 Groovy 的脚本引擎添加到 classpath 中，然后运行：</p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">java RunScript groovy run.groovy
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>无需修改一行 Java 代码就能以 Groovy 脚本引擎来运行 Groovy 脚本。在 <a href="https://scripting.dev.java.net/">这里</a> 为 Java SE 6 提供了许多著名脚本语言的脚本引擎对 JSR 233 的支持，这些 Jar 必须和脚本引擎配合使用，使得这些脚本语言能被 Java 平台支持。到目前为止，它提供了至少 25 种脚本语言的支持，其中包括了 Groovy、Ruby、Python 等当前非常流行的脚本语言。这里需要再次强调的是，负责创建 <code>ScriptEngine</code> 实例的 <code>ScriptEngineFactory</code> 实现类对于用户来说是不可见的，<code>ScriptEngingeManager</code> 实现负责与其交互，通过它创建脚本引擎。</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="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10357"><span class="atitle">脚本引擎的运行上下文</span></a></p>
<p>如果仅仅是通过脚本引擎运行脚本的话，还无法体现出 Java 脚本 API 的优点，在 JSR 233 中，还为所有的脚本引擎定义了一个简洁的执行环境。我们都知道，在 Linux 操作系统中可以维护许多环境变量比如 classpath、path 等，不同的 shell 在运行时可以直接使用这些环境变量，它们构成了 shell 脚本的执行环境。在 <code>javax.script</code> 支持的每个脚本引擎也有各自对应的执行的环境，脚本引擎可以共享同样的环境，也可以有各自不同的上下文。通过脚本运行时的上下文，脚本程序就能自由的和 Java 平台交互，并充分利用已有的众多 Java API，真正的站在&#8220;巨人&#8221;的肩膀上。<code>javax.script.ScriptContext</code> 接口和 <code>javax.script.Bindings</code> 接口定义了脚本引擎的上下文。</p>
<ul>
    <li><strong>Bindings 接口：</strong>
    <p>继承自 Map，定义了对这些&#8220;键-值&#8221;对的查询、添加、删除等 Map 典型操作。<code>Bingdings</code> 接口实际上是一个存放数据的容器，它的实现类会维护许多&#8220;键-值&#8221;对，它们都通过字符串表示。Java 应用程序和脚本程序通过这些&#8220;键-值&#8221;对交换数据。只要脚本引擎支持，用户还能直接在 <code>Bindings</code> 中放置 Java 对象，脚本引擎通过 <code>Bindings</code> 不仅可以存取对象的属性，还能调用 Java 对象的方法，这种双向自由的沟通使得二者真正的结合在了一起。</p>
    <li><strong>ScriptContext 接口：</strong>
    <p>将 <code>Bindings</code> 和 <code>ScriptEngine</code> 联系在了一起，每一个 <code>ScriptEngine</code> 都有一个对应的 <code>ScriptContext</code>，前面提到过通过 <code>ScriptEnginFactory</code> 创建脚本引擎除了达到隐藏实现的目的外，还负责为脚本引擎设置合适的上下文。<code>ScriptEngine</code> 通过 <code>ScriptContext</code> 实例就能从其内部的 <code>Bindings</code> 中获得需要的属性值。<code>ScriptContext</code> 接口默认包含了两个级别的 <code>Bindings</code> 实例的引用，分别是全局级别和引擎级别，可以通过 <code>GLOBAL_SCOPE</code> 和 <code>ENGINE_SCOPE</code> 这两个类常量来界定区分这两个 <code>Bindings</code> 实例，其中 <code>GLOBAL_SCOPE </code>从创建它的 <code>ScriptEngineManager</code> 获得。顾名思义，全局级别指的是 <code>Bindings</code> 里的属性都是&#8220;全局变量&#8221;，只要是同一个 <code>ScriptEngineMananger</code> 返回的脚本引擎都可以共享这些属性；对应的，引擎级别的 <code>Bindings</code> 里的属性则是&#8220;局部变量&#8221;，它们只对同一个引擎实例可见，从而能为不同的引擎设置独特的环境，通过同一个脚本引擎运行的脚本运行时能共享这些属性。</p>
    </li>
</ul>
<p><code>ScriptContext</code> 接口定义了下面这些函数来存取数据：</p>
<br />
<a name="table3"><strong>表 3. ScriptContext 存取属性函数</strong></a><br />
<table class="data-table-1" cellspacing="0" cellpadding="0" width="90%" summary="ScriptContext 存取属性函数" border="0">
    <tbody>
        <tr>
            <th>函数</th>
            <th>描述</th>
        </tr>
        <tr>
            <td><code>Object removeAttribute(String name, int scope)</code> </td>
            <td>从指定的范围里删除一个属性</td>
        </tr>
        <tr>
            <td><code>void setAttribute(String name, Object value, int scope)</code> </td>
            <td>在指定的范围里设置一个属性的值</td>
        </tr>
        <tr>
            <td><code>Object getAttribute(String name)</code> </td>
            <td>从上下文的所有范围内获取优先级最高的属性的值</td>
        </tr>
        <tr>
            <td><code>Object getAttribute(String name, int scope)</code> </td>
            <td>从指定的范围里获取属性值</td>
        </tr>
    </tbody>
</table>
<p><code>ScriptEngineManager</code> 拥有一个全局性的 <code>Bindings</code> 实例，在通过 <code>ScriptEngineFactory</code> 实例创建 <code>ScriptEngine</code> 后，它把自己的这个 <code>Bindings</code> 传递给所有它创建的 <code>ScriptEngine</code> 实例，作为 <code>GLOBAL_SCOPE</code>。同时，每一个 <code>ScriptEngine</code> 实例都对应一个 <code>ScriptContext</code> 实例，这个 <code>ScriptContext</code> 除了从 <code>ScriptEngineManager</code> 那获得的 <code>GLOBAL_SCOPE</code>，自己也维护一个 <code>ENGINE_SCOPE</code> 的 <code>Bindings</code> 实例，所有通过这个脚本引擎运行的脚本，都能存取其中的属性。除了 <code>ScriptContext</code> 可以设置属性，改变内部的 <code>Bindings</code>，Java 脚本 API 为 <code>ScriptEngineManager</code> 和 <code>ScriptEngine</code> 也提供了类似的设置属性和 <code>Bindings</code> 的 API。</p>
<br />
<a name="fig003"><strong>图 3. Bindings 在 Java 脚本 API 中的分布</strong></a><br />
<img alt="图 3. Bindings 在 Java 脚本 API 中的分布" src="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/fig003.jpg" /> <br />
<p>从 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#fig003">图 3</a> 中可以看到，共有三个级别的地方可以存取属性，分别是 <code>ScriptEngineManager</code> 中的 <code>Bindings</code>，<code>ScriptEngine</code> 实例对应的 <code>ScriptContext</code> 中含有的 <code>Bindings</code>，以及调用 <code>eval</code> 函数时传入的 <code>Bingdings</code>。离函数调用越近，其作用域越小，优先级越高，相当于编程语言中的变量的可见域，即 <code>Object getAttribute(String name)</code> 中提到的优先级。从 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#listing3">清单 3</a> 这个例子中可以看出各个属性的存取优先级：</p>
<br />
<a name="listing3"><strong>清单 3. 上下文属性的作用域</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            import javax.script.*;
            public class ScopeTest {
            public static void main(String[] args) throws Exception {
            String script=" println(greeting) ";
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("javascript");
            //Attribute from ScriptEngineManager
            manager.put("greeting", "Hello from ScriptEngineManager");
            engine.eval(script);
            //Attribute from ScriptEngine
            engine.put("greeting", "Hello from ScriptEngine");
            engine.eval(script);
            //Attribute from eval method
            ScriptContext context = new SimpleScriptContext();
            context.setAttribute("greeting", "Hello from eval method",
            ScriptContext.ENGINE_SCOPE);
            engine.eval(script,context);
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>JavaScript 脚本 <code>println(greeting)</code> 在这个程序中被重复调用了三次，由于三次调用的环境不一样，导致输出也不一样，<code>greeting</code> 变量每一次都被优先级更高的也就是距离函数调用越近的值覆盖。从这个例子同时也演示了如何使用 <code>ScriptContext</code> 和 <code>Bindings</code> 这两个接口，在例子脚本中并没有定义 <code>greeting</code> 这个变量，但是脚本通过 Java 脚本 API 能方便的存取 Java 应用程序中的对象，输出 <code>greeting</code> 相应的值。运行这个程序后，能看到输出为：</p>
<br />
<a name="fig004"><strong>图 4. 程序 ScopeTest 的输出</strong></a><br />
<img alt="图 4. 程序 ScopeTest 的输出" src="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/fig004.jpg" /> <br />
<p>除了能在 Java 平台与脚本程序之间的提供共享属性之外，<code>ScriptContext</code> 还允许用户重定向引擎执行时的输入输出流：</p>
<br />
<a name="table4"><strong>表 4. ScriptContext 输入输出重定向</strong></a><br />
<table class="data-table-1" cellspacing="0" cellpadding="0" width="90%" summary="ScriptContext 输入输出重定向" border="0">
    <tbody>
        <tr>
            <th>函数</th>
            <th>描述</th>
        </tr>
        <tr>
            <td><code>void setErrorWriter(Writer writer)</code> </td>
            <td>重定向错误输出，默认是标准错误输出</td>
        </tr>
        <tr>
            <td><code>void setReader(Reader reader)</code> </td>
            <td>重定向输入，默认是标准输入</td>
        </tr>
        <tr>
            <td><code>void setWriter(Writer writer)</code> </td>
            <td>重定向输出，默认是标准输出</td>
        </tr>
        <tr>
            <td><code>Writer getErrorWriter() </code></td>
            <td>获取当前错误输出字节流</td>
        </tr>
        <tr>
            <td><code>Reader getReader()</code> </td>
            <td>获取当前输入流</td>
        </tr>
        <tr>
            <td><code>Writer getWriter()</code> </td>
            <td>获取当前输出流</td>
        </tr>
    </tbody>
</table>
<p><a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#listing4">清单 4</a> 展示了如何通过 <code>ScriptContext</code> 将其对应的 <code>ScriptEngine</code> 标准输出重定向到一个 <code>PrintWriter</code> 中，用户可以通过与这个 <code>PrintWriter</code> 连通的 <code>PrintReader</code> 读取实际的输出，使 Java 应用程序能获取脚本运行输出，满足更加多样的应用需求。</p>
<br />
<a name="listing4"><strong>清单 4. 重定向脚本输出</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            import java.io.*;
            import javax.script.*;
            public class Redirectory {
            public static void main(String[] args) throws Exception {
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("javascript");
            PipedReader pr = new PipedReader();
            PipedWriter pw = new PipedWriter(pr);
            PrintWriter writer = new PrintWriter(pw);
            engine.getContext().setWriter(writer);
            String script = "println('Hello from JavaScript')";
            engine.eval(script);
            BufferedReader br =new BufferedReader(pr);
            System.out.println(br.readLine());
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>Java 脚本 API 分别为这两个接口提供了一个简单的实现供用户使用。<code>SimpleBindings</code> 通过组合模式实现 <code>Map</code> 接口，它提供了两个构造函数。无参构造函数在内部构造一个 <code>HashMap</code> 实例来实现 <code>Map</code> 接口要求的功能；同时，<code>SimpleBindings</code> 也提供了一个以 <code>Map</code> 接口作为参数的构造函数，允许任何实现 <code>Map</code> 接口的类作为其组合的实例，以满足不同的要求。<code>SimpleScriptContext</code> 提供了 <code>ScriptContext</code> 简单实现。默认情况下，它使用了标准输入、标准输出和标准错误输出，同时维护一个 <code>SimpleBindings</code> 作为其引擎级别的 Bindings，它的默认全局级别 Bindings 为空。</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="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1059C"><span class="atitle">脚本引擎可选的接口</span></a></p>
在 Java 脚本 API 中还有两个脚本引擎可以选择是否实现的接口，这个两个接口不是强制要求实现的，即并非所有的脚本引擎都能支持这两个函数，不过 Java SE 6 自带的 JavaScript 引擎支持这两个接口。无论如何，这两个接口提供了非常实用的功能，它们分别是：
<ul>
    <li><strong>Invocable 接口：</strong>允许 Java 平台调用脚本程序中的函数或方法。
    <li><strong>Compilable 接口：</strong>允许 Java 平台编译脚本程序，供多次调用。 </li>
</ul>
<p><a name="N105B1"><span class="smalltitle">Invocable 接口</span></a></p>
<p>有时候，用户可能并不需要运行已有的整个脚本程序，而仅仅需要调用其中的一个过程，或者其中某个对象的方法，这个时候 <code>Invocable</code> 接口就能发挥作用。它提供了两个函数 <code>invokeFunction</code> 和 <code>invokeMethod</code>，分别允许 Java 应用程序直接调用脚本中的一个全局性的过程以及对象中的方法，调用后者时，除了指定函数名字和参数外，还需要传入要调用的对象引用，当然这需要脚本引擎的支持。不仅如此，<code>Invocable</code> 接口还允许 Java 应用程序从这些函数中直接返回一个接口，通过这个接口实例来调用脚本中的函数或方法，从而我们可以从脚本中动态的生成 Java 应用中需要的接口对象。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#listing5">清单 5</a> 演示了如何使用一个 <code>Invocable</code> 接口：</p>
<br />
<a name="listing5"><strong>清单 5. 调用脚本中的函数</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            import javax.script.*;
            public class CompilableTest {
            public static void main(String[] args) throws ScriptException,
            NoSuchMethodException {
            String script = " function greeting(message){println (message);}";
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("javascript");
            engine.eval(script);
            if (engine instanceof Invocable) {
            Invocable invocable = (Invocable) engine;
            invocable.invokeFunction("greeting", "hi");
            // It may through NoSuchMethodException
            try {
            invocable.invokeFunction("nogreeing");
            } catch (NoSuchMethodException e) {
            // expected
            }
            }
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在调用函数前，可以先通过 <code>instanceof</code> 操作判断脚本引擎是否支持编译操作，防止类型转换时抛出运行时异常，需要特别注意的时，如果调用了脚本程序中不存在的函数时，运行时会抛出一个 <code>NoSuchMethodException</code> 的异常，实际开发中应该注意处理这种特殊情况。</p>
<p><a name="N105E7"><span class="smalltitle">Compilable 接口</span></a></p>
<p>一般来说，脚本语言都是解释型的，这也是脚本语言区别与编译语言的一个特点，解释性意味着脚本随时可以被运行，开发者可以边开发边查看接口，从而省去了编译这个环节，提供了开发效率。但是这也是一把双刃剑，当脚本规模变大，重复解释一段稳定的代码又会带来运行时的开销。有些脚本引擎支持将脚本运行编译成某种中间形式，这取决与脚本语言的性质以及脚本引擎的实现，可以是一些操作码，甚至是 Java 字节码文件。实现了这个接口的脚本引擎能把输入的脚本预编译并缓存，从而提高多次运行相同脚本的效率。</p>
<p>Java 脚本 API 还为这个中间形式提供了一个专门的类，每次调用 <code>Compilable</code> 接口的编译函数都会返回一个 <code>CompiledScript</code> 实例。<code>CompiledScript</code> 类被用来保存编译的结果，从而能重复调用脚本而没有重复解释的开销，实际效率提高的多少取决于中间形式的彻底程度，其中间形式越接近低级语言，提高的效率就越高。每一个 <code>CompiledScript</code> 实例对应于一个脚本引擎实例，一个脚本引擎实例可以含有多个 <code>CompiledScript</code>（这很容易理解），调用 <code>CompiledScript</code> 的 <code>eval</code> 函数会传递给这个关联的 ScriptEngine 的 <code>eval</code> 函数。关于 <code>CompiledScript</code> 类需要注意的是，它运行时对与之对应的 ScriptEngine 状态的改变可能会传递给下一次调用，造成运行结果的不一致。<a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#listing6">清单 6</a> 演示了如何使用 <code>Compiable</code> 接口来调用脚本：</p>
<br />
<a name="listing6"><strong>清单 6. 编译脚本</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            import javax.script.*;
            public class CompilableTest {
            public static void main(String[] args) throws ScriptException {
            String script = " println (greeting); greeting= 'Good Afternoon!' ";
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("javascript");
            engine.put("greeting", "Good Morning!");
            if (engine instanceof Compilable) {
            Compilable compilable = (Compilable) engine;
            CompiledScript compiledScript = compilable.compile(script);
            compiledScript.eval();
            compiledScript.eval();
            }
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>与 <code>InovcableTest</code> 类似，也应该先通过 <code>instanceof</code> 操作判断脚本引擎是否支持编译操作，防止预料外的异常抛出。并且我们可以发现同一段编译过的脚本，在第二次运行时 <code>greeting</code> 变量的内容被上一次的运行改变了，导致输出不一致：</p>
<br />
<a name="N1063A"><strong>图 5. 程序 CompilableTest 的输出</strong></a><br />
<img alt="图 5. 程序 CompilableTest 的输出" src="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/fig005.jpg" /> <br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10645"><span class="atitle">jrunscript 工具</span></a></p>
<p>Java SE 6 还为运行脚本添加了一个专门的工具 —— jrunscript。jrunscript 支持两种运行方式：一种是交互式，即边读取边解析运行，这种方式使得用户可以方便调试脚本程序，马上获取预期结果；还有一种就是批处理式，即读取并运行整个脚本文件。用户可以把它想象成一个万能脚本解释器，即它可以运行任意脚本程序，而且它还是跨平台的，当然所有这一切都有一个前提，那就是必须告诉它相应的脚本引擎的位置。默认即支持的脚本是 JavaScript，这意味着用户可以无需任何设置，通过 jrunscript 在任何支持 Java 的平台上运行任何 JavaScript 脚本；如果想运行其他脚本，可以通过 <code>-l</code> 指定以何种脚本引擎运行脚本。不过这个工具仍是实验性质的，不一定会包含在 Java 的后续版本中，无论如何，它仍是一个非常有用的工具。</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="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/index.html?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10652"><span class="atitle">结束语</span></a></p>
<p>在 Java 平台上使用脚本语言编程非常方便，因为 Java 脚本 API 相对其他包要小很多。通过 <code>javax.script</code> 包提供的接口和类我们可以很方便为我们的 Java 应用程序添加对脚本语言的支持。开发者只要遵照 Java 脚本 API 开发应用程序，开发中就无需关注具体的脚本语言细节，应用程序就可以动态支持任何符合 JSR 233 标准的脚本语言，不仅如此，只要按照 JSR 233 标准开发，用户甚至还能为 Java 平台提供一个自定义脚本语言的解释器。在 Java 平台上运行自己的脚本语言，这对于众多开发者来说都是非常有诱惑力的。</p>
<br />
<br />
<p><a name="resources"><span class="atitle">参考资料 </span></a></p>
<ul>
    <li>阅读 <a href="http://www.ibm.com/developerworks/cn/java/j-lo-jse6/"><em>Java SE 6 新特性系列</em> </a>文章的完整列表，了解 Java SE 6 其它重要的增强。<br />
    <br />
    <li>developerWorks 文章&#8220;<a href="http://www.ibm.com/developerworks/cn/java/j-javascripting1/index.html">动态调用动态语言，第 1 部分: 引入 Java 脚本 API</a>&#8221;：介绍了 Java 脚本 API 的各种特性，并使用一个简单的 Hello World 应用程序展示 Java 代码如何执行脚本代码以及脚本如何反过来执行 Java 代码。<br />
    <br />
    <li>developerWorks 文章&#8220;<a href="http://www.ibm.com/developerworks/cn/java/j-javascripting2/index.html">动态调用动态语言，第 2 部分: 在运行时寻找、执行和修改脚本</a>&#8221;：进一步讲解了 Java 脚本 API 的功能，演示如何在无需停止并重新启动应用程序的情况下，在运行时执行外部 Ruby、Groovy 和 JavaScript 脚本以修改业务逻辑。<br />
    <br />
    <li>developerWorks 文章&#8220;<a href="http://www.ibm.com/developerworks/cn/java/j-lo-mustang-script/index.html">给 Java SE 注入脚本语言的活力</a>&#8221;：这篇文章在 Java SE 6 正式发布之前预览了 Java 脚本 API 的功能。<br />
    <br />
    <li><a href="http://java.sun.com/javase/6/docs/">Java SE 6 文档</a>：Java SE 6 的规范文档，可以找到绝大部分新特性的官方说明。 <br />
    <br />
    <li><a href="http://www.jcp.org/en/jsr/detail?id=223">JSR 233</a>：详细描述了脚本语言和 Java 平台交互的规范。 <br />
    <br />
    <li>Java SE 6 的规范文档上关于 Java 脚本编程的 <a href="http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html">教程</a>。 <br />
    <br />
    <li><a href="https://scripting.dev.java.net/">这个网站</a> 为许多著名脚本语言的脚本引擎提供了对 JSR 233 的支持。 <br />
    <br />
    <li>Sun 的 Java SE 6 实现包含了 Rhino 版本 1.6R2 的脚本引擎，<a href="http://www.mozilla.org/rhino/">Rhino</a> 是一个完全用 Java 开发的开源的 JavaScript 实现。 <br />
    <br />
    <li>JAR 规范中对 <a href="http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Service%20Provider">Service&nbsp;Provider</a> 的介绍。 </li>
</ul>
<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><img alt="邱小侠照片" src="http://www.ibm.com/developerworks/cn/java/j-lo-jse66/sean.jpg" align="left" valign="top" /></p>
            </td>
            <td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td>
            <td width="100%">
            <p>邱小侠，目前就职于 IBM 中国开发中心 Harmony 开发团队，负责类库开发工作。 对开源软件，Java 编程，项目构建均抱有浓厚的兴趣。您可以通过 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#113;&#105;&#117;&#120;&#105;&#97;&#111;&#120;&#64;&#99;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;">qiuxiaox@cn.ibm.com</a> 联系到他。</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/150973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2007-10-08 10:10 <a href="http://www.blogjava.net/wangxinsh55/archive/2007/10/08/150973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中文件操作大全</title><link>http://www.blogjava.net/wangxinsh55/archive/2007/08/28/140600.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Tue, 28 Aug 2007 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2007/08/28/140600.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/140600.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2007/08/28/140600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/140600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/140600.html</trackback:ping><description><![CDATA[<strong>一.获得控制台用户输入的信息</strong> <br><br>/** *//**获得控制台用户输入的信息 <br>* @return <br>* @throws IOException <br>*/ <br>public String getInputMessage() throws IOException...{ <br>System.out.println("请输入您的命令∶"); <br>byte buffer[]=new byte[1024]; <br>int count=System.in.read(buffer); <br>char[] ch=new char[count-2];//最后两位为结束符，删去不要 <br>for(int i=0;i&lt;count-2;i++) <br>ch[i]=(char)buffer[i]; <br>String str=new String(ch); <br>return str; <br>} <br>可以返回用户输入的信息，不足之处在于不支持中文输入，有待进一步改进。 <br><br><strong>二.复制文件 <br></strong><br>1.以文件流的方式复制文件 <br><br>/** *//**以文件流的方式复制文件 <br>* @param src 文件源目录 <br>* @param dest 文件目的目录 <br>* @throws IOException <br>*/ <br>public void copyFile(String src,String dest) throws IOException...{ <br>FileInputStream in=new FileInputStream(src); <br>File file=new File(dest); <br>if(!file.exists()) <br>file.createNewFile(); <br>FileOutputStream out=new FileOutputStream(file); <br>int c; <br>byte buffer[]=new byte[1024]; <br>while((c=in.read(buffer))!=-1)...{ <br>for(int i=0;i&lt;c;i++) <br>out.write(buffer[i]); <br>} <br>in.close(); <br>out.close(); <br>} <br>该方法经过测试，支持中文处理，并且可以复制多种类型，比如txt，xml，jpg，doc等多种格式 <br><br><strong>三.写文件</strong> <br><br>1.利用PrintStream写文件 <br><br>/** *//** <br>* 文件输出示例 <br>*/ <br>public void PrintStreamDemo()...{ <br>try ...{ <br>FileOutputStream out=new FileOutputStream("D:/test.txt"); <br>PrintStream p=new PrintStream(out); <br>for(int i=0;i&lt;10;i++) <br>p.println("This is "+i+" line"); <br>} catch (FileNotFoundException e) ...{ <br>e.printStackTrace(); <br>} <br>} <br>2.利用StringBuffer写文件 <br><br>public void StringBufferDemo() throws IOException......{ <br>File file=new File("/root/sms.log"); <br>if(!file.exists()) <br>file.createNewFile(); <br>FileOutputStream out=new FileOutputStream(file,true); <br>for(int i=0;i&lt;10000;i++)......{ <br>StringBuffer sb=new StringBuffer(); <br>sb.append("这是第"+i+"行:前面介绍的各种方法都不关用,为什么总是奇怪的问题 "); <br>out.write(sb.toString().getBytes("utf-8")); <br>} <br>out.close(); <br>} <br>该方法可以设定使用何种编码，有效解决中文问题。 <br><br><strong>四.文件重命名 <br></strong><br>/** *//**文件重命名 <br>* @param path 文件目录 <br>* @param oldname 原来的文件名 <br>* @param newname 新文件名 <br>*/ <br>public void renameFile(String path,String oldname,String newname)...{ <br>if(!oldname.equals(newname))...{//新的文件名和以前文件名不同时,才有必要进行重命名 <br>File oldfile=new File(path+"/"+oldname); <br>File newfile=new File(path+"/"+newname); <br>if(newfile.exists())//若在该目录下已经有一个文件和新文件名相同，则不允许重命名 <br>System.out.println(newname+"已经存在！"); <br>else...{ <br>oldfile.renameTo(newfile); <br>} <br>} <br>} <br><br><strong>五.转移文件目录 <br></strong><br>转移文件目录不等同于复制文件，复制文件是复制后两个目录都存在该文件，而转移文件目录则是转移后，只有新目录中存在该文件。 <br><br>/** *//**转移文件目录 <br>* @param filename 文件名 <br>* @param oldpath 旧目录 <br>* @param newpath 新目录 <br>* @param cover 若新目录下存在和转移文件具有相同文件名的文件时，是否覆盖新目录下文件，cover=true将会覆盖原文件，否则不操作 <br>*/ <br>public void changeDirectory(String filename,String oldpath,String newpath,boolean cover)...{ <br>if(!oldpath.equals(newpath))...{ <br>File oldfile=new File(oldpath+"/"+filename); <br>File newfile=new File(newpath+"/"+filename); <br>if(newfile.exists())...{//若在待转移目录下，已经存在待转移文件 <br>if(cover)//覆盖 <br>oldfile.renameTo(newfile); <br>else <br>System.out.println("在新目录下已经存在："+filename); <br>} <br>else...{ <br>oldfile.renameTo(newfile); <br>} <br>} <br>} <br><strong><br>六.读文件 <br></strong><br>1.利用FileInputStream读取文件 <br><br>/** *//**读文件 <br>* @param path <br>* @return <br>* @throws IOException <br>*/ <br>public String FileInputStreamDemo(String path) throws IOException...{ <br>File file=new File(path); <br>if(!file.exists()||file.isDirectory()) <br>throw new FileNotFoundException(); <br>FileInputStream fis=new FileInputStream(file); <br>byte[] buf = new byte[1024]; <br>StringBuffer sb=new StringBuffer(); <br>while((fis.read(buf))!=-1)...{ <br>sb.append(new String(buf)); <br>buf=new byte[1024];//重新生成，避免和上次读取的数据重复 <br>} <br>return sb.toString(); <br>}<br><br>2.利用BufferedReader读取 <br><br>在IO操作，利用BufferedReader和BufferedWriter效率会更高一点 <br><br>/** *//**读文件 <br>* @param path <br>* @return <br>* @throws IOException <br>*/ <br>public String BufferedReaderDemo(String path) throws IOException...{ <br>File file=new File(path); <br>if(!file.exists()||file.isDirectory()) <br>throw new FileNotFoundException(); <br>BufferedReader br=new BufferedReader(new FileReader(file)); <br>String temp=null; <br>StringBuffer sb=new StringBuffer(); <br>temp=br.readLine(); <br>while(temp!=null)...{ <br>sb.append(temp+" "); <br>temp=br.readLine(); <br>} <br>return sb.toString(); <br>} <br><br><br>3.利用dom4j读取xml文件 <br><br>/** *//**从目录中读取xml文件 <br>* @param path 文件目录 <br>* @return <br>* @throws DocumentException <br>* @throws IOException <br>*/ <br>public Document readXml(String path) throws DocumentException, IOException...{ <br>File file=new File(path); <br>BufferedReader bufferedreader = new BufferedReader(new FileReader(file)); <br>SAXReader saxreader = new SAXReader(); <br>Document document = (Document)saxreader.read(bufferedreader); <br>bufferedreader.close(); <br>return document; <br>} <br><br><strong>七.创建文件(文件夹) </strong><br><br>1.创建文件夹 /** *//**创建文件夹 <br>* @param path 目录 <br>*/ <br>public void createDir(String path)...{ <br>File dir=new File(path); <br>if(!dir.exists()) <br>dir.mkdir(); <br>} <br>2.创建新文件 /** *//**创建新文件 <br>* @param path 目录 <br>* @param filename 文件名 <br>* @throws IOException <br>*/ <br>public void createFile(String path,String filename) throws IOException...{ <br>File file=new File(path+"/"+filename); <br>if(!file.exists()) <br>file.createNewFile(); <br>} <br><br><strong>八.删除文件(目录) <br><br></strong>1.删除文件 /** *//**删除文件 <br>* @param path 目录 <br>* @param filename 文件名 <br>*/ <br>public void delFile(String path,String filename)...{ <br>File file=new File(path+"/"+filename); <br>if(file.exists()&amp;&amp;file.isFile()) <br>file.delete(); <br>} <br>2.删除目录 <br>要利用File类的delete()方法删除目录时，必须保证该目录下没有文件或者子目录，否则删除失败，因此在实际应用中，我们要删除目录，必须利用递归删除该目录下的所有子目录和文件，然后再删除该目录。 /** *//**递归删除文件夹 <br>* @param path <br>*/ <br>public void delDir(String path)...{ <br>File dir=new File(path); <br>if(dir.exists())...{ <br>File[] tmp=dir.listFiles(); <br>for(int i=0;i&lt;tmp.length;i++)...{ <br>if(tmp[i].isDirectory())...{ <br>delDir(path+"/"+tmp[i].getName()); <br>} <br>else...{ <br>tmp[i].delete(); <br>} <br>} <br>dir.delete(); <br>} <br>} 
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/140600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2007-08-28 17:42 <a href="http://www.blogjava.net/wangxinsh55/archive/2007/08/28/140600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>巧用Java程序把Word转换成Html文件</title><link>http://www.blogjava.net/wangxinsh55/archive/2007/08/09/135558.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 09 Aug 2007 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2007/08/09/135558.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/135558.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2007/08/09/135558.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/135558.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/135558.html</trackback:ping><description><![CDATA[　Jacob是Java和Windows下的Com桥，通过它我们可以在Java程序中调用COM组件。如果你的JDK是1.4，那你需要下载Jacob1.9的jni库才能正常运行，早期版本在JDK1.4下有些问题。
<p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word" bgColor=#f3f3f3><font style="FONT-WEIGHT: bold; COLOR: #990000">以下是引用片段：</font><br>package com; <br>/**<br>* 〈p〉Title:Word文档转html类〈/p〉<br>* 〈p〉Description: 〈/p〉<br>* 〈p〉Copyright:() 2002〈/p〉<br>* @author 舵手<br>* @version 1.0<br>*/<br>import com.jacob.com.*; <br>import com.jacob.activeX.*; <br><br>public class WordtoHtml {<br>/**<br>*文档转换函数<br>*@param docfile word文档的绝对路径加文件名(包含扩展名)<br>*@param htmlfile 转换后的html文件绝对路径和文件名(不含扩展名)<br>*/<br>public static void change(String docfile, String htmlfile) {<br>ActiveXComponent app = new ActiveXComponent("Word.Application"); // 启动word<br>try {<br>app.setProperty("Visible", new Variant(false)); <br>//设置word不可见<br>Object docs = app.getProperty("Documents").toDispatch(); <br>Object doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] <br>{ docfile, new Variant(false),new Variant(true) }, new int[1]).toDispatch(); <br>// 打开word文件<br>Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {htmlfile,<br>new Variant(8) }, new int[1]); <br>// 作为html格式保存到临时文件<br>Variant f = new Variant(false); <br>Dispatch.call(doc, "Close", f); <br>} catch (Exception e) {<br>e.printStackTrace(); <br>} finally {<br>app.invoke("Quit", new Variant[]{}); <br>}<br>}<br>public static void main(String[] strs){<br>WordtoHtml.change("c:\a\运输管理调度系统总体方案.doc", "c:\a\t"); <br><br>}<br>}</ccid_code></td>
        </tr>
    </tbody>
</table>
</p>
<table width="90%" align=center border=0>
    <tbody>
        <tr>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/135558.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2007-08-09 17:21 <a href="http://www.blogjava.net/wangxinsh55/archive/2007/08/09/135558.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse 5.5GA的破解程序</title><link>http://www.blogjava.net/wangxinsh55/archive/2007/07/11/129702.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Wed, 11 Jul 2007 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2007/07/11/129702.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/129702.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2007/07/11/129702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/129702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/129702.html</trackback:ping><description><![CDATA[<span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.BufferedReader;<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.IOException;<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.InputStreamReader;<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.PrintStream;<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.text.DecimalFormat;<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.text.NumberFormat;<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.text.SimpleDateFormat;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.Calendar;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Myeclipse5_5_0_KeyMaker&nbsp;{<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;String&nbsp;L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Decompiling&nbsp;this&nbsp;copyrighted&nbsp;software&nbsp;is&nbsp;a&nbsp;violation&nbsp;of&nbsp;both&nbsp;your&nbsp;license&nbsp;agreement&nbsp;and&nbsp;the&nbsp;Digital&nbsp;Millenium&nbsp;Copyright&nbsp;Act&nbsp;of&nbsp;1998&nbsp;(http://www.loc.gov/copyright/legislation/dmca.pdf).&nbsp;Under&nbsp;section&nbsp;1204&nbsp;of&nbsp;the&nbsp;DMCA,&nbsp;penalties&nbsp;range&nbsp;up&nbsp;to&nbsp;a&nbsp;$500,000&nbsp;fine&nbsp;or&nbsp;up&nbsp;to&nbsp;five&nbsp;years&nbsp;imprisonment&nbsp;for&nbsp;a&nbsp;first&nbsp;offense.&nbsp;Think&nbsp;about&nbsp;it;&nbsp;pay&nbsp;for&nbsp;a&nbsp;license,&nbsp;avoid&nbsp;prosecution,&nbsp;and&nbsp;feel&nbsp;better&nbsp;about&nbsp;yourself.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String&nbsp;args[])&nbsp;{<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;BufferedReader(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;InputStreamReader(System.in));<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;userId&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;intLicenseNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strLicenseNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;bProFlag&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strProFlag&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(userId&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">.equals(userId.trim()))&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Subscriber:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userId&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;br.readLine();<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;ioexception)&nbsp;{&nbsp;}<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">29</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Number&nbsp;of&nbsp;licenses(default&nbsp;1,&nbsp;max&nbsp;999):&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">30</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">31</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strLicenseNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;br.readLine();<br></span><span style="COLOR: #008080">32</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">33</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;ioexception1)&nbsp;{&nbsp;}<br></span><span style="COLOR: #008080">34</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberFormat&nbsp;nf&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DecimalFormat(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">000</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">35</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(strLicenseNum&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">.equals(strLicenseNum.trim()))&nbsp;{<br></span><span style="COLOR: #008080">36</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strLicenseNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;nf.format(intLicenseNum);<br></span><span style="COLOR: #008080">37</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">38</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strLicenseNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;nf.format(Integer.parseInt(strLicenseNum));<br></span><span style="COLOR: #008080">39</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">40</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Professional&nbsp;or&nbsp;Standard(default&nbsp;pro,&nbsp;n=stand):&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">41</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008080">42</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strProFlag&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;br.readLine();<br></span><span style="COLOR: #008080">43</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">44</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;ioexception2)&nbsp;{&nbsp;}<br></span><span style="COLOR: #008080">45</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(strProFlag&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">.equals(strProFlag.trim()))&nbsp;{<br></span><span style="COLOR: #008080">46</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bProFlag&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">47</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">48</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Calendar.getInstance();<br></span><span style="COLOR: #008080">49</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal.add(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">50</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cal.add(</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">51</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;sdf&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SimpleDateFormat(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">yyMMdd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">52</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;need&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;userId.substring(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Y</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;(bProFlag&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">E3MP</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">E2MY</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-100</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;strLicenseNum&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;sdf.format(cal.getTime())&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">53</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;dx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;need&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Decompiling&nbsp;this&nbsp;copyrighted&nbsp;software&nbsp;is&nbsp;a&nbsp;violation&nbsp;of&nbsp;both&nbsp;your&nbsp;license&nbsp;agreement&nbsp;and&nbsp;the&nbsp;Digital&nbsp;Millenium&nbsp;Copyright&nbsp;Act&nbsp;of&nbsp;1998&nbsp;(http://www.loc.gov/copyright/legislation/dmca.pdf).&nbsp;Under&nbsp;section&nbsp;1204&nbsp;of&nbsp;the&nbsp;DMCA,&nbsp;penalties&nbsp;range&nbsp;up&nbsp;to&nbsp;a&nbsp;$500,000&nbsp;fine&nbsp;or&nbsp;up&nbsp;to&nbsp;five&nbsp;years&nbsp;imprisonment&nbsp;for&nbsp;a&nbsp;first&nbsp;offense.&nbsp;Think&nbsp;about&nbsp;it;&nbsp;pay&nbsp;for&nbsp;a&nbsp;license,&nbsp;avoid&nbsp;prosecution,&nbsp;and&nbsp;feel&nbsp;better&nbsp;about&nbsp;yourself.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;userId;<br></span><span style="COLOR: #008080">54</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;suf&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;decode(dx);<br></span><span style="COLOR: #008080">55</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;code&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;need&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;suf;<br></span><span style="COLOR: #008080">56</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Subscription&nbsp;Code:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;change(code));<br></span><span style="COLOR: #008080">57</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">58</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">59</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;decode(String&nbsp;s)&nbsp;{<br></span><span style="COLOR: #008080">60</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">61</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;ac[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.toCharArray();<br></span><span style="COLOR: #008080">62</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">63</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ac.length;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;k;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;{<br></span><span style="COLOR: #008080">64</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">31</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ac[j];<br></span><span style="COLOR: #008080">65</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">66</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">67</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;Math.abs(i);<br></span><span style="COLOR: #008080">68</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">69</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">70</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;String&nbsp;change(String&nbsp;s)&nbsp;{<br></span><span style="COLOR: #008080">71</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(s&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;s.length()&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;{<br></span><span style="COLOR: #008080">72</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;s;<br></span><span style="COLOR: #008080">73</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">74</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">byte</span><span style="COLOR: #000000">&nbsp;abyte0[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.getBytes();<br></span><span style="COLOR: #008080">75</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;ac[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[s.length()];<br></span><span style="COLOR: #008080">76</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">77</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;abyte0.length;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;k;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;{<br></span><span style="COLOR: #008080">78</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;abyte0[i];<br></span><span style="COLOR: #008080">79</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">48</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">57</span><span style="COLOR: #000000">)&nbsp;{<br></span><span style="COLOR: #008080">80</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">48</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">48</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">81</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">82</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">90</span><span style="COLOR: #000000">)&nbsp;{<br></span><span style="COLOR: #008080">83</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">26</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">84</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">85</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">97</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">122</span><span style="COLOR: #000000">)&nbsp;{<br></span><span style="COLOR: #008080">86</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((j&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">97</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">26</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">97</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">87</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">88</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ac[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">)j;<br></span><span style="COLOR: #008080">89</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">90</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">91</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;String.valueOf(ac);<br></span><span style="COLOR: #008080">92</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">93</span>&nbsp;<span style="COLOR: #000000">}<br><br><br>说明：仅学习之用，如用做商业用途后果自负！！！！！！！！！！！！！！！！！！！！！</span>
<img src ="http://www.blogjava.net/wangxinsh55/aggbug/129702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxinsh55/" target="_blank">SIMONE</a> 2007-07-11 21:14 <a href="http://www.blogjava.net/wangxinsh55/archive/2007/07/11/129702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse 启动参数</title><link>http://www.blogjava.net/wangxinsh55/archive/2007/07/06/128589.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 06 Jul 2007 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/wangxinsh55/archive/2007/07/06/128589.html</guid><wfw:comment>http://www.blogjava.net/wangxinsh55/comments/128589.html</wfw:comment><comments>http://www.blogjava.net/wangxinsh55/archive/2007/07/06/128589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxinsh55/comments/commentRss/128589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxinsh55/services/trackbacks/128589.html</trackback:ping><description><![CDATA[		 其实，Eclipse是一个可以进行非常灵活配置的系统，除了以缺省的方式启动以外，还可以指定各种参数来定制启动方式。在参考了一些资料之后，我总结了一些比较常用的启动时Command Arguments，如果有不正确的地方希望大家予以指出。<br><br>-arch [processor architecture]<br>描述：指定所使用的处理器的类别<br>举例：eclipse -arch x86或eclipse -arch sparc<br><br>-application [id]<br>描述：指定要运行的应用，id为扩展org.eclipse.core.applications扩展点的插件id加扩展id<br>举例：例如有个插件id为edu.sdu.app，扩展id为myapp，则eclipse -application edu.sdu.app.myapp，就会执行你的扩展应用<br><br>-clean<br>描述：清空插件缓存内容<br>举例：eclipse -clean，有时插件显示不出来是因为Eclipse将插件进行了缓存以加速启动过程，若指定此参数则会清空缓存，从头加载<br><br>-configuration [cofigfile location]<br>描述：指定配置文件的位置，在启动时使用此目录下的配置文件config.ini来启动<br>举例：eclipse -configuration d:/eclipse/configuration<br><br>-data [workspace location]<br>描述：指定启动时的Workspace位置<br>举例：例如Workspace位置设在D:/myworkspace，则eclipse -data D:/myworkspace<br><br>-debug [option file]<br>描述：以Debug状态启动Eclipse，所有的Debug开关在.optio