﻿<?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-XZC.Log-随笔分类-Java</title><link>http://www.blogjava.net/xzclog/category/23459.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 25 Apr 2017 16:23:28 GMT</lastBuildDate><pubDate>Tue, 25 Apr 2017 16:23:28 GMT</pubDate><ttl>60</ttl><item><title>Kerberos简介</title><link>http://www.blogjava.net/xzclog/archive/2017/04/25/432480.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 25 Apr 2017 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2017/04/25/432480.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/432480.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2017/04/25/432480.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/432480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/432480.html</trackback:ping><description><![CDATA[<div><h1><span style="line-height: 1.5; font-size: 2em;">1.&nbsp; Kerberos简介</span></h1><h2>1.1. 功能</h2><ol><li><p><span style="font-size: 18px;">一个安全认证协议</span></p></li><li><p><span style="font-size: 18px;">用tickets验证</span></p></li><li><p><span style="font-size: 18px;">避免本地保存密码和在互联网上传输密码</span></p></li><li><p><span style="font-size: 18px;">包含一个可信任的第三方</span></p></li><li><p><span style="font-size: 18px;">使用对称加密</span></p></li><li><p><span style="font-size: 18px;">客户端与服务器（非KDC）之间能够相互验证</span></p></li></ol><p>Kerberos只提供一种功能&#8212;&#8212;在网络上安全的完成用户的身份验证。它并不提供授权功能或者审计功能。</p><h2>1.2. 概念</h2><p>首次请求，三次通信方</p><ul><li>the Authentication Server</li><li>the Ticket Granting Server</li><li>the Service or host machine that you&#8217;re wanting access to.</li></ul><p align="center"><img width="786" height="590" alt="" src="http://images.cnitblog.com/i/440394/201405/161359440784098.jpg" />&nbsp;</p><p align="center">图 1&#8209;1 角色</p><p>其他知识点</p><ul><li>每次通信，消息包含两部分，一部分可解码，一部分不可解码</li><li>服务端不会直接有KDC通信</li><li>KDC保存所有机器的账户名和密码</li><li>KDC本身具有一个密码</li></ul><h1>2.&nbsp; 3次通信</h1><p>&nbsp;<img style="margin-right: auto; margin-left: auto; display: block;" alt="" src="http://images.cnitblog.com/i/440394/201405/161403404066531.png" /></p><p>　　我们这里已获取服务器中的一张表（数据）的服务以为，为一个http服务。</p><h2>2.1. 你和验证服务</h2><p>　　如果想要获取http服务，你首先要向KDC表名你自己的身份。这个过程可以在你的程序启动时进行。Kerberos可以通过kinit获取。介绍自己通过未加密的信息发送至KDC获取Ticket Granting Ticket (TGT)。</p><p>（1）信息包含</p><ul><li>你的用户名/ID</li><li>你的IP地址</li><li>TGT的有效时间</li></ul><p>　　Authentication Server收到你的请求后，会去数据库中验证，你是否存在。注意，仅仅是验证是否存在，不会验证对错。</p><p>　　如果存在，Authentication Server会产生一个随机的Session key(可以是一个64位的字符串)。这个key用于你和Ticket Granting Server (TGS)之间通信。</p><p>（2）回送信息</p><p>　　Authentication Server同样会发送两部分信息给你，一部分信息为TGT，通过KDC自己的密码进行加密，包含：</p><ul><li>你的name/ID</li><li>TGS的name/ID</li><li>时间戳</li><li>你的IP地址</li><li>TGT的生命周期</li><li><span style="color: #00ff00;"><strong>TGS session key</strong></span></li></ul><p>另外一部分通过你的密码进行加密，包含的信息有</p><ul><li>TGS的name/ID</li><li>时间戳</li><li>生命周期</li><li><span style="color: #00ff00;"><strong>TGS session key</strong></span></li></ul><p align="center">&nbsp;<img width="835" height="630" alt="" src="http://images.cnitblog.com/i/440394/201405/161407343596805.png" /></p><p align="center">图 2&#8209;1 第一次通信</p><p>　　如果你的密码是正确的，你就能解密第二部分信息，获取到TGS session key。如果，密码不正确，无法解密，则认证失败。第一部分信息TGT，你是无法解密的，但需要展示缓存起来。</p><h2>2.2. 你和TGS</h2><p>如果第一部分你已经成功，你已经拥有无法解密的TGT和一个TGS Session Key。</p><p>（1）&nbsp;&nbsp;&nbsp; 请求信息</p><p>　a) &nbsp;通过TGS Session Key加密的<strong>认证器</strong>部分：</p><ul><li>你的name/ID</li><li>时间戳</li></ul><p>b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 明文传输部分：</p><ul><li>请求的Http服务名（就是请求信息）</li><li>HTTP Service的Ticket生命周期</li></ul><p>c)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TGT部分</p><p>　　Ticket Granting Server收到信息后，首先检查数据库中是否包含有你请求的Http服务名。如果无，直接返回错误信息。</p><p>　　如果存在，则通过KDC的密码解密TGT，这个时候。我们就能获取到TGS Session key。然后，通过TGS Session key去解密你传输的第一部分认证器，获取到你的用户名和时间戳。</p><p><strong>TGS再进行验证：</strong></p><ol><li>对比TGT中的用户名与认证器中的用户名</li><li>比较时间戳（网上有说认证器中的时间错和TGT中的时间错，个人觉得应该是认证器中的时间戳和系统的时间戳），不能超过一定范围</li><li>检查是否过期</li><li>检查IP地址是否一致</li><li>检查认证器是否已在TGS缓存中（避免应答攻击）</li><li><strong>可以在这部分添加权限认证服务</strong></li></ol><p>　　TGS随机产生一个<strong><span style="color: #ff0000;">Http Service Session Key</span></strong>, 同时准备Http Service Ticket(ST)。</p><p>（2）&nbsp;&nbsp;&nbsp; 回答信息</p><p>　　a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过Http服务的密码进行加密的信息（ST）：</p><ul><li>你的name/ID</li><li>Http服务name/ID</li><li>你的IP地址</li><li>时间戳</li><li>ST的生命周期</li><li><span style="color: #ff0000;"><strong>Http Service Session Key</strong></span></li></ul><p>　　b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过<span style="color: #00ff00;"><strong>TGS Session Key</strong></span>加密的信息</p><ul><li>Http服务name/ID</li><li>时间戳</li><li>ST的生命周期</li><li><span style="color: #ff0000;"><strong>Http Service Session Key</strong></span></li></ul><p>　　你收到信息后，通过<span style="color: #00ff00;"><strong>TGS Session Key</strong></span>解密，获取到了<span style="color: #ff0000;"><strong>Http Service Session Key</strong></span>，但是你无法解密ST。</p><p>&nbsp;<img width="934" height="687" alt="" src="http://images.cnitblog.com/i/440394/201405/161411563901158.png" /></p><p align="center">图 2&#8209;2 第二次通信</p><h2>2.3. 你和Http服务</h2><p>　　在前面两步成功后，以后每次获取Http服务，在Ticket没有过期，或者无更新的情况下，都可直接进行这一步。省略前面两个步骤。</p><p>（1）&nbsp;&nbsp;&nbsp; 请求信息</p><p>　　a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过<strong>Http Service Session Key</strong><strong>，</strong>加密部分</p><ul><li>你的name/ID</li><li>时间戳</li></ul><p>　　b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ST</p><p>　　　Http服务端通过自己的密码解压ST（KDC是用Http服务的密码加密的），这样就能够获取到<strong>Http Service Session Key</strong>，解密第一部分。</p><p><strong>服务端解密好ST后，进行检查</strong></p><ol><li>对比ST中的用户名（KDC给的）与认证器中的用户名</li><li>比较时间戳（网上有说认证器中的时间错和TGT中的时间错，个人觉得应该是认证器中的时间戳和系统的时间戳），不能超过一定范围</li><li>检查是否过期</li><li>检查IP地址是否一致</li><li>检查认证器是否已在HTTP服务端的缓存中（避免应答攻击）</li></ol><p>（2）&nbsp;&nbsp;&nbsp; 应答信息</p><p>a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过<span style="color: #ff0000;"><strong>Http Service Session Key</strong></span>加密的信息</p><ul><li>Http服务name/ID</li><li>时间戳</li></ul><p>&nbsp;<img width="827" height="437" alt="" src="http://images.cnitblog.com/i/440394/201405/161413397653706.png" /></p><p align="center">图 2&#8209;3 第三次通信</p><p>　　你在通过缓存的<span style="color: #ff0000;"><strong>Http Service Session Key</strong></span>解密这部分信息，然后验证是否是你想要的服务器发送给你的信息。完成你的服务器的验证。</p><p>至此，整个过程全部完成。</p></div><img src ="http://www.blogjava.net/xzclog/aggbug/432480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2017-04-25 15:56 <a href="http://www.blogjava.net/xzclog/archive/2017/04/25/432480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>快使用阿里云的maven仓库 </title><link>http://www.blogjava.net/xzclog/archive/2017/04/11/432442.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 11 Apr 2017 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2017/04/11/432442.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/432442.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2017/04/11/432442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/432442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/432442.html</trackback:ping><description><![CDATA[<div><div id="cnblogs_post_body"><p>自从开源中国的maven仓库挂了之后就一直在用国外的仓库，慢得想要砸电脑的心都有了。如果你和我一样受够了国外maven仓库的龟速下载？快试试阿里云提供的maven仓库，从此不在浪费生命&#8230;&#8230;</p><p>仓库地址：<a href="http://maven.aliyun.com/nexus/#view-repositories;public~browsestorage" target="_blank">http://maven.aliyun.com/nexus/#view-repositories;public~browsestorage</a></p><p>&nbsp;</p><h2>仓库配置</h2><p>在maven的settings.xml文件里的mirrors节点，添加如下子节点：</p><div><div><a title="复制代码" href="http://www.cnblogs.com/keitsi/p/6000649.html"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></div><pre><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span>       <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span>nexus-aliyun<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span>       <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span>central<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirrorOf</span><span style="color: #0000ff;">&gt;</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span>Nexus aliyun<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span>       <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span>http://maven.aliyun.com/nexus/content/groups/public<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span>   <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">mirror</span><span style="color: #0000ff;">&gt;</span> </pre><div><a title="复制代码" href="http://www.cnblogs.com/keitsi/p/6000649.html"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></div></div><p>或者直接在profiles-&gt;profile-&gt;repositories节点，添加如下子节点：</p><div><div><a title="复制代码" href="http://www.cnblogs.com/keitsi/p/6000649.html"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></div><pre><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">repository</span><span style="color: #0000ff;">&gt;</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span>nexus-aliyun<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span>Nexus aliyun<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">layout</span><span style="color: #0000ff;">&gt;</span>default<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">layout</span><span style="color: #0000ff;">&gt;</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span>http://maven.aliyun.com/nexus/content/groups/public<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">snapshots</span><span style="color: #0000ff;">&gt;</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">enabled</span><span style="color: #0000ff;">&gt;</span>false<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">enabled</span><span style="color: #0000ff;">&gt;</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">snapshots</span><span style="color: #0000ff;">&gt;</span>     <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">releases</span><span style="color: #0000ff;">&gt;</span>         <span style="color: #0000ff;">&lt;</span><span style="color: #800000;">enabled</span><span style="color: #0000ff;">&gt;</span>true<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">enabled</span><span style="color: #0000ff;">&gt;</span>     <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">releases</span><span style="color: #0000ff;">&gt;</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">repository</span><span style="color: #0000ff;">&gt;</span></pre><div><a title="复制代码" href="http://www.cnblogs.com/keitsi/p/6000649.html"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></div></div><p>&nbsp;</p><h2>settings文件的路径</h2><p>settings.xml的默认路径就：个人目录/.m2/settings.xml</p><p>如：</p><p><strong>windowns:</strong>&nbsp;C:\Users\你的用户名\.m2\settings.xml</p><p><strong>linux:</strong> /home/你的用户名/.m2/settings.xml</p></div><div id="MySignature" style="display: block;"><div id="my-comment">Keep it simple!</div><div id="my-copyleft"><div>作者：<a href="http://www.cnblogs.com/keitsi/" target="_blank">KEITSI</a></div><div>出处：<a href="http://www.cnblogs.com/keitsi/" target="_blank">http://www.cnblogs.com/keitsi/</a></div><div>知识共享，欢迎转载。</div></div></div></div><img src ="http://www.blogjava.net/xzclog/aggbug/432442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2017-04-11 10:08 <a href="http://www.blogjava.net/xzclog/archive/2017/04/11/432442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA对于数字证书的常用操作方法</title><link>http://www.blogjava.net/xzclog/archive/2015/12/11/428610.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 11 Dec 2015 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2015/12/11/428610.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/428610.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2015/12/11/428610.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/428610.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/428610.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: 宋体; line-height: 28px; background-color: #f8f8f8; "><div class="brief bgF8F8F8" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f8f8f8; width: 597px; padding-top: 12px; padding-right: 18px; padding-left: 18px; margin-top: 10px; border-top-color: #d8d9d9; border-right-color: #d8d9d9; border-left-color: #d8d9d9; border-top-width: 1px; border-right-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: none; border-bottom-width: initial; border-bottom-color: initial; "><div class="brieftext" style="background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; border-top-color: #73a0cf; border-right-color: #73a0cf; border-bottom-color: #73a0cf; border-left-color: #73a0cf; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; line-height: 26px; padding-top: 8px; padding-right: 12px; padding-bottom: 8px; padding-left: 12px; background-color: #ffffff; "><p class="f14 green" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #006600; background-color: transparent; font-size: 14px; ">本文介绍JAVA对于数字证书的常用操作方法</p><p class="ad" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-align: right; ">AD：</p></div></div><div class="content bgF8F8F8 f14" style="font-size: 14px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f8f8f8; padding-top: 12px; padding-right: 18px; padding-left: 18px; line-height: 28px; margin-bottom: 10px; position: relative; min-height: 500px; overflow-x: hidden; overflow-y: hidden; "><div id="content"><strong>一：需要包含的包<br style="clear: both; width: 0px; height: 0px; " /></strong>import java.security.*;<br style="clear: both; width: 0px; height: 0px; " />import java.io.*;<br style="clear: both; width: 0px; height: 0px; " />import java.util.*;<br style="clear: both; width: 0px; height: 0px; " />import java.security.*;<br style="clear: both; width: 0px; height: 0px; " />import java.security.cert.*;<br style="clear: both; width: 0px; height: 0px; " />import sun.security.x509.*<br style="clear: both; width: 0px; height: 0px; " />import java.security.cert.Certificate;<br style="clear: both; width: 0px; height: 0px; " />import java.security.cert.CertificateFactory;<br style="clear: both; width: 0px; height: 0px; " /><strong>二：从文件中读取证书</strong><br style="clear: both; width: 0px; height: 0px; " />用keytool将.keystore中的证书写入文件中，然后从该文件中读取证书信息<br style="clear: both; width: 0px; height: 0px; " />CertificateFactory cf=CertificateFactory.getInstance("X.509");<br style="clear: both; width: 0px; height: 0px; " />FileInputStream in=new FileInputStream("out.csr");<br style="clear: both; width: 0px; height: 0px; " />Certificate c=cf.generateCertificate(in);<br style="clear: both; width: 0px; height: 0px; " />String s=c.toString();<br style="clear: both; width: 0px; height: 0px; " /><strong>三：从密钥库中直接读取证书</strong><br style="clear: both; width: 0px; height: 0px; " />String pass="123456";<br style="clear: both; width: 0px; height: 0px; " />FileInputStream in=new FileInputStream(".keystore");<br style="clear: both; width: 0px; height: 0px; " />KeyStore ks=KeyStore.getInstance("JKS");<br style="clear: both; width: 0px; height: 0px; " />ks.load(in,pass.toCharArray());<br style="clear: both; width: 0px; height: 0px; " />java.security.cert.Certificate c=ks.getCertificate(alias);//alias为条目的别名<br style="clear: both; width: 0px; height: 0px; " /><strong>四：JAVA程序中显示证书指定信息</strong><br style="clear: both; width: 0px; height: 0px; " />System.out.println("输出证书信息:\n"+c.toString());<br style="clear: both; width: 0px; height: 0px; " />System.out.println("版本号:"+t.getVersion());<br style="clear: both; width: 0px; height: 0px; " />System.out.println("序列号:"+t.getSerialNumber().toString(16));<br style="clear: both; width: 0px; height: 0px; " />System.out.println("主体名："+t.getSubjectDN());<br style="clear: both; width: 0px; height: 0px; " />System.out.println("签发者："+t.getIssuerDN());<br style="clear: both; width: 0px; height: 0px; " />System.out.println("有效期："+t.getNotBefore());<br style="clear: both; width: 0px; height: 0px; " />System.out.println("签名算法："+t.getSigAlgName());<br style="clear: both; width: 0px; height: 0px; " />byte [] sig=t.getSignature();//签名值<br style="clear: both; width: 0px; height: 0px; " />PublicKey pk=t.getPublicKey();<br style="clear: both; width: 0px; height: 0px; " />byte [] pkenc=pk.getEncoded();<br style="clear: both; width: 0px; height: 0px; " />System.out.println("公钥");<br style="clear: both; width: 0px; height: 0px; " />for(int i=0;i&lt;pkenc.length;i++)System.out.print(pkenc[i]+",");<br style="clear: both; width: 0px; height: 0px; " /><strong>五：JAVA程序列出密钥库所有条目</strong><br style="clear: both; width: 0px; height: 0px; " />String pass="123456";<br style="clear: both; width: 0px; height: 0px; " />FileInputStream in=new FileInputStream(".keystore");<br style="clear: both; width: 0px; height: 0px; " />KeyStore ks=KeyStore.getInstance("JKS");<br style="clear: both; width: 0px; height: 0px; " />ks.load(in,pass.toCharArray());<br style="clear: both; width: 0px; height: 0px; " />Enumeration e=ks.aliases();<br style="clear: both; width: 0px; height: 0px; " />while(e.hasMoreElements())<br style="clear: both; width: 0px; height: 0px; " />java.security.cert.Certificate c=ks.getCertificate((String)e.nextElement());<br style="clear: both; width: 0px; height: 0px; " /><strong>六：JAVA程序修改密钥库口令</strong><br style="clear: both; width: 0px; height: 0px; " />String oldpass="123456";<br style="clear: both; width: 0px; height: 0px; " />String newpass="654321";<br style="clear: both; width: 0px; height: 0px; " />FileInputStream in=new FileInputStream(".keystore");<br style="clear: both; width: 0px; height: 0px; " />KeyStore ks=KeyStore.getInstance("JKS");<br style="clear: both; width: 0px; height: 0px; " />ks.load(in,oldpass.toCharArray());<br style="clear: both; width: 0px; height: 0px; " />in.close();<br style="clear: both; width: 0px; height: 0px; " />FileOutputStream output=new FileOutputStream(".keystore");<br style="clear: both; width: 0px; height: 0px; " />ks.store(output,newpass.toCharArray());<br style="clear: both; width: 0px; height: 0px; " />output.close();<br style="clear: both; width: 0px; height: 0px; " /><strong>七：JAVA程序修改密钥库条目的口令及添加条目</strong><br style="clear: both; width: 0px; height: 0px; " />FileInputStream in=new FileInputStream(".keystore");<br style="clear: both; width: 0px; height: 0px; " />KeyStore ks=KeyStore.getInstance("JKS");<br style="clear: both; width: 0px; height: 0px; " />ks.load(in,storepass.toCharArray());<br style="clear: both; width: 0px; height: 0px; " />Certificate [] cchain=ks.getCertificate(alias);获取别名对应条目的证书链<br style="clear: both; width: 0px; height: 0px; " />PrivateKey pk=(PrivateKey)ks.getKey(alias,oldkeypass.toCharArray());获取别名对应条目的私钥<br style="clear: both; width: 0px; height: 0px; " />ks.setKeyEntry(alias,pk,newkeypass.toCharArray(),cchain);向密钥库中添加条目<br style="clear: both; width: 0px; height: 0px; " />第一个参数指定所添加条目的别名，假如使用已存在别名将覆盖已存在条目，使用新别名将增加一个新条目，第二个参数为条目的私钥，第三个为设置的新口令，第四个为该私钥的公钥的证书链<br style="clear: both; width: 0px; height: 0px; " />FileOutputStream output=new FileOutputStream("another");<br style="clear: both; width: 0px; height: 0px; " />ks.store(output,storepass.toCharArray())将keystore对象内容写入新文件<br style="clear: both; width: 0px; height: 0px; " /><strong>八：JAVA程序检验别名和删除条目</strong><br style="clear: both; width: 0px; height: 0px; " />FileInputStream in=new FileInputStream(".keystore");<br style="clear: both; width: 0px; height: 0px; " />KeyStore ks=KeyStore.getInstance("JKS");<br style="clear: both; width: 0px; height: 0px; " />ks.load(in,storepass.toCharArray());<br style="clear: both; width: 0px; height: 0px; " />ks.containsAlias("sage");检验条目是否在密钥库中，存在返回true<br style="clear: both; width: 0px; height: 0px; " />ks.deleteEntry("sage");删除别名对应的条目<br style="clear: both; width: 0px; height: 0px; " />FileOutputStream output=new FileOutputStream(".keystore");<br style="clear: both; width: 0px; height: 0px; " />ks.store(output,storepass.toCharArray())将keystore对象内容写入文件,条目删除成功<br style="clear: both; width: 0px; height: 0px; " /><strong>九：JAVA程序签发数字证书</strong><br style="clear: both; width: 0px; height: 0px; " />（1）从密钥库中读取CA的证书<br style="clear: both; width: 0px; height: 0px; " />FileInputStream in=new FileInputStream(".keystore");<br style="clear: both; width: 0px; height: 0px; " />KeyStore ks=KeyStore.getInstance("JKS");<br style="clear: both; width: 0px; height: 0px; " />ks.load(in,storepass.toCharArray());<br style="clear: both; width: 0px; height: 0px; " />java.security.cert.Certificate c1=ks.getCertificate("caroot");<br style="clear: both; width: 0px; height: 0px; " />（2）从密钥库中读取CA的私钥<br style="clear: both; width: 0px; height: 0px; " />PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass.toCharArray());<br style="clear: both; width: 0px; height: 0px; " />（3）从CA的证书中提取签发者的信息<br style="clear: both; width: 0px; height: 0px; " />byte[] encod1=c1.getEncoded();提取CA证书的编码<br style="clear: both; width: 0px; height: 0px; " />X509CertImpl cimp1=new X509CertImpl(encod1);　用该编码创建X509CertImpl类型对象<br style="clear: both; width: 0px; height: 0px; " />X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);　获取X509CertInfo对象<br style="clear: both; width: 0px; height: 0px; " />X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME); 获取X509Name类型的签发者信息<br style="clear: both; width: 0px; height: 0px; " />（4）获取待签发的证书<br style="clear: both; width: 0px; height: 0px; " />CertificateFactory cf=CertificateFactory.getInstance("X.509");<br style="clear: both; width: 0px; height: 0px; " />FileInputStream in2=new FileInputStream("user.csr");<br style="clear: both; width: 0px; height: 0px; " />java.security.cert.Certificate c2=cf.generateCertificate(in);<br style="clear: both; width: 0px; height: 0px; " />（5）从待签发的证书中提取证书信息<br style="clear: both; width: 0px; height: 0px; " />byte [] encod2=c2.getEncoded();<br style="clear: both; width: 0px; height: 0px; " />X509CertImpl cimp2=new X509CertImpl(encod2);　用该编码创建X509CertImpl类型对象<br style="clear: both; width: 0px; height: 0px; " />X509CertInfo cinfo2=(X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO);　获取X509CertInfo对象<br style="clear: both; width: 0px; height: 0px; " />（6）设置新证书有效期<br style="clear: both; width: 0px; height: 0px; " />Date begindate=new Date(); 获取当前时间<br style="clear: both; width: 0px; height: 0px; " />Date enddate=new Date(begindate.getTime()+3000*24*60*60*1000L); 有效期为3000天<br style="clear: both; width: 0px; height: 0px; " />CertificateValidity cv=new CertificateValidity(begindate,enddate); 创建对象<br style="clear: both; width: 0px; height: 0px; " />cinfo2.set(X509CertInfo.VALIDITY,cv);　设置有效期<br style="clear: both; width: 0px; height: 0px; " />（7）设置新证书序列号<br style="clear: both; width: 0px; height: 0px; " />int sn=(int)(begindate.getTime()/1000);以当前时间为序列号<br style="clear: both; width: 0px; height: 0px; " />CertificateSerialNumber csn=new CertificateSerialNumber(sn);<br style="clear: both; width: 0px; height: 0px; " />cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);<br style="clear: both; width: 0px; height: 0px; " />（8）设置新证书签发者<br style="clear: both; width: 0px; height: 0px; " />cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);应用第三步的结果<br style="clear: both; width: 0px; height: 0px; " />（9）设置新证书签名算法信息<br style="clear: both; width: 0px; height: 0px; " />AlgorithmId algorithm=new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);<br style="clear: both; width: 0px; height: 0px; " />cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm);<br style="clear: both; width: 0px; height: 0px; " />（10）创建证书并使用CA的私钥对其签名<br style="clear: both; width: 0px; height: 0px; " />X509CertImpl newcert=new X509CertImpl(cinfo2);<br style="clear: both; width: 0px; height: 0px; " />newcert.sign(caprk,"MD5WithRSA"); 使用CA私钥对其签名<br style="clear: both; width: 0px; height: 0px; " />（11）将新证书写入密钥库<br style="clear: both; width: 0px; height: 0px; " />ks.setCertificateEntry("lf_signed",newcert);<br style="clear: both; width: 0px; height: 0px; " />FileOutputStream out=new FileOutputStream("newstore");<br style="clear: both; width: 0px; height: 0px; " />ks.store(out,"newpass".toCharArray());　这里是写入了新的密钥库，也可以使用第七条来增加条目<br style="clear: both; width: 0px; height: 0px; " /><strong>十：数字证书的检验</strong><br style="clear: both; width: 0px; height: 0px; " />（1）验证证书的有效期<br style="clear: both; width: 0px; height: 0px; " />（a）获取X509Certificate类型对象<br style="clear: both; width: 0px; height: 0px; " />CertificateFactory cf=CertificateFactory.getInstance("X.509");<br style="clear: both; width: 0px; height: 0px; " />FileInputStream in1=new FileInputStream("aa.crt");<br style="clear: both; width: 0px; height: 0px; " />java.security.cert.Certificate　c1=cf.generateCertificate(in1);<br style="clear: both; width: 0px; height: 0px; " />X509Certificate t=(X509Certificate)c1;<br style="clear: both; width: 0px; height: 0px; " />in2.close();<br style="clear: both; width: 0px; height: 0px; " />（b）获取日期<br style="clear: both; width: 0px; height: 0px; " />Date TimeNow=new Date();<br style="clear: both; width: 0px; height: 0px; " />（c）检验有效性<br style="clear: both; width: 0px; height: 0px; " />try{<br style="clear: both; width: 0px; height: 0px; " />t.checkValidity(TimeNow);<br style="clear: both; width: 0px; height: 0px; " />System.out.println("OK");<br style="clear: both; width: 0px; height: 0px; " />}catch(CertificateExpiredException e){　//过期<br style="clear: both; width: 0px; height: 0px; " />System.out.println("Expired");<br style="clear: both; width: 0px; height: 0px; " />System.out.println(e.getMessage());<br style="clear: both; width: 0px; height: 0px; " />}catch((CertificateNotYetValidException e){ //尚未生效<br style="clear: both; width: 0px; height: 0px; " />System.out.println("Too early");<br style="clear: both; width: 0px; height: 0px; " />System.out.println(e.getMessage());}<br style="clear: both; width: 0px; height: 0px; " />（2）验证证书签名的有效性<br style="clear: both; width: 0px; height: 0px; " />（a）获取CA证书<br style="clear: both; width: 0px; height: 0px; " />CertificateFactory cf=CertificateFactory.getInstance("X.509");<br style="clear: both; width: 0px; height: 0px; " />FileInputStream in2=new FileInputStream("caroot.crt");<br style="clear: both; width: 0px; height: 0px; " />java.security.cert.Certificate　cac=cf.generateCertificate(in2);<br style="clear: both; width: 0px; height: 0px; " />in2.close();<br style="clear: both; width: 0px; height: 0px; " />（c）获取CA的公钥<br style="clear: both; width: 0px; height: 0px; " />PublicKey pbk=cac.getPublicKey();<br style="clear: both; width: 0px; height: 0px; " />（b）获取待检验的证书（上步已经获取了，就是C1）<br style="clear: both; width: 0px; height: 0px; " />（c）检验证书<br style="clear: both; width: 0px; height: 0px; " />boolean pass=false;<br style="clear: both; width: 0px; height: 0px; " />try{<br style="clear: both; width: 0px; height: 0px; " />c1.verify(pbk);<br style="clear: both; width: 0px; height: 0px; " />pass=true;<br style="clear: both; width: 0px; height: 0px; " />}catch(Exception e){<br style="clear: both; width: 0px; height: 0px; " />pass=false;<br style="clear: both; width: 0px; height: 0px; " />System.out.println(e);<br style="clear: both; width: 0px; height: 0px; " />}&nbsp;</div><div></div></div></span><img src ="http://www.blogjava.net/xzclog/aggbug/428610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2015-12-11 11:40 <a href="http://www.blogjava.net/xzclog/archive/2015/12/11/428610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DER 和 PEM 格式</title><link>http://www.blogjava.net/xzclog/archive/2015/10/01/427579.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 01 Oct 2015 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2015/10/01/427579.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/427579.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2015/10/01/427579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/427579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/427579.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #555555; font-family: simsun; background-color: #98b774; "><h2 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; ">X509 文件扩展名</h2><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; ">首先我们要理解文件的扩展名代表什么。DER、PEM、CRT和CER这些扩展名经常令人困惑。很多人错误地认为这些扩展名可以互相代替。尽管的确有时候有些扩展名是可以互换的，但是最好你能确定证书是如何编码的，进而正确地标识它们。正确地标识证书有助于证书的管理。</p><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; "><br /></p><h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><a name="t2" style="text-decoration: underline; color: #64814c; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a>编码 (也用于扩展名)</h3><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: disc; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">.DER</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr></span>=&nbsp;<strong style="font-weight: bold; "><font color="#ED1C24" style="word-wrap: normal; word-break: normal; line-height: 21px; ">扩展名DER用于二进制<font color="#22B14C" style="word-wrap: normal; word-break: normal; line-height: 21px; ">DER编码</font>的证书。</font></strong>这些证书也可以用CER或者CRT作为扩展名。比较合适的说法是&#8220;我有一个DER编码的证书&#8221;，而不是&#8220;我有一个DER证书&#8221;。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: disc; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><strong style="font-weight: bold; "><font color="#ED1C24" style="word-wrap: normal; word-break: normal; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">.PEM</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr></span>= 扩展名PEM用于ASCII(Base64)编码的各种X.509 v3 证书</font>。</strong>文件开始由一行"&#8212;&#8211; BEGIN &#8230;&#8220;开始。</li></ul><br /><h3 style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><a name="t3" style="text-decoration: underline; color: #64814c; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a>常用的扩展名</h3><ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: disc; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">.CRT</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr></span>= 扩展名CRT用于证书。证书可以是DER编码，也可以是PEM编码。扩展名CER和CRT几乎是同义词。这种情况在各种unix/linux系统中很常见。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: disc; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">CER</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr></span>= CRT证书的微软型式。可以用微软的工具把CRT文件转换为CER文件（CRT和CER必须是相同编码的，DER或者PEM）。扩展名为CER的文件可以被IE识别并作为命令调用微软的cryptoAPI（具体点就是rudll32.exe cryptext.dll, CyrptExtOpenCER），进而弹出一个对话框来导入并/或查看证书内容。</li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 30px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: disc; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">.KEY</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr></span>= 扩展名KEY用于PCSK#8的公钥和私钥。这些公钥和私钥可以是DER编码或者PEM编码。</li></ul><p style="margin-top: 0px; margin-right: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; border-style: initial; border-color: initial; word-wrap: normal; word-break: normal; line-height: 21px; ">CRT文件和CER文件只有在使用相同编码的时候才可以安全地相互替代。</p></span><img src ="http://www.blogjava.net/xzclog/aggbug/427579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2015-10-01 10:12 <a href="http://www.blogjava.net/xzclog/archive/2015/10/01/427579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解 Java中的 流 (Stream)</title><link>http://www.blogjava.net/xzclog/archive/2015/07/16/426249.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 16 Jul 2015 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2015/07/16/426249.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/426249.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2015/07/16/426249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/426249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/426249.html</trackback:ping><description><![CDATA[转自：<span class="Apple-style-span" style="color: #4b4b4b; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; background-color: #ffffff; "><span class="Apple-style-span" style="color: #000000; font-family: verdana, 'courier new'; font-size: 14px; line-height: 21px; "><a href="http://www.cnblogs.com/shitouer/archive/2012/12/19/2823641.html">http://www.cnblogs.com/shitouer/archive/2012/12/19/2823641.html</a></span><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">最近在看《Hadoop:The Definitive Guide》，对其分布式文件系统HDFS的Streaming data access不能理解。基于流的数据读写，太抽象了，什么叫基于流，什么是流？Hadoop是Java语言写的，所以想理解好Hadoop的Streaming Data Access，还得从Java流机制入手。流机制也是JAVA及C++中的一个重要的机制，通过流使我们能够自由地操作包括文件，内存，IO设备等等中的数据。</p><h2 style="font-size: 21px; font-weight: bold; ">首先，流是什么？</h2><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">流是个抽象的概念，是对输入输出设备的抽象，Java程序中，对于数据的输入/输出操作都是以&#8220;流&#8221;的方式进行。设备可以是文件，网络，内存等。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: center; "><img src="http://pic002.cnblogs.com/images/2012/79891/2012121818014532.png" alt="" width="265" height="273" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">流具有方向性，至于是输入流还是输出流则是一个相对的概念，一般以程序为参考，如果数据的流向是程序至设备，我们成为输出流，反之我们称为输入流。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">可以将流想象成一个&#8220;水流管道&#8221;，水流就在这管道中形成了，自然就出现了方向的概念。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; "><img src="http://pic002.cnblogs.com/images/2012/79891/2012121719220226.jpg" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; display: block; margin-left: auto; margin-right: auto; " /></p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">当程序需要从某个数据源读入数据的时候，就会开启一个输入流，数据源可以是文件、内存或网络等等。相反地，需要写出数据到某个数据源目的地的时候，也会开启一个输出流，这个数据源目的地也可以是文件、内存或网络等等。</p><h2 style="font-size: 21px; font-weight: bold; ">流有哪些分类？</h2><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">可以从不同的角度对流进行分类：</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">1. 处理的数据单位不同，可分为：字符流，字节流</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">2.数据流方向不同，可分为：输入流，输出流</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">3.功能不同，可分为：节点流，处理流</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">1. 和 2. 都比较好理解，对于根据功能分类的，可以这么理解：</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; "><strong>节点流</strong>：节点流从一个特定的数据源读写数据。即节点流是直接操作文件，网络等的流，例如FileInputStream和FileOutputStream，他们直接从文件中读取或往文件中写入字节流。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: center; "><img src="http://pic002.cnblogs.com/images/2012/79891/2012121818051872.png" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; "><strong>处理流</strong>：&#8220;连接&#8221;在已存在的流（节点流或处理流）之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是使用一个已经存在的输入流或输出流连接创建的，过滤流就是对节点流进行一系列的包装。例如BufferedInputStream和BufferedOutputStream，使用已经存在的节点流来构造，提供带缓冲的读写，提高了读写的效率，以及DataInputStream和DataOutputStream，使用已经存在的节点流来构造，提供了读写Java中的基本数据类型的功能。他们都属于过滤流。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: center; "><img src="http://pic002.cnblogs.com/images/2012/79891/2012121818440350.png" alt="" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">举个简单的例子：</p><div class="cnblogs_code" style="font-size: 12px !important; margin-top: 5px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; color: #000000; "><div class="cnblogs_code_toolbar" style="margin-top: 5px; background-color: #f5f5f5; "><span class="cnblogs_code_copy" style="line-height: 1.5 !important; font-size: 12px !important; padding-right: 5px; "><a href="http://www.cnblogs.com/shitouer/archive/2012/12/19/2823641.html" title="复制代码" style="color: #1a8bc8; text-decoration: none; background-color: #f5f5f5 !important; border-top-style: none !important; border-right-style: none !important; border-bottom-style: none !important; border-left-style: none !important; border-width: initial !important; border-color: initial !important; "><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; background-color: #f5f5f5 !important; border-top-style: none !important; border-right-style: none !important; border-bottom-style: none !important; border-left-style: none !important; border-width: initial !important; border-color: initial !important; " /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important; font-size: 12px !important; ">public static void main(String[] args) throws IOException {
        // 节点流FileOutputStream直接以A.txt作为数据源操作
        FileOutputStream fileOutputStream = new FileOutputStream("A.txt");
        // 过滤流BufferedOutputStream进一步装饰节点流，提供缓冲写
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
                fileOutputStream);
        // 过滤流DataOutputStream进一步装饰过滤流，使其提供基本数据类型的写
        DataOutputStream out = new DataOutputStream(bufferedOutputStream);
        out.writeInt(3);
        out.writeBoolean(true);
        out.flush();
        out.close();
        // 此处输入节点流，过滤流正好跟上边输出对应，读者可举一反三
        DataInputStream in = new DataInputStream(new BufferedInputStream(
                new FileInputStream("A.txt")));
        System.out.println(in.readInt());
        System.out.println(in.readBoolean());
        in.close();
}</pre><div class="cnblogs_code_toolbar" style="margin-top: 5px; background-color: #f5f5f5; "><span class="cnblogs_code_copy" style="line-height: 1.5 !important; font-size: 12px !important; padding-right: 5px; "><a href="http://www.cnblogs.com/shitouer/archive/2012/12/19/2823641.html" title="复制代码" style="color: #1a8bc8; text-decoration: none; background-color: #f5f5f5 !important; border-top-style: none !important; border-right-style: none !important; border-bottom-style: none !important; border-left-style: none !important; border-width: initial !important; border-color: initial !important; "><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; background-color: #f5f5f5 !important; border-top-style: none !important; border-right-style: none !important; border-bottom-style: none !important; border-left-style: none !important; border-width: initial !important; border-color: initial !important; " /></a></span></div></div><h2 style="font-size: 21px; font-weight: bold; "><strong>流结构介绍</strong>：</h2><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">Java所有的流类位于java.io包中，都分别继承字以下四种抽象流类型。</p><table border="0" style="border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; word-break: break-word; height: 62px; width: 350px; "><tbody><tr><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; ">&nbsp;</td><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; ">字节流</td><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; ">字符流</td></tr><tr><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; ">输入流</td><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; ">InputStream</td><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; ">Reader</td></tr><tr><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; ">输出流</td><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; text-align: left; ">OutputStream</td><td style="font-size: 12px; color: #454545; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; border-collapse: collapse; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; ">Writer</td></tr></tbody></table><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">1.继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据，且数据的单位都是字节(byte=8bit)，如图，深色的为节点流，浅色的为处理流。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; "><img src="http://pic002.cnblogs.com/images/2012/79891/2012121818562293.png" alt="" width="431" height="193" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " />&nbsp;<img src="http://pic002.cnblogs.com/images/2012/79891/2012121819001442.png" alt="" width="433" height="192" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; ">2.继承自Reader/Writer的流都是用于向程序中输入/输出数据，且数据的单位都是字符(2byte=16bit)，如图，深色的为节点流，浅色的为处理流。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; "><img src="http://pic002.cnblogs.com/images/2012/79891/2012121819033620.png" alt="" width="410" height="189" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /><img src="http://pic002.cnblogs.com/images/2012/79891/2012121819042121.png" alt="" width="415" height="205" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; " /></p><h2 style="font-size: 21px; font-weight: bold; ">常见流类介绍：</h2><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; "><strong>节点流类型常见的有：</strong></p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">对文件操作的字符流有FileReader/FileWriter，字节流有FileInputStream/FileOutputStream。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; "><strong>处理流类型常见的有：</strong></p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">缓冲流：缓冲流要&#8220;套接&#8221;在相应的节点流之上，对读写的数据提供了缓冲的功能，提高了读写效率，同事增加了一些新的方法。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">　　字节缓冲流有BufferedInputStream/BufferedOutputStream，字符缓冲流有BufferedReader/BufferedWriter，字符缓冲流分别提供了读取和写入一行的方法ReadLine和NewLine方法。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">　　对于输出地缓冲流，写出的数据，会先写入到内存中，再使用flush方法将内存中的数据刷到硬盘。所以，在使用字符缓冲流的时候，一定要先flush，然后再close，避免数据丢失。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">转换流：用于字节数据到字符数据之间的转换。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">　　仅有字符流InputStreamReader/OutputStreamWriter。其中，InputStreamReader需要与InputStream&#8220;套接&#8221;，OutputStreamWriter需要与OutputStream&#8220;套接&#8221;。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">数据流：提供了读写Java中的基本数据类型的功能。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">　　DataInputStream和DataOutputStream分别继承自InputStream和OutputStream，需要&#8220;套接&#8221;在InputStream和OutputStream类型的节点流之上。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">对象流：用于直接将对象写入写出。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">　　流类有ObjectInputStream和ObjectOutputStream，本身这两个方法没什么，但是其要写出的对象有要求，该对象必须实现Serializable接口，来声明其是可以序列化的。否则，不能用对象流读写。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">　　还有一个关键字比较重要，transient，由于修饰实现了Serializable接口的类内的属性，被该修饰符修饰的属性，在以对象流的方式输出的时候，该字段会被忽略。</p><p style="line-height: 1.5; margin-top: 10px; margin-bottom: 10px; text-align: left; ">&nbsp;</p></span><img src ="http://www.blogjava.net/xzclog/aggbug/426249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2015-07-16 11:36 <a href="http://www.blogjava.net/xzclog/archive/2015/07/16/426249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 命令参数详解：-D</title><link>http://www.blogjava.net/xzclog/archive/2015/01/21/422309.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 21 Jan 2015 02:09:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2015/01/21/422309.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/422309.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2015/01/21/422309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/422309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/422309.html</trackback:ping><description><![CDATA[<div><div id="sina_keyword_ad_area2"  "=""> 			<p>JAVA 命令参数详解：</p> <p> 1、-D&lt;name&gt;=&lt;value&gt; set a system property&nbsp;<wbr> 设置系统属性。</p> <div><a href="http://www.blogjava.net/chenlb/archive/2008/06/22/209957.html" name="viewpost1_TitleUrl">java -D参数简化加入多个jar</a></div> <p> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> java命令引入jar时可以-cp参数，但时-cp不能用通配符(多个jar时什么烦要一个个写,不能*.jar)，面通常的jar都在同一目录，且多于1个。前些日子找到（发现）-Djava.ext.dirs太好。</p> <p>如：</p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"> <span style="color: #000000">java&nbsp;<wbr></span><span style="color: #000000">-</span><span style="color: #000000">Djava.ext.dirs</span><span style="color: #000000">=</span><span style="color: #000000">lib&nbsp;<wbr>MyClass&nbsp;<wbr>&nbsp;<wbr></span></div> <p>&nbsp;<wbr></p> <p>可以在运行前配置一些属性，比如路径什么的。<br /> <br /> java -Dconfig="d:/config/config.xml" Abc<br /> <br /> 这样在Abc中就可以通过System.getProperty("config");获得这个值了。</p> <p>&nbsp;<wbr></p> <p>&nbsp;<wbr></p> <p>在虚拟机的系统属性中设置属性名/值对，运行在此虚拟机之上的应用程序可用<br /> 当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。</p> <p>另外，javac -d &lt;目录&gt; 指定存放生成的类文件的位置</p> <p>Standard System Properties</p> <p>&nbsp;<wbr></p> <table align="center" width="80%" border="1" cellpadding="2"> <tbody> <tr> <th>Key</th> <th>Meaning</th> </tr> <tr> <td><code>"file.separator"</code></td> <td>Character that separates components of a file path. This is "<code>/</code>" on UNIX and "<code>\</code>" on Windows.</td> </tr> <tr> <td><code>"java.class.path"</code></td> <td>Path used to find directories and JAR archives containing class files. Elements of the class path are separated by a platform-specific character specified in the <code>path.separator</code> property.</td> </tr> <tr> <td><code>"java.home"</code></td> <td>Installation directory for Java Runtime Environment (JRE)</td> </tr> <tr> <td><code>"java.vendor"</code></td> <td>JRE vendor name</td> </tr> <tr> <td><code>"java.vendor.url"</code></td> <td>JRE vender URL</td> </tr> <tr> <td><code>"java.version"</code></td> <td>JRE version number</td> </tr> <tr> <td><code>"line.separator"</code></td> <td>Sequence used by operating system to separate lines in text files</td> </tr> <tr> <td><code>"os.arch"</code></td> <td>Operating system architecture</td> </tr> <tr> <td><code>"os.name"</code></td> <td>Operating system name</td> </tr> <tr> <td><code>"os.version"</code></td> <td>Operating system version</td> </tr> <tr> <td><code>"path.separator"</code></td> <td>Path separator character used in <code>java.class.path</code></td> </tr> <tr> <td><code>"user.dir"</code></td> <td>User working directory</td> </tr> <tr> <td><code>"user.home"</code></td> <td>User home directory</td> </tr> <tr> <td><code>"user.name"</code></td> <td>User account name</td> </tr> </tbody> </table> <p>&nbsp;<wbr></p> <p>&nbsp;<wbr></p> <p>&nbsp;<wbr></p> <p>所谓的 system porperty，system 指的是 JRE (runtime)system，不是指 OS。<br /> <br /> System.setProperty("net.jxta.tls.principal", "client");<br /> System.setProperty("net.jxta.tls.password", "password");<br /> System.setProperty("JXTA_HOME",System.getProperty("JXTA_HOME","client"));<br />  可以利用系统属性来加载多个驱动</p></div></div><img src ="http://www.blogjava.net/xzclog/aggbug/422309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2015-01-21 10:09 <a href="http://www.blogjava.net/xzclog/archive/2015/01/21/422309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态html文件js读取url参数 </title><link>http://www.blogjava.net/xzclog/archive/2011/12/12/366165.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 12 Dec 2011 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/12/12/366165.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/366165.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/12/12/366165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/366165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/366165.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text"><font size="2">在ajax应用流行时，有时我们可能为了降低服务器的负担，把动态内容生成静态html页面或者是xml文件，供客户端访问！但是在我们的网站或系统中往住页面中某些部分是在后台没有进行修改时，其内容不会发生变化的。但是页面中也往往有部分内容是动态的更新的，比如一个新闻页面，新闻内容往往生成了之后就是静态的，但是新闻的最新评论往往是变化的，在这个时候有几种解决方案：<br /><br /></font>1、重新生成该静态页面，优点是用户访问时页面上的肉容可以实现全静态，不与服务器程序及数据库后端打交道！缺点是每次用户对页面任何部分更新都必须重新生成。<br /><br />2、js调用请求动态内容，优点是静态页面只生成一次，动态部分才动态加载，却点是服务器端要用输出一段js代码并用js代码输出网页内容，也不利于搜索引擎收录。<br /><br />3、ajax调用动态内容，和js基本相似，只是与服务器交互的方式不同！并且页面显示不会受到因动态调用速度慢而影响整个页面的加载速度！至于ajax不利于搜索收录，当然在《ajax <span style="color: #0000ff">in</span> acation》等相关书籍中也介绍有变向的解决方案！<br /><br />4、在服务器端ssl动态内容，用服务器端优化及缓存解决是时下最流行的方法！<br /><br />对于第二种和第三种方法都是我最青睐的静态解决方法，适合以内容为主的中小型网站。那么在有时候可能会有js读取url参数的需求，事实证明的确也有很多时候有这种需求，特别是在胖客户端的情况下！以前也写过这样的代码，其实原理很简单就是利用javascript接口提供location对像得到url地址，然后通过分析url以取得参数，以下是我收录的一些优秀的url参数读取代码：<br /><br />一、字符串分割分析法。<br />这里是一个获取URL+?带QUESTRING参数的JAVASCRIPT客户端解决方案，相当于asp的request.querystring，PHP的$_GET<br />函数:<br /><br />&lt;script&gt;<br /><span style="color: #0000ff">function</span> GetRequest()<br />{<br /><span style="color: #0000ff">var</span> url = location.search; <span style="color: #008000">//获取url中"?"符后的字串</span><br /><span style="color: #0000ff">var</span> theRequest = <span style="color: #0000ff">new</span> <span style="color: #808000">Object</span>();<br /><span style="color: #0000ff">if</span>(url.indexOf(<span style="color: #ff00ff">"?"</span>) != -1)<br />{ <br />&nbsp;&nbsp;<span style="color: #0000ff">var</span> str = url.substr(1);<br />&nbsp;&nbsp;&nbsp; strs = str.split(<span style="color: #ff00ff">"&amp;"</span>);<br />&nbsp;&nbsp;<span style="color: #0000ff">for</span>(<span style="color: #0000ff">var</span> i = 0; i &lt; strs.length; i ++)<br />&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp; theRequest[strs[i].split(<span style="color: #ff00ff">"="</span>)[0]]=unescape(strs[i].split(<span style="color: #ff00ff">"="</span>)[1]);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><span style="color: #0000ff">return</span> theRequest;<br />}<br />&lt;/script&gt;<br /><br />然后我们通过调用此函数获取对应参数值：<br /><br />&lt;script&gt;<br /><span style="color: #0000ff">var</span> Request=<span style="color: #0000ff">new</span> <span style="color: #808000">Object</span>();<br />Request=GetRequest();<br /><span style="color: #0000ff">var</span> 参数1,参数2,参数3,参数N;<br />参数1=Request[<span style="color: #ff00ff">'参数1'</span>];<br />参数2=Request[<span style="color: #ff00ff">'参数2'</span>];<br />参数3=Request[<span style="color: #ff00ff">'参数3'</span>];<br />参数N=Request[<span style="color: #ff00ff">'参数N'</span>];<br />&lt;/script&gt;<br /><br /><br />以此获取url串中所带的同名参数<br /><br />二、正则分析法。<br /><br /><span style="color: #0000ff">function</span>&nbsp;&nbsp;&nbsp;&nbsp; GetQueryString(name)&nbsp;&nbsp;&nbsp;<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">var</span>&nbsp;&nbsp;&nbsp;&nbsp; reg&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">new</span>&nbsp;&nbsp;&nbsp;<span style="color: #808000">RegExp</span>(<span style="color: #ff00ff">"(^|&amp;)"</span>+&nbsp;&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp;&nbsp; +<span style="color: #ff00ff">"=([^&amp;]*)(&amp;|$)"</span>);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">var</span>&nbsp;&nbsp;&nbsp;&nbsp; r&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;&nbsp;&nbsp; window.location.search.substr(1).match(reg);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">if</span>&nbsp;&nbsp;&nbsp;&nbsp; (r!=<span style="color: #0000ff">null</span>)&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;&nbsp;&nbsp;&nbsp; unescape(r[2]);&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">return</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">null</span>;&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;<br />alert(GetQueryString(<span style="color: #ff00ff">"参数名1"</span>));&nbsp;&nbsp;&nbsp;<br />alert(GetQueryString(<span style="color: #ff00ff">"参数名2"</span>));&nbsp;&nbsp;&nbsp;<br />alert(GetQueryString(<span style="color: #ff00ff">"参数名3"</span>));</div><img src ="http://www.blogjava.net/xzclog/aggbug/366165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-12-12 17:15 <a href="http://www.blogjava.net/xzclog/archive/2011/12/12/366165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Cookie 中文乱码解决方法 </title><link>http://www.blogjava.net/xzclog/archive/2011/10/03/359956.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 03 Oct 2011 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/10/03/359956.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/359956.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/10/03/359956.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/359956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/359956.html</trackback:ping><description><![CDATA[<ol><li><span class="keyword"><strong><font color="#7f0055">import</font></strong></span><span>&nbsp;java.net.*;&nbsp; &nbsp;&nbsp;</span></li><li><span>String&nbsp;&nbsp;&nbsp;key=URLEncoder.encode(</span><span class="string"><font color="#0000ff">"中文key"</font></span><span>,</span><span class="string"><font color="#0000ff">"GBK"</font></span><span>); &nbsp;&nbsp;</span></span></li><li><span>String&nbsp;&nbsp;&nbsp;value=URLEncoder.encode(</span><span class="string"><font color="#0000ff">"中文value"</font></span><span>,</span><span class="string"><font color="#0000ff">"GBK"</font></span><span>); &nbsp;&nbsp;</span></span></li><li><span>Cookie&nbsp;&nbsp;&nbsp;cook=</span><span class="keyword"><strong><font color="#7f0055">new</font></strong></span><span>&nbsp;Cookie(key,value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>String&nbsp;&nbsp;&nbsp;key=cook.getName(),value=cook.getValue();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>key=URLDecoder.decode(key,</span><span class="string"><font color="#0000ff">"GBK"</font></span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li><li><span>value=URLDecoder.decode(value,</span><span class="string"><font color="#0000ff">"GBK"</font></span><span>);&nbsp;&nbsp;&nbsp;</span></li></ol>
<p><span><br /><br />&nbsp;</p>
<p>String value = java.net.URLEncoder.encode("中文","utf-8");</p>
<p>Cookie cookie = new Cookie("chinese_code",value);</p>
<p>cookie.setMaxAge(60*60*24*6);</p>
<p>response.addCookie(cookie);</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>encode() 只有一个参数的已经过时了，现在可以设置编码格式， 取cookie值的时候 也不用解码了。</p>
<p></span>&nbsp;</p> <img src ="http://www.blogjava.net/xzclog/aggbug/359956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-10-03 11:29 <a href="http://www.blogjava.net/xzclog/archive/2011/10/03/359956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web.xml中load-on-startup的作用</title><link>http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 29 Sep 2011 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/359789.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/359789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/359789.html</trackback:ping><description><![CDATA[<span style="color: #1f4799">如下一段配置，熟悉DWR的再熟悉不过了：</span><br /><span style="color: #1f4799">&lt;servlet&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp; &lt;servlet-class&gt;org.directwebremoting.servlet.DwrServlet&lt;/servlet-class&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp; &lt;init-param&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp; &lt;/init-param&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</span><br /><span style="color: #1f4799">&lt;/servlet&gt;</span><br /><span style="color: #1f4799">&lt;servlet-mapping&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;</span><br /><span style="color: #1f4799">&nbsp;&nbsp; &lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt;</span><br /><span style="color: #1f4799">&lt;/servlet-mapping&gt;</span> 
<p><span style="color: #1f4799">我们注意到它里面包含了这段配置：&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;，那么这个配置有什么作用呢？</span></p>
<p><span style="color: #1f4799">贴一段英文原汁原味的解释如下：</span><br /><span style="color: #1f4799">Servlet specification:</span><br /><span style="color: #1f4799">The load-on-startup element indicates that this servlet should be loaded (</span><span style="color: red">instantiated and have its init() called</span><span style="color: #1f4799">) on the startup of the web application. The optional contents of these element must be an integer indicating the order in which the servlet should be loaded. If the value is a negative integer, or the element is not present, the container is free to load the servlet whenever it chooses.&nbsp;&nbsp; If the value is a positive integer or 0, the container must load and initialize the servlet as the application is deployed. The container must guarantee that servlets marked with lower integers are loaded before servlets marked with higher integers. The container may choose the order of loading of servlets with the same load-on-start-up value.</span></p>
<p><span style="color: #1f4799">翻译过来的意思大致如下：</span><br /><span style="color: #1f4799">1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。</span></p>
<p><span style="color: #1f4799">2)它的值必须是一个整数，表示servlet应该被载入的顺序</span></p>
<p><span style="color: #1f4799">2)当值为0或者大于0时，表示容器在应用启动时就加载并初始化这个servlet；</span></p>
<p><span style="color: #1f4799">3)当值小于0或者没有指定时，则表示容器在该servlet被选择时才会去加载。</span></p>
<p><span style="color: #1f4799">4)正数的值越小，该servlet的优先级越高，应用启动时就越先加载。</span></p>
<p><span style="color: #1f4799">5)当值相同时，容器就会自己选择顺序来加载。</span></p>
<p><span style="color: #1f4799">所以，&lt;load-on-startup&gt;x&lt;/load-on-startup&gt;，中x的取值1，2，3，4，5代表的是优先级，而非启动延迟时间。</span></p>
<p><span style="color: #1f4799">如下题目：</span></p><span style="color: #1f4799">
<p><span>2.web.xml<span style="font-family: 宋体">中不包括哪些定义（多选）</span></span><span></span></p>
<p><span></span></p>
<p><span>a.<span style="font-family: 宋体">默认起始页</span></span><span></span></p>
<p><span></span></p>
<p><span>b.servlet<span style="font-family: 宋体">启动延迟时间定义</span></span><span></span></p>
<p><span></span></p>
<p><span>c.error<span style="font-family: 宋体">处理页面</span></span><span></span></p>
<p><span></span></p>
<p><span>d.jsp<span style="font-family: 宋体">文件改动后重新载入时间</span></span><span></span></p>
<p><span></span></p>
<p><span>答案：<span style="font-family: Times New Roman">b,d</span></span><span></span></p></span>
<p><span style="color: #1f4799">通常大多数Servlet是在用户第一次请求的时候由应用服务器创建并初始化，但&lt;load-on-startup&gt;n&lt;/load-on-startup&gt;&nbsp;&nbsp; 可以用来改变这种状况，根据自己需要改变加载的优先级！</span></p><img src ="http://www.blogjava.net/xzclog/aggbug/359789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-09-29 15:22 <a href="http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java keytool 使用总结(转)</title><link>http://www.blogjava.net/xzclog/archive/2011/09/15/358662.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 15 Sep 2011 00:30:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/09/15/358662.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/358662.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/09/15/358662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/358662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/358662.html</trackback:ping><description><![CDATA[<p><span style="font-size: small"><span style="font-size: 12px">Keytool是一个Java数据证书的管理工具 ,Keytool将密钥（key）和证书（certificates）存在一个称为keystore的文件中在keystore里，包含两种数据： <br /></span><span style="font-size: 12px; color: red">密钥实体（Key entity）&#8212;&#8212;密钥（secret key）又或者是私钥和配对公钥（采用非对称加密） <br /></span><span style="font-size: 12px; color: red">可信任的证书实体（trusted certificate entries）&#8212;&#8212;只包含公钥</span></span></p>
<p><span style="font-size: small"><br /><span style="font-size: 12px">ailas(别名)每个keystore都关联这一个独一无二的alias，这个alias通常不区分大小写</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="font-size: 12px"><span style="color: #ff0000">JDK中keytool常用命令:</span><br /><br />-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名，mykey中包含用户的公钥、私钥和证书<br />(在没有指定生成位置的情况下,keystore会存在用户系统默认目录，如：对于window xp系统，会生成在系统的C:\Documents and Settings\UserName\文件名为&#8220;.keystore&#8221;)<br />-alias 产生别名<br />-keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中)<br />-keyalg 指定密钥的算法 (如 RSA DSA（如果不指定默认采用DSA）)<br />-validity 指定创建的证书有效期多少天<br />-keysize 指定密钥长度<br />-storepass 指定密钥库的密码(获取keystore信息所需的密码)<br />-keypass 指定别名条目的密码(私钥的密码)<br />-dname 指定证书拥有者信息 例如： "CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码"<br />-list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码<br />-v 显示密钥库中的证书详细信息<br />-export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码<br />-file 参数指定导出到文件的文件名<br />-delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore -storepass 密码<br />-printcert 查看导出的证书信息 keytool -printcert -file yushan.crt<br />-keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage<br />-storepasswd 修改keystore口令 keytool -storepasswd -keystore e:\yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)<br />-import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="font-size: 12px">下面是各选项的缺省值。 <br />-alias "mykey"<br /><br />-keyalg "DSA"<br /><br />-keysize 1024<br /><br />-validity 90<br /><br />-keystore 用户宿主目录中名为 .keystore 的文件<br /><br />-file 读时为标准输入，写时为标准输出</span></span><span style="font-size: small"><br /><span style="font-size: 12px"><br /><br /><br /><span style="color: #ff0000">1、keystore的生成：</span><br /><br />分阶段生成：<br />keytool <span style="color: #ff0000">-genkey</span> -alias yushan(别名) -keypass yushan(别名密码) -keyalg RSA(算法) -keysize 1024(密钥长度) -validity 365(有效期，天单位) -keystore <br /><br />e:\yushan.keystore(指定生成证书的位置和证书名称) -storepass 123456(获取keystore信息的密码)；回车输入相关信息即可；<br /><br />一次性生成：<br />keytool -genkey -alias yushan -keypass yushan -keyalg RSA -keysize 1024 -validity 365 -keystore e:\yushan.keystore -storepass 123456 -dname "CN=(名字与<br /><br />姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)";(中英文即可)<br /><br /><span style="color: #ff0000">2、keystore信息的查看：</span><br />keytool<span style="color: #ff0000"> -list -v</span> -keystore e:\keytool\yushan.keystore -storepass 123456<br />显示内容：<br />---------------------------------------------------------------------<br />Keystore 类型： JKS<br />Keystore 提供者： SUN<br /><br />您的 keystore 包含 1 输入<br /><br />别名名称： yushan<br />创建日期： 2009-7-29<br />项类型: PrivateKeyEntry<br />认证链长度： 1<br />认证 [1]:<br />所有者:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国<br />签发人:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国<br />序列号:4a6f29ed<br />有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010<br />证书指纹:<br />MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3<br />SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8<br />签名算法名称:SHA1withRSA<br />版本: 3<br />--------------------------------------------------------------------</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="font-size: 12px">缺省情况下，-list 命令打印证书的 MD5 指纹。而如果指定了 -v 选项，将以可读格式打印证书，如果指定了 -rfc 选项，将以可打印的编码格式输出证书。</span></span></p>
<p><span style="font-size: small"><br /></span></p>
<p><span style="font-size: small"><span style="font-size: 12px">keytool <span style="color: #ff0000">-list -rfc</span> -keystore e:\yushan.keystore -storepass 123456</span></span></p>
<p><span style="font-size: small"><span style="font-size: 12px">显示：</span></span></p>
<p>-------------------------------------------------------------------------------------------------------</p>
<p>Keystore 类型： JKS<br />Keystore 提供者： SUN<br /><br />您的 keystore 包含 1 输入<br /><br />别名名称： yushan<br />创建日期： 2009-7-29<br />项类型: PrivateKeyEntry<br />认证链长度： 1<br />认证 [1]:<br />-----BEGIN CERTIFICATE-----<br />MIICSzCCAbSgAwIBAgIESm8p7TANBgkqhkiG9w0BAQUFADBqMQ8wDQYDVQQGDAbkuK3lm70xDzAN<br />BgNVBAgMBua5luWNlzEPMA0GA1UEBwwG5rmY5r2tMREwDwYDVQQKDAh4eOWNj+S8mjERMA8GA1UE<br />CwwIeHjlhazlj7gxDzANBgNVBAMTBnl1c2hhbjAeFw0wOTA3MjgxNjQwMTNaFw0xMDA3MjgxNjQw<br />MTNaMGoxDzANBgNVBAYMBuS4reWbvTEPMA0GA1UECAwG5rmW5Y2XMQ8wDQYDVQQHDAbmuZjmva0x<br />ETAPBgNVBAoMCHh45Y2P5LyaMREwDwYDVQQLDAh4eOWFrOWPuDEPMA0GA1UEAxMGeXVzaGFuMIGf<br />MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJoru1RQczRzTnBWxefVNspQBykS220rS8Y/oX3mZa<br />hjL4wLfOURzUuxxuVQR2jx7QI+XKME+DHQj9r6aAcLBCi/T1jwF8mVYxtpRuTzE/6KEZdhowEe70<br />liWLVE+hytLBHZ03Zhwcd6q5HUMu27du3MPQvqiwzTY7MrwIvQQ8iQIDAQABMA0GCSqGSIb3DQEB<br />BQUAA4GBAGoQQ1/FnTfkpQh+Ni6h3fZdn3sR8ZzDMbOAIYVLAhBb85XDJ8QZTarHbZMJcIdHxAl1<br />i08ct3E8U87V9t8GZFWVC4BFg/+zeFEv76SFpVE56iX7P1jpsu78z0m69hHlds77VJTdyfMSvtXv<br />sYHP3fxfzx9WyhipBwd8VPK/NgEP<br />-----END CERTIFICATE-----</p>
<p>-------------------------------------------------------------------------------------------------------<br /><span style="font-size: small"><br /><span style="font-size: 12px"><span style="color: #ff0000">3、证书的导出：</span><br /><br />keytool <span style="color: #ff0000">-export</span> -alias yushan -keystore e:\yushan.keystore -file e:\yushan.crt(指定导出的证书位置及证书名称) -storepass 123456<br /><br /><span style="color: #ff0000">4、查看导出的证书信息</span><br />keytool -printcert -file yushan.crt<br />显示：（在windows下可以双击yushan.crt查看）<br />-----------------------------------------------------------------------<br />所有者:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国<br />签发人:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国<br />序列号:4a6f29ed<br />有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010<br />证书指纹:<br />MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3<br />SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8<br />签名算法名称:SHA1withRSA<br />版本: 3<br />-----------------------------------------------------------------------<br /><br /><span style="color: #ff0000">5、证书的导入：</span><br />准备一个导入的证书：<br />keytool -genkey -alias shuany -keypass shuany -keyalg RSA -keysize 1024 -validity 365 -keystore e:\shuany.keystore -storepass 123456 -dname "CN=shuany, <br /><br />OU=xx, O=xx, L=xx, ST=xx, C=xx";<br />keytool <span style="color: #ff0000">-export</span> -alias shuany -keystore e:\shuany.keystore -file e:\shuany.crt -storepass 123456<br /><br />现在将shuany.crt 加入到yushan.keystore中：<br />keytool <span style="color: #ff0000">-import</span> -alias shuany(指定导入证书的别名，如果不指定默认为mykey,别名唯一，否则导入出错) -file e:\shuany.crt -keystore e:\yushan.keystore -storepass <br /><br />123456<br /><br />keytool <span style="color: #ff0000">-list </span>-v -keystore e:\keytool\yushan.keystore -storepass 123456<br />显示：<br />------------------------------------------------------------------------------<br />Keystore 类型： JKS<br />Keystore 提供者： SUN<br /><br />您的 keystore 包含 2 输入<br /><br />别名名称： yushan<br />创建日期： 2009-7-29<br />项类型: PrivateKeyEntry<br />认证链长度： 1<br />认证 [1]:<br />所有者:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国<br />签发人:CN=yushan, OU=xx公司, O=xx协会, L=湘潭, ST=湖南, C=中国<br />序列号:4a6f29ed<br />有效期: Wed Jul 29 00:40:13 CST 2009 至Thu Jul 29 00:40:13 CST 2010<br />证书指纹:<br />MD5:A3:D7:D9:74:C3:50:7D:10:C9:C2:47:B0:33:90:45:C3<br />SHA1:2B:FC:9E:3A:DF:C6:C4:FB:87:B8:A0:C6:99:43:E9:4C:4A:E1:18:E8<br />签名算法名称:SHA1withRSA<br />版本: 3<br /><br /><br />*******************************************<br />*******************************************<br /><br /><br />别名名称： shuany<br />创建日期： 2009-7-29<br />输入类型： trustedCertEntry<br /><br />所有者:CN=shuany, OU=xx, O=xx, L=xx, ST=xx, C=xx<br />签发人:CN=shuany, OU=xx, O=xx, L=xx, ST=xx, C=xx<br />序列号:4a6f2cd9<br />有效期: Wed Jul 29 00:52:41 CST 2009 至Thu Jul 29 00:52:41 CST 2010<br />证书指纹:<br />MD5:15:03:57:9B:14:BD:C5:50:21:15:47:1E:29:87:A4:E6<br />SHA1:C1:4F:8B:CD:5E:C2:94:77:B7:42:29:35:5C:BB:BB:2E:9E:F0:89:F5<br />签名算法名称:SHA1withRSA<br />版本: 3<br /><br /><br />*******************************************<br />*******************************************<br />------------------------------------------------------------------------------<br /><br /><span style="color: #ff0000">6、证书条目的删除：</span><br />keytool <span style="color: #ff0000">-delete</span> -alias shuany(指定需删除的别名) -keystore yushan.keystore -storepass 123456<br /><br /><span style="color: #ff0000">7、证书条目口令的修改：</span><br />keytool <span style="color: #ff0000">-keypasswd </span>-alias yushan(需要修改密码的别名) -keypass yushan(原始密码) -new 123456(别名的新密码) -keystore e:\yushan.keystore -storepass 123456<br /><br /><span style="color: #ff0000">8、keystore口令的修改：</span><br />keytool <span style="color: #008000">-storepasswd</span> -keystore e:\yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码)</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; color: #ff0000"><span style="font-size: 12px">9、修改keystore中别名为yushan的信息</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small"><span style="font-size: 12px">keytool <span style="color: #008000">-selfcert</span> -alias yushan -keypass yushan -keystore e:\yushan.keystore -storepass 123456 -dname "cn=yushan,ou=yushan,o=yushan,c=us</span></span></p><img src ="http://www.blogjava.net/xzclog/aggbug/358662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-09-15 08:30 <a href="http://www.blogjava.net/xzclog/archive/2011/09/15/358662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Buffalo Ajax框架使用 </title><link>http://www.blogjava.net/xzclog/archive/2011/06/16/352439.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 16 Jun 2011 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/06/16/352439.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/352439.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/06/16/352439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/352439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/352439.html</trackback:ping><description><![CDATA[buffalo-2.0（国人开发的Ajax框架），下载buffalo-2.0-bin就可以了，个人认为也下载buffalo-2.0-src<br />下载地址：<a href="http://sourceforge.net/project/showfiles.php?group_id=178867"><font color="#1a8bc8">http://sourceforge.net/project/showfiles.php?group_id=178867</font></a><br /><br />1．buffalo-2.0.jar<br />在buffalo-2.0-bin里，把它加到Web应用程序里的lib<br /><br />2．buffalo.js和prototype.js<br />我把这两个文件放到Web应用程序的scripts/目录下，buffalo.js在buffalo-2.0-bin里，prototype.js在buffalo-demo.war里找<br /><br />4．web.xml内容<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done"><span style="color: #0000ff" twffan="done">&lt;?</span><span style="color: #ff00ff" twffan="done">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff" twffan="done">?&gt;</span><span style="color: #000000" twffan="done"><br /></span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">web-app&nbsp;</span><span style="color: #ff0000" twffan="done">version</span><span style="color: #0000ff" twffan="done">="2.4"</span><span style="color: #ff0000" twffan="done">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="color: #0000ff" twffan="done">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000" twffan="done">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff" twffan="done">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000" twffan="done">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff" twffan="done">="http://java.sun.com/xml/ns/j2ee&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">servlet</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">servlet-name</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done">bfapp</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">servlet-name</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">servlet-class</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done">net.buffalo.web.servlet.ApplicationServlet</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">servlet-class</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">servlet</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">servlet-mapping</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">servlet-name</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done">bfapp</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">servlet-name</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">url-pattern</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done">/bfapp/*</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">url-pattern</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">servlet-mapping</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">web-app</span><span style="color: #0000ff" twffan="done">&gt;</span></div><br /><br />5．index.jsp文件<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done"><span style="color: #000000; background-color: #ffff00" twffan="done">&lt;%</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">@&nbsp;page&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">=</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">"</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">java</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">"</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">&nbsp;pageEncoding</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">=</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">"</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">UTF-8</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">"</span><span style="color: #000000; background-color: #ffff00" twffan="done">%&gt;</span><span style="color: #000000" twffan="done"><br /><br /><br /></span><span style="color: #0000ff" twffan="done">&lt;!</span><span style="color: #ff00ff" twffan="done">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br /></span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">html</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">head</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">title</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done">第一个&nbsp;buffalo&nbsp;示例程序</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">title</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">script&nbsp;</span><span style="color: #ff0000" twffan="done">language</span><span style="color: #0000ff" twffan="done">="JavaScript"</span><span style="color: #ff0000" twffan="done">&nbsp;src</span><span style="color: #0000ff" twffan="done">="scripts/prototype.js"</span><span style="color: #0000ff" twffan="done">&gt;&lt;/</span><span style="color: #800000" twffan="done">script</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">script&nbsp;</span><span style="color: #ff0000" twffan="done">language</span><span style="color: #0000ff" twffan="done">="JavaScript"</span><span style="color: #ff0000" twffan="done">&nbsp;src</span><span style="color: #0000ff" twffan="done">="scripts/buffalo.js"</span><span style="color: #0000ff" twffan="done">&gt;&lt;/</span><span style="color: #800000" twffan="done">script</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">script&nbsp;</span><span style="color: #ff0000" twffan="done">type</span><span style="color: #0000ff" twffan="done">="text/javascript"</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000; background-color: #f5f5f5" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5" twffan="done">var</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">&nbsp;endPoint</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">=</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">"</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">&lt;%=request.getContextPath()%&gt;/bfapp</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">"</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5" twffan="done">var</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">&nbsp;buffalo&nbsp;</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">=</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5" twffan="done">new</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">&nbsp;Buffalo(endPoint);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5" twffan="done">function</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">&nbsp;hello(me)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffalo.remoteCall(</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">"</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">demoService.getHello</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">"</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">,&nbsp;[me.value],&nbsp;</span><span style="color: #0000ff; background-color: #f5f5f5" twffan="done">function</span><span style="color: #000000; background-color: #f5f5f5" twffan="done">(reply)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(reply.getResult());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">script</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">head</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">body</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;输入你的名字:</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">input&nbsp;</span><span style="color: #ff0000" twffan="done">type</span><span style="color: #0000ff" twffan="done">="text"</span><span style="color: #ff0000" twffan="done">&nbsp;name</span><span style="color: #0000ff" twffan="done">="myname"</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;</span><span style="color: #800000" twffan="done">input&nbsp;</span><span style="color: #ff0000" twffan="done">type</span><span style="color: #0000ff" twffan="done">="button"</span><span style="color: #ff0000" twffan="done">&nbsp;value</span><span style="color: #0000ff" twffan="done">="Buffao远程调用"</span><span style="color: #ff0000" twffan="done">&nbsp;onclick</span><span style="color: #0000ff" twffan="done">="hello($('myname'));"</span><span style="color: #0000ff" twffan="done">&gt;&lt;</span><span style="color: #800000" twffan="done">br</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br />&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">body</span><span style="color: #0000ff" twffan="done">&gt;</span><span style="color: #000000" twffan="done"><br /></span><span style="color: #0000ff" twffan="done">&lt;/</span><span style="color: #800000" twffan="done">html</span><span style="color: #0000ff" twffan="done">&gt;</span></div><br />说明：remoteCall是远程调用方法，demoService是buffalo-service.properties文件的键，getHello是被调用java类方法名，me.value是传给getHello方法的参数，reply.getResult()是getHello返回的值。<br /><br />6．DemoService.java文件<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done"><span style="color: #0000ff" twffan="done">package</span><span style="color: #000000" twffan="done">&nbsp;demo.buffalo;<br /><br /></span><span style="color: #008000" twffan="done">/**</span><span style="color: #008000" twffan="done"><br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;@文件名&nbsp;demo.buffalo.DemoService.java<br />&nbsp;*&nbsp;@作者&nbsp;chenlb<br />&nbsp;*&nbsp;@创建时间&nbsp;2007-7-14&nbsp;下午12:42:17&nbsp;<br />&nbsp;</span><span style="color: #008000" twffan="done">*/</span><span style="color: #000000" twffan="done"><br /></span><span style="color: #0000ff" twffan="done">public</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #0000ff" twffan="done">class</span><span style="color: #000000" twffan="done">&nbsp;DemoService&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">public</span><span style="color: #000000" twffan="done">&nbsp;String&nbsp;getHello(String&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff" twffan="done">return</span><span style="color: #000000" twffan="done">&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">Hello&nbsp;,&nbsp;</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">name&nbsp;</span><span style="color: #000000" twffan="done">+</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">&nbsp;这是第一个buffalo示例程序</span><span style="color: #000000" twffan="done">"</span><span style="color: #000000" twffan="done">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br />7．buffalo-service.properties文件放到WEB-INF/classes/目录下<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee" twffan="done"><span style="color: #000000" twffan="done">demoService</span><span style="color: #000000" twffan="done">=</span><span style="color: #000000" twffan="done">demo.buffalo.DemoService</span></div>说明：框架是通过此文件来查找远程调用的类的。<br /><br />8．现在可以运行了。<br /><br /><a href="http://www.blogjava.net/chenlb/Files/chenlb/buffalodemo.rar"><font color="#1a8bc8">示例下载<br /></font></a>注意：Eclipse项目，文件编码是UTF-8<br /><br />官方地址：<br />Buffalo中文论坛：<a href="http://groups.google.com/group/amowa"><font color="#1a8bc8">http://groups.google.com/group/amowa</font></a><br /><a href="http://buffalo.sourceforge.net/tutorial.html" target="blank"><font color="#1a8bc8">http://buffalo.sourceforge.net/tutorial.html</font></a><br />
<p><a href="http://confluence.redsaga.com/pages/viewpage.action?pageId=1643" target="blank"><font color="#1a8bc8">http://confluence.redsaga.com/pages/viewpage.action?pageId=1643</font></a> </p>JavaScript API ：<a href="http://confluence.redsaga.com/display/BUFFALO/JavaScript+API"><font color="#1a8bc8">http://confluence.redsaga.com/display/BUFFALO/JavaScript+API</font></a><br /><a href="http://www.amowa.net/buffalo/zh/index.html"><font color="#1a8bc8">http://www.amowa.net/buffalo/zh/index.html</font></a> <br /><img src ="http://www.blogjava.net/xzclog/aggbug/352439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-06-16 16:44 <a href="http://www.blogjava.net/xzclog/archive/2011/06/16/352439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java通过Telnet连接执行shell脚本</title><link>http://www.blogjava.net/xzclog/archive/2010/09/29/333403.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Wed, 29 Sep 2010 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/09/29/333403.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/333403.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/09/29/333403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/333403.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/333403.html</trackback:ping><description><![CDATA[<li><span><span class="comment">/** </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;*&nbsp;commons-net-2.0.jar是工程依赖包&nbsp; </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="keyword">package</span><span>&nbsp;telnet2; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="keyword">import</span><span>&nbsp;java.io.InputStream; &nbsp;&nbsp;</span></span></li>
<li><span class="keyword">import</span><span>&nbsp;java.io.PrintStream; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="keyword">import</span><span>&nbsp;org.apache.commons.net.telnet.TelnetClient; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span class="comment">/** </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;*&nbsp;@descript&nbsp;NetTelenet.java </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;sinclair </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;*&nbsp;@date&nbsp;Jun&nbsp;10,&nbsp;2010 </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
<li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;NetTelnet&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;TelnetClient&nbsp;telnet&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;TelnetClient(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;InputStream&nbsp;in; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;PrintStream&nbsp;out; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">char</span><span>&nbsp;prompt&nbsp;=&nbsp;</span><span class="string">'$'</span><span>;</span><span class="comment">//&nbsp;普通用户结束 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;NetTelnet(&nbsp;String&nbsp;ip,&nbsp;</span><span class="keyword">int</span><span>&nbsp;port,&nbsp;String&nbsp;user,&nbsp;String&nbsp;password&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;telnet.connect(&nbsp;ip,&nbsp;port&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;=&nbsp;telnet.getInputStream(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PrintStream(&nbsp;telnet.getOutputStream()&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;根据root用户设置结束符 </span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.prompt&nbsp;=&nbsp;user.equals(&nbsp;</span><span class="string">"root"</span><span>&nbsp;)&nbsp;?&nbsp;</span><span class="string">'#'</span><span>&nbsp;:&nbsp;</span><span class="string">'$'</span><span>; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;login(&nbsp;user,&nbsp;password&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;登录 </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;user </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;password </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;login(&nbsp;String&nbsp;user,&nbsp;String&nbsp;password&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;readUntil(&nbsp;</span><span class="string">"login:"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;write(&nbsp;user&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;readUntil(&nbsp;</span><span class="string">"Password:"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;write(&nbsp;password&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;readUntil(&nbsp;prompt&nbsp;+&nbsp;</span><span class="string">"&nbsp;"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;读取分析结果 </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;pattern </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;readUntil(&nbsp;String&nbsp;pattern&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>&nbsp;lastChar&nbsp;=&nbsp;pattern.charAt(&nbsp;pattern.length()&nbsp;-&nbsp;</span><span class="number">1</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>&nbsp;ch&nbsp;=&nbsp;(&nbsp;</span><span class="keyword">char</span><span>&nbsp;)&nbsp;in.read(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(&nbsp;</span><span class="keyword">true</span><span>&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&nbsp;ch&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(ch&nbsp;==&nbsp;lastChar)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(sb.toString().endsWith(&nbsp;pattern&nbsp;))&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;sb.toString(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;=&nbsp;(&nbsp;</span><span class="keyword">char</span><span>&nbsp;)&nbsp;in.read(); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;写操作 </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;value </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;write(&nbsp;String&nbsp;value&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(&nbsp;value&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;向目标发送命令字符串 </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;command </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;sendCommand(&nbsp;String&nbsp;command&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write(&nbsp;command&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;readUntil(&nbsp;prompt&nbsp;+&nbsp;</span><span class="string">"&nbsp;"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;关闭连接 </span>&nbsp;</span></li>
<li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;disconnect()&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;telnet.disconnect(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(&nbsp;String[]&nbsp;args&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;</span><span class="string">"启动Telnet..."</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ip&nbsp;=&nbsp;</span><span class="string">"192.168.0.11"</span><span>; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;port&nbsp;=&nbsp;</span><span class="number">23</span><span>; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;user&nbsp;=&nbsp;</span><span class="string">"user"</span><span>; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password&nbsp;=&nbsp;</span><span class="string">"111111"</span><span>; &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetTelnet&nbsp;telnet&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;NetTelnet(&nbsp;ip,&nbsp;port,&nbsp;user,&nbsp;password&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;telnet.sendCommand(&nbsp;</span><span class="string">"export&nbsp;LANG=en"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;r1&nbsp;=&nbsp;telnet.sendCommand(&nbsp;</span><span class="string">"cd&nbsp;/home/project/"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;r2&nbsp;=&nbsp;telnet.sendCommand(&nbsp;</span><span class="string">"pwd"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;r3&nbsp;=&nbsp;telnet.sendCommand(&nbsp;</span><span class="string">"sh&nbsp;a.sh"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;</span><span class="string">"显示结果"</span><span>&nbsp;); &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;r1&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;r2&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;r3&nbsp;); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;telnet.disconnect(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(&nbsp;Exception&nbsp;e&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
<li><span>}&nbsp;&nbsp;</span></li>
<img src ="http://www.blogjava.net/xzclog/aggbug/333403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-09-29 15:56 <a href="http://www.blogjava.net/xzclog/archive/2010/09/29/333403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2ee异常处理机制</title><link>http://www.blogjava.net/xzclog/archive/2010/03/13/315329.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 13 Mar 2010 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/03/13/315329.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/315329.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/03/13/315329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/315329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/315329.html</trackback:ping><description><![CDATA[转自：<a href="http://mofeichen.javaeye.com/blog/557426">http://mofeichen.javaeye.com/blog/557426<br />
<div class="blog_content">
<p>异常的处理是每个Java程序员时常面对的问题，但是很多人没有原则，遇到异常也不知道如何去处理，于是遇到检查异常就胡乱try...catch...一把，然后e.printStackTrace()一下了事，这种做法通常除了调试排错有点作用外，没任何价值。对于运行时异常，则干脆置之不理。</p>
<p>　　原因是很多开发者缺乏对异常的认识和分析，首先应该明白Java异常体系结构，一种分层继承的关系，你必须对层次结构熟烂于心：</p>
<p>　　Throwable(必须检查)</p>
<p>　　Error(非必须检查)</p>
<p>　　Exception(必须检查)</p>
<p>　　RuntimeException(非必须检查)</p>
<p>　　一般把Exception异常及其直接子类(除了RuntimeException之外)的异常称之为检查异常。把RuntimeException以及其子类的异常称之为非检查异常，也叫运行时异常。</p>
<p>　　对于Throwable和Error，则用的很少，一般会用在一些基础框架中，这里不做讨论。</p>
<p>　　下面针对J2EE的分层架构：DAO层、业务层、控制层、展示层的异常处理做个分析，并给出一般处理准则。</p>
<p>　<strong><span style="color: #bc0e07">　一、DAO层异常处理</span></strong></p>
<p>　　如果你用了Spring的DAO模板来实现，则DAO层没有检查异常抛出，代码非常的优雅。但是，如果你的DAO采用了原始的JDBC来写，这时候，你不能不对异常做处理了，因为难以避免的SQLException会如影随形的跟着你。对已这种DAO级别的异常，异常了你又能如何呢?与其这样胡乱try...catch...，囫囵吞枣消灭了异常不如让异常以另外一种非检查的方式向外传递。这样做好处有二：</p>
<p>　　1)、DAO的接口不被异常所污染，假设你抛出了SQLException，以后要是换了Spring DAO模板，那DAO接口就不再抛出了SQLException，这样，你的接口抛出异常就是对接口的污染。</p>
<p>　　2)、DAO异常向外传播给更高层处理，以便异常的错误原因不丢失，便于排查错误或进行捕获处理。</p>
<p>　　这里还有一个设计上常常令人困扰的问题：很多人会问，那定义一个什么样的异常抛出呢，或者是直接抛出一个throw RuntimeException(e)? 对于这个问题，需要分场合，如果系统小，你可以直接抛出一个throw RuntimeException(e)，但对于一个庞大的多模块系统来说，不要抛这种原生的非检查异常，而要抛出自定义的非检查异常，这样不但利于排错，而且有利于系统异常的处理，通常针对每一个模块，粗粒度的定义一个运行时DAO异常。比如：throw new ModelXxxDAORuntimeException(".....",e)，对于msg信息，你可写也可不写，根据需要灵活抛出。</p>
<p>　　这里常见一个很愚昧的处理方式，为每个DAO定义一个异常，呵呵，这样累不累啊，有多大意义，在Service层中调用时候，如果要捕获，还要捕获出一堆异常。这样致命的问题是代码混乱，维护困难，阅读也困难，DAO的异常应该是粗粒度的。</p>
<p><strong><span style="color: #bc0e07">　　二、业务层异常处理</span></strong></p>
<p>　　习惯上把业务层称之为Service层或者服务层，Service层的代表的是业务逻辑，不要迷信分太多太多层有多大好处，除非需要，否则别盲目划分不必要的层，层越多，效率越差，根据需要够用就行了。</p>
<p>　　Service接口中的每个方法代表一个特定的业务，而这个业务一定是一个完整的业务，通常会看到一些傻X的做法，数据库事务配置在Service层，而Service的实现就是DAO的直接调用，然后在控制层(Action)中，调用了好多Service去完成一个业务，你气得已经无语了，低头找砖头去!!!</p>
<p>　　搞明白以上两个问题后再回过头看异常怎么处理，Service层通常依赖DAO，而Service层的通常也会因为调用别的非检查异常方法而必须面对异常处理的问题，这里和DAO层又有所不同，彼一时，此一时嘛!</p>
<p>　　一般来说一个小模块对应一个Service，当然也许有两个或多个，针对这个模块的Service定义一个非检查异常，以应付那些不可避免的异常检查，这个自定义异常可以简单的命名为XxxServiceRuntimeException，将捕获到的异常顺势转译为非检查异常后抛出。我喜欢这么做，因为前台是J2EE应用，前台是web页面，它们的Struts2等框架会自动捕获所有Service层的异常，并把异常交给开发者去自由处理。</p>
<p>　　但是还有一种情况，由于一些特殊的限制，如果某个异常一旦发生，必须做什么什么处理，而这种处理时硬性要求，或者调用某个Service方法，必须检查处理什么异常，也可以抛出非检查的自定义异常，往往出现这种情况的是政治原因。不推崇这种做法，但也不排斥。</p>
<p>　　总之，对于接口，尽可能不去用异常污染她!</p>
<p><strong><span style="color: #bc0e07">　　三、控制层异常</span></strong></p>
<p>　　控制层说的简单些就是常见的Action层，主要是控制页面请求的处理。控制层通常都依赖于Service层，现在比较流行的框架对控制层做得都相当的到位，比如Struts2、SpringMVC等等，他们的控制层框架会捕获业务层的所有异常，并在控制层中声明可能抛出Exception，因此控制层一般不处理什么异常。</p>
<p>　　如果是控制层中因为调用了一些非检查异常的方法，比如IO操作等，可以简单处理下异常，保证流的安全，这才是目的。</p>
<p>　<strong><span style="color: #bc0e07">　四、显示层异常处理</span></strong></p>
<p>　　对于页面异常，处理的方式多种多样，一是不处理异常，一旦异常了，页面就报错。二是定义出错页面，根据异常的类型以及所在的模块，导航到出错页面。</p>
<p>　　一般来说，出错页面是更友好的做法。</p>
<p>　　另外还有特殊的处理方式，展示页面的模板可以捕获异常，并根据情况将异常信息铺到相应的位置，这样就更友好了，不过复杂度较高。</p>
<p>　　怎么处理，就看需要了。</p>
<p><strong><span style="color: #bc0e07">　　五、总结</span></strong></p>
<p>　　1)、对于异常处理，应该从设计、需要、维护等多个角度综合考虑，有一个通用准则：千万别捕获了异常什么事情都不干，这样一旦出现异常了，你没法依据异常信息来排错。</p>
<p>　　2)、对于J2EE多层架构系统来说，尽可能避免(因抛出异常带来的)接口污染。</p>
</div>
<script type="text/javascript"><!-- google_ad_client="pub-4348265167276910" ;
/* 468x60, 个人博客 */ google_ad_slot="2046406163" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script></a>
<img src ="http://www.blogjava.net/xzclog/aggbug/315329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-03-13 11:59 <a href="http://www.blogjava.net/xzclog/archive/2010/03/13/315329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>proxool连接池配置详细说明</title><link>http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 30 Jan 2010 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/311320.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/311320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/311320.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目前市面上三个主流连接池从性能上排名如下：proxool&gt;c3p0&gt;dbcp，proxool还提供了可视化的连接池实时监控工具，所以既稳定又方便，配置也是非常容易的事情。下面我来讲讲我如何配置proxool连接池的。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、下载相关资源。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从http://pr...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/311320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-01-30 12:02 <a href="http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的三种连接池设置C3P0、Proxool和DBCP </title><link>http://www.blogjava.net/xzclog/archive/2010/01/30/311319.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 30 Jan 2010 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/01/30/311319.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/311319.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/01/30/311319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/311319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/311319.html</trackback:ping><description><![CDATA[<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;JDBC驱动程序&nbsp;--&gt;</span>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.driver_class"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>com.mysql.jdbc.Driver<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.url"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>jdbc:mysql://localhost:3306/struts?<span class="attribute" style="color: #ff0000; background-color: #ffffff">useUnicode</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">true</span>&amp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">characterEncoding</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">GBK</span><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;数据库用户名&nbsp;--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.username"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>root<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;数据库密码&nbsp;--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.password"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>8888<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;!-- JDBC驱动程序 --&gt; &lt;property name="connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt; &lt;property name="connection.url"&gt;jdbc:mysql://localhost:3306/struts?useUnicode=true&amp;characterEncoding=GBK&lt;/property&gt; &lt;!-- 数据库用户名 --&gt; &lt;property name="connection.username"&gt;root&lt;/property&gt; &lt;!-- 数据库密码 --&gt; &lt;property name="connection.password"&gt;8888&lt;/property&gt; </span></pre>
</div>
<div class="textbox-content"><span style="background-color: #ffffff"><br />
<br />
上面的一段配置，在<span class="hilite2" style="background-color: #ffffff">c3p0</span>和<span class="hilite1" style="background-color: #ffffff">dbcp</span>中，都是必需的，因为hibernate会根据上述的配置来生成connections，再交给<span class="hilite2" style="background-color: #ffffff">c3p0</span>或<span class="hilite1" style="background-color: #ffffff">dbcp</span>管理.<br />
<br />
1 <span class="hilite2" style="background-color: #ffffff">C3P0</span> <br />
<br />
只需在hibernate.cfg.xml中加入 <br />
</div>
</span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite2" style="background-color: #ffffff">c3p0</span><span style="color: #0000ff; background-color: #ffffff">.min_size"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>5<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite2" style="background-color: #ffffff">c3p0</span><span style="color: #0000ff; background-color: #ffffff">.max_size"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>30<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite2" style="background-color: #ffffff">c3p0</span><span style="color: #0000ff; background-color: #ffffff">.time_out"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>1800<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite2" style="background-color: #ffffff">c3p0</span><span style="color: #0000ff; background-color: #ffffff">.max_statement"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>50<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;property name="<span class="hilite2" style="background-color: #ffffff">c3p0</span>.min_size"&gt;5&lt;/property&gt; &lt;property name="<span class="hilite2" style="background-color: #ffffff">c3p0</span>.max_size"&gt;30&lt;/property&gt; &lt;property name="<span class="hilite2" style="background-color: #ffffff">c3p0</span>.time_out"&gt;1800&lt;/property&gt; &lt;property name="<span class="hilite2" style="background-color: #ffffff">c3p0</span>.max_statement"&gt;50&lt;/property&gt; </span></pre>
</div>
<div class="textbox-content"><span style="background-color: #ffffff"><br />
<br />
还有在classespath中加入<span class="hilite2" style="background-color: #ffffff">c3p0</span>-0.8.4.5.jar <br />
<br />
<br />
2 <span class="hilite1" style="background-color: #ffffff">dbcp</span> <br />
<br />
在hibernate.cfg.xml中加入 <br />
<br />
</div>
</span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.maxActive"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>100<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.whenExhaustedAction"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>1<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.maxWait"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>60000<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.maxIdle"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>10<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.ps.maxActive"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>100<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.ps.whenExhaustedAction"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>1<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.ps.maxWait"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>60000<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.ps.maxIdle"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>10<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.maxActive"&gt;100&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.whenExhaustedAction"&gt;1&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.maxWait"&gt;60000&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.maxIdle"&gt;10&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.ps.maxActive"&gt;100&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.ps.whenExhaustedAction"&gt;1&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.ps.maxWait"&gt;60000&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.ps.maxIdle"&gt;10&lt;/property&gt;</span></pre>
</div>
<div class="textbox-content"><span style="background-color: #ffffff"><br />
还有在classespath中加入commons-pool-1.2.jar 和commons-<span class="hilite1" style="background-color: #ffffff">dbcp</span>-1.2.1.jar. <br />
<br />
<br />
3 proxool <br />
<br />
由于数据库connection在较长时间没有访问下会自动断开连接，导致浏览出错，增加proxool作为数据库pool。它有自动连接功能。<br />
1)、从</span><a href="http://proxool.sourceforge.net/" target="_blank"><span style="color: #006600; background-color: #ffffff">http://proxool.sourceforge...</span></a><span style="background-color: #ffffff">下载proxool，释放proxool.jar到WEB-INF/lib<br />
<br />
2)、在hibernate.cfg.xml中增加：<br />
</div>
</span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"hibernate.proxool.pool_alias"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>dbpool<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"hibernate.proxool.xml"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>proxool.xml<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.provider_class"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>org.hibernate.connection.ProxoolConnectionProvider<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;property name="hibernate.proxool.pool_alias"&gt;dbpool&lt;/property&gt; &lt;property name="hibernate.proxool.xml"&gt;proxool.xml&lt;/property&gt; &lt;property name="connection.provider_class"&gt;org.hibernate.connection.ProxoolConnectionProvider&lt;/property&gt;</span></pre>
</div>
<div class="textbox-content"><span style="background-color: #ffffff"><br />
<br />
3)、在与hibernate.cfg.xml同级目录（src根目录下）增加proxool.xml文件：<br />
</div>
</span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;?</span><span class="tag-name" style="background-color: #ffffff">xml</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">version</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"1.0"</span>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">encoding</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"utf-8"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">?&gt;</span></strong></span>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff">&lt;!--&nbsp;the&nbsp;proxool&nbsp;configuration&nbsp;can&nbsp;be&nbsp;embedded&nbsp;within&nbsp;your&nbsp;own&nbsp;application's. &nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff">&nbsp;Anything&nbsp;outside&nbsp;the&nbsp;"proxool"&nbsp;tag&nbsp;is&nbsp;ignored.&nbsp;--<span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">something-else-entirely</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">proxool</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">alias</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>dbpool<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">alias</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--proxool只能管理由自己产生的连接--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">driver-url</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc:mysql://127.0.0.1:3306/wlsh?<span class="attribute" style="color: #ff0000; background-color: #ffffff">characterEncoding</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">GBK</span>&amp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">useUnicode</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">true</span>&amp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">autoReconnect</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">true</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">driver-url</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">driver-class</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>com.mysql.jdbc.Driver<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">driver-class</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">driver-properties</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"user"</span>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">value</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"root"</span>&nbsp;<span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">/&gt;</span></strong></span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"password"</span>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">value</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"123456"</span>&nbsp;<span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">/&gt;</span></strong></span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">driver-properties</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">house-keeping-sleep-time</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>90000<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">house-keeping-sleep-time</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;最少保持的空闲连接数--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">prototype-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>5<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">prototype-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;允许最大连接数,超过了这个连接，再有请求时，就排在队列中等候，最大的等待请求数由maximum-new-connections决定--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">maximum-connection-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>100<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">maximum-connection-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;最小连接数--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">minimum-connection-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>10<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">minimum-connection-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">proxool</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">something-else-entirely</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;!-- the proxool configuration can be embedded within your own application's. Anything outside the "proxool" tag is ignored. --&gt; &lt;something-else-entirely&gt; &lt;proxool&gt; &lt;alias&gt;dbpool&lt;/alias&gt; &lt;!--proxool只能管理由自己产生的连接--&gt; &lt;driver-url&gt; jdbc:mysql://127.0.0.1:3306/wlsh?characterEncoding=GBK&amp;useUnicode=true&amp;autoReconnect=true &lt;/driver-url&gt; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt; &lt;driver-properties&gt; &lt;property name="user" value="root" /&gt; &lt;property name="password" value="123456" /&gt; &lt;/driver-properties&gt; &lt;!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁--&gt; &lt;house-keeping-sleep-time&gt;90000&lt;/house-keeping-sleep-time&gt; &lt;!-- 最少保持的空闲连接数--&gt; &lt;prototype-count&gt;5&lt;/prototype-count&gt; &lt;!-- 允许最大连接数,超过了这个连接，再有请求时，就排在队列中等候，最大的等待请求数由maximum-new-connections决定--&gt; &lt;maximum-connection-count&gt;100&lt;/maximum-connection-count&gt; &lt;!-- 最小连接数--&gt; &lt;minimum-connection-count&gt;10&lt;/minimum-connection-count&gt; &lt;/proxool&gt;&lt;/something-else-entirely&gt;</span></pre>
</div>
<span style="background-color: #ffffff">
<div class="textbox-content"><br />
<span style="font-size: 10pt; background-color: #ffffff"><span style="color: #330099">于在hibernate3.0中，已经不再支持dbcp了，hibernate的作者在hibernate.org中，明确指出在实践中发现dbcp有 BUG,在某些种情会产生很多空连接不能释放，所以抛弃了对dbcp的支持。至于</span><strong style="color: black; background-color: #ffff66">c3p0</strong><span style="color: #330099; background-color: #ffffff">，有评论说它的算法不是最优的，因为网上查资料得知：有网友做了一个实验，在同一项目中分别用了几个常用的连接池，然后测试其性能，发现</span><strong style="color: black; background-color: #ffff66">c3p0</strong><span style="color: #330099; background-color: #ffffff">占用资源</span><strong style="color: black; background-color: #99ff99">比较</strong><span style="color: #330099; background-color: #ffffff">大，效率也不高。所以，基于上述原因，</span><strong style="color: black; background-color: #a0ffff">proxool</strong><span style="color: #330099; background-color: #ffffff">不少行家推荐使用，而且暂时来说，是负面评价是最少的一个。在三星中也有项目是用</span><strong style="color: black; background-color: #a0ffff">proxool</strong><span style="color: #330099; background-color: #ffffff">的。<span style="color: #000000">从性能和出错率来说，proxool稍微比前两种好些。<strong><span style="background-color: #ffff66">C3P0</span></strong>，稳定性似乎不错，在这方面似乎有很好的口碑。至于<strong style="color: black; background-color: #99ff99">性能</strong>，应该不是最好的，算是中规中矩的类型。 <br />
　　<strong style="color: black; background-color: #a0ffff">Proxool</strong>的口碑似乎很好，不大见到负面的评价，从官方资料上来看，有许多有用的特性和特点，也是许多人推荐的。</span></span></span></div>
</span>
<img src ="http://www.blogjava.net/xzclog/aggbug/311319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-01-30 12:00 <a href="http://www.blogjava.net/xzclog/archive/2010/01/30/311319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java命令详解</title><link>http://www.blogjava.net/xzclog/archive/2009/12/04/304798.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 04 Dec 2009 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/12/04/304798.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/304798.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/12/04/304798.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/304798.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/304798.html</trackback:ping><description><![CDATA[<div>JDK工具 java命令详解</div>
<div>一、查看用法</div>
<div>&nbsp;</div>
<div>C:\&gt;java -help</div>
<div>Usage: java [-options] class [args...]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (to execute a class)</div>
<div>&nbsp;&nbsp; or&nbsp; java [-options] -jar jarfile [args...]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (to execute a jar file)</div>
<div>&nbsp;</div>
<div>where options include:</div>
<div>&nbsp;&nbsp;&nbsp; -client&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to select the "client" VM</div>
<div>&nbsp;&nbsp;&nbsp; -server&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to select the "server" VM</div>
<div>&nbsp;&nbsp;&nbsp; -hotspot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is a synonym for the "client" VM&nbsp; [deprecated]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The default VM is client.</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp; -cp &lt;class search path of directories and zip/jar files&gt;</div>
<div>&nbsp;&nbsp;&nbsp; -classpath &lt;class search path of directories and zip/jar files&gt;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A ; separated list of directories, JAR archives,</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and ZIP archives to search for class files.</div>
<div>&nbsp;&nbsp;&nbsp; -D&lt;name&gt;=&lt;value&gt;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set a system property</div>
<div>&nbsp;&nbsp;&nbsp; -verbose[:class|gc|jni]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable verbose output</div>
<div>&nbsp;&nbsp;&nbsp; -version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print product version and exit</div>
<div>&nbsp;&nbsp;&nbsp; -version:&lt;value&gt;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; require the specified version to run</div>
<div>&nbsp;&nbsp;&nbsp; -showversion&nbsp; print product version and continue</div>
<div>&nbsp;&nbsp;&nbsp; -jre-restrict-search | -jre-no-restrict-search</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; include/exclude user private JREs in the version search</div>
<div>&nbsp;&nbsp;&nbsp; -? -help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print this help message</div>
<div>&nbsp;&nbsp;&nbsp; -X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print help on non-standard options</div>
<div>&nbsp;&nbsp;&nbsp; -ea[:&lt;packagename&gt;...|:&lt;classname&gt;]</div>
<div>&nbsp;&nbsp;&nbsp; -enableassertions[:&lt;packagename&gt;...|:&lt;classname&gt;]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable assertions</div>
<div>&nbsp;&nbsp;&nbsp; -da[:&lt;packagename&gt;...|:&lt;classname&gt;]</div>
<div>&nbsp;&nbsp;&nbsp; -disableassertions[:&lt;packagename&gt;...|:&lt;classname&gt;]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disable assertions</div>
<div>&nbsp;&nbsp;&nbsp; -esa | -enablesystemassertions</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable system assertions</div>
<div>&nbsp;&nbsp;&nbsp; -dsa | -disablesystemassertions</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disable system assertions</div>
<div>&nbsp;&nbsp;&nbsp; -agentlib:&lt;libname&gt;[=&lt;options&gt;]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; load native agent library &lt;libname&gt;, e.g. -agentlib:hprof</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; see also, -agentlib:jdwp=help and -agentlib:hprof=help</div>
<div>&nbsp;&nbsp;&nbsp; -agentpath:&lt;pathname&gt;[=&lt;options&gt;]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; load native agent library by full pathname</div>
<div>&nbsp;&nbsp;&nbsp; -javaagent:&lt;jarpath&gt;[=&lt;options&gt;]</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; load Java programming language agent, see java.lang.instrument</div>
<div>&nbsp;</div>
<div>这个命令帮助是英文的，不知道JDK咋搞的，也不妨碍使用。</div>
<div>&nbsp;</div>
<div>另外，这个命令的非标准选项也是很重要的，常常在JVM优化配置方面很关键，可以参看本人的JVM参数配置文章。</div>
<div>C:\myproject&gt;java -X<br />
&nbsp;&nbsp;&nbsp; -Xmixed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mixed mode execution (default)<br />
&nbsp;&nbsp;&nbsp; -Xint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; interpreted mode execution only<br />
&nbsp;&nbsp;&nbsp; -Xbootclasspath:&lt;directories and zip/jar files separated by ;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set search path for bootstrap classes and resources<br />
&nbsp;&nbsp;&nbsp; -Xbootclasspath/a:&lt;directories and zip/jar files separated by ;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; append to end of bootstrap class path<br />
&nbsp;&nbsp;&nbsp; -Xbootclasspath/p:&lt;directories and zip/jar files separated by ;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prepend in front of bootstrap class path<br />
&nbsp;&nbsp;&nbsp; -Xnoclassgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disable class garbage collection<br />
&nbsp;&nbsp;&nbsp; -Xincgc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable incremental garbage collection<br />
&nbsp;&nbsp;&nbsp; -Xloggc:&lt;file&gt;&nbsp;&nbsp;&nbsp; log GC status to a file with time stamps<br />
&nbsp;&nbsp;&nbsp; -Xbatch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disable background compilation<br />
&nbsp;&nbsp;&nbsp; -Xms&lt;size&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set initial Java heap size<br />
&nbsp;&nbsp;&nbsp; -Xmx&lt;size&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set maximum Java heap size<br />
&nbsp;&nbsp;&nbsp; -Xss&lt;size&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set java thread stack size<br />
&nbsp;&nbsp;&nbsp; -Xprof&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output cpu profiling data<br />
&nbsp;&nbsp;&nbsp; -Xfuture&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enable strictest checks, anticipating future default<br />
&nbsp;&nbsp;&nbsp; -Xrs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reduce use of OS signals by Java/VM (see documentation)<br />
&nbsp;&nbsp;&nbsp; -Xcheck:jni&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; perform additional checks for JNI functions<br />
&nbsp;&nbsp;&nbsp; -Xshare:off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do not attempt to use shared class data<br />
&nbsp;&nbsp;&nbsp; -Xshare:auto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use shared class data if possible (default)<br />
&nbsp;&nbsp;&nbsp; -Xshare:on&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; require using shared class data, otherwise fail.</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>二、实践</div>
<div>&nbsp;</div>
<div>老规矩，主要看看里面的参数（也叫开关）的使用。环境接着上篇javac的环境。</div>
<div align="center"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226496942135.png" border="0" /></div>
<div align="center">&nbsp;</div>
<div align="center"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226496967916.png" border="0" /></div>
<div>&nbsp;</div>
<div>1、无参数情况</div>
<div align="center"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226497071010.png" border="0" /></div>
<div>&nbsp;</div>
<div>2、-cp</div>
<div>运行Java要使用类的全名来运行。如果遇到文件夹，则需要-cp设置到顶级包下面，例如</div>
<div align="center"><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226497087275.png" border="0" /></div>
<div>&nbsp;</div>
<div>3、-D</div>
<div>设置一个系统属性，在运行时候，可以通过System.getProperties()来获取到。例如写一段代码：</div>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee"><font color="#0000ff">package</font> com.lavasoft; <br />
<br />
<font color="#0000ff">import</font> java.util.Properties; <br />
<br />
<font color="#008000">/** <br />
* 列举系统的属性 <br />
* User: leizhimin <br />
* Date: 2008-11-12 21:25:08 <br />
*/</font> <br />
<font color="#0000ff">public</font> <font color="#0000ff">class</font> TestProperty { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">void</font> main(String[] args) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//获取系统属性 </font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties prop = System.getProperties(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008000">//输出所有到一个流上， </font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop.list(System.out); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
}</div>
</div>
<div>&nbsp;</div>
<div><img style="width: 650px" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226497148181.png" border="0" /></div>
<div>&nbsp;</div>
<div>如果在运行的时候加上一个参数-DmyProp=999999999，注意，中间不要添加任何空格。这样就相当于设置了一个系统属性myProp，其值为999999999。</div>
<div align="center"><img style="width: 650px" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226497391728.png" border="0" /></div>
<div>&nbsp;</div>
<div>一旦通过-DmyProp=999999999设置了这个系统属性，在程序中就可以获取到这个属性。</div>
<div>&nbsp;</div>
<div>3、程序入参</div>
<div>是在运行的时候，给main方法传递参数。为了测试先写一个测试类。</div>
<div>
<div style="border-right: #cccccc 1px solid; padding-right: 4px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 10pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; color: #000000; word-break: break-all; line-height: 16px; padding-top: 4px; border-bottom: #cccccc 1px solid; font-family: verdana,宋体; background-color: #eeeeee"><font color="#0000ff">package</font> com.lavasoft; <br />
<br />
<font color="#008000">/** <br />
* 测试main方法的入参 <br />
* User: leizhimin <br />
* Date: 2008-11-12 21:46:21 <br />
*/</font> <br />
<font color="#0000ff">public</font> <font color="#0000ff">class</font> TestMainVar { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public</font> <font color="#0000ff">static</font> <font color="#0000ff">void</font> main(String[] args) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<font color="#800000">"入参列表如下："</font>); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">for</font>(String arg:args){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(arg); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
}</div>
</div>
<div>&nbsp;</div>
<div align="center"><img style="width: 650px" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226497857556.png" border="0" /></div>
<div>&nbsp;</div>
<div>4、其他的选项</div>
<div>有关选择 客户端/服务端VM、版本、运行在哪个版本下、是否使用断言等一些不常用的选项。还可以查看</div>
<div align="center"><img style="width: 650px" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226498790760.png" border="0" /></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>5、-verbose[:class|gc|jni]</div>
<div>查看虚拟机内部动作。</div>
<div><img style="width: 650px" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/200811/200811121226499130275.png" border="0" /></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/304798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-12-04 17:15 <a href="http://www.blogjava.net/xzclog/archive/2009/12/04/304798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVAC 命令详解 </title><link>http://www.blogjava.net/xzclog/archive/2009/12/04/304796.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 04 Dec 2009 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/12/04/304796.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/304796.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/12/04/304796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/304796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/304796.html</trackback:ping><description><![CDATA[<h2>结构</h2>
<a name="synopsis">
<blockquote>
<pre><strong>javac</strong> [ options ] [ sourcefiles ] [ @files ]
</pre>
<p>参数可按任意次序排列。</p>
<blockquote>
<dl>
<dt><code><font face="新宋体">options</font></code>
<dd>命令行选项。
<dt><code><font face="新宋体">sourcefiles</font></code>
<dd>一个或多个要编译的源文件（例如 MyClass.java）。
<dt><code><font face="新宋体">@files</font></code>
<dd>一个或多个对源文件进行列表的文件。 </dd></dl></blockquote></blockquote></a><a name="description">
<h2>说明</h2>
</a><a name="synopsis">
<blockquote>
<p>javac</p>
<p>有两种方法可将源代码文件名传递给 javac： </p>
<ul>
    <li>如果源文件数量少，在命令行上列出文件名即可。
    <li>如果源文件数量多，则将源文件名列在一个文件中，名称间用空格或回车行来进行分隔。然后在 javac 命令行中使用该列表文件名，文件名前冠以 @ 字符。 </li>
</ul>
<p>源代码文件名称必须含有 <code><font face="新宋体">.java</font></code> 后缀，类文件名称必须含有 <code><font face="新宋体">.class</font></code> 后缀，源文件和类文件都必须有识别该类的根名。例如，名为 <code><font face="新宋体">MyClass</font></code> 的类将写在名为 <code><font face="新宋体">MyClass.java</font></code>的源文件中，并被编译为字节码类文件 <code><font face="新宋体">MyClass.class</font></code>。</p>
<p>内部类定义产生附加的类文件。这些类文件的名称将内部类和外部类的名称结合在一起，例如 <code><font face="新宋体">MyClass$MyInnerClass.class</font></code>。</p>
<p>应当将源文件安排在反映其包树结构的目录树中。例如，如果将所有的源文件放在 /workspace 中，那么 <code><font face="新宋体">com.mysoft.mypack.MyClass</font></code> 的代码应该在 \workspace\com\mysoft\mypack\MyClass.java 中。</p>
<p>缺省情况下，编译器将每个类文件与其源文件放在同一目录中。可用 -d 选项（请参阅后面的</a><a href="http://www.iplab.cs.tsukuba.ac.jp/~liuxj/jdk1.2/zh/docs/tooldocs/win32/javac.html#options">选项</a><a name="synopsis">）指定其它目标目录。</p>
工具读取用 Java 编程语言编写的类和接口定义，并将它们编译成字节码类文件。</blockquote></a><a name="searching">
<h2>查找类型</h2>
</a><a name="synopsis">
<blockquote>
<p>当编译源文件时，编译器常常需要它还没有识别出的类型的有关信息。对于源文件中使用、扩展或实现的每个类或接口，编译器都需要其类型信息。这包括在源文件中没有明确提及、但通过继承提供信息的类和接口。</p>
<p>例如，当扩展 <strong>java.applet.Applet</strong> 时还要用到 <strong>Applet</strong> 的祖先类：<strong>java.awt.Panel</strong> 、 <strong>java.awt.Container</strong>、 <strong>java.awt.Component</strong> 和 <strong>java.awt.Object</strong>。</p>
<p>当编译器需要类型信息时，它将查找定义类型的源文件或类文件。编译器先在自举类及扩展类中查找，然后在用户类路径中查找。用户类路径通过两种途径来定义：通过设置 <strong>CLASSPATH</strong> 环境变量或使用 <strong>-classpath</strong> 命令行选项。（有关详细资料，请参阅设置类路径）。如果使用 <strong>-sourcepath</strong> 选项，则编译器在<strong> sourcepath</strong> 指定的路径中查找源文件；否则，编译器将在用户类路径中查找类文件和源文件。可用<strong>-bootclasspath</strong> 和 <strong>-extdirs</strong> 选项来指定不同的自举类或扩展类；参阅下面的联编选项。</p>
<p>成功的类型搜索可能生成类文件、源文件或两者兼有。以下是 <strong>javac</strong> 对各种情形所进行的处理： </p>
<ul>
    <li><em>搜索结果只生成类文件而没有源文件：</em> <strong>javac</strong> 使用类文件。
    <li><em>搜索结果只生成源文件而没有类文件：</em> <strong>javac</strong> 编译源文件并使用由此生成的类文件。
    <li><em>搜索结果既生成源文件又生成类文件：<strong> </strong>确定类文件是否过时。若类文件已过时，则 <strong>javac</strong> 重新编译源文件并使用更新后的类文件。否则， <strong>javac</strong> 直接使用类文件。
    <p>缺省情况下，只要类文件比源文件旧， <strong>javac</strong> 就认为它已过时。（ <strong>-Xdepend</strong> 选项指定相对来说较慢但却比较可靠的过程。） </p>
    </em>javac </li>
</ul>
<p>注意： <strong>javac</strong> 可以隐式编译一些没有在命令行中提及的源文件。用 <strong>-verbose</strong> 选项可跟踪自动编译。</p>
</blockquote>
<p></a><a name="commandlineargfile"></a><a name="synopsis"></p>
<h2>文件列表</h2>
<!-- Don't document &#64;files for arguments other than files, such as
            options - dps
            <h2>COMMAND LINE ARGUMENT FILE</h2>
            -->
<blockquote>
<p>为缩短或简化 <code><font face="新宋体">javac</font></code> 命令，可以指定一个或多个每行含有一个文件名的文件。在命令行中，采用 '<tt><font face="新宋体">@</font></tt>' 字符加上文件名的方法将它指定为文件列表。当 javac 遇到以 `<tt><font face="新宋体">@</font></tt>' 字符开头的参数时，它对那个文件中所含文件名的操作跟对命令行中文件名的操作是一样的。这使得 Windows 命令行长度不再受限制。</p>
<p>例如，可以在名为 <code><font face="新宋体">sourcefiles</font></code> 的文件中列出所有源文件的名称。该文件可能形如： </p>
<pre>     MyClass1.java
MyClass2.java
MyClass3.java
</pre>
<p>然后可用下列命令运行编译器：</p>
<pre>     C:&gt; <strong>javac @sourcefiles</strong>
</pre>
</blockquote></a><a name="options">
<h2>选项</h2>
</a><a name="synopsis">
<blockquote>
<p>编译器有一批标准选项，目前的开发环境支持这些标准选项，将来的版本也将支持它。还有一批附加的非标准选项是目前的虚拟机实现所特有的，将来可能要有变化。非标准选项以 <strong>-X</strong> 打头。</p>
</blockquote></a><a name="standard">
<h2>标准选项</h2>
</a><a name="synopsis">
<blockquote>
<dl>
<dt><strong>-classpath</strong> <em>类路径</em>
<dd>设置用户类路径，它将覆盖 <strong>CLASSPATH</strong> 环境变量中的用户类路径。若既未指定 <strong>CLASSPATH</strong> 又未指定 <strong>-classpath</strong>，则用户类路径由当前目录构成。有关详细信息，请参阅设置类路径。
<p>若未指定 <strong>-sourcepath</strong> 选项，则将在用户类路径中查找类文件和源文件。</p>
<dt><strong>-d</strong> <em>目录</em>
<dd>设置类文件的目标目录。如果某个类是一个包的组成部分，则 <strong>javac</strong> 将把该类文件放入反映包名的子目录中，必要时创建目录。例如，如果指定 <strong>-d c:\myclasses</strong> 并且该类名叫 <code><font face="新宋体">com.mypackage.MyClass</font></code>，那么类文件就叫作 <code><font face="新宋体">c:\myclasses\com\mypackage\MyClass.class</font></code>。
<p>若未指定 <strong>-d</strong> 选项，则 <strong>javac</strong> 将把类文件放到与源文件相同的目录中。</p>
<p>注意： <strong>-d</strong> 选项指定的目录不会被自动添加到用户类路径中。</p>
<dt><strong>-deprecation</strong>
<dd>显示每种不鼓励使用的成员或类的使用或覆盖的说明。没有给出 <strong>-deprecation</strong> 选项的话， <strong>javac</strong> 将显示这类源文件的名称：这些源文件使用或覆盖不鼓励使用的成员或类。
<dt><strong>-encoding</strong>
<dd>设置源文件编码名称，例如 <code><font face="新宋体">EUCJIS/SJIS</font></code>。若未指定 <strong>-encoding</strong> 选项，则使用平台缺省的转换器。
<dt><strong>-g</strong>
<dd>生成所有的调试信息，包括局部变量。缺省情况下，只生成行号和源文件信息。
<dt><strong>-g:none</strong>
<dd>不生成任何调试信息。
<dt><strong>-g:</strong><em>{关键字列表}</em>
<dd>只生成某些类型的调试信息，这些类型由逗号分隔的关键字列表所指定。有效的关键字有：
<dl>
<dt><strong>source</strong>
<dd>源文件调试信息
<dt><strong>lines</strong>
<dd>行号调试信息
<dt><strong>vars</strong>
<dd>局部变量调试信息 </dd></dl>
<dt><strong>-nowarn</strong>
<dd>禁用警告信息。
<dt><strong>-O</strong>
<dd>优化代码以缩短执行时间。使用 <strong>-O</strong> 选项可能使编译速度下降、生成更大的类文件并使程序难以调试。
<p>在 JDK 1.2 以前的版本中，javac 的 <strong>-g</strong> 选项和 <strong>-O</strong> 选项不能一起使用。在 JDK 1.2 中，可以将 <strong>-g</strong> 和 <strong>-O</strong> 选项结合起来，但可能会得到意想不到的结果，如丢失变量或重新定位代码或丢失代码。<strong>-O</strong> 选项不再自动打开 <strong>-depend</strong> 或关闭 <strong>-g</strong> 选项。同样， <strong>-O</strong> 选项也不再允许进行跨类内嵌。</p>
<dt><strong>-sourcepath</strong> <em>源路径</em>
<dd>指定用以查找类或接口定义的源代码路径。与用户类路径一样，源路径项用分号 (<strong>;</strong>) 进行分隔，它们可以是目录、JAR 归档文件或 ZIP 归档文件。如果使用包，那么目录或归档文件中的本地路径名必须反映包名。
<p>注意：通过类路径查找的类，如果找到了其源文件，则可能会自动被重新编译。</p>
<dt><strong>-verbose</strong>
<dd>冗长输出。它包括了每个所加载的类和每个所编译的源文件的有关信息。 </dd></dl></blockquote></a><a name="crosscomp-options">
<h3>联编选项</h3>
</a><a name="synopsis">
<blockquote>
<p>缺省情况下，类是根据与 <strong>javac</strong> 一起发行的 JDK 自举类和扩展类来编译。但 <strong>javac</strong> 也支持<em>联编</em>，在联编中，类是根据其它 Java平台实现的自举类和扩展类来进行编译的。联编时， <strong>-bootclasspath</strong> 和 <strong>-extdirs</strong> 的使用很重要；请参阅下面的联编程序示例。 </p>
<dl>
<dt><strong>-target</strong> <em>版本</em>
<dd>生成将在指定版本的虚拟机上运行的类文件。缺省情况下生成与 1.1 和 1.2 版本的虚拟机都兼容的类文件。JDK 1.2 中的 <strong>javac</strong> 所支持的版本有：
<dl>
<dt><strong>1.1</strong>
<dd>保证所产生的类文件与 1.1 和 1.2 版的虚拟机兼容。这是缺省状态。
<dt><strong>1.2</strong>
<dd>生成的类文件可在 1.2 版的虚拟机上运行，但不能在 1.1 版的虚拟机上运行。 </dd></dl>
<dt><strong>-bootclasspath</strong> <em>自举类路径</em>
<dd>根据指定的自举类集进行联编。和用户类路径一样，自举类路径项用分号 (<strong>;</strong>) 进行分隔，它们可以是目录、JAR 归档文件或 ZIP 归档文件。
<dt><strong>-extdirs</strong> <em>目录</em>
<dd>根据指定的扩展目录进行联编。<em>目录</em>是以分号分隔的目录列表。在指定目录的每个 JAR 归档文件中查找类文件。 </dd></dl></blockquote></a><a name="nonstandard">
<h3>非标准选项</h3>
</a><a name="synopsis">
<blockquote>
<dl>
<dt><strong>-X</strong>
<dd>显示非标准选项的有关信息并退出。
<dt><strong>-Xdepend</strong>
<dd>递归地搜索所有可获得的类，以寻找要重编译的最新源文件。该选项将更可靠地查找需要编译的类，但会使编译进程的速度大为减慢。
<dt><strong>-Xstdout</strong>
<dd>将编译器信息送到<code><font face="新宋体">System.out</font></code> 中。缺省情况下，编译器信息送到 <code><font face="新宋体">System.err</font></code> 中。
<dt><strong>-Xverbosepath</strong>
<dd>说明如何搜索路径和标准扩展以查找源文件和类文件。
<dt><strong>-J</strong><em>选项</em>
<dd>将<em>选项</em>传给 <strong>javac</strong> 调用的 <strong>java</strong> 启动器。例如， <strong>-J-Xms48m</strong> 将启动内存设为 48 兆字节。虽然它不以 <strong>-X</strong> 开头，但它并不是 <strong>javac</strong> 的&#8216;标准选项&#8217;。用<strong> -J</strong> 将选项传给执行用 Java 编写的应用程序的虚拟机是一种公共约定。
<p>注意： <strong>CLASSPATH</strong> 、 <strong>-classpath</strong> 、 <strong>-bootclasspath</strong> 和 <strong>-extdirs</strong> 并 <em>不</em> 指定用于运行 <strong>javac</strong> 的类。如此滥用编译器的实现通常没有任何意义而且总是很危险的。如果确实需要这样做，可用 <strong>-J</strong> 选项将选项传给基本的 <strong>java</strong> 启动器。</p>
</dd></dl></blockquote></a><a name="examples">
<h2>程序示例</h2>
</a><a name="simpleexamples">
<h3>编译简单程序</h3>
</a><a name="synopsis">
<blockquote>
<p>一个源文件 <code><font face="新宋体">Hello.java</font></code> ，它定义了一个名叫 <strong>greetings.Hello</strong> 的类。<code><font face="新宋体">greetings</font></code> 目录是源文件和类文件两者的包目录，且它不是当前目录。这让我们可以使用缺省的用户类路径。它也使我们没必要用 <strong>-d</strong> 选项指定单独的目标目录。</p>
<blockquote>
<pre>C:&gt; <strong>dir</strong>
greetings/
C:&gt; <strong>dir greetings</strong>
Hello.java
C:&gt; <strong>cat greetings\Hello.java</strong>
package greetings;
public class Hello {
public static void main(String[] args) {
for (int i=0; i &lt; args.length; i++) {
System.out.println("Hello " + args[i]);
}
}
}
C:&gt; <strong>javac greetings\Hello.java</strong>
C:&gt; <strong>dir greetings</strong>
Hello.class   Hello.java
C:&gt; <strong>java greetings.Hello World Universe Everyone</strong>
Hello World
Hello Universe
Hello Everyone
</pre>
</blockquote></blockquote></a><a name="multiple-example">
<h3>编译多个源文件</h3>
</a><a name="synopsis">
<blockquote>
<p>该示例编译 <code><font face="新宋体">greetings</font></code> 包中的所有源文件。</p>
<blockquote>
<pre>C:&gt; <strong>dir</strong>
greetings\
C:&gt; <strong>dir greetings</strong>
Aloha.java         GutenTag.java      Hello.java         Hi.java
C:&gt; <strong>javac greetings\*.java</strong>
C:&gt; <strong>dir greetings</strong>
Aloha.class         GutenTag.class      Hello.class         Hi.class
Aloha.java          GutenTag.java       Hello.java          Hi.java
</pre>
</blockquote></blockquote></a><a name="userclasspath">
<h3>指定用户类路径</h3>
</a><a name="synopsis">
<blockquote>
<p>对前面示例中的某个源文件进行更改后，重新编译它： </p>
<blockquote>
<pre>C:&gt; <strong>cd</strong>
\examples
C:&gt; <strong>javac greetings\Hi.java</strong>
</pre>
</blockquote>
<p>由于 <code><font face="新宋体">greetings.Hi</font></code> 引用了 <code><font face="新宋体">greetings</font></code> 包中其它的类，编译器需要找到这些其它的类。上面的示例能运行是因为缺省的用户类路径刚好是含有包目录的目录。但是，假设我们想重新编译该文件并且不关心我们在哪个目录中的话， 我们需要将 <code><font face="新宋体">\examples</font></code> 添加到用户类路径中。可以通过设置 <strong>CLASSPATH</strong> 达到此目的，但这里我们将使用 <strong>-classpath</strong> 选项来完成。</p>
<blockquote>
<pre>C:&gt;<strong>javac -classpath \examples \examples\greetings\Hi.java</strong>
</pre>
</blockquote>
<p>如果再次将 <code><font face="新宋体">greetings.Hi</font></code> 改为使用标题实用程序，该实用程序也需要通过用户类路径来进行访问： </p>
<blockquote>
<pre>C:&gt;<strong>javac -classpath \examples:\lib\Banners.jar \
\examples\greetings\Hi.java</strong>
</pre>
</blockquote>
<p>要执行 <code><font face="新宋体">greetings</font></code> 中的类，需要访问 <code><font face="新宋体">greetings</font></code> 和它所使用的类。</p>
<blockquote>
<pre>C:&gt;<strong>java -classpath \examples:\lib\Banners.jar greetings.Hi</strong>
</pre>
</blockquote></blockquote></a><a name="separating">
<h3>将源文件和类文件分开</h3>
</a><a name="synopsis">
<blockquote>
<p>将源文件和类文件置于不同的目录下经常是很有意义的，特别是在大型的项目中。我们用 <strong>-d</strong> 选项来指明单独的类文件目标位置。由于源文件不在用户类路径中，所以用 <strong>-sourcepath</strong> 选项来协助编译器查找它们。</p>
<blockquote>
<pre>C:&gt; <strong>dir</strong>
classes\  lib\      src\
C:&gt; <strong>dir src</strong>
farewells\
C:&gt; <strong>dir src\farewells</strong>
Base.java      GoodBye.java
C:&gt; <strong>dir lib</strong>
Banners.jar
C:&gt; <strong>dir classes</strong>
C:&gt; <strong>javac -sourcepath src -classpath classes:lib\Banners.jar \
src\farewells\GoodBye.java -d classes</strong>
C:&gt; <strong>dir classes</strong>
farewells\
C:&gt; <strong>dir classes\farewells</strong>
Base.class      GoodBye.class
</pre>
</blockquote>
<p>注意：编译器也编译了 <code><font face="新宋体">src\farewells\Base.java</font></code>，虽然我们没有在命令行中指定它。要跟踪自动编译，可使用 <strong>-verbose</strong> 选项。</p>
</blockquote></a><a name="crosscomp-example">
<h3>联编程序示例</h3>
</a><a name="synopsis">
<blockquote>
<p>这里我们用 JDK 1.2 的 <strong>javac</strong> 来编译将在 1.1 版的虚拟机上运行的代码。</p>
<blockquote>
<pre>C:&gt; <strong>javac -target 1.1 -bootclasspath jdk1.1.7\lib\classes.zip \
-extdirs "" OldCode.java</strong>
</pre>
</blockquote><strong>
<p>-target 1.1</p>
<p>JDK 1.2 <strong>javac</strong> 在缺省状态下也将根据 1.2 版的自举类来进行编译，因此我们需要告诉 <strong>javac</strong> 让它根据 JDK 1.1 自举类来进行编译。可用 <strong>-bootclasspath</strong> 和 <strong>-extdirs</strong> 选项来达到此目的。不这样做的话，可能会使编译器根据 1.2 版的 API 来进行编译。由于 1.1 版的虚拟机上可能没有该 1.2 版的 API，因此运行时将出错。</p>
</strong>选项可确保生成的类文件与 1.1 版的虚拟机兼容。在 JDK1.2 中， 缺省情况下 <strong>javac</strong> 编译生成的文件是与 1.1 版的虚拟机兼容的，因此并非严格地需要该选项。然而，由于别的编译器可能采用其它的缺省设置，所以提供这一选项将不失为是个好习惯。</blockquote></a>
<img src ="http://www.blogjava.net/xzclog/aggbug/304796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-12-04 17:13 <a href="http://www.blogjava.net/xzclog/archive/2009/12/04/304796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java命令行命令详解</title><link>http://www.blogjava.net/xzclog/archive/2009/12/04/304795.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 04 Dec 2009 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/12/04/304795.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/304795.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/12/04/304795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/304795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/304795.html</trackback:ping><description><![CDATA[<p>Java命令行命令详解<br />
<br />
rmic</p>
<p>功能说明： <br />
　　rmic 为远程对象生成 stub 和 skeleton。</p>
<p>语法： <br />
　　rmic [ options ] package-qualified-class-name(s)</p>
<p>补充说明： <br />
　　rmic 编译器根据编译后的 Java 类（含有远程对象实现）名，为远程对象生成 stub 和 skeleton（远程对象是指实现 java.rmi.Remote 接口的对象）。在 rmic 命令中所给的类必须是经 javac 命令成功编译且是完全包限定的类。</p>
<p>命令选项 <br />
　　-classpath[路径] 指定 rmic 用于查询类的路径。如果设置了该选项，它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。</p>
<p><br />
　　-d[目录] 指定类层次的根目录。此选项可用来指定 stub 和 skeleton 文件的目标目录。</p>
<p><br />
　　-depend 使编译器考虑重新编译从其它类引用的类。 一般来说，它只重新编译从源代码引用的遗漏或过期的类。</p>
<p>　　-g 允许生成调试表格。调试表格含有行号和局部变量的有关信息，即 Java 调试工具所使用的信息。缺省情况下，只生成行号。</p>
<p>　　-J 与 -D 选项联用，它将紧跟其后的选项（ -J 与 -D 之间无空格）传给 java 解释器。</p>
<p>　　-keepgenerated 为 stub 和 skeleton 文件保留所生成的 .java 源文件，并将这些源文件写到与 .class 文件相同的目录中，如果要指定目录，则使用 -d 选项。</p>
<p>　　-nowarn 关闭警告。如果使用该选项，则编译器不输出任何警告信息。</p>
<p>　　-show 显示 rmic 编译器的 GUI（图形用户界面）。输入一个或多个包限定类名（以空格分隔），并按回车键或&#8220;显示&#8221;按钮，创建 stub 和 skeleton。</p>
<p>　　-vcompat （缺省值）创建与 JDK 1.1 和 1.2 stub 协议版本都兼容的 stub 和 skeleton。</p>
<p>　　-verbose 使编译器和链接器输出关于正在编译哪些类和正在加载哪些类文件的信息。</p>
<p>　　-v1.1 创建 JDK 1.1 stub 协议版本的 stub 和 skeleton。</p>
<p>　　-v1.2 只创建 JDK 1.2 stub 协议版本的 stub。</p>
<p><br />
rmid </p>
<p>功能说明： <br />
　　rmid 启动激活系统守护进程，以便能够在 Java 虚拟机上注册和激活对象。</p>
<p>语法： <br />
　　rmid [-port port] [-log dir]</p>
<p>补充说明： <br />
　　rmid 工具启动激活系统守护进程。必须先启动激活系统守护进程，才能向激活系统注册可被激活的对象或在 Java 虚拟机上激活可被激活的对象。</p>
<p>命令选项 <br />
　　-C&lt;某些命令行选项&gt; 指定一个选项，在创建每个 rmid 的子守护进程（激活组）时，该选项以命令行参数的形式传给该子守护进程。</p>
<p>　　-log[目录] 指定目录的名称，激活系统守护进程在该目录中写入其数据库及相关信息。缺省状态下，将在执行 rmid 命令的目录中创建一个 log 目录。</p>
<p>　　-port[端口] 指定 rmid 的注册服务程序所使用的端口。激活系统守护进程将 ActivationSystem 与该注册服务程序中的名称java.rmi.activation.ActivationSystem 捆绑在一起。</p>
<p>　　-stop 停止 -port 选项所指定端口上的当前 rmid 调用。若未指定端口，则将停止在端口 1098 上运行的 rmid。</p>
<p>rmiregistry </p>
<p>功能说明： <br />
　　rmiregistry 命令可在当前主机的指定端口上启动远程对象注册服务程序。</p>
<p>语法： <br />
　　rmiregistry [port]</p>
<p>补充说明： <br />
　 　rmiregistry 命令在当前主机的指定 port 上创建并启动远程对象注册服务程序。如果省略 port，则注册服务程序将在 1099 端口上启动。rmiregistry 命令不产生任何输出而且一般在后台运行。远程对象注册服务程序是自举命名服务。主机上的 RMI 服务器将利用它将远程对象绑定到名字上。客户机即可查询远程对象并进行远程方法调用。注册服务程序一般用于定位应用程序需调用其方法的第一个远程对象。该 对象反过来对各应用程序提供相应的支持，用于查找其它对象。</p>
<p>　　java.rmi.registry.LocateRegistry 类的方法可用于在某台主机或主机和端口上获取注册服务程序操作。java.rmi.Naming 类的基于 URL 的方法将对注册服务程序进行操作，并可用于查询远程对象、将简单（字符串）名称绑定到远程对象、将新名称重新绑定到远程对象（覆盖旧绑定）、取消远程对象 的绑定以及列出绑定在注册服务程序上的 URL。</p>
<p>serialver </p>
<p>功能说明： <br />
　　serialver 命令返回 serialVersionUID。</p>
<p>语法： <br />
　　serialver [ 命令选项 ]</p>
<p>补充说明： <br />
　　serialver 以适于复制到演变类的形式返回一个或多个类的 serialVersionUID。不带参数调用时，它输出用法行。</p>
<p>命令选项 <br />
　　-show 显示一个简单的用户界面。输入完整的类名并按回车键或&#8220;显示&#8221;按钮可显示 serialVersionUID。</p>
<p>jarsigner </p>
<p>功能说明： <br />
　　为 Java 归档 (JAR) 文件产生签名，并校验已签名的 JAR 文件的签名。</p>
<p>语法： <br />
　　jarsigner [ 命令选项 ] jar-file alias <br />
　　jarsigner -verify [ 命令选项 ] jar-file</p>
<p>补充说明： <br />
　　jarsigner 工具用于两个目的： <br />
　　1:为 Java 归档 (JAR) 文件签名 <br />
　　2:校验已签名的 JAR 文件的签名和完整性</p>
<p>命令选项 <br />
　　-keystore[url] 指定密钥仓库的 URL。缺省值是用户的宿主目录中的 .keystore 文件，它由系统属性&#8220;user.home&#8221;决定。</p>
<p>　　-storetype[storetype] 指定要被实例化的密钥仓库类型。默认的密钥仓库类型是安全属性文件中 "keystore.type" 属性值所指定的那个类型，由 java.security.KeyStore 中的静态方法 getDefaultType 返回。</p>
<p>　　-storepass[password] 指定访问密钥仓库所需的口令。这仅在签名（不是校验）JAR 文件时需要。在这种情况下，如果命令行中没有提供 -storepass 选项，用户将被提示输入口令。</p>
<p>　　-keypass[password] 指定用于保护密钥仓库项（由命令行中指定的别名标出）的私钥的口令。使用 jarsigner 为 JAR 文件签名时需要该口令。如果命令行中没有提供口令，且所需的口令与密钥仓库的口令不同，则将提示用户输入它。</p>
<p>　　-sigfile[file] 指定用于生成 .SF 和 .DSA 文件的基本文件名。</p>
<p>　　-signedjar[file] 指定用于已签名的 JAR 文件的名称。</p>
<p>　 　-verify 如果它出现在命令行中，则指定的 JAR 文件将被校验，而不是签名。如果校验成功，将显示&#8220;jar verified&#8221;。如果试图校验未签名的 JAR 文件，或校验被不支持的算法（例如未安装 RSA 提供者时使用的 RSA）签名的 JAR 文件，则将有如下显示： "jar is unsigned. (signatures missing or not parsable)" 。</p>
<p>　　-certs 如果它与 -verify 和 -verbose 选项一起出现在命令行中，则输出将包括 JAR 文件的每个签名人的证书信息。</p>
<p>　　-verbose 如果它出现在命令行中，则代表&#8220;verbose&#8221;模式，它使 jarsigner 在 JAR 签名或校验过程中输出额外信息。</p>
<p>　 　-internalsf 过去，JAR 文件被签名时产生的 .DSA（签名块）文件包含一个同时产生的 .SF 文件（签名文件）的完整编码副本。这种做法已被更改。为了减小输出 JAR 文件的整个大小，缺省情况下 .DSA 文件不再包含 .SF 文件的副本。但是如果 -internalsf 出现在命令行中，将采用旧的做法。该选项主要在测试时有用；实际上不应使用它，因为这样将消除有用的优化。</p>
<p>　　-sectionsonly 如果它出现在命令行中，则 JAR 文件被签名时生成的 .SF 文件（签名文件）将不包括含有整个清单文件的散列的头。它仅包含 与 JAR 中每个单独的源文件相关的信息和散列。该选项主要在测试时有用；实际上不应使用它，因为这样将消除有用的优化。</p>
<p>　　-J [javaoption] 将指定的 javaoption 串直接传递到 Java 解释器。(（jarsigner 实际上是解释器的一个 &#8220;wrapper&#8221;）。该选项不应含有任何空格。它有助于调整执行环境或内存使用。要获得可用的解释器选项的清单，可在命令行键入 java -h 或 java -X。</p>
<p>keytool </p>
<p>功能说明： <br />
　　管理由私钥和认证相关公钥的 X.509 证书链组成的密钥仓库（数据库）。还管理来自可信任实体的证书。</p>
<p>语法： <br />
　　keytool [ 命令 ]</p>
<p>补充说明： <br />
　　keytool 是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书，用于（通过数字签名）自我认证（用户向别的用户/服务认证自己）或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥（以证书形式）。</p>
<p>native2ascii </p>
<p>功能说明： <br />
　　将含有本地编码字符（既非 Latin1 又非 Unicode 字符）的文件转换为 Unicode 编码字符的文件。</p>
<p>语法： <br />
　　native2ascii [options] [inputfile [outputfile]]</p>
<p>补充说明： <br />
　　Java 编译器和其它 Java 工具只能处理含有 Latin-1 和/或 Unicode 编码（udddd 记号）字符的文件。native2ascii 将含有其它字符编码的文件转换成含 Latin-1 和/或 Unicode 编码字符的文件。若省略 outputfile，则使用标准输出设备输出。此外，如果也省略 inputfile，则使用标准输入设备输入。</p>
<p>命令选项 <br />
　　-reverse 执行相反的操作：将含 Latin-1 和/或 Unicode 编码字符的文件转换成含本地编码字符的文件。</p>
<p>　　-encoding[encoding_name] 指定转换过程使用的编码名称。缺省的编码从系统属性 file.encoding 中得到。</p>
<p>appletviewer </p>
<p>功能说明： <br />
　　Java applet 浏览器。appletviewer 命令可在脱离万维网浏览器环境的情况下运行 applet。</p>
<p>语法： <br />
　　appletviewer [ threads flag ] [ 命令选项 ] urls ...</p>
<p>补充说明： <br />
　 　appletviewer 命令连接到 url 所指向的文档或资源上，并在其自身的窗口中显示文档引用的每个 applet。注意：如果 url 所指向的文档不引用任何带有 OBJECT、EMBED 或 APPLET 标记的 applet，那么 appletviewer 就不做任何事情。</p>
<p>命令选项 <br />
　　-debug 在 Java 调试器 jdb 中启动 appletviewer，使您可以调试文档中的 applet。</p>
<p>　　-encoding[编码名称] 指定输入 HTML 文件的编码名称。</p>
<p>　 　-J[javaoption] 将 javaoption 字符串作为单个参数传给运行 appletviewer 的 Java 解释器。参数不能含有空格。由多重参数组成的字符串，其中的每个参数都必须以前缀 -J 开头，该前缀以后将被除去。这在调整编译器的执行环境或内存使用时将很有用。</p>
<p>extcheck </p>
<p>功能说明： <br />
　　extcheck 检测目标 jar 文件与当前安装方式扩展 jar 文件间的版本冲突。</p>
<p>语法： <br />
　　extcheck [ -verbose ] targetfile.jar</p>
<p>补充说明： <br />
　　extcheck 实用程序检查指定 Jar 文件的标题和版本与 JDK TM 软件中所安装的扩展是否有冲突。在安装某个扩展前，可以用该实用程序查看是否已安装了该扩展的相同版本或更高的版本。</p>
<p>　 　extcheck 实用程序将 targetfile.jar 文件清单的 specification-title 和 specification-version 头与当前安装在扩展目录下所有 Jar 文件的相对应的头进行比较（缺省扩展目录为 jre/lib/ext）。extcheck 实用程序比较版本号的方式与 java.lang.Package.isCompatibleWith 方法相同。若未检测到冲突，则返回代码为 0。如果扩展目录中任何一个 jar 文件的清单有相同的 specification-title 和相同的或更新的 specification-version 号，则返回非零错误代码。如果 targetfile.jar 的清单中没有 specification-title 或 specification-version 属性，则同样返回非零错误代码。</p>
<p>命令选项 <br />
　　-verbose 对扩展目录中的 Jar 文件进行检查时，列出文件。此外，还报告目标 jar 文件的清单属性及所有冲突的 jar 文件。</p>
<p>jar </p>
<p>功能说明： <br />
　　Java归档工具</p>
<p>语法： <br />
　　jar [ 命令选项 ] [manifest] destination input-file [input-files]</p>
<p>补充说明： <br />
　 　jar工具是个java应用程序，可将多个文件合并为单个JAR归档文件。jar是个多用途的存档及压缩工具，它基于ZIP和ZLIB压缩格式。然而， 设计jar的主要目的是便于将java applet或应用程序打包成单个归档文件。将applet或应用程序的组件(.class 文件、图像和声音)合并成单个归档文件时，可以用java代理(如浏览器)在一次HTTP事务处理过程中对它们进行下载，而不是对每个组件都要求一个新连 接。这大大缩短了下载时间。jar还能压缩文件，从而进一步提高了下载速度。此外，它允许applet的作者对文件中的各个项进行签名，因而可认证其来 源。jar工具的语法基本上与tar命令的语法相同。</p>
<p>命令选项 <br />
　　-c 在标准输出上创建新归档或空归档。</p>
<p>　　-t 在标准输出上列出内容表。</p>
<p>　　-x[file] 从标准输入提取所有文件，或只提取指定的文件。如果省略了file，则提取所有文件；否则只提取指定文件。</p>
<p>　　-f 第二个参数指定要处理的jar文件。在-c(创建)情形中，第二个参数指的是要创建的jar文件的名称(不是在标准输出上)。在-t(表(或-x(抽取)这两种情形中，第二个参数指定要列出或抽取的jar文件。</p>
<p>　　-v 在标准错误输出设备上生成长格式的输出结果。</p>
<p>　　-m 包括指定的现有清单文件中的清单信息。用法举例：&#8220;jar cmf myManifestFile myJarFile *.class&#8221;</p>
<p>　　-0 只储存，不进行 ZIP 压缩。</p>
<p>　　-M 不创建项目的清单文件。</p>
<p>　 　-u 通过添加文件或更改清单来更新现有的 JAR 文件。例如：&#8220;jar -uf foo.jar foo.class&#8221;将文件 foo.class 添加到现有的JAR文件foo.jar中，而&#8220;jar umf manifest foo.jar&#8221;则用manifest中的信息更新foo.jar的清单。</p>
<p>　　-C 在执行 jar 命令期间更改目录。例如：&#8220;jar -uf foo.jar -C classes *&#8221;将classes目录内的所有文件加到foo.jar中，但不添加类目录本身。</p>
<p>程序示例 <br />
　　1:将当前目录下所有CLASS文件打包成新的JAR文件： <br />
　　jar cf file.jar *.class</p>
<p>　　2:显示一个JAR文件中的文件列表 <br />
　　jar tf file.jar</p>
<p>　　3:将当前目录下的所有文件增加到一个已经存在的JAR文件中 <br />
　　jar cvf file.jar *</p>
<p>javadoc </p>
<p>功能说明 <br />
　　Java API文档生成器从Java源文件生成API文档HTML页。</p>
<p>语法： <br />
　　javadoc [ 命令选项 ] [ 包名 ] [ 源文件名 ] [ @files ] <br />
　　其中[ 包名 ]为用空格分隔的一系列包的名字，包名不允许使用通配符，如（*）。[ 源文件名 ]为用空格分隔的一系列的源文件名，源文件名可包括路径和通配符，如（*）。[ @files ]是以任何次序包含包名和源文件的一个或多个文件。</p>
<p>补充说明 <br />
　　Javadoc解析Java源文件中的声明和文档注释，并产生相应的HTML页缺省），描述公有类、保护类、内部类、接口、构造函数、方法和域。</p>
<p>　 　在实现时，Javadoc要求且依赖于java编译器完成其工作。Javadoc调用部分javac编译声明部分，忽略成员实现。它建立类的内容丰富的 内部表示，包括类层次和&#8220;使用&#8221;关系，然后从中生成HTML。Javadoc还从源代码的文档注释中获得用户提供的文档。</p>
<p>　　当Javadoc建立其内部文档结构时，它将加载所有引用的类。由于这一点，Javadoc必须能查找到所有引用的类，包括引导类、扩展类和用户类。</p>
<p>命令选项 <br />
　　-overview i&gt;path/filename 指定javadoc应该从path/filename所指定的&#8220;源&#8221;文件中获取概述文档，并将它放到概述页中（overview- summary.html）。其中path/filename 是相对于-sourcepath的相对路径名。</p>
<p>　　-public 只显示公有类及成员。</p>
<p>　　-protected 只显示受保护的和公有的类及成员。这是缺省状态。</p>
<p>　　-package 只显示包、受保护的和公有的类及成员。</p>
<p>　　-private 显示所有类和成员。</p>
<p>　　-help 显示联机帮助，它将列出这些javadoc和doclet命令行选项。</p>
<p>　 　-doclet class 指定启动用于生成文档的docle 的类文件。该doclet定义了输出的内容和格式。如果未使用-doclet选项，则javadoc使用标准doclet生成缺省HTML格式。该类必须 包含start(Root)法。该启动类的路径由 -docletpath选项定义。</p>
<p>　　-docletpath classpathlist 指定doclet类文件的路径，该类文件用-doclet选项指定。如果doclet已位于搜索路径中，则没有必要使用该选项。</p>
<p>　 　-1.1 生成具有用Javadoc 1.1生成的文档的外观和功能的文档。也就是说，页的背景为灰色，用图像做页眉，使用bullet列表而不是表格，具有单层目的目录结构，不包含继承 API，不使?*** TML框架，并且不支持内部类。该选项还自动将索引分割成每个字母一个文件。如果想要这种外观，则该选项比javadoc 1.1优越之处等于修正了一些错误。</p>
<p>　　-sourcepath sourcepathlist <br />
　　当将包名传递到 javadoc命令中时，指定定位源文件（.java）的搜索路径。注意只有当用 javadoc命令指定包名时才能使用sourcepath选项 -- 它将不会查找传递到javadoc命令中的.java文件。如果省略-sourcepath，则javadoc使用类路径查找源文件。</p>
<p>　　-classpath classpathlist 指定javadoc将在其中查找引用类的路径 -- 引用类是指带文档的类加上它们引用的任何类。Javadoc将搜索指定路径的所有子目录。classpathlist可以包括多个路径，彼此用逗号分隔。</p>
<p>　　-bootclasspath classpathlist 指定自举类所在路径。它们名义上是Java平台类。这个bootclasspath是Javadoc将用来查找源文件和类文件的搜索路径的一部分。在 classpathlist中用冒号（:）分隔目录。</p>
<p>　　-extdirs dirlist 指定扩展类所在的目录。它们是任何使用Java扩展机制的类。这个 extdirs是Javadoc将用来查找源文件和在文件的搜索路径的一部分。在dirlist中用冒号（:）分隔目录。</p>
<p>　　-verbose 在javadoc运行时提供更详细的信息。不使用verbose选项时，将显示加载源文件、生成文档（每个源文件一条信息）和排序的信息。verbose选项导致打印额外的信息，指定解析每个java源文件的毫秒数。</p>
<p>　　-locale language_country_variant 指定javadoc在生成文档时使用的环境。</p>
<p>　　-encoding name 指定源文件编码名，例如EUCJIS/SJIS。如果未指定该选项，则使用平台缺省转换器。</p>
<p>　　-J[flag] 将flag直接传递给运行javadoc的运行时系统java。注意在J和flag之间不能有空格。 <br />
标准 Doclet 提供的选项</p>
<p>　　-d directory 指定javadoc保存生成的HTML件的目的目录。省略该选项将导致把文件保存到当前目录中。其中directory可以是绝对路径或相对当前工作目录的相对路径。</p>
<p>　　-use 对每个带文档类和包包括一个&#8220;用法&#8221;页。该页描述使用给定类或包的任何 API 的包、类、方法、构造函数和域。对于给定类 C，使用类 C 的任何东西将包括 C 的子类、声明为 C 的域、返回 C 的方法以及具有 C 类型参数的方法和构造函数。</p>
<p>　　-version 在生成文档中包括 @version 文本。缺省地将省略该文本。</p>
<p>　　-author 在生成文档中包括 @author 文本。</p>
<p>　　-splitindex 将索引文件按字母分割成多个文件，每个字母一个文件，再加上一个包含所有以非字母字符开头的索引项的文件。</p>
<p>　　-windowtitle[title] 指定放入 HTML<br />
&nbsp;</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/smile_dyf/archive/2008/09/04/2882247.aspx</p>
<img src ="http://www.blogjava.net/xzclog/aggbug/304795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-12-04 17:12 <a href="http://www.blogjava.net/xzclog/archive/2009/12/04/304795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ssh2的两种java实现[转]</title><link>http://www.blogjava.net/xzclog/archive/2009/08/17/291531.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 17 Aug 2009 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/08/17/291531.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/291531.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/08/17/291531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/291531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/291531.html</trackback:ping><description><![CDATA[<div class="xspace-itemmessage" id="xspace-showmessage">
<p>转自：<a href="http://www.51testing.com/?53222/action_viewspace_itemid_21227.html">http://www.51testing.com/?53222/action_viewspace_itemid_21227.html</a><br />
</p>
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/291531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-08-17 18:01 <a href="http://www.blogjava.net/xzclog/archive/2009/08/17/291531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决html导出excel时数字被改成科学计数法的问题[转]</title><link>http://www.blogjava.net/xzclog/archive/2009/08/07/290246.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 07 Aug 2009 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/08/07/290246.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/290246.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/08/07/290246.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/290246.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/290246.html</trackback:ping><description><![CDATA[<div class="blog_content">【适用范围】IE,<span class="hilite1">JSP</span> <br />
<br />
【问题描述和定位】业务需要把一个html页面中的内容导出到excle文件里面，一个常用的方法是在需要导出的<span class="hilite1">jsp</span>页面中增加： <br />
<br />
&nbsp;&nbsp;&nbsp; response.setContentType("application/vnd.ms-Excel; charset=gb2312"); <br />
<br />
&nbsp;&nbsp;&nbsp; response.setHeader("Content-disposition","attachment;filename=excel文件名.xls"); <br />
<br />
&nbsp;&nbsp;&nbsp; 但是经常遇到会把身份证等数字比较长的数据改成科学计数法来显示。 <br />
<br />
【解决方案和步骤】 <br />
<br />
在html页面里面加上如下css，然后在出现问题的字段应用这种style就可以了。 <br />
<br />
<br />
&lt;style type="text/css"&gt; <br />
&lt;!-- <br />
td { <br />
background-color: #FFFFFF; <br />
} <br />
.txt <br />
{padding-top:1px; <br />
padding-right:1px; <br />
padding-left:1px; <br />
mso-ignore:padding; <br />
color:black; <br />
font-size:11.0pt; <br />
font-weight:400; <br />
font-style:normal; <br />
text-decoration:none; <br />
font-family:宋体; <br />
mso-generic-font-family:auto; <br />
mso-font-charset:134; <br />
mso-number-format:"\@"; //关键是这里 <br />
text-align:general; <br />
vertical-align:middle; <br />
mso-background-source:auto; <br />
mso-pattern:auto; <br />
white-space:nowrap;} <br />
--&gt; <br />
&lt;/style&gt; <br />
&nbsp; <br />
示例： <br />
&lt;TD class="txt" align="center"&gt; <br />
&lt;bean:write id="ResultSet" property="VW_SETTLHINT/DEALBILLID"/&gt; <br />
&lt;/TD&gt; <br />
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/290246.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-08-07 16:26 <a href="http://www.blogjava.net/xzclog/archive/2009/08/07/290246.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大数据量导出Excel的方案[转]</title><link>http://www.blogjava.net/xzclog/archive/2009/08/07/290240.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 07 Aug 2009 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/08/07/290240.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/290240.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/08/07/290240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/290240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/290240.html</trackback:ping><description><![CDATA[<div id="threadtitle">
<h1>&nbsp;</h1>
</div>
<div class="t_msgfontfix">
<table cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td class="t_msgfont" id="postmessage_806">试共同条件： <br />
            数据总数为110011条，每条数据条数为19个字段。 <br />
            电脑配置为：P4 2.67GHz，1G内存。 <br />
            <br />
            一、POI、JXL、FastExcel比较 <br />
            POI、JXL、FastExcel均为java第三方开源导出Excel的开源项目。 <br />
            <br />
            导出方案一：一次性全部导出到一个Excel文件中。 <br />
            实际情况均报OutOfMemery错误，以下数据为报OutOfMemery数据时，数据到的最大数据数目，如表1所示： <br />
            表1：报OutOfMemery错误时所能处理的数据量 <br />
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td></td>
                        <td>FastExecl</td>
                        <td>POI </td>
                        <td>JXL </td>
                    </tr>
                    <tr>
                        <td>10000数据/sheet</td>
                        <td>37465 </td>
                        <td>28996 </td>
                        <td>42270 </td>
                    </tr>
                    <tr>
                        <td>5000数据/sheet</td>
                        <td>39096 </td>
                        <td>31487 </td>
                        <td>46270 </td>
                    </tr>
                    <tr>
                        <td>3000数据/sheet</td>
                        <td>39000 </td>
                        <td>32493 </td>
                        <td>47860 </td>
                    </tr>
                </tbody>
            </table>
            小结： <br />
            多分sheet能一定程度上减少内存的使用，但是均因为程序中创建的Cell（即为Excel中的一个单元格）无法释放，消耗大量内存，导致OutOfMemery错误；JXL表现最好，创建Cell内存使用较少。 <br />
            <br />
            导出方案二：先分多个Excel文件将数据全部导出，然后对多个Excel文件进行合并。 <br />
            首先，测试将全部数据导出所用的时间，如表2所示，数据均测试三次取平均。 <br />
            表2：导出全部数据所用时间 <br />
            <br />
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td></td>
                        <td>FastExecl </td>
                        <td>POI </td>
                        <td>JXL </td>
                    </tr>
                    <tr>
                        <td>10000数据/文件</td>
                        <td>68s </td>
                        <td>33s </td>
                        <td>30s </td>
                    </tr>
                    <tr>
                        <td>5000数据/文件</td>
                        <td>68s </td>
                        <td>32s </td>
                        <td>33s </td>
                    </tr>
                    <tr>
                        <td>3000数据/文件</td>
                        <td>59s </td>
                        <td>33s </td>
                        <td>39s </td>
                    </tr>
                </tbody>
            </table>
            小结： <br />
            均成功导出Excel文件，原因是导出一个Excel文件，释放所占用的创建Cell的内存。 <br />
            FastExecl表现最差，POI表现稳定，JXL随着数据的增大，速度一定程度上增快。 <br />
            <br />
            然后，进行整合，由于将多Excel合并成一个Excel文件的功能只有POI所有，故使用POI测试，结果如表3所示。 <br />
            注：数据量大合并还会报OutOfMemery错误，故合并总数据量以5万为准。 <br />
            表3：合并5万数据所用时间 <br />
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td></td>
                        <td>时间 </td>
                    </tr>
                    <tr>
                        <td>10000数据/文件</td>
                        <td>11s </td>
                    </tr>
                    <tr>
                        <td>5000数据/文件</td>
                        <td>11s </td>
                    </tr>
                    <tr>
                        <td>3000数据/文件 </td>
                        <td>11s</td>
                    </tr>
                </tbody>
            </table>
            小结： <br />
            使用POI对文件进行合并速度较快，但有数据量的限制。 <br />
            <br />
            <br />
            总结：方案二比较可行，但是数据量有限制，为5万条。 <br />
            <br />
            <br />
            二、导出XML 的电子表格 <br />
            导出的格式类似为纯文本，能实现大数据量的存储，并能实现分Sheet查看，且能添加简单的样式，符合项目要求。经实际测试Excel2003和Excel2007均能识别并正常打开查看。使用时间测试如表4所示，数据均测试3次取平均。 <br />
            表4：生成全部数据所用时间 <br />
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td></td>
                        <td>时间 </td>
                    </tr>
                    <tr>
                        <td>10000数据/sheet</td>
                        <td>28.0秒 </td>
                    </tr>
                    <tr>
                        <td>20000数据/sheet</td>
                        <td>30.1秒 </td>
                    </tr>
                    <tr>
                        <td>30000数据/sheet</td>
                        <td>28.1秒</td>
                    </tr>
                    <tr>
                        <td>40000数据/sheet</td>
                        <td>26.5秒</td>
                    </tr>
                    <tr>
                        <td>50000数据/shee</td>
                        <td>28.2秒</td>
                    </tr>
                    <tr>
                        <td>55000数据/sheet</td>
                        <td>26.8秒</td>
                    </tr>
                    <tr>
                        <td>59000数据/sheet </td>
                        <td>30.1秒</td>
                    </tr>
                    <tr>
                        <td>59500数据/sheet </td>
                        <td>发生假死机现象 </td>
                    </tr>
                    <tr>
                        <td>60000数据/sheet</td>
                        <td>发生假死机现象 </td>
                    </tr>
                </tbody>
            </table>
            <br />
            但是导出的数据为XML不是纯正的Excel文件，如使用Excel文件的xls后缀保存，打开文件会弹出警告，但不影响阅读。 <br />
            且经实际测试，在Access2007和Access2003中可通过导入外部数据的方式，将导出的XML导入进Access数据库。 <br />
            <br />
            三、总结 <br />
            项目要求是大数据量导出Excel文件，POI、JXL、FastExcel不能完全满足要求；使用XML 的电子表格导出实现了大数据量导出，但是格式为XML不是纯正的Excel文件，为曲线救国。两种导出形式的比较，如表5所示。 <br />
            表5：合并5万数据所用时间 <br />
            <table class="t_table" cellspacing="0">
                <tbody>
                    <tr>
                        <td></td>
                        <td>POI、JXL、FastExcel</td>
                        <td>XML 的电子表格</td>
                    </tr>
                    <tr>
                        <td>导出数据格式</td>
                        <td>为纯Execl文件</td>
                        <td>为XML文件</td>
                    </tr>
                    <tr>
                        <td>导出数据量</td>
                        <td>小</td>
                        <td>较大</td>
                    </tr>
                    <tr>
                        <td>能否分Sheet</td>
                        <td>能</td>
                        <td>能</td>
                    </tr>
                    <tr>
                        <td>能否添加样式</td>
                        <td>能</td>
                        <td>能</td>
                    </tr>
                    <tr>
                        <td>能否添加图片</td>
                        <td>POI 能</td>
                        <td>不能</td>
                    </tr>
                    <tr>
                        <td>导出数据能否导入Access</td>
                        <td>能</td>
                        <td>能</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
</div>
<div id="post_rate_div_806"></div>
<div class="useraction"><a id="ajax_favorite" onclick="floatwin('open_login', this.href, 600, 400);return false;" href="http://www.offshore-jp.com/bbs/logging.php?action=login">收藏</a> <a id="emailfriend" onclick="floatwin('open_emailfriend', this.href, 250, 200);return false;" href="http://www.offshore-jp.com/bbs/misc.php?action=emailfriend&amp;tid=262">分享</a> <a id="ratelink" onclick="floatwin('open_login', this.href, 600, 400);return false;" href="http://www.offshore-jp.com/bbs/logging.php?action=login">评分</a> </div>
<img src ="http://www.blogjava.net/xzclog/aggbug/290240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-08-07 15:57 <a href="http://www.blogjava.net/xzclog/archive/2009/08/07/290240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat中文乱码问题的原理和解决方法</title><link>http://www.blogjava.net/xzclog/archive/2008/11/22/242017.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 22 Nov 2008 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/11/22/242017.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/242017.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/11/22/242017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/242017.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/242017.html</trackback:ping><description><![CDATA[自从接触Java和JSP以来，就不断与Java的中文乱码问题打交道，现在终于得到了彻底的解决，现将我们的解决心得与大家共享。
<p>　　一、Java中文问题的由来</p>
<p>　　<span style="background-color: yellow">Java的内核和class文件是基于unicode的</span>，这使Java程序具有良好的跨平台性，但也带来了一些中文乱码问题的麻烦。原因主要有两方面，Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。</p>
<p>　　首先<span style="background-color: yellow">Java（包括JSP）源文件中很可能包含有中文</span>，而Java和JSP源文件的保存方式是基于字节流的，如果Java和JSP编译成class文件过程中，使用的编码方式与源文件的编码不一致，就会出现乱码。基于这种乱码，建议在Java文件中尽量不要写中文（注释部分不参与编译，写中文没关系），<span style="background-color: yellow">如果必须写的话，尽量手动带参数－ecoding GBK或－ecoding gb2312编译</span>；<span style="background-color: yellow">对于JSP，在文件头加上&lt;%@ page contentType="text/html;charset=GBK"%&gt;或&lt;%@ page contentType="text/html;charset=gb2312"%&gt;基本上就能解决这类乱码问题。</span></p>
<p>　　本文要重点讨论的是第二类乱码，<span style="background-color: yellow">即Java程序与其他存储媒介交互时产生的乱码。</span>很多存储媒介，如数据库，文件，流等的存储方式都是基于字节流的，Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换，例如从页面提交表单中提交的数据在Java程序里显示乱码等情况。</p>
<p>　　如果在以上转换过程中使用的编码方式与字节原有的编码不一致，很可能就会出现乱码。</p>
<p>　　二、解决方法</p>
<p>　　对于流行的Tomcat来说，有以下两种解决方法：</p>
<p>　　<span style="background-color: yellow">1) 更改 D:\Tomcat\conf\server.xml，指定浏览器的编码格式为&#8220;简体中文&#8221;：</span></p>
<p>　　方法是找到 server.xml 中的</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br />
&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" <strong>URIEncoding='GBK'</strong> /&gt;<br />
</p>
<p>　　标记，粗体字是我添加的。</p>
<p>　　可以这样验证你的更改是否成功：在更改前，在你出现乱码的页面的IE浏览器，点击菜单&#8220;查看｜编码&#8221;，会发现&#8220;西欧(ISO)&#8221;处于选中状态。而更改后，点击菜单&#8220;查看｜编码&#8221;，会发现&#8220;简体中文(GB2312)&#8221;处于选中状态。</p>
<p>　　<span style="background-color: yellow">b)更该 Java 程序，我的程序是这样的：</span></p>
<p>public class ThreeParams extends <span style="background-color: yellow">HttpServlet </span>{<br />
&nbsp; public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp; throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>response.setContentType("text/html; charset=GBK");<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp; }&nbsp; <br />
}<br />
</p>
<p>　　粗体字是必需要有的，<span style="background-color: yellow">它的作用是让浏览器把Unicode</span><span style="background-color: yellow">字符转换为GBK字符。这样页面的内容和浏览器的显示模式都设成了GBK</span>，就不会乱码了。</p>
<div class="post-body">
<center><br />
<br />
原创文章如转载，请注明：转载自<a href="http://www.williamlong.info/">月光博客</a> [ <a href="http://www.williamlong.info/">http://www.williamlong.info/</a> ] <br />
</center></div>
<img src ="http://www.blogjava.net/xzclog/aggbug/242017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-11-22 20:39 <a href="http://www.blogjava.net/xzclog/archive/2008/11/22/242017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用MessageSource实现国际化[I18N]</title><link>http://www.blogjava.net/xzclog/archive/2008/11/22/241974.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 22 Nov 2008 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/11/22/241974.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/241974.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/11/22/241974.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/241974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/241974.html</trackback:ping><description><![CDATA[<div class="section" lang="zh-cn">
<div class="titlepage">
<div>
<div>
<h3 class="title"><a name="context-functionality-messagesource"></a>3.8.1.&nbsp;利用<code class="literal"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>实现国际化</h3>
</div>
</div>
</div>
<p><code class="interfacename">ApplicationContext</code>接口扩展了<code class="interfacename"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>接口，因而提供了消息处理的功能（i18n或者国际化）。与<code class="classname">HierarchicalMessageSource</code>一起使用，它还能够处理嵌套的消息，这些是Spring提供的处理消息的基本接口。让我们快速浏览一下它所定义的方法：</p>
<div class="itemizedlist">
<ul type="disc">
    <li>
    <p><code class="literal">String getMessage(String code, Object[] args, String default, Locale loc)：用来从<code class="interfacename"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>获取消息的基本方法。如果在指定的locale中没有找到消息，则使用默认的消息。args中的参数将使用标准类库中的<code class="literal">MessageFormat</code>来作消息中替换值。</code></p>
    <li>
    <p><code class="literal">String getMessage(String code, Object[] args, Locale loc)：本质上和上一个方法相同，其区别在：没有指定默认值，如果没找到消息，会抛出一个<code class="classname">NoSuchMessageException</code>异常。</code></p>
    <li>
    <p><code class="literal">String getMessage(MessageSourceResolvable resolvable, Locale locale)</code>：上面方法中所使用的属性都封装到一个<code class="interfacename">MessageSourceResolvable</code>实现中，而本方法可以指定<code class="interfacename">MessageSourceResolvable</code>实现。</p>
    </li>
</ul>
</div>
<p>当一个<code class="interfacename">ApplicationContext</code>被加载时，它会自动在context中查找已定义为<code class="interfacename"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>类型的bean。此bean的名称须为<code class="literal"><font style="background-color: #316ac5" color="#ffffff">messageSource</font></code>。如果找到，那么所有对上述方法的调用将被委托给该bean。否则<code class="interfacename">ApplicationContext</code>会在其父类中查找是否含有同名的bean。如果有，就把它作为<code class="interfacename"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>。如果它最终没有找到任何的消息源，一个空的<code class="classname">StaticMessageSource</code>将会被实例化，使它能够接受上述方法的调用。</p>
<p>Spring目前提供了两个<code class="interfacename"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>的实现:<code class="classname">ResourceBundleMessageSource</code>和<code class="classname">StaticMessageSource</code>。它们都继承<code class="classname">NestingMessageSource</code>以便能够处理嵌套的消息。<code class="classname">StaticMessageSource</code>很少被使用，但能以编程的方式向消息源添加消息。<code class="classname">ResourceBundleMessageSource</code>会用得更多一些，为此提供了一下示例：</p>
<pre class="programlisting">&lt;beans&gt;
&lt;bean id="<font style="background-color: #316ac5" color="#ffffff">messageSource</font>"
class="org.springframework.context.support.ResourceBundleMessageSource"&gt;
&lt;property name="basenames"&gt;
&lt;list&gt;
&lt;value&gt;format&lt;/value&gt;
&lt;value&gt;exceptions&lt;/value&gt;
&lt;value&gt;windows&lt;/value&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;
&lt;/beans&gt;</pre>
<p>这段配置假定在你的classpath中有三个资源文件（resource bundle），它们是<code class="literal">format</code>， <code class="literal">exceptions</code>和<code class="literal">windows</code>。通过ResourceBundle，使用JDK中解析消息的标准方式，来处理任何解析消息的请求。出于示例的目的，假定上面的两个资源文件的内容为&#8230;</p>
<pre class="programlisting"><em class="lineannotation"><span class="lineannotation"># in 'format.properties'</span></em>
message=Alligators rock!</pre>
<pre class="programlisting"><em class="lineannotation"><span class="lineannotation"># in 'exceptions.properties'</span></em>
argument.required=The '{0}' argument is required.</pre>
<p>下面是测试代码。因为<code class="classname">ApplicationContext</code>实现也都实现了<code class="classname"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>接口，所以能被转型为<code class="classname"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>接口</p>
<pre class="programlisting">public static void main(String[] args) {
<font style="background-color: #316ac5" color="#ffffff">MessageSource</font> resources = new ClassPathXmlApplicationContext("beans.xml");
String message = resources.getMessage("message", null, "Default", null);
System.out.println(message);
}</pre>
<p>上述程序的输出结果将会是...</p>
<pre class="programlisting">Alligators rock!</pre>
<p>总而言之，我们在<code class="literal">'beans.xml'</code>的文件中（在classpath根目录下）定义了一个<code class="literal"><font style="background-color: #316ac5" color="#ffffff">messageSource</font></code> bean，通过它的<code class="literal">basenames</code>属性引用多个资源文件；而<code class="literal">basenames</code>属性值由list元素所指定的三个值传入，它们以文件的形式存在并被放置在classpath的根目录下（分别为<code class="literal">format.properties</code>，<code class="literal">exceptions.properties</code>和<code class="literal">windows.properties</code>）。</p>
<p>再分析个例子，这次我们将着眼于传递参数给查找的消息，这些参数将被转换为字符串并插入到已查找到的消息中的占位符（译注：资源文件中花括号里的数字即为占位符）。</p>
<pre class="programlisting">&lt;beans&gt;
<em class="lineannotation"><span class="lineannotation">&lt;!-- this <code class="interfacename"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code> is being used in a web application --&gt;</span></em>
&lt;bean id="<font style="background-color: #316ac5" color="#ffffff">messageSource</font>" class="org.springframework.context.support.ResourceBundleMessageSource"&gt;
&lt;property name="baseName" value="WEB-INF/test-messages"/&gt;
&lt;/bean&gt;
<em class="lineannotation"><span class="lineannotation">&lt;!-- let's inject the above <code class="interfacename"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code> into this POJO --&gt;</span></em>
&lt;bean id="example" class="com.foo.Example"&gt;
&lt;property name="messages" ref="<font style="background-color: #316ac5" color="#ffffff">messageSource</font>"/&gt;
&lt;/bean&gt;
&lt;/beans&gt;</pre>
<pre class="programlisting">public class Example {
private <font style="background-color: #316ac5" color="#ffffff">MessageSource</font> messages;
public void setMessages(<font style="background-color: #316ac5" color="#ffffff">MessageSource</font> messages) {
this.messages = messages;
}
public void execute() {
String message = this.messages.getMessage("argument.required",
new Object [] {"userDao"}, "Required", null);
System.out.println(message);
}
}</pre>
<p>调用<code class="methodname">execute()</code>方法的输出结果是...</p>
<pre class="programlisting">The 'userDao' argument is required.</pre>
<p>对于国际化（i18n），Spring中不同的<code class="classname">MessageResource</code>实现与JDK标准ResourceBundle中的locale解析规则一样。比如在上面例子中定义的<code class="literal"><font style="background-color: #316ac5" color="#ffffff">messageSource</font></code> bean，如果你想解析British (en-GB) locale的消息，那么需要创建<code class="literal">format_en_GB.properties</code>，<code class="literal">exceptions_en_GB.properties</code>和<code class="literal">windows_en_GB.properties</code>三个资源文件。</p>
<p>Locale解析通常由应用程序根据运行环境来指定。出于示例的目的，我们对将要处理的(British)消息手工指定locale参数值。</p>
<pre class="programlisting"><em class="lineannotation"><span class="lineannotation"># in 'exceptions_en_GB.properties'</span></em>
argument.required=Ebagum lad, the '{0}' argument is required, I say, required.</pre>
<pre class="programlisting">public static void main(final String[] args) {
<font style="background-color: #316ac5" color="#ffffff">MessageSource</font> resources = new ClassPathXmlApplicationContext("beans.xml");
String message = resources.getMessage("argument.required",
new Object [] {"userDao"}, "Required", Locale.UK);
System.out.println(message);
}</pre>
<p>上述程序运行时的输出结果是...</p>
<pre class="programlisting">Ebagum lad, the 'userDao' argument is required, I say, required.</pre>
<p><code class="classname">MessageSourceAware</code>接口还能用于获取任何已定义的<code class="classname"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>引用。任何实现了<code class="classname">MessageSourceAware</code>接口的bean将在创建和配置的时候与<code class="classname"><font style="background-color: #316ac5" color="#ffffff">MessageSource</font></code>一同被注入。</p>
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/241974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-11-22 16:51 <a href="http://www.blogjava.net/xzclog/archive/2008/11/22/241974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring i18n的better practice(相对于appfuse)</title><link>http://www.blogjava.net/xzclog/archive/2008/11/22/241969.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 22 Nov 2008 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/11/22/241969.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/241969.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/11/22/241969.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/241969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/241969.html</trackback:ping><description><![CDATA[因为希望把SpringSide搞成国际化项目，i18n就成了必做的事情。<br />
照抄appfuse，折腾了很久后才发现appfuse式的sample总是只顾着演示自己的一亩三分地而忽略了很多其他东西。<br />
<br />
<span style="color: red">&nbsp;&nbsp;&nbsp;1.从基础开始，没有Spring时，Java的i18n是这样的：</span><br />
&nbsp;&nbsp;&nbsp;<span style="background-color: yellow">1.1&nbsp;jsp环境<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;首先写一个messages.zh_CN.properties文件，放在class-path也就是/WEB-INF/classes里&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;welcome=欢迎&nbsp;&nbsp;&nbsp;&nbsp;然后用native2ascii.exe把它转为&nbsp;welcome=\u6b22\u8fce<br />
&nbsp;&nbsp;&nbsp;&nbsp;在web.xml中定义messages文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background-color: yellow">&lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;javax.servlet.jsp.jstl.fmt.localizationContext&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;messages&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/context-param&gt;<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;最后在jsp里使用<br />
&lt;%@&nbsp;taglib&nbsp;uri="http://java.sun.com/jstl/fmt"&nbsp;prefix="fmt"&nbsp;%&gt;<br />
&lt;<span style="background-color: yellow">fmt:message&nbsp;</span>key="welcome"/&gt;<br />
如果有多个Resource&nbsp;Bundle文件,&nbsp;就要在jsp里用&lt;ftm:bundle&gt;定义了.<br />
<br />
<span style="background-color: yellow">1.2&nbsp;pure&nbsp;Java环境</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;ResourceBundle&nbsp;rb&nbsp;=&nbsp;ResourceBundle.getBundle("messages");<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;welcome&nbsp;=&nbsp;rb.getString("welcome");<br />
<br />
<span style="color: red">2.Spring的增强及appfuse的做法</span><br />
&nbsp;&nbsp;<span style="background-color: yellow">&nbsp;Spring增加了MessageSource的概念，一是ApplicationContext将充当一个单例的角色，不再需要每次使用i18时都初始化一次ResourceBundle,二是可以代表多个Resource&nbsp;Bundle.<br />
</span><br />
&nbsp;&nbsp;&nbsp;在ApplicationContext的定义文件中，增加如下节点：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;id="messageSource"&nbsp;class="org.springframework.context.support.ResourceBundleMessageSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="basename"&nbsp;value="messages"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;则在pure&nbsp;java环境中。&nbsp;&nbsp;context.getMessage("welcome",&nbsp;null,&nbsp;Locale.CHINA)<br />
<br />
&nbsp;&nbsp;而在jsp环境中，Controller调用JSTL&nbsp;viewResolver再调用Jsp时，&lt;fmt:message&gt;将继续发挥它的功效。<br />
<br />
&nbsp;&nbsp;因此，appfuse等sample都是在appfuse-servlet.xml&nbsp;中定义一个&lt;messageSource&gt;。<br />
<br />
<span style="color: red">3.Better&nbsp;Practice</span><br />
3.1&nbsp;要不要定义javax.servlet.jsp.jstl.fmt.localizationContext<span style="color: red">[定义]</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Appfuse等sample，都是假定大家完全使用Controller作访问入口，jsp甚至藏在了/web-inf/中。而很不幸，大家的项目可能还是有很多直接访问jsp的地方，而直接访问jsp时，&lt;messageSource&gt;节点是没有作用的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但如果定义了javax...localizationContext,&nbsp;又会让MessageSource失效......<br />
<br />
<br />
3.2<span style="color: red">&nbsp;messageSource定义在ApplicationContext.xml</span>还是appfuse-servlet.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="background-color: yellow">ApplicationContext*.xml由ContextLoaderListener载入</span>，<span style="background-color: yellow">而appfuse-servlet.xml靠dispatchServlet载入</span>，<span style="background-color: yellow">并拥有一个指向ApplcationContex*.xml指针</span>。所以，appfuse-servlet.xml能看到定义在ApplcationContext里的东西，而反之做不到。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;明显,&nbsp;把&lt;messageSource&gt;定义在ApplicationContext.xml&nbsp;能获得更好的可见性。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但是appfuse没有在pure&nbsp;Java代码中使用i18n，也就没有考虑这个问题。<br />
<br />
3.3&nbsp;坚决不用鸡肋级&lt;spring:message&gt;&nbsp;tag<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;连appfuse也不用它，可见多么鸡肋。因为fmt在找不到资源时，最多显示???welcome???，而&lt;spring:message&gt;则会抛出异常，谁会喜欢这种定时炸弹阿。<br />
<br />
3.4&nbsp;有趣的theme&nbsp;解决"做成图片的文字"的国际化<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;theme也就是把message的原理发挥了一下，让不同语言的美术字图片的路径也可以定义在theme_zh_CN.properties和theme_en_US.properties中。终于有一个不那么鸡肋的spring&nbsp;tag了。<br />
<br />
4.简单归纳<br />
<br />
<span style="background-color: yellow">1.&nbsp;jstl中仍然使用标准的&lt;ftm:message&gt;及其定义?<br />
<br />
2.java中使用spring的&lt;messageSource&gt;实现单例<br />
<br />
3.用&lt;spring:theme&gt;解决那些做成图片的文字的国际化问题<br />
<br />
4.Spring&nbsp;还有session,cookie&nbsp;locale&nbsp;resolver,&nbsp;到时可以看一下.</span><br />
<img src ="http://www.blogjava.net/xzclog/aggbug/241969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-11-22 16:40 <a href="http://www.blogjava.net/xzclog/archive/2008/11/22/241969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java语法总结 - 线程 </title><link>http://www.blogjava.net/xzclog/archive/2008/11/21/241880.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 21 Nov 2008 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/11/21/241880.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/241880.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/11/21/241880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/241880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/241880.html</trackback:ping><description><![CDATA[<div class="posthead">
<h2><a class="singleposttitle" id="viewpost1_TitleUrl" href="http://www.blogjava.net/raylong1982/archive/2007/10/25/155983.html">Java语法总结 - 线程</a> </h2>
Posted on 2007-10-25 23:53 <a href="http://www.blogjava.net/raylong1982/">Raylong</a> 阅读(3747) <a href="http://www.blogjava.net/raylong1982/archive/2007/10/25/155983.html#Post">评论(10)</a> &nbsp;<a href="http://www.blogjava.net/raylong1982/admin/EditPosts.aspx?postid=155983">编辑</a> &nbsp;<a href="http://www.blogjava.net/raylong1982/AddToFavorite.aspx?id=155983">收藏</a> 所属分类: <a href="http://www.blogjava.net/raylong1982/category/26720.html">Java语法总结</a> <img height="1" src="http://www.blogjava.net/raylong1982/aggbug/155983.html?webview=1" width="1"  alt="" /> <!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description rdf:about="http://www.blogjava.net/raylong1982/archive/2007/10/25/155983.html" dc:identifier="http://www.blogjava.net/raylong1982/archive/2007/10/25/155983.html" dc:title="Java语法总结 - 线程" trackback:ping="http://www.blogjava.net/raylong1982/services/trackbacks/155983.aspx"  />
</rdf:RDF>
--></div>
<div class="postbody">Java语法总结 - 线程<br />
<br />
一提到线程好像是件很麻烦很复杂的事，事实上确实如此，涉及到线程的编程是很讲究技巧的。这就需要我们变换思维方式，了解线程机制的比较通用的技巧，写出高效的、不依赖于某个JVM实现的程序来。毕竟仅仅就Java而言，各个虚拟机的实现是不同的。学习线程时，最令我印象深刻的就是那种不确定性、没有保障性，各个线程的运行完全是以不可预料的方式和速度推进，有的一个程序运行了N次，其结果差异性很大。<br />
<br />
<br />
1、什么是线程？线程是彼此互相独立的、能独立运行的子任务，并且每个线程都有自己的调用栈。所谓的多任务是通过周期性地将CPU时间片切换到不同的子任务，虽然从微观上看来，单核的CPU上同时只运行一个子任务，但是从宏观来看，每个子任务似乎是同时连续运行的。（但是JAVA的线程不是按时间片分配的，在本文的最后引用了一段网友翻译的JAVA原著中对线程的理解。）<br />
<br />
2、在java中，线程指两个不同的内容：一是java.lang.Thread类的一个对象；另外也可以指线程的执行。线程对象和其他的对象一样，在堆上创建、运行、死亡。但不同之处是线程的执行是一个轻量级的进程，有它自己的调用栈。<br />
可以这样想，每个调用栈都对应一个线程，每个线程又对应一个调用栈。<br />
我们运行java程序时有一个入口函数main()函数，它对应的线程被称为主线程。一个新线程一旦被创建，就产生一个新调用栈，从原主线程中脱离，也就是与主线程并发执行。<br />
<br />
<br />
4、当提到线程时，很少是有保障的。我们必须了解到什么是有保障的操作，什么是无保障的操作，以便设计的程序在各种jvm上都能很好地工作。比如，在某些jvm实现中，把java线程映射为本地操作系统的线程。这是java核心的一部分。<br />
<br />
5、线程的创建。<br />
创建线程有两种方式：<br />
A、继承java.lang.Thread类。<br />
&nbsp;&nbsp; &nbsp;class ThreadTest extends Thread{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println ("someting run here！");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public void run(String s){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println ("string in run is " + s);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public static void main (String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ThreadTest tt = new ThreadTest();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;tt.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;tt.run("it won't auto run!");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
输出的结果比较有趣：<br />
string in run is it won't auto run!<br />
someting run here！<br />
注意输出的顺序：好像与我们想象的顺序相反了！为什么呢？<br />
一旦调用start()方法，必须给JVM点时间，让它配置进程。而在它配置完成之前，重载的run(String s)方法被调用了，结果反而先输出了&#8220;string in run is it won't auto run!&#8221;，这时tt线程完成了配置，输出了&#8220;someting run here！&#8221;。<br />
这个结论是比较容易验证的：<br />
修改上面的程序，在tt.start();后面加上语句for (int i = 0; i&lt;10000; i++); 这样主线程开始执行运算量比较大的for循环了，只有执行完for循环才能运行后面的tt.run("it won't auto run!");语句。此时，tt线程和主线程并行执行了，已经有足够的时间完成线程的配置！因此先到一步！修改后的程序运行结果如下：<br />
someting run here！<br />
string in run is it won't auto run!<br />
注意：这种输出结果的顺序是没有保障的！不要依赖这种结论！<br />
<br />
没有参数的run()方法是自动被调用的，而带参数的run()是被重载的，必须显式调用。<br />
这种方式的限制是：这种方式很简单，但不是个好的方案。如果继承了Thread类，那么就不能继承其他的类了，java是单继承结构的，应该把继承的机会留给别的类。除非因为你有线程特有的更多的操作。<br />
Thread类中有许多管理线程的方法，包括创建、启动和暂停它们。所有的操作都是从run()方法开始，并且在run()方法内编写需要在独立线程内执行的代码。run()方法可以调用其他方法，但是执行的线程总是通过调用run()。<br />
<br />
B、实现java.lang.Runnable接口。<br />
&nbsp;&nbsp; &nbsp;class ThreadTest implements Runnable {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println ("someting run here");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public static void main (String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ThreadTest tt = new ThreadTest();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread t1 = new Thread(tt);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread t2 = new Thread(tt);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t1.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t2.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//new Thread(tt).start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
比第一种方法复杂一点，为了使代码被独立的线程运行，还需要一个Thread对象。这样就把线程相关的代码和线程要执行的代码分离开来。<br />
<br />
另一种方式是：参数形式的匿名内部类创建方式，也是比较常见的。<br />
&nbsp;&nbsp; &nbsp;class ThreadTest{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public static void main (String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread t = new Thread(new Runnable(){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public void run(){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println ("anonymous thread");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;}<br />
如果你对此方式的声明不感冒，请参看本人总结的内部类。<br />
<br />
第一种方式使用无参构造函数创建线程，则当线程开始工作时，它将调用自己的run()方法。<br />
第二种方式使用带参数的构造函数创建线程，因为你要告诉这个新线程使用你的run()方法，而不是它自己的。<br />
如上例，可以把一个目标赋给多个线程，这意味着几个执行线程将运行完全相同的作业。<br />
<br />
6、什么时候线程是活的？<br />
在调用start()方法开始执行线程之前，线程的状态还不是活的。测试程序如下：<br />
&nbsp;&nbsp; &nbsp;class ThreadTest implements Runnable {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println ("someting run here");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public static void main (String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ThreadTest tt = new ThreadTest();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread t1 = new Thread(tt);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println (t1.isAlive());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t1.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println (t1.isAlive());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
结果输出：<br />
false<br />
true<br />
isAlive方法是确定一个线程是否已经启动，而且还没完成run()方法内代码的最好方法。<br />
<br />
7、启动新线程。<br />
线程的启动要调用start()方法，只有这样才能创建新的调用栈。而直接调用run()方法的话，就不会创建新的调用栈，也就不会创建新的线程，run()方法就与普通的方法没什么两样了！<br />
<br />
8、给线程起个有意义的名字。<br />
没有该线程命名的话，线程会有一个默认的名字，格式是：&#8220;Thread-&#8221;加上线程的序号，如：Thread-0<br />
这看起来可读性不好，不能从名字分辨出该线程具有什么功能。下面是给线程命名的方式。<br />
第一种：用setName()函数<br />
第二种：选用带线程命名的构造器<br />
&nbsp;&nbsp; &nbsp;class ThreadTest implements Runnable{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public void run(){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println (Thread.currentThread().getName());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public static void main (String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ThreadTest tt = new ThreadTest();&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Thread t = new Thread (tt,"eat apple");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread t = new Thread (tt);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t.setName("eat apple");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
9、&#8220;没有保障&#8221;的多线程的运行。下面的代码可能令人印象深刻。<br />
&nbsp;&nbsp; &nbsp;class ThreadTest implements Runnable{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public void run(){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println (Thread.currentThread().getName());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public static void main (String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ThreadTest tt = new ThreadTest();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread[] ts =new Thread[10];<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i =0; i &lt; ts.length; i++)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ts[i] = new Thread(tt);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (Thread t : ts) <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;}<br />
在我的电脑上运行的结果是：<br />
Thread-0<br />
Thread-1<br />
Thread-3<br />
Thread-5<br />
Thread-2<br />
Thread-7<br />
Thread-4<br />
Thread-9<br />
Thread-6<br />
Thread-8<br />
而且每次运行的结果都是不同的！继续引用前面的话，一旦涉及到线程，其运行多半是没有保障。这个保障是指线程的运行完全是由调度程序控制的，我们没法控制它的执行顺序，持续时间也没有保障，有着不可预料的结果。<br />
<br />
<br />
10、线程的状态。<br />
A、新状态。<br />
实例化Thread对象，但没有调用start()方法时的状态。<br />
ThreadTest tt = new ThreadTest();&nbsp;&nbsp;&nbsp; &nbsp;<br />
或者Thread t = new Thread (tt);<br />
此时虽然创建了Thread对象，如前所述，但是它们不是活的，不能通过isAlive()测试。<br />
<br />
B、就绪状态。<br />
线程有资格运行，但调度程序还没有把它选为运行线程所处的状态。也就是具备了运行的条件，一旦被选中马上就能运行。<br />
也是调用start()方法后但没运行的状态。此时虽然没在运行，但是被认为是活的，能通过isAlive()测试。而且在线程运行之后、或者被阻塞、等待或者睡眠状态回来之后，线程首先进入就绪状态。<br />
<br />
C、运行状态。<br />
从就绪状态池（注意不是队列，是池）中选择一个为当前执行进程时，该线程所处的状态。<br />
<br />
D、等待、阻塞、睡眠状态。<br />
这三种状态有一个共同点：线程依然是活的，但是缺少运行的条件，一旦具备了条就就可以转为就绪状态（不能直接转为运行状态）。另外，suspend()和stop()方法已经被废弃了，比较危险，不要再用了。<br />
<br />
E、死亡状态。<br />
一个线程的run()方法运行结束，那么该线程完成其历史使命，它的栈结构将解散，也就是死亡了。但是它仍然是一个Thread对象，我们仍可以引用它，就像其他对象一样！它也不会被垃圾回收器回收了，因为对该对象的引用仍然存在。<br />
如此说来，即使run()方法运行结束线程也没有死啊！事实是，一旦线程死去，它就永远不能重新启动了，也就是说，不能再用start()方法让它运行起来！如果强来的话会抛出IllegalThreadStateException异常。如：<br />
t.start();<br />
t.start();<br />
放弃吧，人工呼吸或者心脏起搏器都无济于事&#8230;&#8230;线程也属于一次性用品。<br />
<br />
11、阻止线程运行。<br />
A、睡眠。sleep()方法<br />
让线程睡眠的理由很多，比如：认为该线程运行得太快，需要减缓一下，以便和其他线程协调；查询当时的股票价格，每睡5分钟查询一次，可以节省带宽，而且即时性要求也不那么高。<br />
用Thread的静态方法可以实现Thread.sleep(5*60*1000); 睡上5分钟吧。sleep的参数是毫秒。但是要注意sleep()方法会抛出检查异常InterruptedException，对于检查异常，我们要么声明，要么使用处理程序。<br />
&nbsp;&nbsp; &nbsp;try {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread.sleep(20000);<br />
&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;catch (InterruptedException ie) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ie.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;}<br />
既然有了sleep()方法，我们是不是可以控制线程的执行顺序了！每个线程执行完毕都睡上一觉？这样就能控制线程的运行顺序了，下面是书上的一个例子：<br />
&nbsp;&nbsp; &nbsp;class ThreadTest implements Runnable{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public void run(){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (int i = 1; i&lt;4; i++){<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println (Thread.currentThread().getName());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread.sleep(1000);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (InterruptedException ie) { }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public static void main (String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ThreadTest tt = new ThreadTest();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread t0 = new Thread(tt,"Thread 0");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread t1 = new Thread(tt,"Thread 1");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Thread t2 = new Thread(tt,"Thread 2");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t0.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t1.start();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;t2.start();&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;}<br />
<br />
并且给出了结果：<br />
Thread 0<br />
Thread 1<br />
Thread 2<br />
Thread 0<br />
Thread 1<br />
Thread 2<br />
Thread 0<br />
Thread 1<br />
Thread 2<br />
也就是Thread 0&nbsp; Thread 1 Thread 2 按照这个顺序交替出现，作者指出虽然结果和我们预料的似乎相同，但是这个结果是不可靠的。果然被我的双核电脑验证了：<br />
Thread 0<br />
Thread 1<br />
Thread 2<br />
Thread 2<br />
Thread 0<br />
Thread 1<br />
Thread 1<br />
Thread 0<br />
Thread 2<br />
看来线程真的很不可靠啊。但是尽管如此，sleep()方法仍然是保证所有线程都有运行机会的最好方法。至少它保证了一个线程进入运行之后不会一直到运行完位置。<br />
<br />
时间的精确性。再强调一下，线程醒来之后不会进入运行状态，而是进入就绪状态。因此sleep()中指定的时间不是线程不运行的精确时间！不能依赖sleep()方法提供十分精确的定时。我们可以看到很多应用程序用sleep()作为定时器，而且没什么不好的，确实如此，但是我们一定要知道sleep()不能保证线程醒来就能马上进入运行状态，是不精确的。<br />
<br />
sleep()方法是一个静态的方法，它所指的是当前正在执行的线程休眠一个毫秒数。看到某些书上的Thread.currentThread().sleep(1000); ，其实是不必要的。Thread.sleep(1000);就可以了。类似于getName()方法不是静态方法，它必须针对具体某个线程对象，这时用取得当前线程的方法Thread.currentThread().getName();<br />
<br />
B、线程优先级和让步。<br />
线程的优先级。在大多数jvm实现中调度程序使用基于线程优先级的抢先调度机制。如果一个线程进入可运行状态，并且它比池中的任何其他线程和当前运行的进程的具有更高的优先级，则优先级较低的线程进入可运行状态，最高优先级的线程被选择去执行。<br />
<br />
于是就有了这样的结论：当前运行线程的优先级通常不会比池中任何线程的优先级低。但是并不是所有的jvm的调度都这样，因此一定不能依赖于线程优先级来保证程序的正确操作，这仍然是没有保障的，要把线程优先级用作一种提高程序效率的方法，并且这种方法也不能依赖优先级的操作。<br />
<br />
另外一个没有保障的操作是：当前运行的线程与池中的线程，或者池中的线程具有相同的优先级时，JVM的调度实现会选择它喜欢的线程。也许是选择一个去运行，直至其完成；或者用分配时间片的方式，为每个线程提供均等的机会。<br />
<br />
优先级用正整数设置，通常为1-10，JVM从不会改变一个线程的优先级。默认情况下，优先级是5。Thread类具有三个定义线程优先级范围的静态最终常量：Thread.MIN_PRIORITY （为1） Thread.NORM_PRIORITY （为5） Thread.MAX_PRIORITY （为10）<br />
<br />
静态Thread.yield()方法。<br />
它的作用是让当前运行的线程回到可运行状态，以便让具有同等优先级的其他线程运行。用yield()方法的目的是让同等优先级的线程能适当地轮转。但是，并不能保证达到此效果！因为，即使当前变成可运行状态，可是还有可能再次被JVM选中！也就是连任。<br />
<br />
非静态join()方法。<br />
让一个线程加入到另一个线程的尾部。让B线程加入A线程，意味着在A线程运行完成之前，B线程不会进入可运行状态。<br />
&nbsp;&nbsp; &nbsp;Thread t = new Thread();<br />
&nbsp;&nbsp; &nbsp;t.start();<br />
&nbsp;&nbsp; &nbsp;t.join;<br />
这段代码的意思是取得当前的线程，把它加入到t线程的尾部，等t线程运行完毕之后，原线程继续运行。书中的例子在我的电脑里效果很糟糕，看不出什么效果来。也许是CPU太快了，而且是双核的；也许是JDK1.6的原因？<br />
<br />
12、没总结完。线程这部分很重要，内容也很多，看太快容易消化不良，偶要慢慢地消化掉&#8230;&#8230;<br />
<br />
<br />
<br />
附： java原著中对线程的解释。<br />
<br />
e文原文：<br />
<p><strong>Thread Scheduling</strong></p>
<p>In Java technology,threads are usually preemptive,but not necessarily Time-sliced(the process of giving each thread an equal amount of CPU time).It is common mistake to believe that "preemptive" is a fancy word for "does time-slicing". </p>
<p>For the runtime on a Solaris Operating Environment platform,Java technology does not preempt threads of the same priority.However,the runtime on Microsoft Windows platforms uses time-slicing,so it preempts threads of the same priority and even threads of higher priority.Preemption is not guaranteed;however,most JVM implementations result in behavior that appears to be strictly preemptive.Across JVM implementations,there is no absolute guarantee of preemption or time-slicing.The only guarantees lie in the coder&#8217;s use of wait and sleep. </p>
<p>The model of a preemptive scheduler is that many threads might be runnable,but only one thread is actually running.This thread continues to run until it ceases to be runnable or another thread of higher priority becomes runnable.In the latter case,the lower priority thread is preempted by the thread of higher priority,which gets a chance to run instead. </p>
<p>A thread might cease to runnable (that is,because blocked) for a variety of reasons.The thread&#8217;s code can execute a Thread.sleep() call,deliberately asking the thread to pause for a fixed period of time.The thread might have to wait to access a resource and cannot continue until that resource become available. </p>
<p>All thread that are runnable are kept in pools according to priority.When a blocked thread becomes runnable,it is placed back into the appropriate runnable pool.Threads from the highest priority nonempty pool are given CPU time. </p>
<p>The last sentence is worded loosed because: <br />
(1) In most JVM implementations,priorities seem to work in a preemptive manner,although there is no guarantee that priorities have any meaning at all; <br />
(2) Microsoft Window&#8217;s values affect thread behavior so that it is possible that a Java Priority 4 thread might be running,in spite of the fact that a runnable Java Priority 5 thread is waiting for the CPU. <br />
In reality,many JVMs implement pool as queues,but this is not guaranteed hehavior. </p>
<br />
<strong>热心网友翻译的版本：<br />
<br />
</strong>在java技术中，线程通常是抢占式的而不需要时间片分配进程（分配给每个线程相等的cpu时间的进程）。一个经常犯的错误是认为&#8220;抢占&#8221;就是&#8220;分配时间片&#8221;。<br />
在Solaris平台上的运行环境中，相同优先级的线程不能相互抢占对方的cpu时间。但是，在使用时间片的windows平台运行环境中，可以抢占相同甚至更高优先级的线程的cpu时间。抢占并不是绝对的，可是大多数的JVM的实现结果在行为上表现出了严格的抢占。纵观JVM的实现，并没有绝对的抢占或是时间片，而是依赖于编码者对wait和sleep这两个方法的使用。<br />
抢占式调度模型就是许多线程属于可以运行状态（等待状态），但实际上只有一个线程在运行。该线程一直运行到它终止进入可运行状态（等待状态）或是另一个具有更高优先级的线程变成可运行状态。在后一种情况下，底优先级的线程被高优先级的线程抢占，高优先级的线程获得运行的机会。<br />
线程可以因为各种各样的原因终止并进入可运行状态（因为堵塞）。例如，线程的代码可以在适当时候执行Thread.sleep()方法，故意让线程中止；线程可能为了访问资源而不得不等待直到该资源可用为止。<br />
所有可运行的线程根据优先级保持在不同的池中。一旦被堵塞的线程进入可运行状态，它将会被放回适当的可运行池中。非空最高优先级的池中的线程将获得cpu时间。<br />
最后一个句子是不精确的，因为：<br />
（1）在大多数的JVM实现中，虽然不能保证说优先级有任何意义，但优先级看起来象是用抢占方式工作。<br />
（2）微软windows的评价影响线程的行为，以至尽管一个处于可运行状态的优先级为5的java线程正在等待cpu时间，但是一个优先级为4的java线程却可能正在运行。<br />
实际上，许多JVM用队列来实现池，但没有保证行为。<br />
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/241880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-11-21 18:01 <a href="http://www.blogjava.net/xzclog/archive/2008/11/21/241880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的多进程运行模式分析</title><link>http://www.blogjava.net/xzclog/archive/2008/11/17/241023.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 17 Nov 2008 11:56:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/11/17/241023.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/241023.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/11/17/241023.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/241023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/241023.html</trackback:ping><description><![CDATA[<h3>
<div class="m_l_cont_note1">
<ul>
    <li><span class="fa">摘要：</span>本文通过java代码启动多个java子进程。必如在Java中通过Runtime中的exec方法执行java classname。如果执行成功，这个方法返回一个Process对象，如果执行失败，将抛出一个IOException错误。
    <li><span class="fa">标签：</span><a href="http://www.51cto.com/php/search.php?keyword=Java" target="_blank">Java</a>&nbsp;&nbsp;<a href="http://www.51cto.com/php/search.php?keyword=%B6%E0%BD%F8%B3%CC" target="_blank">多进程</a>&nbsp;&nbsp;<a href="http://www.51cto.com/php/search.php?keyword=%C4%A3%CA%BD" target="_blank">模式</a>&nbsp;&nbsp;<a href="http://www.51cto.com/php/search.php?keyword=%B7%D6%CE%F6" target="_blank">分析</a>
    <li class="m_l_cont_note1_r"><script src="http://www.51cto.com/js/article/keywords_ad.js"></script>
    <div align="right"><a class="font_a" style="font-size: 12px" href="http://ad.cn.doubleclick.net/clk;202930372;27012168;u" target="_blank">Oracle帮您准确洞察各个物流环节</a></div>
    </li>
</ul>
</div>
<div class="m_l_cont_text">
<p>
<p>一般我们在java中运行其它类中的方法时，无论是静态调用，还是动态调用，都是在当前的进程中执行的，也就是说，只有一个java虚拟机实例在运行。而有的时候，我们需要通过java代码启动多个java子进程。这样做虽然占用了一些系统资源，但会使程序更加稳定，因为新启动的程序是在不同的虚拟机进程中运行的，如果有一个进程发生异常，并不影响其它的子进程。</p>
<p>在Java中我们可以使用两种方法来实现这种要求。最简单的方法就是通过Runtime中的exec方法执行java classname。如果执行成功，这个方法返回一个Process对象，如果执行失败，将抛出一个IOException错误。下面让我们来看一个简单的例子。</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>// Test1.java文件<br />
            import java.io.*;<br />
            public class Test<br />
            {<br />
            　public static void main(String[] args)<br />
            　{<br />
            FileOutputStream fOut = new FileOutputStream("c:\\Test1.txt");<br />
            fOut.close();<br />
            System.out.println("被调用成功!");<br />
            　}<br />
            }</p>
            <p>// Test_Exec.java<br />
            public class Test_Exec<br />
            {<br />
            　public static void main(String[] args)<br />
            　{<br />
            Runtime run = Runtime.getRuntime();<br />
            Process p = run.exec("java test1"); <br />
            　}<br />
            }</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>通过java Test_Exec运行程序后，发现在C盘多了个Test1.txt文件，但在控制台中并未出现&#8220;被调用成功!&#8221;的输出信息。因此可以断定，Test已经被执行成功，但因为某种原因，Test的输出信息未在Test_Exec的控制台中输出。这个原因也很简单，因为使用exec建立的是Test_Exec的子进程，这个子进程并没有自己的控制台，因此，它并不会输出任何信息。</p>
<p>如果要输出子进程的输出信息，可以通过Process中的getInputStream得到子进程的输出流(在子进程中输出，在父进程中就是输入)，然后将子进程中的输出流从父进程的控制台输出。具体的实现代码如下如示：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>// Test_Exec_Out.java<br />
            import java.io.*;<br />
            public class Test_Exec_Out<br />
            {<br />
            　public static void main(String[] args)<br />
            　{<br />
            Runtime run = Runtime.getRuntime();<br />
            Process p = run.exec("java test1"); <br />
            BufferedInputStream in = new BufferedInputStream(p.getInputStream());<br />
            BufferedReader br = new BufferedReader(new InputStreamReader(in));<br />
            String s;<br />
            while ((s = br.readLine()) != null)<br />
            　System.out.println(s); <br />
            　}<br />
            } </p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>从上面的代码可以看出，在Test_Exec_Out.java中通过按行读取子进程的输出信息，然后在Test_Exec_Out中按每行进行输出。上面讨论的是如何得到子进程的输出信息。那么，除了输出信息，还有输入信息。既然子进程没有自己的控制台，那么输入信息也得由父进程提供。我们可以通过Process的getOutputStream方法来为子进程提供输入信息(即由父进程向子进程输入信息，而不是由控制台输入信息)。我们可以看看如下的代码：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>// Test2.java文件<br />
            import java.io.*;<br />
            public class Test<br />
            {<br />
            　public static void main(String[] args)<br />
            　{<br />
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));<br />
            System.out.println("由父进程输入的信息：" + br.readLine());<br />
            　}<br />
            }</p>
            <p>// Test_Exec_In.java<br />
            import java.io.*;<br />
            public class Test_Exec_In<br />
            {<br />
            　public static void main(String[] args)<br />
            　{<br />
            Runtime run = Runtime.getRuntime();<br />
            Process p = run.exec("java test2"); <br />
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));<br />
            bw.write("向子进程输出信息");<br />
            bw.flush();<br />
            bw.close(); // 必须得关闭流，否则无法向子进程中输入信息<br />
            // System.in.read();<br />
            　}<br />
            }</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>从以上代码可以看出，Test1得到由Test_Exec_In发过来的信息，并将其输出。当你不加bw.flash()和bw.close()时，信息将无法到达子进程，也就是说子进程进入阻塞状态，但由于父进程已经退出了，因此，子进程也跟着退出了。如果要证明这一点，可以在最后加上System.in.read()，然后通过任务管理器(在windows下)查看java进程，你会发现如果加上bw.flush()和bw.close()，只有一个java进程存在，如果去掉它们，就有两个java进程存在。这是因为，如果将信息传给Test2，在得到信息后，Test2就退出了。</p>
<p>在这里有一点需要说明一下，exec的执行是异步的，并不会因为执行的某个程序阻塞而停止执行下面的代码。因此，可以在运行test2后，仍可以执行下面的代码。</p>
<p>exec方法经过了多次的重载。上面使用的只是它的一种重载。它还可以将命令和参数分开，如exec(&#8220;java.test2&#8221;)可以写成exec(&#8220;java&#8221;, &#8220;test2&#8221;)。exec还可以通过指定的环境变量运行不同配置的java虚拟机。</p>
<p>除了使用Runtime的exec方法建立子进程外，还可以通过ProcessBuilder建立子进程。ProcessBuilder的使用方法如下：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>// Test_Exec_Out.java<br />
            import java.io.*;<br />
            public class Test_Exec_Out<br />
            {<br />
            　public static void main(String[] args)<br />
            　{<br />
            ProcessBuilder pb = new ProcessBuilder("java", "test1");<br />
            Process p = pb.start();<br />
            &#8230; &#8230;<br />
            　}<br />
            } </p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>在建立子进程上，ProcessBuilder和Runtime类似，不同的ProcessBuilder使用start()方法启动子进程，而Runtime使用exec方法启动子进程。得到Process后，它们的操作就完全一样的。</p>
<p>ProcessBuilder和Runtime一样，也可设置可执行文件的环境信息、工作目录等。下面的例子描述了如何使用ProcessBuilder设置这些信息。</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>ProcessBuilder pb = new ProcessBuilder("Command", "arg2", "arg2", ''');<br />
            // 设置环境变量<br />
            Map&lt;String, String&gt; env = pb.environment();<br />
            env.put("key1", "value1");<br />
            env.remove("key2");<br />
            env.put("key2", env.get("key1") + "_test"); <br />
            pb.directory("..\abcd"); // 设置工作目录<br />
            Process p = pb.start(); // 建立子进程 </p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
</div>
</h3>
<img src ="http://www.blogjava.net/xzclog/aggbug/241023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-11-17 19:56 <a href="http://www.blogjava.net/xzclog/archive/2008/11/17/241023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java相对路径/绝对路径总结(转）</title><link>http://www.blogjava.net/xzclog/archive/2008/11/11/239844.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 11 Nov 2008 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/11/11/239844.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/239844.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/11/11/239844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/239844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/239844.html</trackback:ping><description><![CDATA[<strong>关键字: 相对路径 绝对路径</strong>
<div class="blog_content"><span style="font-size: small"><strong>1.基本概念的理解</strong><br />
<br />
<span style="font-family: courier new,courier">绝对路径：绝对路径就是你的主页上的文件或目录在硬盘上真正的路径，(URL和物理路径)例如：<br />
C:xyz est.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个URL绝对路径。<br />
<br />
相对路径：相对与某个基准目录的路径。包含Web的相对路径（HTML中的相对目录），例如：在<br />
Servlet中，"/"代表Web应用的跟目录。和物理路径的相对表示。例如："./" 代表当前目录,"../"代表上级目录。这种类似的表示，也是属于相对路径。<br />
另外关于URI，URL,URN等内容，请参考RFC相关文档标准。<br />
<br />
RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,<br />
(http://www.ietf.org/rfc/rfc2396.txt)<br />
<br />
<br />
<strong>2.关于JSP/Servlet中的相对路径和绝对路径。</strong><br />
<br />
2.1服务器端的地址<br />
<br />
服务器端的相对地址指的是相对于你的web应用的地址，这个地址是在服务器端解析的（不同于html和javascript中的相对地址，他们是由客户端浏览器解析的）也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用，即相对于http: //192.168.0.1/webapp/的。<br />
<br />
其用到的地方有：<br />
forward：servlet中的request.getRequestDispatcher(address);这个address是在服务器端解析的，所以，你要forward到a.jsp应该这么写：request.getRequestDispatcher(&#8220;/user/a.jsp&#8221;)这个/ 相对于当前的web应用webapp，其绝对地址就是：http://192.168.0.1/webapp/user/a.jsp。 sendRedirect：在jsp中&lt;%response.sendRedirect("/rtccp/user/a.jsp");%&gt;<br />
<br />
2.22、客户端的地址<br />
<br />
所有的html页面中的相对地址都是相对于服务器根目录(http://192.168.0.1/)的，而不是(跟目录下的该Web应用的目录) http://192.168.0.1/webapp/的。 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://192.168.0.1/)的，所以，如果提交到a.jsp 为：action＝"/webapp/user/a.jsp"或action="&lt;%=request.getContextPath()% &gt;"/user/a.jsp；<br />
提交到servlet为actiom＝"/webapp/handleservlet" Javascript也是在客户端解析的，所以其相对路径和form表单一样。<br />
<br />
<br />
因此，一般情况下，在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上<br />
&lt;%=request.getContextPath()%&gt;,以确保所引用的文件都属于Web应用中的目录。另外，应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径，这样当文件移动时，很容易出问题。<br />
<br />
<br />
<strong>3. JSP/Servlet中获得当前应用的相对路径和绝对路径<br />
<br />
</strong>3.1 JSP中获得当前应用的相对路径和绝对路径<br />
根目录所对应的绝对路径:request.getRequestURI()<br />
文件的绝对路径 　:application.getRealPath(request.getRequestURI());<br />
当前web应用的绝对路径 :application.getRealPath("/");<br />
取得请求文件的上层目录:new File(application.getRealPath(request.getRequestURI())).getParent()<br />
<br />
3.2 Servlet中获得当前应用的相对路径和绝对路径<br />
根目录所对应的绝对路径:request.getServletPath();<br />
文件的绝对路径 :request.getSession().getServletContext().getRealPath<br />
(request.getRequestURI())<br />
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");<br />
(ServletContext对象获得几种方式：<br />
javax.servlet.http.HttpSession.getServletContext()<br />
javax.servlet.jsp.PageContext.getServletContext()<br />
javax.servlet.ServletConfig.getServletContext()<br />
)<br />
<br />
<strong>4.java 的Class中获得相对路径，绝对路径的方法<br />
<br />
</strong>4.1单独的Java类中获得绝对路径<br />
根据java.io.File的Doc文挡，可知:<br />
默认情况下new File("/")代表的目录为：System.getProperty("user.dir")。<br />
一下程序获得执行类的当前路径</span> <br />
</span>
<div class="dp-highlighter">
<div class="bar"><span style="font-size: small">&nbsp;</span></div>
<ol class="dp-j">
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span><span class="keyword">package</span><span>&nbsp;org.cheng.file;&nbsp;&nbsp;</span></span></span>
    <li><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span><span class="keyword">import</span><span>&nbsp;java.io.File;&nbsp;&nbsp;</span></span></span>
    <li><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;FileTest&nbsp;{&nbsp;&nbsp;</span></span></span>
    <li><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></span>
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Thread.currentThread().getContextClassLoader().getResource(<span class="string">""</span><span>));&nbsp;&nbsp;</span></span></span>
    <li><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(FileTest.<span class="keyword">class</span><span>.getClassLoader().getResource(</span><span class="string">""</span><span>));&nbsp;&nbsp;</span></span></span>
    <li><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ClassLoader.getSystemResource(<span class="string">""</span><span>));&nbsp;&nbsp;</span></span></span>
    <li><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(FileTest.<span class="keyword">class</span><span>.getResource(</span><span class="string">""</span><span>));&nbsp;&nbsp;</span></span></span>
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(FileTest.<span class="keyword">class</span><span>.getResource(</span><span class="string">"/"</span><span>));</span></span></span>
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span></span></span><span style="font-family: courier new,courier">Class</span><span style="font-size: small; font-family: courier new,courier"><span><span class="comment">文件所在路径</span></span></span>
    <li><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"/"</span><span>).getAbsolutePath());&nbsp;&nbsp;</span></span></span>
    <li class="alt"><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(System.getProperty(<span class="string">"user.dir"</span><span>));&nbsp;&nbsp;</span></span></span>
    <li><span style="font-size: small; font-family: courier new,courier"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></span>
    <li class="alt"><span style="font-size: small"><span><span style="font-family: courier new,courier">}&nbsp; </span><br />
    </span></span></li>
</ol>
</div>
<span style="font-size: small"><br />
<span style="font-family: courier new,courier">4.2服务器中的Java类获得当前路径（来自网络）<strong><br />
<br />
</strong>(1).Weblogic<br />
<br />
WebApplication的系统文件根目录是你的weblogic安装所在根目录。<br />
例如：如果你的weblogic安装在c:eaweblogic700.....<br />
那么，你的文件根路径就是c:.<br />
所以，有两种方式能够让你访问你的服务器端的文件：<br />
a.使用绝对路径：<br />
比如将你的参数文件放在c:yourconfigyourconf.properties，<br />
直接使用 new FileInputStream("yourconfig/yourconf.properties");<br />
b.使用相对路径：<br />
相对路径的根目录就是你的webapplication的根路径，即WEB-INF的上一级目录，将你的参数文件放<br />
<br />
在yourwebappyourconfigyourconf.properties，<br />
这样使用：<br />
new FileInputStream("./yourconfig/yourconf.properties");<br />
这两种方式均可，自己选择。<br />
<br />
(2).Tomcat<br />
<br />
在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin<br />
<br />
(3).Resin<br />
<br />
不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET<br />
的路径为根.比如用新建文件法测试File f = new File("a.htm");<br />
这个a.htm在resin的安装目录下<br />
<br />
(4).如何读相对路径哪？<br />
<br />
在Java文件中getResource或getResourceAsStream均可<br />
<br />
例：getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web<br />
<br />
发布根路径下WEB-INF/classes<br />
<br />
默认使用该方法的路径是：WEB-INF/classes。已经在Tomcat中测试。<br />
<br />
5.读取文件时的相对路径，避免硬编码和绝对路径的使用。（来自网络）<br />
5.1 采用Spring的DI机制获得文件，避免硬编码。<br />
参考下面的连接内容：<br />
<a href="http://www.javajia.net/viewtopic.php?p=90213&amp;" target="_blank">http://www.javajia.net/viewtopic.php?p=90213&amp;</a><br />
5.2 配置文件的读取<br />
参考下面的连接内容：<br />
<a href="http://dev.csdn.net/develop/article/39/39681.shtm" target="_blank">http://dev.csdn.net/develop/article/39/39681.shtm</a><br />
<br />
<strong>5.3 通过虚拟路径或相对路径读取一个xml文件，避免硬编码<br />
<br />
</strong>参考下面的连接内容：<br />
<a href="http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8" target="_blank">http://club.gamvan.com/club/clubPage.jsp?iPage=1&amp;tID=10708&amp;ccID=8</a><br />
<br />
6.Java中文件的常用操作（复制，移动，删除，创建等）（来自网络）<br />
常用 java File 操作类<br />
<a href="http://www.easydone.cn/014/200604022353065155.htm" target="_blank">http://www.easydone.cn/014/200604022353065155.htm</a><br />
<br />
Java文件操作大全（JSP中）<br />
<a href="http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html" target="_blank">http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html</a><br />
<br />
java文件操作详解（Java中文网）<br />
<a href="http://www.51cto.com/html/2005/1108/10947.htm" target="_blank">http://www.51cto.com/html/2005/1108/10947.htm</a><br />
<br />
JAVA 如何创建删除修改复制目录及文件<br />
<a href="http://www.gamvan.com/developer/java/2005/2/264.html" target="_blank">http://www.gamvan.com/developer/java/2005/2/264.html</a><br />
<br />
总结：<br />
通过上面内容的使用，可以解决在Web应用服务器端，移动文件，查找文件，复制<br />
删除文件等操作，同时对服务器的相对地址，绝对地址概念更加清晰。<br />
建议参考URI,的RFC标准文挡。同时对Java.io.File. Java.net.URI.等内容了解透彻<br />
对其他方面的理解可以更加深入和透彻。</span> </span></div>
<img src ="http://www.blogjava.net/xzclog/aggbug/239844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-11-11 11:54 <a href="http://www.blogjava.net/xzclog/archive/2008/11/11/239844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jspsmartupload下载用法</title><link>http://www.blogjava.net/xzclog/archive/2008/11/03/238399.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 03 Nov 2008 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/11/03/238399.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/238399.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/11/03/238399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/238399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/238399.html</trackback:ping><description><![CDATA[&lt;%@ page contentType="text/html;charset=GBK"%&gt;<br />
&lt;%@ page import="java.io.*" %&gt;<br />
&lt;%<br />
// 得到文件名字和路径<br />
String filename = request.getParameter("filename");<br />
String filepath = request.getSession().getServletContext().getgetRealPath("/download/excel/");<br />
//String filepath = request.getRealPath("/download/excel/");<br />
//读到流中<br />
InputStream inputStream = new FileInputStream(filepath+"/"+filename);<br />
//设置输出的格式<br />
response.reset();<br />
response.setContentType("bin");<br />
response.addHeader("Content-Disposition","attachment;filename=\"" + filename + "\"");<br />
//循环取出流中的数据 <br />
byte[] bytes = new byte[1000];<br />
int len = inputStream.read(bytes);<br />
while (len &gt; 0){<br />
&nbsp;response.getOutputStream().write(bytes,0,len);<br />
&nbsp;len = inputStream.read(bytes);<br />
}<br />
inputStream.close(); <br />
%&gt;
<img src ="http://www.blogjava.net/xzclog/aggbug/238399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-11-03 17:58 <a href="http://www.blogjava.net/xzclog/archive/2008/11/03/238399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Content-Disposition的使用和注意事项</title><link>http://www.blogjava.net/xzclog/archive/2008/10/30/237627.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 30 Oct 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/10/30/237627.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/237627.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/10/30/237627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/237627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/237627.html</trackback:ping><description><![CDATA[<div class="itemTitle"><a class="TitleLinkStyle" href="http://www.qihangnet.com/PermaLink,guid,db65d50a-ba90-4229-a3a2-71b4f1b407b9.aspx" rel="bookmark"><span class="searchword">Content-Disposition</span>的使用和注意事项</a>&nbsp;[转自：<a href="http://www.qihangnet.com/PermaLink,guid,db65d50a-ba90-4229-a3a2-71b4f1b407b9.aspx">http://www.qihangnet.com/PermaLink,guid,db65d50a-ba90-4229-a3a2-71b4f1b407b9.aspx</a>]</div>
<div class="itemContents">
<div class="itemBody">
<p>&nbsp;&nbsp;&nbsp; 最近不少Web技术圈内的朋友在讨论协议方面的事情，有的说web开发者应该熟悉web相关的协议，有的则说不用很了解。个人认为这要分层次来看待这个问题，对于一个新手或者刚入门的web开发人员而言，研究协议方面的东西可能会使得web开发失去趣味性、抹煞学习积极性，这类人应该更多的了解基本的Web技术使用。而对于在该行业工作多年的老鸟来说，协议相关的内容、标准相关内容应该尽量多些的了解，因为只有这样才能使得经手的web系统更加优秀（安全、漂亮、快速、兼容性好、体验好&#8230;&#8230;）。本文我们来说一下MIME 协议的一个扩展<span class="searchword">Content-disposition</span>。</p>
<p>&nbsp;&nbsp;&nbsp; 我们在开发web系统时有时会有以下需求：</p>
<ul>
    <li>希望某类或者某已知MIME 类型的文件（比如：*.gif;*.txt;*.htm）能够在访问时弹出&#8220;文件下载&#8221;对话框
    <li>希望以原始文件名（上传时的文件名,例如：山东省政府1024号文件.doc）提供下载，但服务器上保存的地址却是其他文件名（如：12519810948091234_asdf.doc)
    <li>希望某文件直接在浏览器上显示而不是弹出文件下载对话框
    <li>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 要解决上述需求就可以使用<span class="searchword">Content-disposition</span>来解决。第一个需求的解决办法是</p>
<div class="csharpcode">
<pre><span style="font-size: 11px; color: black; font-family: courier new; background-color: transparent">Response.AddHeader <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"<span class="searchword">content-disposition</span>"</span>,<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"attachment; filename=fname.ext"</span></span></pre>
</div>
<div class="csharpcode">&nbsp;</div>
<div class="csharpcode">将上述需求进行归我给出如下例子代码：</div>
<div class="csharpcode">
<pre><span style="font-size: 11px; color: black; font-family: courier new; background-color: transparent"><span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">public</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">static</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">void</span> ToDownload(<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> serverfilpath,<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> filename)
{
FileStream fileStream <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">new</span> FileStream(serverfilpath, FileMode.Open);
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">long</span> fileSize <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> fileStream.Length;
HttpContext.Current.Response.ContentType <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"application/octet-stream"</span>;
HttpContext.Current.Response.AddHeader(<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"<span class="searchword">Content-Disposition</span>"</span>, <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"attachment; filename=\""</span> <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">+</span> UTF_FileName(filename) <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">+</span> <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"\";"</span>);
<span style="font-size: 11px; color: green; font-family: courier new; background-color: transparent">////attachment --- 作为附件下载</span>
<span style="font-size: 11px; color: green; font-family: courier new; background-color: transparent">////inline --- 在线打开</span>
HttpContext.Current.Response.AddHeader(<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"Content-Length"</span>, fileSize.ToString());
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">byte</span>[] fileBuffer <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">new</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">byte</span>[fileSize];
fileStream.Read(fileBuffer, 0, (<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">int</span>)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">public</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">static</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">void</span> ToOpen(<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> serverfilpath, <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> filename)
{
FileStream fileStream <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">new</span> FileStream(serverfilpath, FileMode.Open);
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">long</span> fileSize <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> fileStream.Length;
HttpContext.Current.Response.ContentType <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"application/octet-stream"</span>;
HttpContext.Current.Response.AddHeader(<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"<span class="searchword">Content-Disposition</span>"</span>, <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"inline; filename=\""</span> <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">+</span> UTF_FileName(filename) <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">+</span> <span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"\";"</span>);
HttpContext.Current.Response.AddHeader(<span style="font-size: 11px; color: #666666; font-family: courier new; background-color: #e4e4e4">"Content-Length"</span>, fileSize.ToString());
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">byte</span>[] fileBuffer <span style="font-size: 11px; color: red; font-family: courier new; background-color: transparent">=</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">new</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">byte</span>[fileSize];
fileStream.Read(fileBuffer, 0, (<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">int</span>)fileSize);
HttpContext.Current.Response.BinaryWrite(fileBuffer);
fileStream.Close();
HttpContext.Current.Response.End();
}
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">private</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">static</span> <span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> UTF_FileName(<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">string</span> filename)
{
<span style="font-size: 11px; color: blue; font-family: courier new; background-color: transparent">return</span> HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
}</span></pre>
</div>
<p>&nbsp;</p>
<p>简单的对上述代码做一下解析，ToDownload方法为将一个服务器上的文件（serverfilpath为服务器上的物理地址），以某文件名(filename)在浏览器上弹出&#8220;文件下载&#8221;对话框，而ToOpen是将服务器上的某文件以某文件名在浏览器中显示/打开的。注意其中我使用了UTF_FileName方法，该方法很简单，主要为了解决包含非英文/数字名称的问题，比如说文件名为&#8220;衣明志.doc&#8221;，使用该方法客户端就不会出现乱码了。</p>
<p>&nbsp;<strong>需要注意以下几个问题：</strong> </p>
<ol>
    <li><span class="searchword">Content-disposition</span>是MIME协议的扩展，由于多方面的安全性考虑没有被标准化，所以可能某些浏览器不支持，比如说IE4.01
    <li>我们可以使用程序来使用它，也可以在web服务器（比如IIS）上使用它，只需要在http header上做相应的设置即可</li>
</ol>
<p class="csharpcode">可参看以下几篇文档：</p>
<ul>
    <li class="csharpcode"><a href="http://www.qihangnet.com/ct.ashx?id=db65d50a-ba90-4229-a3a2-71b4f1b407b9&amp;url=http%3a%2f%2fsupport.microsoft.com%2fkb%2f260519" target="_blank">如何为已知的 MIME 类型激活&#8220;文件下载&#8221;对话框</a>
    <li class="csharpcode"><a href="http://www.qihangnet.com/ct.ashx?id=db65d50a-ba90-4229-a3a2-71b4f1b407b9&amp;url=http%3a%2f%2fwww.faqs.org%2frfcs%2frfc2183.html" target="_blank">Communicating Presentation Information in Internet Messages: The <span class="searchword">Content-Disposition</span> Header Field</a>
    <li class="csharpcode"><a href="http://www.qihangnet.com/ct.ashx?id=db65d50a-ba90-4229-a3a2-71b4f1b407b9&amp;url=http%3a%2f%2fwww.w3.org%2fProtocols%2frfc2616%2frfc2616.html" target="_blank">Hypertext Transfer Protocol -- HTTP/1.1</a></li>
</ul>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</div>
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/237627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-10-30 16:07 <a href="http://www.blogjava.net/xzclog/archive/2008/10/30/237627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判定文件编码或文本流编码的方法</title><link>http://www.blogjava.net/xzclog/archive/2008/06/16/208328.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Mon, 16 Jun 2008 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/06/16/208328.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/208328.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/06/16/208328.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/208328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/208328.html</trackback:ping><description><![CDATA[<h3><a href="http://hdwangyi.javaeye.com/blog/108540"></a>&nbsp;</h3>
<div class="blog_content">在程序中，文本文件经常用来存储标准的ASCII码文本，比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符，如基于GBK的简体中文，基于GIG5的繁体中文等等。在存储这些字符时需要正确指定文件的编码格式；而在读取这些文本文件时，有时候就需要自动判定文件的编码格式。 <br />
<br />
按照给定的字符集存储文本文件时，在文件的最开头的三个字节中就有可能存储着编码信息，所以，基本的原理就是只要读出文件前三个字节，判定这些字节的值，就可以得知其编码的格式。其实，如果项目运行的平台就是中文操作系统，如果这些文本文件在项目内产生，即开发人员可以控制文本的编码格式，只要判定两种常见的编码就可以了：GBK和UTF-8。由于中文Windows默认的编码是GBK，所以一般只要判定UTF-8编码格式。 <br />
<br />
对于UTF-8编码格式的文本文件，其前3个字节的值就是-17、-69、-65，所以，判定是否是UTF-8编码格式的代码片段如下： <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://hdwangyi.javaeye.com/blog/108540#"><img alt="复制代码" src="http://hdwangyi.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>java.io.File&nbsp;f=</span><span class="keyword">new</span><span>&nbsp;java.io.File(</span><span class="string">"待判定的文本文件名"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;java.io.InputStream&nbsp;ios=</span><span class="keyword">new</span><span>&nbsp;java.io.FileInputStream(f); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;b=</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[</span><span class="number">3</span><span>]; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;ios.read(b); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;ios.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>(b[</span><span class="number">0</span><span>]==-</span><span class="number">17</span><span>&amp;&amp;b[</span><span class="number">1</span><span>]==-</span><span class="number">69</span><span>&amp;&amp;b[</span><span class="number">2</span><span>]==-</span><span class="number">65</span><span>) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(f.getName()+</span><span class="string">"编码为UTF-8"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;System.out.println(f.getName()+</span><span class="string">"可能是GBK"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>}</span><span class="keyword">catch</span><span>(Exception&nbsp;e){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">    java.io.File f=new java.io.File("待判定的文本文件名");
try{
java.io.InputStream ios=new java.io.FileInputStream(f);
byte[] b=new byte[3];
ios.read(b);
ios.close();
if(b[0]==-17&amp;&amp;b[1]==-69&amp;&amp;b[2]==-65)
System.out.println(f.getName()+"编码为UTF-8");
else System.out.println(f.getName()+"可能是GBK");
}catch(Exception e){
e.printStackTrace();
}
</pre>
<br />
上述代码只是简单判定了是否是UTF-8格式编码的文本文件，如果项目对要判定的<span class="hilite1">文本文件编码</span>不可控（比如用户上传的一些HTML、XML等文本），可以采用一个现成的开源项目：cpdetector，它所在的网址是：<a href="http://cpdetector.sourceforge.net/" target="_blank">http://cpdetector.sourceforge.net/</a>。它的类库很小，只有500K左右，利用该类库判定文本文件的代码如下： <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://hdwangyi.javaeye.com/blog/108540#"><img alt="复制代码" src="http://hdwangyi.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="comment">/*------------------------------------------------------------------------ </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;detector是探测器，它把探测任务交给具体的探测实现类的实例完成。 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;cpDetector内置了一些常用的探测实现类，这些探测实现类的实例可以通过add方法 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;加进来，如ParsingDetector、&nbsp;JChardetFacade、ASCIIDetector、UnicodeDetector。&nbsp;&nbsp; </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;detector按照&#8220;谁最先返回非空的探测结果，就以该结果为准&#8221;的原则返回探测到的 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;字符集编码。 </span>&nbsp;</span></li>
    <li><span><span class="comment">--------------------------------------------------------------------------*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>cpdetector.io.CodepageDetectorProxy&nbsp;detector&nbsp;= &nbsp;&nbsp;</span></li>
    <li><span>cpdetector.io.CodepageDetectorProxy.getInstance(); &nbsp;&nbsp;</span></li>
    <li><span class="comment">/*------------------------------------------------------------------------- </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;指示是否显示探测过程的详细信息，为false不显示。 </span>&nbsp;</span></li>
    <li><span><span class="comment">---------------------------------------------------------------------------*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>detector.add(</span><span class="keyword">new</span><span>&nbsp;cpdetector.io.ParsingDetector(</span><span class="keyword">false</span><span>));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span class="comment">/*-------------------------------------------------------------------------- </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;JChardetFacade封装了由Mozilla组织提供的JChardet，它可以完成大多数文件的编码 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;测定。所以，一般有了这个探测器就可满足大多数项目的要求，如果你还不放心，可以 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;再多加几个探测器，比如下面的ASCIIDetector、UnicodeDetector等。 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;---------------------------------------------------------------------------*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>detector.add(cpdetector.io.JChardetFacade.getInstance()); &nbsp;&nbsp;</span></li>
    <li><span class="comment">//ASCIIDetector用于ASCII编码测定 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>detector.add(cpdetector.io.ASCIIDetector.getInstance()); &nbsp;&nbsp;</span></li>
    <li><span class="comment">//UnicodeDetector用于Unicode家族编码的测定 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>detector.add(cpdetector.io.UnicodeDetector.getInstance()); &nbsp;&nbsp;</span></li>
    <li><span>java.nio.charset.Charset&nbsp;charset&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>File&nbsp;f=</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"待测的文本文件名"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;charset&nbsp;=&nbsp;detector.detectCodepage(f.toURL()); &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;ex)&nbsp;{ex.printStackTrace();} &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">if</span><span>(charset!=</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(f.getName()+</span><span class="string">"编码是："</span><span>+charset.name()); &nbsp;&nbsp;</span></span></li>
    <li><span>}</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(f.getName()+</span><span class="string">"未知"</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">  /*------------------------------------------------------------------------
detector是探测器，它把探测任务交给具体的探测实现类的实例完成。
cpDetector内置了一些常用的探测实现类，这些探测实现类的实例可以通过add方法
加进来，如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。
detector按照&#8220;谁最先返回非空的探测结果，就以该结果为准&#8221;的原则返回探测到的
字符集编码。
--------------------------------------------------------------------------*/
cpdetector.io.CodepageDetectorProxy detector =
cpdetector.io.CodepageDetectorProxy.getInstance();
/*-------------------------------------------------------------------------
ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
指示是否显示探测过程的详细信息，为false不显示。
---------------------------------------------------------------------------*/
detector.add(new cpdetector.io.ParsingDetector(false));
/*--------------------------------------------------------------------------
JChardetFacade封装了由Mozilla组织提供的JChardet，它可以完成大多数文件的编码
测定。所以，一般有了这个探测器就可满足大多数项目的要求，如果你还不放心，可以
再多加几个探测器，比如下面的ASCIIDetector、UnicodeDetector等。
---------------------------------------------------------------------------*/
detector.add(cpdetector.io.JChardetFacade.getInstance());
//ASCIIDetector用于ASCII编码测定
detector.add(cpdetector.io.ASCIIDetector.getInstance());
//UnicodeDetector用于Unicode家族编码的测定
detector.add(cpdetector.io.UnicodeDetector.getInstance());
java.nio.charset.Charset charset = null;
File f=new File("待测的文本文件名");
try {
charset = detector.detectCodepage(f.toURL());
} catch (Exception ex) {ex.printStackTrace();}
if(charset!=null){
System.out.println(f.getName()+"编码是："+charset.name());
}else
System.out.println(f.getName()+"未知");
</pre>
<br />
上面代码中的detector不仅可以用于探测文件的编码，也可以探测任意输入的文本流的编码，方法是调用其重载形式： <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://hdwangyi.javaeye.com/blog/108540#"><img alt="复制代码" src="http://hdwangyi.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>charset=detector.detectCodepage(待测的文本输入流,测量该流所需的读入字节数);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"> charset=detector.detectCodepage(待测的文本输入流,测量该流所需的读入字节数);
</pre>
<br />
上面的字节数由程序员指定，字节数越多，判定越准确，当然时间也花得越长。要注意，字节数的指定不能超过文本流的最大长度。 <br />
<br />
判定文件编码的具体应用举例： <br />
属性文件(.properties)是Java程序中的常用文本存储方式，象STRUTS框架就是利用属性文件存储程序中的字符串资源。它的内容如下所示： <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://hdwangyi.javaeye.com/blog/108540#"><img alt="复制代码" src="http://hdwangyi.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>#注释语句 &nbsp;&nbsp;</span></span></li>
    <li><span>属性名=属性值 &nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">   #注释语句
属性名=属性值
</pre>
<br />
读入属性文件的一般方法是： <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://hdwangyi.javaeye.com/blog/108540#"><img alt="复制代码" src="http://hdwangyi.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>FileInputStream&nbsp;ios=</span><span class="keyword">new</span><span>&nbsp;FileInputStream(</span><span class="string">"属性文件名"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>Properties&nbsp;prop=</span><span class="keyword">new</span><span>&nbsp;Properties(); &nbsp;&nbsp;</span></span></li>
    <li><span>prop.load(ios); &nbsp;&nbsp;</span></li>
    <li><span>ios.close(); &nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">  FileInputStream ios=new FileInputStream("属性文件名");
Properties prop=new Properties();
prop.load(ios);
ios.close();
</pre>
<br />
利用java.io.Properties的load方法读入属性文件虽然方便，但如果属性文件中有中文，在读入之后就会发现出现乱码现象。发生这个原因是load方法使用字节流读入文本，在读入后需要将字节流编码成为字符串，而它使用的编码是&#8220;iso-8859-1&#8221;,这个字符集是ASCII码字符集，不支持中文编码，所以这时需要使用显式的转码: <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://hdwangyi.javaeye.com/blog/108540#"><img alt="复制代码" src="http://hdwangyi.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>String&nbsp;value=prop.getProperty(</span><span class="string">"属性名"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>String&nbsp;encValue=</span><span class="keyword">new</span><span>&nbsp;String(value.getBytes(</span><span class="string">"iso-8859-1"</span><span>),</span><span class="string">"属性文件的实际编码"</span><span>); &nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">   String value=prop.getProperty("属性名");
String encValue=new String(value.getBytes("iso-8859-1"),"属性文件的实际编码");
</pre>
<br />
在上面的代码中，属性文件的实际编码就可以利用上面的方法获得。当然，象这种属性文件是项目内部的，我们可以控制属性文件的编码格式，比如约定采用Windows内定的GBK，就直接利用"gbk"来转码，如果约定采用UTF-8，也可以是使用"UTF-8"直接转码。如果想灵活一些，做到自动探测编码，就可利用上面介绍的方法测定属性文件的编码，从而方便开发人员的工作。 </div>
<img src ="http://www.blogjava.net/xzclog/aggbug/208328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-06-16 14:44 <a href="http://www.blogjava.net/xzclog/archive/2008/06/16/208328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>