﻿<?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-Kelven Cheung-文章分类-java</title><link>http://www.blogjava.net/zhangrenquan/category/6015.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 29 Aug 2014 22:46:52 GMT</lastBuildDate><pubDate>Fri, 29 Aug 2014 22:46:52 GMT</pubDate><ttl>60</ttl><item><title>解决linux下tmany open files问题</title><link>http://www.blogjava.net/zhangrenquan/articles/417485.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 29 Aug 2014 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/417485.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/417485.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/417485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/417485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/417485.html</trackback:ping><description><![CDATA[<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">工作中发现，在linux中搭建JBOSS应用服务器的环境下，有时可能同时发布多个war包，而且每一个war包的文件数目很多，或者客户同时访问量比较大，此时JBOSS就会报错，报错信息中包含&#8220;<span style="color: rgb(255,0,0); font-size: x-small">Too many open files</span>&#8221;，例如：</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left">Caused by: java.io.FileNotFoundException: /home/jboss/jboss-5.1.0.GA/server/default/deploy/card.war/WEB-INF/web.xml (<span style="color: red">Too many open files)</span><br />&nbsp;at java.io.FileInputStream.open(Native Method)<br />&nbsp;at java.io.FileInputStream.&lt;init&gt;(FileInputStream.java:120)<br />&nbsp;at org.jboss.net.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:128)<br />&nbsp;at org.jboss.virtual.plugins.context.AbstractURLHandler.openStream(AbstractURLHandler.java:203)<br />&nbsp;at org.jboss.virtual.VirtualFile.openStream(VirtualFile.java:230)<br />&nbsp;at org.jboss.virtual.VFSInputSource.getByteStream(VFSInputSource.java:66)<br />&nbsp;... 44 more</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">这是因为linux限制了打开文件的最大句柄数量。</span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">linux默认的打开文件数量是1024，我们可以用ulimit -a 来查看系统资源，例如：</span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left">[root@redhat ~]# ulimit -a<br />core file size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (blocks, -c) 0<br />data seg size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -d) unlimited<br />file size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (blocks, -f) unlimited<br />pending signals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-i) 1024<br />max locked memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -l) 32<br />max memory size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -m) unlimited<br /><strong><span style="color: rgb(255,0,0)">open files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;(-n) 1024 --打开最大文件数量限制</span><br /></strong>pipe size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (512 bytes, -p) 8<br />POSIX message queues&nbsp;&nbsp;&nbsp;&nbsp; (bytes, -q) 819200<br />stack size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -s) 10240<br />cpu time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (seconds, -t) unlimited<br />max user processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-u) 16384<br />virtual memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -v) unlimited<br />file locks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-x) unlimited</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">解决该问题的宗旨是：<strong>增大<span style="color: rgb(0,0,0)">打开文件最大句柄限制数，该数是1024的整数倍</span></strong></span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">1.临时增大open files的限制值</span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">&nbsp; 可以用ulimit -n 来临时增大该限制值，但是一旦重启服务器后，该值又会恢复到1024。只能暂时性的解决问题。命令如下：</span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left">[root@redhat ~]#<span class="Apple-converted-space">&nbsp;</span><span style="color: rgb(255,0,0)">ulimit -n 65536<br /></span>[root@redhat ~]# ulimit -a<br />core file size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (blocks, -c) 0<br />data seg size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -d) unlimited<br />file size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (blocks, -f) unlimited<br />pending signals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-i) 1024<br />max locked memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -l) 32<br />max memory size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -m) unlimited<br /><span style="color: rgb(255,0,0)">open files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-n) 65536</span><br />pipe size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (512 bytes, -p) 8<br />POSIX message queues&nbsp;&nbsp;&nbsp;&nbsp; (bytes, -q) 819200<br />stack size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -s) 10240<br />cpu time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (seconds, -t) unlimited<br />max user processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-u) 16384<br />virtual memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -v) unlimited<br />file locks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-x) unlimited</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">2.彻底增大open files的限制值</span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">&nbsp; 一般情况下，我们都会通过修改系统限制文件来彻底增大open files的值。</span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">2.1 通过VI打开/etc/security/limits.conf，在&#8220;# End of file&#8221;上面添加如下：</span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="color: rgb(255,0,0)">*&nbsp; -&nbsp; nofile&nbsp; 65536</span></span></p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" align="left"><span style="font-size: small">&nbsp;&nbsp;&nbsp; 该语句表示：每一个用户的默认打开文件数是65536</span></p>
<p style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br /><span style="font-size: small">2.2 通过VI打开/etc/sysctl.conf,在最后一行添加如下：</span><span class="Apple-converted-space">&nbsp;</span><br />&nbsp;<span class="Apple-converted-space">&nbsp;</span><br /><span style="color: rgb(255,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><span style="font-size: small">fs.file-max = 65536</span></span><span class="Apple-converted-space">&nbsp;</span><br />&nbsp;<span class="Apple-converted-space">&nbsp;</span><br /><span style="font-size: small">2.3 重启ssh服务<br />修改ssh server配置文件：/etc/ssh/sshd_config<br /></span><span class="Apple-converted-space">UseLogin yes<br /></span><br />重启ssh&nbsp;用/etc/init.d/sshd restart<br /><br /><span style="font-size: small">此时再用ulimit -a来查看：</span><span class="Apple-converted-space">&nbsp;</span><br />[root@redhat ~]# ulimit -a<br />core file size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (blocks, -c) 0<br />data seg size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -d) unlimited<br />file size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (blocks, -f) unlimited<br />pending signals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-i) 1024<br />max locked memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -l) 32<br />max memory size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -m) unlimited<br /><span style="color: rgb(255,0,0)">open files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-n) 65536</span><br />pipe size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (512 bytes, -p) 8<br />POSIX message queues&nbsp;&nbsp;&nbsp;&nbsp; (bytes, -q) 819200<br />stack size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -s) 10240<br />cpu time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (seconds, -t) unlimited<br />max user processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-u) 16384<br />virtual memory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (kbytes, -v) unlimited<br />file locks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (-x) unlimited<br /><br />（如果还不行可以<span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; display: inline !important; font: small/26px Arial; white-space: normal; orphans: 2; float: none; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">重启下服务器试试</span>）<br /><br /></p><img src ="http://www.blogjava.net/zhangrenquan/aggbug/417485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2014-08-29 09:58 <a href="http://www.blogjava.net/zhangrenquan/articles/417485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBOSS5.0 配置详解(转)</title><link>http://www.blogjava.net/zhangrenquan/articles/366152.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 12 Dec 2011 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/366152.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/366152.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/366152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/366152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/366152.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [转自：http://xuebin530.blog.163.com/blog/static/377214720093915555643/]一． &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载与安装JBoss 在本文中，我下载的JBoss版本为：JBOSS5.0 Beta4。下...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangrenquan/articles/366152.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/366152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2011-12-12 15:13 <a href="http://www.blogjava.net/zhangrenquan/articles/366152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FLASH+JAVA开发实时网络游戏 (转：闪客帝国) </title><link>http://www.blogjava.net/zhangrenquan/articles/365650.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 06 Dec 2011 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/365650.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/365650.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/365650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/365650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/365650.html</trackback:ping><description><![CDATA[<div style="display: block" id="diary733447" class="diaryContent"><strong>简介：</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;实时网络游戏也属于大型应用程序范畴，一个关键环节就是建立实时主动通信环境，在此Socekt API就成为了首选。通过调用XMLSocket方法，FLASH就可以和一些由强大语言编写的服务器应用程序进行通信，进而开发出各种实时信息交流系统......<br />
<p align="left">本文分两部分：FLASH编程 和 Java编程，此文记录的仅仅是我在探索中的一些收获，其中用了很多个人化的描述语言，并不是业界标准的用语。 ：）</p>
<p align="left">探索笔记： </p>
<p align="left">目前国内Flash应用大部分还是在制作精美的动画方面，但据我了解早在Flash4 的时代，国外一些人就已经开始将flash技术运用于开发动态网站（和php、asp、jsp结合）和开发应用程序（象网络游戏、远程管理等应用软件）的项目中了。而直到今日，这方面在国内发展还是比较缓慢（有一部分原因是少数人掌握了关键技术，但不愿意共享出来）。因此，我将致力于推动国内flash技术在开发动态网站和开发应用程序方面的发展，并将自己亲手写的代码公布到网络中，以便于大家共享、交流。<br /><br />涉及到的知识范畴：<br /><br />1. socket概念<br />2. java编程语言<br />3. Flash MX ActionScript中的XMLSocket</p>
<p align="left">实时网络游戏也属于大型应用程序范畴，一个关键环节就是建立实时主动通信环境（相对的，有个称为被动通。信的方式，最好的例子就是你正在用IE浏览器浏览一个网站，此时浏览器和服务器之间就是被动通信方式：如果你不点击一个连接，发送一个WEB页面请求到WEB服务器，WEB服务器是不会主动向你的浏览器发送任何页面的）。在此Socekt API就成为了首选。限于篇幅，这里不再过多解释socket的含义，只希望大家能记住一点，只要建立能够实时通信的应用程序就需要建立socket连接。</p>
<p align="left">【客户端FLASH编程部分】</p>
<p align="left">从mx自带的as字典中可以看出，Flash在网络通信方面得到了非常大的加强。"The XMLSocket object is useful for client-server applications that require low latency, such as real-time chat systems"注意最后的一小段话：such as real-time chat systems（译文：例如实时聊天系统）</p>
<p align="left">通过调用XMLSocket方法FLASH就可以和一些由强大语言编写的服务器应用程序进行通信，进而开发出各种实时信息交流系统。所以我们的目标锁定在XMLSocket！</p>
<p align="left">另外值得注意的是：有很多人一看到XMLSocket前面的XML三个字母，就觉得头疼，以为必须先熟悉甚至精通XML才能使用这个对象及其方法，但我要说的是在你不太了解XML的阶段，只要把XML信息看成是一个随意长度（&gt;0）的字符串，把XMLSocket看成是一个只是用来发送字符串数据的对象就好办多了。</p>
<p align="left">我们还是从分析代码着手，来跨进开发FLASH实时网络游戏的大门吧：</p><pre>//建立XMLSocket对象
var mySocket = new XMLSocket();
mySocket.connect("127.0.0.1",3000);
//测试建立socket连接是否成功
mySocket.onConnect = function(success) {
  if(success) {
    trace("connect ok"); 
  } else {
    trace("connect failed");
  }
}
//End for 测试是否连接成功 </pre>
<p align="left">成功建立连接后 向服务器端发送一个测试用的字符串，以便服务器端能显示出信息。</p><pre>mySocket.send("this is a testing String !!!");</pre>
<p align="left">FLASH中的程序就先到此，因为是基础篇，所以不会涉及太多的其他东西，呵呵。</p>
<p align="left">【服务器端java程序部分】</p><pre>import java.io.*;
import java.net.*;
public class LocalServer {
  protected int listenPort = 3000;
  public void acceptConnections() {
  try {
    ServerSocket server = new ServerSocket(this.listenPort);
    //在服务器端,我们需要ServerSocket对象以便建立服务,参数是兼听的端口号
    Socket incomingConnection = null;//创建一个客户端的Socket变量,以接收从客户端监听到的Socket
    handleConnection处理
    System.out.println("Server端正在等待一个socket连接......");
    incomingConnection = server.accept();//调用该 ServerSocket 的 accept()来告诉它开始侦听
    System.out.println("一个socket客户端已经连接过来......");
    handleConnection(incomingConnection);
    } catch (BindException e) {
      System.out.println("Unable to bind to port " + listenPort);
      }
  catch (IOException e) {
    System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
    }
  }
  public void handleConnection(Socket incomingConnection) {
    System.out.println("\r\n正在对此连接进行处理......");
    try {//首先获取同Socket相关联的流outputToSocket和InputStream
//其中outputToSocket是要返回给客户端Socket的流
//InputStream是客户端发来的请求
      otputStream outputToSocket = incomingConnection.getOutputStream();
      InputStream inputFromSocket = incomingConnection.getInputStream();
      BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputFromSocket));
//首先要将InputStream转换到BufferedReader中
      String line = null;
      while ((line = streamReader.readLine()) != null) {
        System.out.println(line); 
        //从streamReader中读出信息，直接输出到默认输出设备中(本例中是指dos窗口)
      }
    System.out.println("\r\n\r\n接受信息完毕！");
//完成之后关闭所有流,注意关闭Socket流的顺序
    streamReader.close();
    } catch (Exception e) {
      System.out.println("Error handling a client: " + e);
    }
  }
//主程序，建立sever实例对象，然后运行对象的acceptConnections()方法
  public static void main(String[] args) {
    LocalServer server = new LocalServer();
    server.acceptConnections();
  }
}</pre>
<p align="left">java服务端程序就到此为止了，此时已经能够建立起一个最简单的C/S结构通信体系。</p>
<p align="left">在此基础上再增加适当的东西 就能够开发出任何应用程序或者网络游戏。</p></div><img src ="http://www.blogjava.net/zhangrenquan/aggbug/365650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2011-12-06 10:38 <a href="http://www.blogjava.net/zhangrenquan/articles/365650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现log4j日志文件在相对路径保存</title><link>http://www.blogjava.net/zhangrenquan/articles/284624.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 29 Jun 2009 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/284624.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/284624.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/284624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/284624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/284624.html</trackback:ping><description><![CDATA[<p><span class="Apple-style-span" style="font-weight: normal; font-size: 12px; word-spacing: 0px; text-transform: none; color: rgb(0,0,0); text-indent: 0px; line-height: 18px; font-style: normal; white-space: normal; letter-spacing: normal; border-collapse: separate; text-align: left; font-variant: normal; orphans: 2; widows: 2"><span class="hilite1" style="background-color: rgb(255,255,0)">Log4j</span>日志输出路径只能设定成绝对路径，这个在web项目中就变得很不方便了。<span class="Apple-converted-space"> </span><br />
比如我想要设定日志保存在webapp/log<span class="Apple-converted-space"> </span><br />
<br />
参考了网上资料：<span class="Apple-converted-space"> </span><br />
<a style="color: rgb(16,138,198); text-decoration: underline" href="http://hi.baidu.com/suofang/blog/item/6cf2befbd1ff07234f4aea90.html" target="_blank">http://hi.baidu.com/suofang/blog/item/6cf2befbd1ff07234f4aea90.html</a><span class="Apple-converted-space"> </span><br />
下面是引入内容：<span class="Apple-converted-space"> </span><br />
<br />
方法一主要是扩展了<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>的RollingFileAppender类，其他的FileAppender同样道理。扩展的方法，就是用一个子类去覆盖setFile方法，这个方法在<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>读取配置文件生成appender的时候调用，传入的就是配置文件中的路径，这样我就可以按照自己的想法在路径前面加上根路径了。这种方法可以在<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>.properties中用相对路径自由配置<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>.appender.A1.File属性来决定生成的日志相对web应用根目录的位置。<span class="Apple-converted-space"> </span><br />
<br />
方法二是利用服务器vm中已经存在的环境变量如${catalina.home}来设置相对于${catalina.home}的日志路径，日志只能放到服务器子目录里，而且如果是用的其它服务器，则要改对应的环境变量。此方法平台移植不方便。<span class="Apple-converted-space"> </span><br />
<br />
方法三是扩展ActionServlet类，覆盖其init()方法，新方法中载入<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>.properties位置的参数，可以自由配置<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>的配置文件的名字和存放位置。也可自由配置<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>日志文件的相对于当前应用的路径。<span class="Apple-converted-space"> </span><br />
<br />
对于第三个方法，作者提出了个问题：<span class="Apple-converted-space"> </span><br />
<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>配置文件的位置，不让其在<span class="hilite2" style="background-color: rgb(85,255,85)">web-inf</span>/classes目录，因为在加载此Servlet之前，服务器如tomcat启动时会自动搜索<span class="hilite2" style="background-color: rgb(85,255,85)">web-inf</span>目录和<span class="hilite2" style="background-color: rgb(85,255,85)">web-inf</span>/classes目录中<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>.properties文件，如有则自动加载。<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>属性文件加载后,由于该属性文件中<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>.appender.A1.File的值用的是相对路径，自动加载配置便会出错：<span class="Apple-converted-space"> </span><br />
<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>:ERROR setFile(null,true) call failed.<span class="Apple-converted-space"> </span><br />
java.io.FileNotFoundException:<span class="Apple-converted-space"> </span><span class="hilite2" style="background-color: rgb(85,255,85)">WEB-INF</span>\logs\bysxxglxt.log<span class="Apple-converted-space"> </span><br />
(系统找不到指定的路径。)<span class="Apple-converted-space"> </span><br />
<br />
尽管后面加载扩展的ActionServlet中正确设置了<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>属性文件并正常加载了，但还是报的这个错，怪不爽的。只有更改<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>属性文件名字或者更改其存放位置，让其不能自动加载了，不过还是有两个警告：<span class="Apple-converted-space"> </span><br />
<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax).<span class="Apple-converted-space"> </span><br />
<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>:WARN Please initialize the<span class="Apple-converted-space"> </span><span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span><span class="Apple-converted-space"> </span>system properly.<span class="Apple-converted-space"> </span><br />
<br />
新的发现：<span class="Apple-converted-space"> </span><br />
由于spring也会加载<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>.properties，如果加载不到就往控制台打log信息，总觉得有些碍眼，于是想办法去掉。Spring提供了一个Log4jConfigListener，本身就能通过web.xml中配置来指定位置加载<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>配置文件和log输出路径，注意该listener需要放在spring的Listener之前。<span class="Apple-converted-space"> </span><br />
事实上，Log4jConfigListener更适合<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>在web工程中使用，原因如下：<span class="Apple-converted-space"> </span><br />
1. 动态的改变记录级别和策略，不需要重启Web应用，如《Effective Enterprise Java》所说。<span class="Apple-converted-space"> </span><br />
&nbsp;&nbsp; 2. 把log文件定在 /<span class="hilite2" style="background-color: rgb(85,255,85)">WEB-INF</span>/logs/ 而不需要写绝对路径。<span class="Apple-converted-space"> </span><br />
因为 系统把web目录的路径压入一个叫webapp.root的系统变量。这样写log文件路径时不用写绝对路径了.<span class="Apple-converted-space"> </span><br />
<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>.appender.logfile.File=${webapp.root}/<span class="hilite2" style="background-color: rgb(85,255,85)">WEB-INF</span>/logs/myfuse.log<span class="Apple-converted-space"> </span><br />
&nbsp;&nbsp; 3. 可以把<span class="hilite1" style="background-color: rgb(255,255,0)">log4j</span>.properties和其他properties一起放在/<span class="hilite2" style="background-color: rgb(85,255,85)">WEB-INF</span>/ ，而不是Class-Path。<span class="Apple-converted-space"> </span><br />
&nbsp;&nbsp; 4.log4jRefreshInterval为60000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;<span class="Apple-converted-space"> </span><br />
&nbsp;&nbsp; 在web.xml 添加<span class="Apple-converted-space"> </span><br />
</p>
<div class="dp-highlighter" style="padding-right: 1px; padding-left: 1px; font-size: 12px; padding-bottom: 1px; margin-left: 9px; overflow: auto; width: 97%; padding-top: 1px; background-color: transparent">
<div class="bar">
<div class="tools" style="padding-right: 3px; padding-left: 3px; font-weight: bold; padding-bottom: 3px; margin: 0px; color: black; padding-top: 3px; text-align: left">Xml代码<span class="Apple-converted-space"> </span></embed></div>
</div>
<ol class="dp-xml" style="border-right: rgb(209,215,220) 1px solid; padding-right: 0px; border-top: rgb(209,215,220) 1px solid; padding-left: 0px; font-size: 1em; padding-bottom: 2px; margin: 0px 0px 1px; border-left: rgb(209,215,220) 1px solid; color: rgb(43,145,175); line-height: 1.4em; padding-top: 2px; border-bottom: rgb(209,215,220) 1px solid; list-style-type: decimal; background-color: rgb(255,255,255)">
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black"><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">context-param</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">param-name</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">log4jConfigLocation</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;/</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">param-name</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">param-value</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black"><span class="hilite2" style="color: black; background-color: rgb(85,255,85)">WEB-INF</span>/<span class="hilite1" style="color: black; background-color: rgb(255,255,0)">log4j</span>.properties</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;/</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">param-value</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black"><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;/</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">context-param</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black">&nbsp;&nbsp;</span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black"><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">context-param</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">param-name</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">log4jRefreshInterval</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;/</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">param-name</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">param-value</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">60000</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;/</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">param-value</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black"><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;/</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">context-param</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black">&nbsp;&nbsp;</span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black"><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">listener</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black">&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">listener-class</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">org.springframework.web.util.Log4jConfigListener</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;/</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">listener-class</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp;</span></span>
    <li style="padding-right: 0px; padding-left: 10px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; padding-top: 0px; background-color: rgb(250,250,250)"><span style="color: black"><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&lt;/</span><span class="tag-name" style="font-weight: bold; color: rgb(0,102,153)">listener</span><span class="tag" style="font-weight: bold; color: rgb(0,102,153)">&gt;</span><span style="color: black">&nbsp;&nbsp; <br />
    </span></span></li>
</ol>
</div>
</span><img src ="http://www.blogjava.net/zhangrenquan/aggbug/284624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2009-06-29 16:11 <a href="http://www.blogjava.net/zhangrenquan/articles/284624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手機照相辨識二維條碼(Sample Code)-生成与识别</title><link>http://www.blogjava.net/zhangrenquan/articles/284619.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 29 Jun 2009 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/284619.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/284619.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/284619.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/284619.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/284619.html</trackback:ping><description><![CDATA[QR Code 編碼<br />
<br />
<font class="java-comment">/*********************************************************<br />
*<br />
* Created on 2007年3月1日<br />
*<br />
* Program : QRCodeEncoderTest.java<br />
* @author : ryanpai<br />
* Java平台 : J2SDK 1.4.9<br />
* OS : XP<br />
* 1. 下載使用 (http://www.swetake.com/qr/ ) qrcode.jar<br />
*&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 建議改為qr_encode.jar<br />
*&nbsp;&nbsp;&nbsp;&nbsp; (因為跟SourceForge QR Code Decode Library 之 qrcode.jar 同名)<br />
* 2. 將上述下載的 jar 增加至classpath<br />
*<br />
********************************************************/</font><br />
<br />
<font class="java-reserved_word"><strong>import</strong></font> com.swetake.util.Qrcode;<br />
<font class="java-reserved_word"><strong>import</strong></font> java.io.*;<br />
<br />
<font class="java-reserved_word"><strong>import</strong></font> java.awt.*;<br />
<font class="java-reserved_word"><strong>import</strong></font> java.awt.image.*;<br />
<font class="java-reserved_word"><strong>import</strong></font> javax.imageio.*;<br />
<br />
<font class="java-comment">/******************************************<br />
*<br />
* @author&nbsp; Ryan Pai<br />
*<br />
******************************************/</font><br />
<br />
<font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>class</strong></font> QRCodeEncoderTest <font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <font class="java-comment">/** Creates a new instance of QRCodeEncoderTest */</font><br />
&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>public</strong></font> QRCodeEncoderTest() <font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp; <font class="java-bracket">}</font><br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <font class="java-comment">/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param args the command line arguments<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</font><br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>static</strong></font> <font class="java-reserved_word"><strong>void</strong></font> main(String[] args) <font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>try</strong></font><font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// TODO code application logic here</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// Constructor Qrcode Object</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.swetake.util.Qrcode testQrcode <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <font class="java-reserved_word"><strong>new</strong></font> com.swetake.util.Qrcode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testQrcode.setQrcodeErrorCorrect(<font class="java-string">'M'</font>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testQrcode.setQrcodeEncodeMode(<font class="java-string">'B'</font>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testQrcode.setQrcodeVersion(7);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// 設定QR Code 編碼內容</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String testString = <font class="java-string">""</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testString = testString+<font class="java-string">"JavaWorld .\n"</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testString = testString+<font class="java-string">"中文Java討論網站\n"</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; testString = testString+<font class="java-string">"http://www.javaworld.com\n"</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// getBytes</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>byte</strong></font>[] d = testString.getBytes(<font class="java-string">"Big5"</font>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// 設定圖檔寬度 140*140</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedImage bi <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = <font class="java-reserved_word"><strong>new</strong></font> BufferedImage(140, 140, BufferedImage.TYPE_INT_RGB);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// createGraphics</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Graphics2D g = bi.createGraphics();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// set background</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setBackground(Color.WHITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.clearRect(0, 0, 140, 140);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// 設定字型顏色 =&gt; BLACK</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setColor(Color.BLACK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// 轉出 Bytes</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>if</strong></font> (d.length&gt;0 &amp;&amp; d.length &lt;120)<font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>boolean</strong></font>[][] s = testQrcode.calQrcode(d);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>for</strong></font> (<font class="java-reserved_word"><strong>int</strong></font> i=0;i&lt;s.length;i++)<font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>for</strong></font> (<font class="java-reserved_word"><strong>int</strong></font> j=0;j&lt;s.length;j++)<font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>if</strong></font> (s[j][i]) <font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.fillRect(j*3+2,i*3+2,3,3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-bracket">}</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-bracket">}</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-bracket">}</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-bracket">}</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.dispose();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bi.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// 設定 產生檔案路徑</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String FilePath=<font class="java-string">"D:\\TestQRCode.jpg"</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File f = <font class="java-reserved_word"><strong>new</strong></font> File(FilePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-comment">// 產生TestQRCode JPG File</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageIO.write(bi, <font class="java-string">"jpg"</font>, f);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-bracket">}</font> <font class="java-comment">// end try</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-reserved_word"><strong>catch</strong></font> (Exception e) <font class="java-bracket">{</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font class="java-bracket">}</font> <font class="java-comment">// end catch</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<span class="javascript">QR Code 解碼<br />
</span><br />
<span class="javascript">
<pre><font class="java-comment">/*********************************************************<br />
*<br />
* Created on 2007年3月1日<br />
*<br />
* Program : QRCodeDecoderTest.java<br />
* @author : ryanpai<br />
* Java平台 : J2SDK 1.4.9<br />
* OS : XP<br />
* 1. 下載使用 (http://sourceforge.jp/projects/qrcode/ ) qrcode.jar<br />
*       =&gt; (SourceForge Open Source QR Code Decode Library)<br />
* 2. 修改官方 Sample =&gt; QRCodeDecoderCUIExample.java<br />
* 3. 將上述下載的 jar 增加至classpath<br />
*<br />
********************************************************/</font><br />
<br />
<font class="java-reserved_word"><strong>import</strong></font> jp.sourceforge.qrcode.codec.QRCodeDecoder;<br />
<font class="java-reserved_word"><strong>import</strong></font> jp.sourceforge.qrcode.codec.data.QRCodeImage;<br />
<font class="java-reserved_word"><strong>import</strong></font> jp.sourceforge.qrcode.codec.exception.DecodingFailedException;<br />
<font class="java-reserved_word"><strong>import</strong></font> jp.sourceforge.qrcode.codec.exception.InvalidVersionInfoException;<br />
<br />
<font class="java-reserved_word"><strong>import</strong></font> java.awt.image.BufferedImage;<br />
<font class="java-reserved_word"><strong>import</strong></font> javax.imageio.ImageIO;<br />
<font class="java-reserved_word"><strong>import</strong></font> java.io.File;<br />
<font class="java-reserved_word"><strong>import</strong></font> java.io.IOException;<br />
<br />
<font class="java-comment">/******************************************<br />
*<br />
* @author  RYANPAI<br />
*<br />
******************************************/</font><br />
<br />
<font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>class</strong></font> QRCodeDecoderTest <font class="java-bracket">{</font><br />
<br />
<font class="java-comment">/** Creates a new instance of QRCodeDecoderTest */</font><br />
<font class="java-reserved_word"><strong>public</strong></font> QRCodeDecoderTest() <font class="java-bracket">{</font><br />
<font class="java-bracket">}</font><br />
<br />
<font class="java-comment">/**<br />
* @param args the command line arguments<br />
*/</font><br />
<font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>static</strong></font> <font class="java-reserved_word"><strong>void</strong></font> main(String[] args) <font class="java-bracket">{</font><br />
<br />
<font class="java-comment">// TODO code application logic here</font><br />
QRCodeDecoder decoder = <font class="java-reserved_word"><strong>new</strong></font> QRCodeDecoder();<br />
<br />
<font class="java-comment">// 設定讀取QR Code圖檔路徑</font><br />
File imageFile = <font class="java-reserved_word"><strong>new</strong></font> File(<font class="java-string">"D:\\TestQRCode.jpg"</font>);<br />
<br />
<font class="java-comment">// 設定 BufferedImage</font><br />
BufferedImage image = <font class="java-reserved_word"><strong>null</strong></font>;<br />
<br />
<font class="java-reserved_word"><strong>try</strong></font> <font class="java-bracket">{</font><br />
image = ImageIO.read(imageFile);<br />
<font class="java-bracket">}</font> <font class="java-reserved_word"><strong>catch</strong></font> (IOException e) <font class="java-bracket">{</font><br />
System.out.println(<font class="java-string">"Error: "</font>+ e.getMessage());<br />
<font class="java-bracket">}</font><br />
<font class="java-reserved_word"><strong>try</strong></font> <font class="java-bracket">{</font><br />
String decodedData <br />
= <font class="java-reserved_word"><strong>new</strong></font> String(decoder.decode(<font class="java-reserved_word"><strong>new</strong></font> J2SEImage(image)));<br />
System.out.println(decodedData);<br />
<font class="java-bracket">}</font> <font class="java-reserved_word"><strong>catch</strong></font> (DecodingFailedException dfe) <font class="java-bracket">{</font><br />
System.out.println(<font class="java-string">"Error: "</font> + dfe.getMessage());<br />
<font class="java-bracket">}</font><br />
<br />
<br />
<font class="java-bracket">}</font><br />
<font class="java-bracket">}</font><br />
<br />
<font class="java-reserved_word"><strong>class</strong></font> J2SEImage <font class="java-reserved_word"><strong>implements</strong></font> QRCodeImage <font class="java-bracket">{</font><br />
BufferedImage image;<br />
<br />
<font class="java-reserved_word"><strong>public</strong></font> J2SEImage(BufferedImage image) <font class="java-bracket">{</font><br />
this.image = image;<br />
<font class="java-bracket">}</font><br />
<br />
<font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>int</strong></font> getWidth() <font class="java-bracket">{</font><br />
<font class="java-reserved_word"><strong>return</strong></font> image.getWidth();<br />
<font class="java-bracket">}</font><br />
<br />
<font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>int</strong></font> getHeight() <font class="java-bracket">{</font><br />
<font class="java-reserved_word"><strong>return</strong></font> image.getHeight();<br />
<font class="java-bracket">}</font><br />
<br />
<font class="java-reserved_word"><strong>public</strong></font> <font class="java-reserved_word"><strong>int</strong></font> getPixel(<font class="java-reserved_word"><strong>int</strong></font> x, <font class="java-reserved_word"><strong>int</strong></font> y) <font class="java-bracket">{</font><br />
<font class="java-reserved_word"><strong>return</strong></font> image.getRGB(x, y);<br />
<font class="java-bracket">}</font><br />
<br />
<font class="java-bracket">}</font></span><br />
<br />
<font class="java-bracket">}</font> <font class="java-comment">// end main</font><br />
<br />
<br />
<font class="java-bracket">}</font></pre><img src ="http://www.blogjava.net/zhangrenquan/aggbug/284619.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2009-06-29 15:59 <a href="http://www.blogjava.net/zhangrenquan/articles/284619.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA断点续传(B/S) </title><link>http://www.blogjava.net/zhangrenquan/articles/163212.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 26 Nov 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/163212.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/163212.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/163212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/163212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/163212.html</trackback:ping><description><![CDATA[<p>JAVA断点续传(B/S) <br />
<a href="http://www.java-ren.com/article/2007/11/26/20071126164656582.html">http://www.java-ren.com/article/2007/11/26/20071126164656582.html</a><br />
</p><img src ="http://www.blogjava.net/zhangrenquan/aggbug/163212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2007-11-26 16:43 <a href="http://www.blogjava.net/zhangrenquan/articles/163212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse插件开发</title><link>http://www.blogjava.net/zhangrenquan/articles/89332.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 21 Dec 2006 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/89332.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/89332.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/89332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/89332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/89332.html</trackback:ping><description><![CDATA[<p>一、新建项目。  <br />　　按照上一篇的新建插件项目的方法，新建一个名为myplugin2的插件项目，注意：在最后一步选择“建立白空插件项目”，除此，其它都一样。截图如下：</p>
		<p>
				<img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058521.png" o:title="" />
				<br />   <br />       附注：发现又有上一篇的错误，中文版的Eclipse在新建项目时，比较容易有“由于类路径错误（不完整或涉及循环），所以未构建项目。”这类的错误。好办，因为中文包只是一些文本文件，对开发没用，用前面一篇所说的方法删除那些对中文包的引用（前面字符为ECLIPSE_HOME_LANGUAGE_LINK…….），如下图：  <br /><br />   <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058523.png" o:title="" /><br />二、插件开发的几个关注点。 <br />　　a) 库引用。如上附注所说库引用是在建立插件初期要设置好的地方，不过一经设置基本不需要再改变。功能类似于JDK的classpath或者Jbuilder里的库引用。  <br />　　b) 插件JAVA源代码。今后主要的工作，狂写代码吧。主要都是一些*.JAVA文件。  <br />　　c) 项目根目录下的plugin.xml文件。这个文件是插件的入口文件，Eclipse根据这个文件中的设置来加载插件。代码写完了，要让Eclipse加载你的代码就要在这里面做些手脚了，这些手脚有个术语叫“设置扩展点”。象在Eclipse的加个主菜单、视图、按钮，都在这个文件里面做不同的扩展点，后面的教程会看到这个文件的使用。要人会说那我开发一个系统会有很多的菜单和按钮，那是不是都要设置这个文件呢？回答：不必，这里面只设置主要和Eclipse接壤的扩展点，其它系统里的菜单按钮就没必要了，今后会讲到。  <br />   <br />三、设置库引用。  <br />　　在删除了上面附注所说的无用且出错的引用，接下来我们要加入一些开发插件要用到的库。是那些呢？呵呵，前面我们还是用向导建立了一个helloword插件吗，参考它的就行了。如下图：  <br /><img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058525.png" o:title="" /></p>
		<p>   <br />　　手工加可真累，这里有个好办法。把目录C:\eclipse2.1.3\eclipse\workspace\myplugin\下的.classpath文件拷贝到C:\eclipse2.1.3\eclipse\workspace\myplugin2目录就行了。所有关于库引用的设置全保存在这个文件中。最后别忘记刷新一下项目，如下图所示：  </p>
		<p>
				<img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058527.png" o:title="" />
		</p>
		<p>
				<br />附注说明：</p>
		<p>　　有些文章在这里是用“文件&gt;导入...&gt;外部插件和段”来提供插件开发支持库的引用，本文不采用这种方法，因为这种会将支持库（也是一种插件项目）会新建很多相应项目，让开发界面显得很乱。还不如本文所用的建立库引用变量的方法方便简洁。  <br />   </p>
		<p>四、写源代码。  <br />　　a) 新建一个包。方法如下图所示。  <br />　　　<img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-102058529.png" o:title="" /></p>
		<p>　　包名如下：  </p>
		<p>　　　<img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-1020585211.png" o:title="" /><br />   <br />　　结果如下：  </p>
		<p>　　　<img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-1020585213.png" o:title="" /><br /><br />   <br />　　b) 然后将上一章的myplugin的SampleAction直接移动本项目myplugin2中就可以了（Eclipse支持鼠标拖拉操做）。  <br />　　c)  本文SampleAction做了一些小修改（删除了注释和构造函数）。代码如下：  <br /></p>
		<p>
		</p>
		<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">public class SampleAction implements IWorkbenchWindowActionDelegate {   <br />    private IWorkbenchWindow window;   <br />    public void run(IAction action) {   <br />        //这是打开一个提示窗口   <br />        MessageDialog.openInformation(window.getShell(), "myplugin 插件", "这是手工做的插件");   <br />    }   <br />    public void selectionChanged(IAction action, ISelection selection) {}   <br />    public void dispose() {}   <br />    public void init(IWorkbenchWindow window) {   <br />        this.window = window;   <br />    }   <br />}  </td>
						</tr>
				</tbody>
		</table>
		<p>   </p>
		<p>五、在plugin.xml文件中加入扩展点的代码。  <br />　　库将本项目plugin.xml文件打开，并转到其源代码视图。将如下代码加入到“&lt;/runtime&gt;”之后。（这些xml还是从上一章的项目搬过来的  <br /></p>
		<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
				<tbody>
						<tr>
								<td style="WORD-WRAP: break-word" bgcolor="#f3f3f3">&lt;requires&gt;   <br />      &lt;import plugin="org.eclipse.core.resources"/&gt;   <br />      &lt;import plugin="org.eclipse.ui"/&gt;   <br />&lt;/requires&gt;   <br />&lt;extension point="org.eclipse.ui.actionSets"&gt;   <br />      &lt;actionSet label="样本操作集" visible="true" id="myplugin.actionSet"&gt;   <br />         &lt;menu label="样本菜单" id="sampleMenu"&gt;   <br />            &lt;separator name="sampleGroup"&gt; &lt;/separator&gt;   <br />         &lt;/menu&gt;   <br />         &lt;action   <br />               label="样本操作"   <br />               icon="icons/sample.gif"   <br />               class="com.glchengang.SampleAction"   <br />               tooltip="Hello，Eclipse world"   <br />               menubarPath="sampleMenu/sampleGroup"   <br />               toolbarPath="sampleGroup"   <br />               id="com.glchengang.SampleAction"&gt;   <br />         &lt;/action&gt;   <br />         &lt;action   <br />               label="样本操作２"   <br />               icon="icons/sample.gif"   <br />               class="com.glchengang.SampleAction"   <br />               tooltip="Hello，Eclipse world２"   <br />               menubarPath="sampleMenu/sampleGroup2"   <br />               toolbarPath="sampleGroup2"   <br />               id="com.glchengang.SampleAction2"&gt;   <br />         &lt;/action&gt;   <br />      &lt;/actionSet&gt;   <br />   &lt;/extension&gt;  </td>
						</tr>
				</tbody>
		</table>   <br />说明：  <br />　　a) requires域中定义了该插件所要使用的依赖插件,随着开发的不断深入,这里将会填加更多的引用,现在两项就够了  <br />　　b) 在extension中说明了要们要扩展org.eclipse.ui. actionSets扩展点, &lt;actionSet&gt;…..&lt;/ actionSet &gt;表示一个action组(按钮、菜单)。还有其它类型的扩展点，如org.eclipse.ui.views是视图的扩展点，org.eclipse.ui.editors是编辑器的扩展点，各种扩展点在eclipse的帮助中有详细的说明。label是显示的名称。id是唯一标识符，只要保证在plugin.xml文件不存在重复的id就行了，这里建议以包路径和类名的组合来做为id。  <br />　　c) &lt;menu&gt;….&lt;/menu&gt;表示菜单　separator标签是一个结束符，它可以对菜单分组  <br />　　d) &lt;action&gt;....&lt;/action&gt;表示按钮。Icon是图片的路径，绝对路径是什么大家实际对照就知道了，如果eclipse找不到这个图片，默认是一个红色实心小框。Class是这个按钮所对应的类，注意把包名写全，这样比较规范些。menubarPath表示把这个action做成一个菜单放在上前&lt;menu&gt;….&lt;/menu&gt;定义的主菜单下。toolbarPath表示把这个action做成一个工具栏按钮。在这里为了方便比较我将这个action的设置复制成了两份，大家可以自己改改其中的设置，然后看看实际效果。  <br />　　e) 各详细的plugin.xml大家可以参考eclipse自带的帮助文件，这里仅做一个入门性的说明。  <br />   <br />六、按钮前面一章所说的方法运行插件（运行之前注意将原来那个向导做的myplugin项目关闭掉，关闭方法：鼠标右键点击此项目－＞弹出菜单中选择关闭项目）。插件效果如下图  <br /><br />   <img src="http://www.csdn.net/Develop/ArticleImages/27/27689/CSDN_Dev_Image_2004-5-1020585215.png" o:title="" /><br /><img src ="http://www.blogjava.net/zhangrenquan/aggbug/89332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-12-21 17:34 <a href="http://www.blogjava.net/zhangrenquan/articles/89332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Eclipse将编译后的java字节码打包成JAR文件</title><link>http://www.blogjava.net/zhangrenquan/articles/89286.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 21 Dec 2006 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/89286.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/89286.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/89286.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/89286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/89286.html</trackback:ping><description><![CDATA[File-&gt;Export-&gt;JAR File，<br /><img height="601" alt="o_000000.bmp" src="http://www.blogjava.net/images/blogjava_net/xiekai-blog/12690/o_000000.bmp" width="553" border="0" /><br /><br />点下一步，在下面的画面中设置Main class:<br /><img height="601" alt="o_000001.bmp" src="http://www.blogjava.net/images/blogjava_net/xiekai-blog/12690/o_000001.bmp" width="553" border="0" /><br /><br />点击完成就可以了。用winrar解压缩该jar文件，会发现其中有一个META-INF文件夹，里面就是MANIFEST.MF，其中设定了Main-Class: Calculator.<br />注意，如果不再上图中设置Main class，虽然可以生成jar文件，但是不能通过双击它直接运行程序.因为生成的MANIFEST.MF文件中没有设定Main-Class: Calculator，无法启动程序。<img src ="http://www.blogjava.net/zhangrenquan/aggbug/89286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-12-21 14:53 <a href="http://www.blogjava.net/zhangrenquan/articles/89286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp彩色验证码</title><link>http://www.blogjava.net/zhangrenquan/articles/59697.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Sun, 23 Jul 2006 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/59697.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/59697.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/59697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/59697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/59697.html</trackback:ping><description><![CDATA[<p>一些网站采用了字母和数字的验证码，数字和字母加起来一共30多个，如果有心，还是能够通过方法识别出来。<br />我在网上看到一篇文章"jsp彩色验证码"，我进行了加强，生成的验证码内容为汉字，可以方便应用在面向汉语网民的网站认证上。</p>
		<p>当然，我还看到别人考虑的几种方法：<br />1.生成计算题，比如20+34*(23-12)=?，用户必须输入正确的答案才能通过验证，这个想法挺好，但是用户必须打开计算器进行计算，增加了用户的难度<br />2.问一些常见的问题，比如“人”这个字由几笔组成。这也是不错的想法，关键是必须有上万条的题库，而且题库的答案必须是明确的，简单易比较的，这个难度也较大。</p>
		<p>下面是彩色汉字验证码的代码。</p>
		<p>
				<br />&lt;%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %&gt; <br />&lt;%! <br /><br />//生成随机颜色 <br />Color getRandColor(Random random,int fc,int bc) <br />{ <br />        if(fc&gt;255) fc=255; <br />        if(bc&gt;255) bc=255; <br />        int r=fc+random.nextInt(bc-fc); <br />        int g=fc+random.nextInt(bc-fc); <br />        int b=fc+random.nextInt(bc-fc); <br />        return new Color(r,g,b); <br />} <br />%&gt; <br />&lt;% <br />//设置页面不缓存 <br />response.setHeader("Pragma","No-cache"); <br />response.setHeader("Cache-Control","no-cache"); <br />response.setDateHeader("Expires", 0); </p>
		<p>
				<br />// 设置图片的长宽 <br />int width=176, height=30; <br />//设置备选汉字，剔除一些不雅的汉字 <br />String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6"; <br />//备选汉字的长度 <br />int length = base.length(); </p>
		<p>
				<br />//创建内存图像 <br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); <br />// 获取图形上下文 <br />Graphics g = image.getGraphics(); </p>
		<p>
				<br />//创建随机类的实例 <br />Random random = new Random(); </p>
		<p>
				<br />// 设定图像背景色(因为是做背景，所以偏淡) <br />g.setColor(getRandColor(random,200,250)); <br />g.fillRect(0, 0, width, height); </p>
		<p>
				<br />//备选字体 <br />String[] fontTypes = {"\u5b8b\u4f53","\u65b0\u5b8b\u4f53","\u9ed1\u4f53","\u6977\u4f53","\u96b6\u4e66"}; <br />int fontTypesLength = fontTypes.length; </p>
		<p>
				<br />//在图片背景上增加噪点 <br />g.setColor(getRandColor(random,160,200)); <br />g.setFont(new Font("Times New Roman",Font.PLAIN,14)); <br />for (int i=0;i&lt;6;i++) <br />{ <br />    g.drawString("*********************************************",0,5*(i+2)); <br />} </p>
		<p> </p>
		<p>
				<br />//取随机产生的认证码(6个汉字) </p>
		<p>
				<br />//保存生成的汉字字符串 <br />String sRand=""; <br />for (int i=0;i&lt;6;i++) <br />{ <br />    int start = random.nextInt(length); <br />    String rand=base.substring(start,start+1); <br />    sRand+=rand; <br />     <br />    //设置字体的颜色 <br />    g.setColor(getRandColor(random,10,150)); <br />    //设置字体 <br />    g.setFont(new Font(fontTypes[random.nextInt(fontTypesLength)],Font.BOLD,18 + random.nextInt(6))); <br />    //将此汉字画到图片上 <br />    g.drawString(rand,24*i+ 10 + random.nextInt(8),24); <br />} </p>
		<p>
				<br />//将认证码存入session <br />session.setAttribute("rand",sRand); </p>
		<p>
				<br />g.dispose(); </p>
		<p>
				<br />//输出图象到页面 <br />ImageIO.write(image, "JPEG", response.getOutputStream()); <br />%&gt;  </p><img src ="http://www.blogjava.net/zhangrenquan/aggbug/59697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-07-23 20:39 <a href="http://www.blogjava.net/zhangrenquan/articles/59697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在jsp中使用smartupload组件上传文件</title><link>http://www.blogjava.net/zhangrenquan/articles/58015.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 13 Jul 2006 08:39:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/58015.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/58015.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/58015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/58015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/58015.html</trackback:ping><description><![CDATA[<p>jsp对上传文件的支持不象php中支持的那么好，直接做成了函数，也不象asp中要通过组件才能实现。jsp中可以通过javabean来实现。但是我们没有必要自己去写一个上载的bean，在网上已经有了很多成型的技术，smartupload就是其中的一个。但是smartupload是将文件先读到服务器的内存中，所以上传太大的文件（超过100兆）有可能会出问题，也算是一个美中不足吧：） <br />   先说一下提交的页面，smartupload组件要求用字节流的方式来提交&lt;FORM action="upload.jsp"  encType=multipart/form-data method=post&gt;。下面就是个例子upload.htm： </p>
		<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br />&lt;!-- saved from url=(0057) <a href="http://localhost:8080/jspsmartfile/jsp/uploadTemplate.jsp">http://localhost:8080/jspsmartfile/jsp/uploadTemplate.jsp</a> --&gt;<br />&lt;HTML&gt;&lt;HEAD&gt;<br />&lt;META content="text/html; charset=gb2312" http-equiv=Content-Type&gt;<br />&lt;META content="MSHTML 5.00.2920.0" name=GENERATOR&gt;&lt;/HEAD&gt;<br />&lt;BODY bgColor=#e6e6e6&gt;&lt;BR&gt;<br />&lt;FORM action="upload.jsp"  encType=multipart/form-data method=post&gt;<br />&lt;TABLE&gt;<br />  &lt;TBODY&gt;<br />  &lt;TR&gt;<br />    &lt;TD&gt;&lt;FONT color=#000000 face=helv,helvetica size=1&gt;&amp;nbsp;&amp;nbsp;File  <br />      :&amp;nbsp;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&lt;INPUT  size=60 type=file  name="file"&gt;&lt;/TD&gt;&lt;/TR&gt;<br />        &lt;TR&gt;<br />    &lt;TR&gt;<br />    &lt;TD&gt;&lt;FONT color=#000000 face=helv,helvetica size=1&gt;&amp;nbsp;&amp;nbsp;File  <br />      :&amp;nbsp;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&lt;INPUT  size=60 type=file  name="file1"&gt;&lt;/TD&gt;&lt;/TR&gt;<br />        &lt;TR&gt;  <br />    &lt;TD&gt;&lt;FONT color=#000000 face=helv,helvetica size=1&gt;&amp;nbsp;&amp;nbsp;File  <br />      :&amp;nbsp;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp;&lt;INPUT  size=60 type=text  name="text"&gt;&lt;/TD&gt;&lt;/TR&gt;<br />  &lt;TR&gt;<br />    &lt;TD <br />align=right&gt;&lt;INPUT type=submit value=Send name="send"&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/FORM&gt;&lt;/BODY&gt;&lt;/HTML&gt; </p>
		<p>  再来看一下接收的页面 ，我们把文件上传到服务器以后就直接把它再存入数据库中：upload.jsp </p>
		<p>&lt;%@ page contentType="text/html;charset=gb2312"%&gt;<br />&lt;%@ page import="java.sql.*"%&gt;<br />&lt;%@ page import="com.jspsmart.upload.*" %&gt;<br />&lt;%@ page import="DBstep.iDBManager2000.*"%&gt;<br />&lt;%<br />    //实 例化上载bean<br />    com.jspsmart.upload.SmartUpload mySmartUpload=new com.jspsmart.upload.SmartUpload();<br />    //初 始化<br />    mySmartUpload.initialize(pageContext); <br />    //设 置上载的最大值<br />    mySmartUpload.setMaxFileSize(500 * 1024*1024);<br />    //上 载文件<br />    mySmartUpload.upload();<br />   //循 环取得所有上载的文件<br />   for (int i=0;i&lt;mySmartUpload.getFiles().getCount();i++){<br />   //取 得上载的文件<br />   com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);<br />   if (!myFile.isMissing())<br />    {<br />   //取 得上载的文件的文件名<br />    String myFileName=myFile.getFileName();<br />    //取 得不带后缀的文件名<br />    String  suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));<br />    //取 得后缀名<br />    String  ext= mySmartUpload.getFiles().getFile(0).getFileExt();  <br />    //取 得文件的大小  <br />    int fileSize=myFile.getSize();<br />    //保 存路径<br />    String aa=getServletContext().getRealPath("/")+"jsp\\";<br />    String trace=aa+myFileName;<br />    //取 得别的参数<br />    String explain=(String)mySmartUpload.getRequest().getParameter("text");<br />    String send=(String)mySmartUpload.getRequest().getParameter("send");<br />    //将 文件保存在服务器端 <br />    myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);<br />    //下 面的是将上载的文件保存到数据库中<br />    //将 文件读到流中 <br />    java.io.File file = new java.io.File(trace);<br />    java.io.FileInputStream fis = new java.io.FileInputStream(file);<br />  out.println(file.length());<br />   //打 开数据库<br />   ResultSet result=null;<br />   String mSql=null;<br />   PreparedStatement prestmt=null; <br />   DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();<br />   DbaObj.OpenConnection();<br />   //将 文件写到数据库中<br />   mSql="insert into marklist (markname,password,marksize,markdate,MarkBody) values (?,?,?,?,?)";<br />   prestmt =DbaObj.Conn.prepareStatement(mSql);<br />   prestmt.setString(1, "aaa1");<br />   prestmt.setString(2, "0000");<br />   prestmt.setInt(3, fileSize);<br />   prestmt.setString(4, DbaObj.GetDateTime());<br />   prestmt.setBinaryStream(5,fis,(int)file.length());<br />   DbaObj.Conn.setAutoCommit(true) ;<br />   prestmt.executeUpdate();<br />   DbaObj.Conn.commit();<br />   out.println(("上载成功！！！").toString());<br />   }<br />   else <br />   { out.println(("上载失败！！！").toString()); } <br />   }//与前面的if对应<br />%&gt; </p>
		<p>   再说一下下载，下载分两种情况1。从数据库直接下载2。从服务器上下载 </p>
		<p>  先说从数据库直接下载的情形：就是把输入流从数据库里读出来，然后转存为文件 </p>
		<p>&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page import="java.sql.*"%&gt;<br />&lt;%@ page import="java.io.*" %&gt;<br />&lt;%@ page import="DBstep.iDBManager2000.*"%&gt;<br />&lt;%<br />    int bytesum=0;<br />    int byteread=0;<br />  //打 开数据库<br />  ResultSet result=null;<br />  String Sql=null;<br />  PreparedStatement prestmt=null; <br />  DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();<br />  DbaObj.OpenConnection();<br />  //取 得数据库中的数据<br /> Sql="select  *  from  t_local_zhongzhuan ";<br /> result=DbaObj.ExecuteQuery(Sql);<br /> result.next(); </p>
		<p>  //将 数据库中的数据读到流中 <br />InputStream inStream=result.getBinaryStream("content"); <br />FileOutputStream fs=new FileOutputStream( "c:/dffdsafd.doc"); </p>
		<p>  byte[]  buffer =new  byte[1444];<br />int length;<br />    while ((byteread=inStream.read(buffer))!=-1)<br />    {<br />       out.println("&lt;DT&gt;&lt;B&gt;"+byteread+"&lt;/B&gt;&lt;/DT&gt;");<br />       bytesum+=byteread;<br />       System.out.println(bytesum);<br />    <br />    <br />       fs.write(buffer,0,byteread);<br />     }<br />%&gt; </p>
		<p>再说从服务器上下载的情形： </p>
		<p>&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page import="java.io.*" %&gt;<br />&lt;%<br />  String fileName = "zsc104.swf".toString();<br />f//读 到流中<br />InputStream inStream=new FileInputStream("c:/zsc104.swf");<br />  //设置 置输出的格式 <br />  response.reset(); <br />  response.setContentType("bin");<br />  response.addHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");<br />  //循 环取出流中的数据 <br />  byte[] b = new byte[100]; <br />  int len; <br />  while((len=inStream.read(b)) &gt;0) <br />  response.getOutputStream().write(b,0,len);  <br />  inStream.close(); <br />%&gt; </p>
		<p>   好了，到这里只要不是太大的文件的上传下载的操作都可以完成了。 <br /></p><img src ="http://www.blogjava.net/zhangrenquan/aggbug/58015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-07-13 16:39 <a href="http://www.blogjava.net/zhangrenquan/articles/58015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java连接池</title><link>http://www.blogjava.net/zhangrenquan/articles/55770.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 29 Jun 2006 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/55770.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/55770.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/55770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/55770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/55770.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: /**										* Title: ConnectPool.java* Description: 连接池管理器* Copyright: Copyright (c) 2002/12/25* Company:* Author :* Version 2.0				*/																								import				 java.io.		...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangrenquan/articles/55770.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/55770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-06-29 16:24 <a href="http://www.blogjava.net/zhangrenquan/articles/55770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现数据库连接池的方法(JAVA)</title><link>http://www.blogjava.net/zhangrenquan/articles/55754.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 29 Jun 2006 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/55754.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/55754.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/55754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/55754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/55754.html</trackback:ping><description><![CDATA[<p>数据库连接池在编写应用服务是经常需要用到的模块，太过频繁的连接数据库对服务性能来讲是一个瓶颈，使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网上找到很多关于数据库连接池的源程序，但是都发现这样一个共同的问题：这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库的连接，这一点我们可以理解，毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外一个共同的问题是，它们同时不允许使用者显式的调用Connection.close()方法，而需要用其规定的一个方法来关闭连接。这种做法有两个缺点：</p>
		<p>第一：改变了用户使用习惯，增加了用户的使用难度。</p>
		<p>首先我们来看看一个正常的数据库操作过程：</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
int executeSQL(String sql) throws SQLException
{
	Connection conn = getConnection();	//通过某种方式获取数据库连接
	PreparedStatement ps = null;
	int res = 0;
	try{
		ps = conn.prepareStatement(sql);
		res = ps.executeUpdate();
}finally{
try{
ps.close();
}catch(Exception e){}
try{
	conn.close();//
}catch(Exception e){}
}
return res;
}
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>使用者在用完数据库连接后通常是直接调用连接的方法close来释放数据库资源，如果用我们前面提到的连接池的实现方法，那语句conn.close()将被某些特定的语句所替代。</p>
		<p>第二：使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法，一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接，那么连接池将无法正常维护所有连接的状态，考虑连接池和应用由不同开发人员实现时这种问题更容易出现。</p>
		<p>综合上面提到的两个问题，我们来讨论一下如何解决这两个要命的问题。</p>
		<p>首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的。用户可以通过特定的方法来获取数据库的连接，同时这个连接的类型应该是标准的java.sql.Connection。用户在获取到这个数据库连接后可以对这个连接进行任意的操作，包括关闭连接等。</p>
		<p>通过对用户使用的描述，怎样可以接管Connection.close方法就成了我们这篇文章的主题。</p>
		<p>为了接管数据库连接的close方法，我们应该有一种类似于钩子的机制。例如在Windows编程中我们可以利用Hook API来实现对某个Windows API的接管。在JAVA中同样也有这样一个机制。JAVA提供了一个Proxy类和一个InvocationHandler，这两个类都在java.lang.reflect包中。我们先来看看SUN公司提供的文档是怎么描述这两个类的。</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
public interface InvocationHandler

InvocationHandler is the interface implemented by the invocation handler of a proxy instance. 

Each proxy instance has an associated invocation handler. 
When a method is invoked on a proxy instance, 
the method invocation is encoded and dispatched to the invoke method of its invocation handler.
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>SUN的API文档中关于Proxy的描述很多，这里就不罗列出来。通过文档对接口InvocationHandler的描述我们可以看到当调用一个Proxy实例的方法时会触发Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态代理机制只能接管接口的方法，而对一般的类无效，考虑到java.sql.Connection本身也是一个接口由此就找到了解决如何接管close方法的出路。</p>
		<p>首先，我们先定义一个数据库连接池参数的类，定义了数据库的JDBC驱动程序类名，连接的URL以及用户名口令等等一些信息，该类是用于初始化连接池的参数，具体定义如下：</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
public class ConnectionParam implements Serializable
{
	private String driver;				//数据库驱动程序
	private String url;					//数据连接的URL
	private String user;					//数据库用户名
	private String password;				//数据库密码
	private int minConnection = 0;		//初始化连接数
	private int maxConnection = 50;		//最大连接数
	private long timeoutValue = 600000;//连接的最大空闲时间
	private long waitTime = 30000;		//取连接的时候如果没有可用连接最大的等待时间
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>其次是连接池的工厂类ConnectionFactory，通过该类来将一个连接池对象与一个名称对应起来，使用者通过该名称就可以获取指定的连接池对象，具体代码如下：</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
/**
 * 连接池类厂，该类常用来保存多个数据源名称合数据库连接池对应的哈希
 * @author liusoft
 */
public class ConnectionFactory
{
	//该哈希表用来保存数据源名和连接池对象的关系表
	static Hashtable connectionPools = null;
	static{
		connectionPools = new Hashtable(2,0.75F);
	} 
	/**
	 * 从连接池工厂中获取指定名称对应的连接池对象
	 * @param dataSource	连接池对象对应的名称
	 * @return DataSource	返回名称对应的连接池对象
	 * @throws NameNotFoundException	无法找到指定的连接池
	 */
	public static DataSource lookup(String dataSource) 
		throws NameNotFoundException
	{
		Object ds = null;
		ds = connectionPools.get(dataSource);
		if(ds == null || !(ds instanceof DataSource))
			throw new NameNotFoundException(dataSource);
		return (DataSource)ds;
	}

	/**
	 * 将指定的名字和数据库连接配置绑定在一起并初始化数据库连接池
	 * @param name		对应连接池的名称
	 * @param param	连接池的配置参数，具体请见类ConnectionParam
	 * @return DataSource	如果绑定成功后返回连接池对象
	 * @throws NameAlreadyBoundException	一定名字name已经绑定则抛出该异常
	 * @throws ClassNotFoundException		无法找到连接池的配置中的驱动程序类
	 * @throws IllegalAccessException		连接池配置中的驱动程序类有误
	 * @throws InstantiationException		无法实例化驱动程序类
	 * @throws SQLException				无法正常连接指定的数据库
	 */
	public static DataSource bind(String name, ConnectionParam param)
		throws NameAlreadyBoundException,ClassNotFoundException,
				IllegalAccessException,InstantiationException,SQLException
	{
		DataSourceImpl source = null;
		try{
			lookup(name);
			throw new NameAlreadyBoundException(name);
		}catch(NameNotFoundException e){
			source = new DataSourceImpl(param);
			source.initConnection();
			connectionPools.put(name, source);
		}
		return source;
	}
	/**
	 * 重新绑定数据库连接池
	 * @param name		对应连接池的名称
	 * @param param	连接池的配置参数，具体请见类ConnectionParam
	 * @return DataSource	如果绑定成功后返回连接池对象
	 * @throws NameAlreadyBoundException	一定名字name已经绑定则抛出该异常
	 * @throws ClassNotFoundException		无法找到连接池的配置中的驱动程序类
	 * @throws IllegalAccessException		连接池配置中的驱动程序类有误
	 * @throws InstantiationException		无法实例化驱动程序类
	 * @throws SQLException				无法正常连接指定的数据库
	 */
	public static DataSource rebind(String name, ConnectionParam param)
		throws NameAlreadyBoundException,ClassNotFoundException,
				IllegalAccessException,InstantiationException,SQLException
	{
		try{
			unbind(name);
		}catch(Exception e){}
		return bind(name, param);
	}
	/**
	 * 删除一个数据库连接池对象
	 * @param name
	 * @throws NameNotFoundException
	 */
	public static void unbind(String name) throws NameNotFoundException
	{
		DataSource dataSource = lookup(name);
		if(dataSource instanceof DataSourceImpl){
			DataSourceImpl dsi = (DataSourceImpl)dataSource;
			try{
				dsi.stop();
				dsi.close();
			}catch(Exception e){
			}finally{
				dsi = null;
			}
		}
		connectionPools.remove(name);
	}
	
}
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>ConnectionFactory主要提供了用户将将连接池绑定到一个具体的名称上以及取消绑定的操作。使用者只需要关心这两个类即可使用数据库连接池的功能。下面我们给出一段如何使用连接池的代码：</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
	String name = "pool";
	String driver = " sun.jdbc.odbc.JdbcOdbcDriver ";
	String url = "jdbc:odbc:datasource";
	ConnectionParam param = new ConnectionParam(driver,url,null,null);
	param.setMinConnection(1);
	param.setMaxConnection(5);
	param.setTimeoutValue(20000);
	ConnectionFactory.bind(name, param);
	System.out.println("bind datasource ok.");
	//以上代码是用来登记一个连接池对象，该操作可以在程序初始化只做一次即可
	//以下开始就是使用者真正需要写的代码
	DataSource ds = ConnectionFactory.lookup(name);
	try{
		for(int i=0;i&lt;10;i++){
			Connection conn = ds.getConnection();
			try{
				testSQL(conn, sql);
			}finally{
				try{
					conn.close();
				}catch(Exception e){}
			}
		}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		ConnectionFactory.unbind(name);
		System.out.println("unbind datasource ok.");
		System.exit(0);
	}
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>从使用者的示例代码就可以看出，我们已经解决了常规连接池产生的两个问题。但是我们最最关心的是如何解决接管close方法的办法。接管工作主要在ConnectionFactory中的两句代码：</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
source = new DataSourceImpl(param);
source.initConnection();
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>DataSourceImpl是一个实现了接口javax.sql.DataSource的类，该类维护着一个连接池的对象。由于该类是一个受保护的类，因此它暴露给使用者的方法只有接口DataSource中定义的方法，其他的所有方法对使用者来说都是不可视的。我们先来关心用户可访问的一个方法getConnection</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
/**
 * @see javax.sql.DataSource#getConnection(String,String)
 */
	public Connection getConnection(String user, String password) throws SQLException 
	{
		//首先从连接池中找出空闲的对象
		Connection conn = getFreeConnection(0);
		if(conn == null){
			//判断是否超过最大连接数,如果超过最大连接数
			//则等待一定时间查看是否有空闲连接,否则抛出异常告诉用户无可用连接
			if(getConnectionCount() &gt;= connParam.getMaxConnection())
				conn = getFreeConnection(connParam.getWaitTime());
			else{//没有超过连接数，重新获取一个数据库的连接
				connParam.setUser(user);
				connParam.setPassword(password);
				Connection conn2 = DriverManager.getConnection(connParam.getUrl(), 
				user, password);
				//代理将要返回的连接对象
				_Connection _conn = new _Connection(conn2,true);
				synchronized(conns){
					conns.add(_conn);
				}
				conn = _conn.getConnection();
			}
		}
		return conn;
	}
	/**
	 * 从连接池中取一个空闲的连接
	 * @param nTimeout	如果该参数值为0则没有连接时只是返回一个null
	 * 否则的话等待nTimeout毫秒看是否还有空闲连接，如果没有抛出异常
	 * @return Connection
	 * @throws SQLException
	 */
	protected synchronized Connection getFreeConnection(long nTimeout) 
		throws SQLException
	{
		Connection conn = null;
		Iterator iter = conns.iterator();
		while(iter.hasNext()){
			_Connection _conn = (_Connection)iter.next();
			if(!_conn.isInUse()){
				conn = _conn.getConnection();
				_conn.setInUse(true);				
				break;
			}
		}
		if(conn == null &amp;&amp; nTimeout &gt; 0){
			//等待nTimeout毫秒以便看是否有空闲连接
			try{
				Thread.sleep(nTimeout);
			}catch(Exception e){}
			conn = getFreeConnection(0);
			if(conn == null)
				throw new SQLException("没有可用的数据库连接");
		}
		return conn;
	}
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>DataSourceImpl类中实现getConnection方法的跟正常的数据库连接池的逻辑是一致的，首先判断是否有空闲的连接，如果没有的话判断连接数是否已经超过最大连接数等等的一些逻辑。但是有一点不同的是通过DriverManager得到的数据库连接并不是及时返回的，而是通过一个叫_Connection的类中介一下，然后调用_Connection.getConnection返回的。如果我们没有通过一个中介也就是JAVA中的Proxy来接管要返回的接口对象，那么我们就没有办法截住Connection.close方法。</p>
		<p>终于到了核心所在，我们先来看看_Connection是如何实现的，然后再介绍是客户端调用Connection.close方法时走的是怎样一个流程，为什么并没有真正的关闭连接。</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
/**
 * 数据连接的自封装，屏蔽了close方法
 * @author Liudong
 */
class _Connection implements InvocationHandler
{
	private final static String CLOSE_METHOD_NAME = "close";
	private Connection conn = null;
	//数据库的忙状态
	private boolean inUse = false;
	//用户最后一次访问该连接方法的时间
	private long lastAccessTime = System.currentTimeMillis();
	
	_Connection(Connection conn, boolean inUse){
		this.conn = conn;
		this.inUse = inUse;
	}
	/**
	 * Returns the conn.
	 * @return Connection
	 */
	public Connection getConnection() {
		//返回数据库连接conn的接管类，以便截住close方法
		Connection conn2 = (Connection)Proxy.newProxyInstance(
			conn.getClass().getClassLoader(),
			conn.getClass().getInterfaces(),this);
		return conn2;
	}
	/**
	 * 该方法真正的关闭了数据库的连接
	 * @throws SQLException
	 */
	void close() throws SQLException{
		//由于类属性conn是没有被接管的连接，因此一旦调用close方法后就直接关闭连接
		conn.close();
	}
	/**
	 * Returns the inUse.
	 * @return boolean
	 */
	public boolean isInUse() {
		return inUse;
	}

	/**
	 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)
	 */
	public Object invoke(Object proxy, Method m, Object[] args) 
		throws Throwable 
	{
		Object obj = null;
		//判断是否调用了close的方法，如果调用close方法则把连接置为无用状态
		if(CLOSE_METHOD_NAME.equals(m.getName()))
			setInUse(false);		
		else
			obj = m.invoke(conn, args);	
		//设置最后一次访问时间，以便及时清除超时的连接
		lastAccessTime = System.currentTimeMillis();
		return obj;
	}
		
	/**
	 * Returns the lastAccessTime.
	 * @return long
	 */
	public long getLastAccessTime() {
		return lastAccessTime;
	}

	/**
	 * Sets the inUse.
	 * @param inUse The inUse to set
	 */
	public void setInUse(boolean inUse) {
		this.inUse = inUse;
	}
}
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>一旦使用者调用所得到连接的close方法，由于用户的连接对象是经过接管后的对象，因此JAVA虚拟机会首先调用_Connection.invoke方法，在该方法中首先判断是否为close方法，如果不是则将代码转给真正的没有被接管的连接对象conn。否则的话只是简单的将该连接的状态设置为可用。到此您可能就明白了整个接管的过程，但是同时也有一个疑问：这样的话是不是这些已建立的连接就始终没有办法真正关闭？答案是可以的。我们来看看ConnectionFactory.unbind方法，该方法首先找到名字对应的连接池对象，然后关闭该连接池中的所有连接并删除掉连接池。在DataSourceImpl类中定义了一个close方法用来关闭所有的连接，详细代码如下：</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
	/**
	 * 关闭该连接池中的所有数据库连接
	 * @return int 返回被关闭连接的个数
	 * @throws SQLException
	 */
	public int close() throws SQLException
	{
		int cc = 0;
		SQLException excp = null;
		Iterator iter = conns.iterator();
		while(iter.hasNext()){
			try{
				((_Connection)iter.next()).close();
				cc ++;
			}catch(Exception e){
				if(e instanceof SQLException)
					excp = (SQLException)e;
			}
		}
		if(excp != null)
			throw excp;
		return cc;
	}
</code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>该方法一一调用连接池中每个对象的close方法，这个close方法对应的是_Connection中对close的实现，在_Connection定义中关闭数据库连接的时候是直接调用没有经过接管的对象的关闭方法，因此该close方法真正的释放了数据库资源。</p>
		<p>以上文字只是描述了接口方法的接管，具体一个实用的连接池模块还需要对空闲连接的监控并及时释放连接，详细的代码请参照附件。</p><img src ="http://www.blogjava.net/zhangrenquan/aggbug/55754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-06-29 15:02 <a href="http://www.blogjava.net/zhangrenquan/articles/55754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java实现连接池程序</title><link>http://www.blogjava.net/zhangrenquan/articles/55743.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 29 Jun 2006 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/55743.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/55743.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/55743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/55743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/55743.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1								package				 ConnectionPool; 				  2																								/** */										/**						 						  3														此内部类定义了一个连接池。它能够根据要求创建新连接，直到预定的最大连接数为止。在返回连接给客户程序之前，它...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangrenquan/articles/55743.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/55743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-06-29 14:44 <a href="http://www.blogjava.net/zhangrenquan/articles/55743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ZIP压缩简介</title><link>http://www.blogjava.net/zhangrenquan/articles/50554.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 05 Jun 2006 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/50554.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/50554.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/50554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/50554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/50554.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在										JDK API								中，定义了多种类型用于创建										ZIP								格式压缩文件的										API								。程序设计人员在开发网络应用程序时，可以基于这些										API								，编写将原始数据压缩成为										ZIP				...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangrenquan/articles/50554.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/50554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-06-05 17:48 <a href="http://www.blogjava.net/zhangrenquan/articles/50554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用java zip 压缩单个文件</title><link>http://www.blogjava.net/zhangrenquan/articles/50542.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 05 Jun 2006 09:06:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/50542.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/50542.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/50542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/50542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/50542.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.zip.ZipOutputStream;<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.IOException;<br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.zip.ZipEntry;<br /></span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.FileOutputStream;<br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.FileInputStream;<br /></span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_176_928_Open_Image" onclick="this.style.display='none'; Codehighlighter1_176_928_Open_Text.style.display='none'; Codehighlighter1_176_928_Closed_Image.style.display='inline'; Codehighlighter1_176_928_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_176_928_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_176_928_Closed_Text.style.display='none'; Codehighlighter1_176_928_Open_Image.style.display='inline'; Codehighlighter1_176_928_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> CSVZip </span>
				<span id="Codehighlighter1_176_928_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_176_928_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080"> 8</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
						</span>
						<span style="COLOR: #008080"> 9</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_232_926_Open_Image" onclick="this.style.display='none'; Codehighlighter1_232_926_Open_Text.style.display='none'; Codehighlighter1_232_926_Closed_Image.style.display='inline'; Codehighlighter1_232_926_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_232_926_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_232_926_Closed_Text.style.display='none'; Codehighlighter1_232_926_Open_Image.style.display='inline'; Codehighlighter1_232_926_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> Zip(String file,String zipfile) </span>
						<span id="Codehighlighter1_232_926_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_232_926_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">10</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_242_831_Open_Image" onclick="this.style.display='none'; Codehighlighter1_242_831_Open_Text.style.display='none'; Codehighlighter1_242_831_Closed_Image.style.display='inline'; Codehighlighter1_242_831_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_242_831_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_242_831_Closed_Text.style.display='none'; Codehighlighter1_242_831_Open_Image.style.display='inline'; Codehighlighter1_242_831_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">try</span>
								<span style="COLOR: #000000"> </span>
								<span id="Codehighlighter1_242_831_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_242_831_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">11</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">创建文件输入流对象</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">12</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">      FileInputStream in </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> FileInputStream(file); </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">0<br /></span>
										<span style="COLOR: #008080">13</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">创建文件输出流对象</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">14</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">      FileOutputStream out </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> FileOutputStream(zipfile); </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">1<br /></span>
										<span style="COLOR: #008080">15</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">创建ZIP数据输出流对象</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">16</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">      ZipOutputStream zipOut </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> ZipOutputStream(out);<br /></span>
										<span style="COLOR: #008080">17</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">创建指向压缩原始文件的入口</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">18</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">      ZipEntry entry </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> ZipEntry(file); </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">0</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">19</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">      zipOut.putNextEntry(entry);<br /></span>
										<span style="COLOR: #008080">20</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">向压缩文件中输出数据</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">21</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">      </span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000"> nNumber;<br /></span>
										<span style="COLOR: #008080">22</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
										<span style="COLOR: #0000ff">byte</span>
										<span style="COLOR: #000000">[] buffer </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">byte</span>
										<span style="COLOR: #000000">[</span>
										<span style="COLOR: #000000">512</span>
										<span style="COLOR: #000000">];<br /></span>
										<span style="COLOR: #008080">23</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
										<span style="COLOR: #0000ff">while</span>
										<span style="COLOR: #000000"> ( (nNumber </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> in.read(buffer)) </span>
										<span style="COLOR: #000000">!=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">-</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">)<br /></span>
										<span style="COLOR: #008080">24</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        zipOut.write(buffer, </span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">, nNumber);<br /></span>
										<span style="COLOR: #008080">25</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">关闭创建的流对象</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">26</span>
										<span style="COLOR: #008000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">      zipOut.close();<br /></span>
										<span style="COLOR: #008080">27</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												<br />
										</span>
										<span style="COLOR: #008080">28</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      out.close();<br /></span>
										<span style="COLOR: #008080">29</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      in.close();<br /></span>
										<span style="COLOR: #008080">30</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												<br />
										</span>
										<span style="COLOR: #008080">31</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_854_921_Open_Image" onclick="this.style.display='none'; Codehighlighter1_854_921_Open_Text.style.display='none'; Codehighlighter1_854_921_Closed_Image.style.display='inline'; Codehighlighter1_854_921_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_854_921_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_854_921_Closed_Text.style.display='none'; Codehighlighter1_854_921_Open_Image.style.display='inline'; Codehighlighter1_854_921_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #0000ff">catch</span>
								<span style="COLOR: #000000"> (IOException e) </span>
								<span id="Codehighlighter1_854_921_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_854_921_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">32</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />               System.out.println(e);<br /></span>
										<span style="COLOR: #008080">33</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                           }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">34</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080">35</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">36</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">37</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/50542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-06-05 17:06 <a href="http://www.blogjava.net/zhangrenquan/articles/50542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用java实现printscreen，读取位图文件，将位图文件转化位jpeg格式并保存成文件输出</title><link>http://www.blogjava.net/zhangrenquan/articles/48784.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 29 May 2006 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/48784.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/48784.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/48784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/48784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/48784.html</trackback:ping><description><![CDATA[
		<span id="Codehighlighter1_447_12724_Open_Text">
				<pre>
						<span id="Codehighlighter1_7390_12768_Open_Text">
								<span id="Codehighlighter1_8085_12768_Open_Text">
										<span id="Codehighlighter1_447_12724_Open_Text">
												<pre>package screensaver;</pre>
												<pre>import java.awt.*;<br />import java.awt.image.BufferedImage;<br />import java.io.*;<br />import java.util.*;<br />import com.sun.image.codec.jpeg.*;<br />import java.awt.Image;<br />import java.awt.Toolkit;<br />import java.awt.image.BufferedImage;<br />import java.awt.image.MemoryImageSource;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import com.sun.image.codec.jpeg.JPEGCodec;<br />import com.sun.image.codec.jpeg.JPEGImageEncoder;</pre>
												<pre>public class ScreenPicSaver<br />{<br />  MediaTracker tracker = new MediaTracker(new Component()<br />  {});</pre>
												<pre>  public ScreenPicSaver()<br />  {}</pre>
												<pre>  public Image loadbitmap(String sdir, String sfile) //读取8位或24位的位图文件<br />  {<br />    Image image;<br />    System.out.println("loading:" + sdir + sfile);<br />    try<br />    {<br />      FileInputStream fs = new FileInputStream(sdir + sfile);<br />      int bflen = 14; // 14 字节 BITMAPFILEHEADER<br />      byte bf[] = new byte[bflen];<br />      fs.read(bf, 0, bflen);<br />      int bilen = 40; // 40 字节 BITMAPINFOHEADER<br />      byte bi[] = new byte[bilen];<br />      fs.read(bi, 0, bilen);</pre>
												<pre>      // 解释数据。<br />      int nsize = ( ( (int) bf[5] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bf[4] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bf[3] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bf[2] &amp; 0xff;<br />      System.out.println("File type is :" + (char) bf[0] + (char) bf[1]);<br />      System.out.println("Size of file is :" + nsize);</pre>
												<pre>      int nbisize = ( ( (int) bi[3] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bi[2] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bi[1] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bi[0] &amp; 0xff;<br />      System.out.println("Size of bitmapinfoheader is :" + nbisize);</pre>
												<pre>      int nwidth = ( ( (int) bi[7] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bi[6] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bi[5] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bi[4] &amp; 0xff;<br />      System.out.println("Width is :" + nwidth);</pre>
												<pre>      int nheight = ( ( (int) bi[11] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bi[10] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bi[9] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bi[8] &amp; 0xff;<br />      System.out.println("Height is :" + nheight);</pre>
												<pre>      int nplanes = ( ( (int) bi[13] &amp; 0xff) &lt;&lt; 8) | (int) bi[12] &amp; 0xff;<br />      System.out.println("Planes is :" + nplanes);</pre>
												<pre>      int nbitcount = ( ( (int) bi[15] &amp; 0xff) &lt;&lt; 8) | (int) bi[14] &amp; 0xff;<br />      System.out.println("BitCount is :" + nbitcount);</pre>
												<pre>      // 查找表明压缩的非零值<br />      int ncompression = ( ( (int) bi[19]) &lt;&lt; 24)<br />          | ( ( (int) bi[18]) &lt;&lt; 16)<br />          | ( ( (int) bi[17]) &lt;&lt; 8)<br />          | (int) bi[16];<br />      System.out.println("Compression is :" + ncompression);</pre>
												<pre>      int nsizeimage = ( ( (int) bi[23] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bi[22] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bi[21] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bi[20] &amp; 0xff;<br />      System.out.println("SizeImage is :" + nsizeimage);</pre>
												<pre>      int nxpm = ( ( (int) bi[27] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bi[26] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bi[25] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bi[24] &amp; 0xff;<br />      System.out.println("X-Pixels per meter is :" + nxpm);</pre>
												<pre>      int nypm = ( ( (int) bi[31] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bi[30] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bi[29] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bi[28] &amp; 0xff;<br />      System.out.println("Y-Pixels per meter is :" + nypm);</pre>
												<pre>      int nclrused = ( ( (int) bi[35] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bi[34] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bi[33] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bi[32] &amp; 0xff;<br />      System.out.println("Colors used are :" + nclrused);</pre>
												<pre>      int nclrimp = ( ( (int) bi[39] &amp; 0xff) &lt;&lt; 24)<br />          | ( ( (int) bi[38] &amp; 0xff) &lt;&lt; 16)<br />          | ( ( (int) bi[37] &amp; 0xff) &lt;&lt; 8)<br />          | (int) bi[36] &amp; 0xff;<br />      System.out.println("Colors important are :" + nclrimp);</pre>
												<pre>      if (nbitcount == 24)<br />      {<br />        // 24 位格式不包含调色板数据，但扫描行被补足到<br />        // 4 个字节。<br />        int npad = (nsizeimage / nheight) - nwidth * 3;<br />        int ndata[] = new int[nheight * nwidth];<br />        byte brgb[] = new byte[ (nwidth + npad) * 3 * nheight];<br />        fs.read(brgb, 0, (nwidth + npad) * 3 * nheight);<br />        int nindex = 0;<br />        for (int j = 0; j &lt; nheight; j++)<br />        {<br />          for (int i = 0; i &lt; nwidth; i++)<br />          {<br />            ndata[nwidth * (nheight - j - 1) + i] =<br />                (255 &amp; 0xff) &lt;&lt; 24<br />                | ( ( (int) brgb[nindex + 2] &amp; 0xff) &lt;&lt; 16)<br />                | ( ( (int) brgb[nindex + 1] &amp; 0xff) &lt;&lt; 8)<br />                | (int) brgb[nindex] &amp; 0xff;<br />            /**   System.out.println("Encoded Color at ("<br />               +i + "," + j + ")is:" + nrgb + " (R,G,B)= ("<br />                   + ( (int) (brgb[2]) &amp; 0xff) + ","<br />                   + ( (int) brgb[1] &amp; 0xff) + ","<br />                   + ( (int) brgb[0] &amp; 0xff) + ")");<br />             }*/<br />            nindex += 3;<br />          }<br />          nindex += npad;<br />        }</pre>
												<pre>        image = Toolkit.getDefaultToolkit().createImage<br />            (new MemoryImageSource(nwidth, nheight,<br />                                   ndata, 0, nwidth));<br />      }<br />      else if (nbitcount == 8)<br />      {<br />        // 必须确定颜色数。如果 clrsused 参数大于 0，<br />        // 则颜色数由它决定。如果它等于 0，则根据<br />        // bitsperpixel 计算颜色数。<br />        int nNumColors = 0;<br />        if (nclrused &gt; 0)<br />        {<br />          nNumColors = nclrused;<br />        }<br />        else<br />        {<br />          nNumColors = (1 &amp; 0xff) &lt;&lt; nbitcount;<br />        }<br />        System.out.println("The number of Colors is" + nNumColors);</pre>
												<pre>        // 某些位图不计算 sizeimage 域，请找出<br />        // 这些情况并对它们进行修正。<br />        if (nsizeimage == 0)<br />        {<br />          nsizeimage = ( ( ( (nwidth * nbitcount) + 31) &amp; ~31) &gt;&gt; 3);<br />          nsizeimage *= nheight;<br />          System.out.println("nsizeimage (backup) is" + nsizeimage);<br />        }</pre>
												<pre>        // 读取调色板颜色。<br />        int npalette[] = new int[nNumColors];<br />        byte bpalette[] = new byte[nNumColors * 4];<br />        fs.read(bpalette, 0, nNumColors * 4);<br />        int nindex8 = 0;<br />        for (int n = 0; n &lt; nNumColors; n++)<br />        {<br />          npalette[n] = (255 &amp; 0xff) &lt;&lt; 24<br />              | ( ( (int) bpalette[nindex8 + 2] &amp; 0xff) &lt;&lt; 16)<br />              | ( ( (int) bpalette[nindex8 + 1] &amp; 0xff) &lt;&lt; 8)<br />              | (int) bpalette[nindex8] &amp; 0xff;<br />          /**System.out.println ("Palette Color "+n<br />                     +" is:" + npalette[n] + " (res,R,G,B)= ("<br />              + ( (int) (bpalette[nindex8 + 3]) &amp; 0xff) + ","<br />              + ( (int) (bpalette[nindex8 + 2]) &amp; 0xff) + ","<br />              + ( (int) bpalette[nindex8 + 1] &amp; 0xff) + ","<br />              + ( (int) bpalette[nindex8] &amp; 0xff) + ")");<br />           */<br />          nindex8 += 4;<br />        }</pre>
												<pre>        // 读取图像数据（实际上是调色板的索引）<br />        // 扫描行仍被补足到 4 个字节。<br />        int npad8 = (nsizeimage / nheight) - nwidth;<br />        System.out.println("nPad is:" + npad8);</pre>
												<pre>        int ndata8[] = new int[nwidth * nheight];<br />        byte bdata[] = new byte[ (nwidth + npad8) * nheight];<br />        fs.read(bdata, 0, (nwidth + npad8) * nheight);<br />        nindex8 = 0;<br />        for (int j8 = 0; j8 &lt; nheight; j8++)<br />        {<br />          for (int i8 = 0; i8 &lt; nwidth; i8++)<br />          {<br />            ndata8[nwidth * (nheight - j8 - 1) + i8] =<br />                npalette[ ( (int) bdata[nindex8] &amp; 0xff)];<br />            nindex8++;<br />          }<br />          nindex8 += npad8;<br />        }</pre>
												<pre>        image = Toolkit.getDefaultToolkit().createImage<br />            (new MemoryImageSource(nwidth, nheight,<br />                                   ndata8, 0, nwidth));<br />      }<br />      else<br />      {<br />        System.out.println("Not a 24-bit or 8-bit Windows Bitmap, aborting...");<br />        image = (Image)null;<br />      }</pre>
												<pre>      fs.close();<br />      return image;<br />    }<br />    catch (Exception e)<br />    {<br />      System.out.println("Caught exception in loadbitmap!");<br />    }<br />    return (Image)null;<br />  }</pre>
												<pre>  public void waitForImage(Image image)<br />  {<br />    //tracker = new MediaTracker(this);<br />    try<br />    {<br />      tracker.addImage(image, 0); //public void addImage(Image image,int id)<br />      //tracker.waitForAll();<br />      tracker.waitForID(0);<br />      tracker.checkAll(true);<br />      /** while(!tracker.checkID(0))<br />       {<br />         tracker.waitForID(0);<br />       }*/<br />      if (tracker.isErrorAny())<br />      {<br />        // System.out.println(tracker.getErrorsAny().toString());<br />        System.out.println("加载图像出现错误！");<br />        System.exit(0);<br />      }</pre>
												<pre>      // loadStatus = tracker.statusID( 0, false );<br />      // tracker.removeImage(image, 0);<br />    }<br />    catch (InterruptedException e)<br />    {<br />      e.printStackTrace();<br />    }<br />  } // waitForImage</pre>
												<pre>  public void checkImage(Image image)<br />  {<br />    waitForImage(image);</pre>
												<pre>    int imageWidth = image.getWidth(null);<br />    if (imageWidth &lt; 1)<br />    {<br />      throw new IllegalArgumentException("image width " + imageWidth +<br />                                         " is out of range");<br />    }<br />    int imageHeight = image.getHeight(null);<br />    if (imageHeight &lt; 1)<br />    {<br />      throw new IllegalArgumentException("image height " + imageHeight +<br />                                         " is out of range");<br />    }<br />    // System.out.println( "Image size=" + imageWidth + "x" + imageHeight );<br />  } // checkImage</pre>
												<pre>  public void encodeJPEG(OutputStream outputStream, Image outputImage,<br />                         float outputQuality) throws java.io.IOException<br />  {<br />    int outputWidth = outputImage.getWidth(null);<br />    if (outputWidth &lt; 1)<br />    {<br />      throw new IllegalArgumentException("output image width " + outputWidth +<br />                                         " is out of range");<br />    }<br />    int outputHeight = outputImage.getHeight(null);<br />    if (outputHeight &lt; 1)<br />    {<br />      throw new IllegalArgumentException("output image height " + outputHeight +<br />                                         " is out of range");<br />    }</pre>
												<pre>    // Get a buffered image from the image.<br />    BufferedImage bi = new BufferedImage(outputWidth, outputHeight,<br />                                         BufferedImage.TYPE_INT_RGB);<br />    Graphics2D biContext = bi.createGraphics();<br />    biContext.drawImage(outputImage, 0, 0, null);<br />    // Note that additional drawing such as watermarks or logos can be placed here.</pre>
												<pre>    // com.sun.image.codec.jpeg package is included in sun and ibm sdk 1.3<br />    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);<br />    // The default quality is 0.75.<br />    JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(bi);<br />    jep.setQuality(outputQuality, true);<br />    encoder.encode(bi, jep);<br />    // encoder.encode( bi );<br />    outputStream.flush();<br />  } // encodeImage</pre>
												<pre>  /** Adjusts the size of the image to the given coordinates.<br />   * If width or height is -1, the image aspect ration is maintained.<br />   * &lt;p&gt;<br />   * Hints are one of SCALE_DEFAULT, SCALE_FAST, SCALE_SMOOTH,<br />   * SCALE_REPLICATE, SCALE_AREA_AVERAGING as defined in java.awt.Image.<br />   */<br />  public Image setSize(Image image, int width, int height, int hints)<br />  {<br />    return image.getScaledInstance(width, height, hints);<br />  } // setSize</pre>
												<pre>  public Image setSize(Image image, int width, int height)<br />  {<br />    return setSize(image, width, height, java.awt.Image.SCALE_DEFAULT); //setSize调用的是上一个方法.<br />  } // setSize</pre>
												<pre>  //Component initialization<br />  public static void main(String[] args)<br />  {<br />    ScreenPicSaver sps = new ScreenPicSaver();<br />    // String sdir = new String("d:\\");<br />    // String sfile = new String("desktop.bmp");<br />    String outputFileName = new String("d:\\desktop.jpg");</pre>
												<pre>    //Image inputImage = Toolkit.getDefaultToolkit().getImage(inputFileName);<br />    //Image inputImage = sps.loadbitmap(sdir, sfile);<br />    //===============================================================<br />    BufferedImage bufferedImage = null;<br />    Robot robot;<br />    Image inputImage = null;<br />    try<br />    {<br />      robot = new Robot();<br />      bufferedImage = robot.createScreenCapture(new Rectangle(Toolkit.<br />          getDefaultToolkit().getScreenSize())); //得到桌面图像的bufferedImage对象</pre>
												<pre>    }<br />    catch (Exception ex)<br />    {<br />      ex.printStackTrace();<br />    }<br />    int width = bufferedImage.getWidth();<br />    int height = bufferedImage.getHeight();<br />    inputImage = bufferedImage.getScaledInstance(width, height,<br />                                                 BufferedImage.TYPE_INT_RGB); //将bufferedImage对象转化位Image对象</pre>
												<pre>    MediaTracker tracker = new MediaTracker(new Component()<br />    {});</pre>
												<pre>    int outputWidth = inputImage.getWidth(null); //使得新图像和原图像的宽度一样<br />    float outputQuality = 0.80f;<br />    Image outputImage = sps.setSize(inputImage, outputWidth, -1); //-1表示在宽度确定的情况下，高度在原图像的基础上成比例缩放</pre>
												<pre>    try<br />    {<br />      tracker.addImage(inputImage, 0);<br />      //sps.tracker.waitForAll();<br />      tracker.waitForID(0);<br />      tracker.checkAll(true);<br />    }<br />    catch (InterruptedException e)<br />    {<br />      e.printStackTrace();<br />    }</pre>
												<pre>    int imageWidth = inputImage.getWidth(null);<br />    if (imageWidth &lt; 1)<br />    {<br />      throw new IllegalArgumentException("image width " + imageWidth +<br />                                         " is out of range");<br />    }<br />    int imageHeight = inputImage.getHeight(null);<br />    if (imageHeight &lt; 1)<br />    {<br />      throw new IllegalArgumentException("image height " + imageHeight +<br />                                         " is out of range");<br />    }<br />    try<br />    {<br />      FileOutputStream fos = new FileOutputStream(outputFileName);<br />      sps.encodeJPEG(fos, outputImage, outputQuality);<br />      fos.flush();<br />      fos.close();<br />    }<br />    catch (Exception e)<br />    {<br />      e.printStackTrace();<br />    }</pre>
												<pre>    System.exit(0);</pre>
												<pre>  }</pre>
												<pre>}</pre>
										</span>
								</span>
						</span>
				</pre>
		</span>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/48784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-05-29 16:49 <a href="http://www.blogjava.net/zhangrenquan/articles/48784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态图文结合</title><link>http://www.blogjava.net/zhangrenquan/articles/48775.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 29 May 2006 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/48775.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/48775.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/48775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/48775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/48775.html</trackback:ping><description><![CDATA[
		<a href="http://www.jdon.com/aboutme.htm">板桥里人</a> http://www.jdon.com<br /><br /><p>IBM已经有一篇文章介绍动态图文结合输出的文章， 由于此篇文章中使用了SUN的JPEG特殊类：com.sun.image.codec.jpeg.*;我个人认为通用性不好，利用jdk1.4的新特点，也完全可以作到：</p><p>现将本人实践的动态图文结合javabeans的核心公布如下:</p><p></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.io.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.awt.image.BufferedImage;<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.awt.Image;<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.awt.image.AffineTransformOp;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.imageio.ImageIO;<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.awt.geom.AffineTransform;<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.awt.Graphics2D;<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.awt.Color;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.awt.Font;<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><img src="http://www.blogjava.net/images/dot.gif" /><img src="http://www.blogjava.net/images/dot.gif" /><img src="http://www.blogjava.net/images/dot.gif" /><img src="http://www.blogjava.net/images/dot.gif" />..<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">生成BufferedImage实例,这是不需要真正显示时经常使用的类</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">BufferedImage Bi </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ImageIO.read(F);<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 利用Graphics2D的新特性.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Graphics2D g2D </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Bi.createGraphics(); <br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">定义字体(楷体或宋体等) 及其大小</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">Font myfont</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Font(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\u5b8b\u4f53</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,Font.PLAIN,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />g2D.setFont(myfont);<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">字体颜色为黑</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">g2D.setColor(Color.BLACK);<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">需要写在图片上文字 注意:中文需要操作系统支持中文 如中文window,<br /></span><span style="COLOR: #008080">30</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> linux下要安装中文字库,并使jdk1.4支持这个中文</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">String strs</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello everyone 中 文</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在离顶部 和左边各为20处 写入文字,该处使用了对中文处理的getBytes功能.</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">35</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">g2D.drawString(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> String(strs.getBytes(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ISO8859_1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)),</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">必须使用,表示完成 </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">38</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">g2D.dispose(); <br /></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img id="Codehighlighter1_815_1090_Open_Image" onclick="this.style.display='none'; Codehighlighter1_815_1090_Open_Text.style.display='none'; Codehighlighter1_815_1090_Closed_Image.style.display='inline'; Codehighlighter1_815_1090_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_815_1090_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_815_1090_Closed_Text.style.display='none'; Codehighlighter1_815_1090_Open_Image.style.display='inline'; Codehighlighter1_815_1090_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> </span><span id="Codehighlighter1_815_1090_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_815_1090_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使用ImageIO写入图片 </span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">42</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">ImageIO.write(Bi, ext, ThF);<br /></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">原来是使用com.sun.image.codec.jpeg.*的功能,如下.需要下载com.sun.image.codec.jpeg<br /></span><span style="COLOR: #008080">45</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> FileOutputStream out = new FileOutputStream(ThF);<br /></span><span style="COLOR: #008080">46</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);<br /></span><span style="COLOR: #008080">47</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> encoder.encode(Bi);<br /></span><span style="COLOR: #008080">48</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> out.close();</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080">49</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img id="Codehighlighter1_1112_1192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1112_1192_Open_Text.style.display='none'; Codehighlighter1_1112_1192_Closed_Image.style.display='inline'; Codehighlighter1_1112_1192_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1112_1192_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1112_1192_Closed_Text.style.display='none'; Codehighlighter1_1112_1192_Open_Image.style.display='inline'; Codehighlighter1_1112_1192_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span></span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (Exception ex) </span><span id="Codehighlighter1_1112_1192_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1112_1192_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Exception(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ImageIo.write error in CreatThum.: </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">ex.getMessage()); <br /></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">53</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p><br /><br />只要jsp将相关参数通知这个bean,就会轻松产生自己的图文,下图我自己在linux上调试的结果,由于linux没有安装字库,所以下图中文不正常显示,不过该程序我在中文win2000下调试正常通过:</p><p><b>原图:</b></p><p><img height="194" src="http://www.jdon.com/idea/images/%B6%AF%CC%AC%CD%BC%CE%C4%BD%E1%BA%CF2.jpg" width="272" /></p><p><b>效果图</b></p><p><img height="194" src="http://www.jdon.com/idea/images/%B6%AF%CC%AC%CD%BC%CE%C4%BD%E1%BA%CF1.jpg" width="272" /></p><p> </p><p>关于使用Servlet/Jsp输出图片或图像，见网址：</p><p><a href="http://www.mullassery.com/" target="_blank"><font color="#002c99">http://www.mullassery.com/</font></a></p><p>相关文章：</p><p><a class="home_title" href="http://www.jdon.com/artichect/coupling.htm" target="_blank"><font color="#002c99">软件最大的追求是什么？</font></a></p><p><span class="smallgray"><a class="home_title" href="http://www.jdon.com/idea/j2eebasic.htm" target="_blank"><font color="#002c99">初学者如何开发出一个高质量的J2EE系统？</font></a></span></p><p><a class="home_title" href="http://www.jdon.com/artichect/dbover.htm" target="_blank"><font color="#002c99">数据库时代的终结</font></a></p><p><a class="home_title" href="http://www.jdon.com/artichect/oo_math.htm" target="_blank"></a><a class="home_title" href="http://www.jdon.com/artichect/state.htm" target="_blank"><font color="#002c99">状态对象：数据库的替代者</font></a></p><p><a class="home_title" href="http://www.jdon.com/idea/chinesejava.htm" target="_blank"><font color="#002c99">Java/J2EE中文问题终极解决之道</font></a><a href="http://www.jdon.com/idea/jdonframework/app.htm" target="_blank"></a></p><img src ="http://www.blogjava.net/zhangrenquan/aggbug/48775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-05-29 16:26 <a href="http://www.blogjava.net/zhangrenquan/articles/48775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java操作Excel (jxl)</title><link>http://www.blogjava.net/zhangrenquan/articles/46441.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 16 May 2006 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/46441.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/46441.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/46441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/46441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/46441.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 71.91%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 607px; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> com.jagie.test;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> jxl.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> jxl.write.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> jxl.format.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.awt.Color;<br /><img id="Codehighlighter1_157_1018_Open_Image" onclick="this.style.display='none'; Codehighlighter1_157_1018_Open_Text.style.display='none'; Codehighlighter1_157_1018_Closed_Image.style.display='inline'; Codehighlighter1_157_1018_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_157_1018_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_157_1018_Closed_Text.style.display='none'; Codehighlighter1_157_1018_Open_Image.style.display='inline'; Codehighlighter1_157_1018_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> Test</span>
				<span id="Codehighlighter1_157_1018_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_157_1018_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_224_836_Open_Image" onclick="this.style.display='none'; Codehighlighter1_224_836_Open_Text.style.display='none'; Codehighlighter1_224_836_Closed_Image.style.display='inline'; Codehighlighter1_224_836_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_224_836_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_224_836_Closed_Text.style.display='none'; Codehighlighter1_224_836_Open_Image.style.display='inline'; Codehighlighter1_224_836_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> writeExcel(OutputStream os) </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> Exception </span>
						<span id="Codehighlighter1_224_836_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_224_836_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />jxl.write.WritableWorkbook wwb </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> Workbook.createWorkbook(os);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />jxl.write.WritableSheet ws </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> wwb.createSheet(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">TestSheet1</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />jxl.write.Label labelC </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> jxl.write.Label(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">我爱中国</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />ws.addCell(labelC);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />jxl.write.WritableFont wfc </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> jxl.write.WritableFont(WritableFont.ARIAL,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
								<span style="COLOR: #000000">20</span>
								<span style="COLOR: #000000">, WritableFont.BOLD, </span>
								<span style="COLOR: #0000ff">false</span>
								<span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.GREEN);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />jxl.write.WritableCellFormat wcfFC </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> jxl.write.WritableCellFormat(wfc);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />wcfFC.setBackground(jxl.format.Colour.RED);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />labelC </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> jxl.write.Label(</span>
								<span style="COLOR: #000000">6</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">, </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">中国爱我</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,wcfFC);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />ws.addCell(labelC);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">写入Exel工作表</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">wwb.write();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">关闭Excel工作薄对象</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">wwb.close();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">最好写一个这样的main方法来测试一下你的这个class是否写好了。</span>
						<span style="COLOR: #008000">
								<br />
								<img id="Codehighlighter1_930_1015_Open_Image" onclick="this.style.display='none'; Codehighlighter1_930_1015_Open_Text.style.display='none'; Codehighlighter1_930_1015_Closed_Image.style.display='inline'; Codehighlighter1_930_1015_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_930_1015_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_930_1015_Closed_Text.style.display='none'; Codehighlighter1_930_1015_Open_Image.style.display='inline'; Codehighlighter1_930_1015_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> main(String[] args)</span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> Exception</span>
						<span id="Codehighlighter1_930_1015_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_930_1015_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />File f</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> File(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">kk.xls</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />f.createNewFile();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />writeExcel(</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> FileOutputStream(f));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<br />
		<br />写一个jsp,来利用Test这个javabean输出excel文档。<br /><br />///////////////////////////test_excel.jsp//////////////////////////<br /><br />&lt;%@page import="com.jagie.test.Test" %&gt;<br />&lt;%<br />response.reset();<br />response.setContentType("application/vnd.ms-excel");<br />Test.writeExcel(response.getOutputStream());<br />%&gt;<br /><br />这样就大功告成了，你用ie访问test_excel.jsp就能在ie里面打开动态生成的excel文档了。一点乱码也没有。<br /><br />也许有人会问:response.reset();可不可以不要这一句,我的建议是一定要写，除非你能保证response的buffer里面没有别的东西。<br /><br />还有人也许会问:我在jsp开头加上&lt;%@page contentType="application/vnd.ms-excel;charset=GBK" %&gt;这一句，去掉response.setContentType("application/vnd.ms-excel");行不行?回答这个问题很简单，就是查看jsp服务器编译jsp后生成的java代码，如果改成这样，我的welogic7编译test_excel.jsp后生成的java文件的示意性代码是这样的:<br /><br />public void _jspService(javax.servlet.http.HttpServletRequest request,<br />javax.servlet.http.HttpServletResponse response) throws java.io.IOException,<br />javax.servlet.ServletException {<br /><br />// declare and set well-known variables:<br />javax.servlet.ServletConfig config = getServletConfig();<br />javax.servlet.ServletContext application = config.getServletContext();<br />javax.servlet.jsp.tagext.Tag _activeTag = null;<br />// variables for Tag extension protocol<br /><br />Object page = this;<br />javax.servlet.jsp.JspWriter out;<br />javax.servlet.jsp.PageContext pageContext =<br />javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(this,<br />request, response, null, true, 8192, true);<br /><br />response.setHeader("Content-Type",<br />"application/vnd.ms-excel; charset=GBK");<br />out = pageContext.getOut();<br />JspWriter _originalOut = out;<br /><br />javax.servlet.http.HttpSession session = request.getSession(true);<br /><br />try { // error page try block<br /><br />response.setContentType("application/vnd.ms-excel;charset=GBK");<br /><br />out.print("\r\n\r\n\r\n\r\n");<br />out.print("\r\n");<br />//[ /test_excel.jsp; Line: 6]<br />response.reset(); //[ /test_excel.jsp; Line: 7]<br />//response.setContentType("application/vnd.ms-excel");<br />//[ /test_excel.jsp; Line: 8]<br />Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 9]<br />} catch (Throwable __ee) {<br />while (out != null &amp;&amp; out != _originalOut) out = pageContext.popBody();<br />((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);<br />}<br /><br />//before final close brace...<br />}<br /><br />很明显，屏蔽response.setContentType("application/vnd.ms-excel");后，在Test.writeExcel(response.getOutputStream());之前，response.reset(); 之后没有设置response contenttype的正确类型，当然输出为乱码了。而正确输出excel的jsp的编译后源码是这样的:<br /><br />public void _jspService(javax.servlet.http.HttpServletRequest request,<br />javax.servlet.http.HttpServletResponse response) throws java.io.IOException,<br />javax.servlet.ServletException<br />{<br /><br />// declare and set well-known variables:<br />javax.servlet.ServletConfig config = getServletConfig();<br />javax.servlet.ServletContext application = config.getServletContext();<br />javax.servlet.jsp.tagext.Tag _activeTag = null;<br />// variables for Tag extension protocol<br /><br />Object page = this;<br />javax.servlet.jsp.JspWriter out;<br />javax.servlet.jsp.PageContext pageContext =<br />javax.servlet.jsp.JspFactory.getDefaultFactory().getPageContext(<br />this, request, response, null, true, 8192, true);<br /><br />out = pageContext.getOut();<br />JspWriter _originalOut = out;<br /><br />javax.servlet.http.HttpSession session = request.getSession(true);<br /><br />try { // error page try block<br /><br />out.print("\r\n");<br />//[ /test_excel.jsp; Line: 2]<br />response.reset(); //[ /test_excel.jsp; Line: 3]<br />response.setContentType("application/vnd.ms-excel"); //[ /test_excel.jsp; Line: 4]<br />Test.writeExcel(response.getOutputStream()); //[ /test_excel.jsp; Line: 5]<br />} catch (Throwable __ee) {<br />while (out != null &amp;&amp; out != _originalOut) out = pageContext.popBody();<br />((weblogic.servlet.jsp.PageContextImpl)pageContext).handlePageException((Throwable)__ee);<br />}<br /><br />//before final close brace...<br />}<br /><br />大家可以看到在response.reset();之后,Test.writeExcel(response.getOutputStream());之前正确的设置了response的输出内容。所以输出就正常了。<img src ="http://www.blogjava.net/zhangrenquan/aggbug/46441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-05-16 17:22 <a href="http://www.blogjava.net/zhangrenquan/articles/46441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非java.util.zip，使用ant.jar制作zip压缩文件，以及相关中文解决方法</title><link>http://www.blogjava.net/zhangrenquan/articles/42390.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 21 Apr 2006 10:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/42390.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/42390.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/42390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/42390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/42390.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="548" border="0">
				<tbody>
						<tr>
								<td class="content_td">
										<font id="zoom">
												<span id="ArticleContent1_ArticleContent1_lblContent">
														<p>用java.util.zip制作zip压缩文件时，如果制作的压缩文件有中文文件名或中文目录，用WinZip、WinRar解压时会有乱码， 同样，用java.util.zip解压WinZip、WinRar打包的压缩文件时，中文也是乱码，主要原因是因为java.util.zip使用编码和WinZip和WinRar使用的不同，在网上找了半天，发现只有两种解决方法：<br />1、修改import java.util.zip.ZipInputStream和ZipOutputStream。<br />2、使用Apache Ant里提供的zip工具。<br />-------------------------------------<br />已找到解决方法，就是用Ant的zip来实现，Ant里面可以指定编码，而java.util.zip是写死了的，只能用UTF-8，呵呵<br />-------------------------------<br />不要使用java.util.zip的包，用ant.jar放到classpath中</p>
														<p> </p>
														<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 105.22%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 1134px; BACKGROUND-COLOR: #eeeeee">
																<span style="COLOR: #008080"> 1</span>
																<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																<span style="COLOR: #008000">//</span>
																<span style="COLOR: #008000">在classpath中引入ant.jar的包</span>
																<span style="COLOR: #008000">
																		<br />
																</span>
																<span style="COLOR: #008080"> 2</span>
																<span style="COLOR: #008000">
																		<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																</span>
																<span style="COLOR: #0000ff">import</span>
																<span style="COLOR: #000000"> java.io.</span>
																<span style="COLOR: #000000">*</span>
																<span style="COLOR: #000000">;  <br /></span>
																<span style="COLOR: #008080"> 3</span>
																<span style="COLOR: #000000">
																		<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																</span>
																<span style="COLOR: #0000ff">import</span>
																<span style="COLOR: #000000"> java.util.</span>
																<span style="COLOR: #000000">*</span>
																<span style="COLOR: #000000">;<br /></span>
																<span style="COLOR: #008080"> 4</span>
																<span style="COLOR: #000000">
																		<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																</span>
																<span style="COLOR: #0000ff">import</span>
																<span style="COLOR: #000000"> java.io.File;<br /></span>
																<span style="COLOR: #008080"> 5</span>
																<span style="COLOR: #000000">
																		<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																</span>
																<span style="COLOR: #0000ff">import</span>
																<span style="COLOR: #000000"> org.apache.tools.zip.</span>
																<span style="COLOR: #000000">*</span>
																<span style="COLOR: #000000">;<br /></span>
																<span style="COLOR: #008080"> 6</span>
																<span style="COLOR: #000000">
																		<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																		<br />
																</span>
																<span style="COLOR: #008080"> 7</span>
																<span style="COLOR: #000000">
																		<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																</span>
																<span style="COLOR: #0000ff">public</span>
																<span style="COLOR: #000000">  </span>
																<span style="COLOR: #0000ff">class</span>
																<span style="COLOR: #000000">  CDGGzip  <br /></span>
																<span style="COLOR: #008080"> 8</span>
																<span style="COLOR: #000000">
																		<img id="Codehighlighter1_143_1460_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_1460_Open_Text.style.display='none'; Codehighlighter1_143_1460_Closed_Image.style.display='inline'; Codehighlighter1_143_1460_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
																		<img id="Codehighlighter1_143_1460_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_143_1460_Closed_Text.style.display='none'; Codehighlighter1_143_1460_Open_Image.style.display='inline'; Codehighlighter1_143_1460_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
																</span>
																<span id="Codehighlighter1_143_1460_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																		<img src="http://www.blogjava.net/images/dot.gif" />
																</span>
																<span id="Codehighlighter1_143_1460_Open_Text">
																		<span style="COLOR: #000000">{  <br /></span>
																		<span style="COLOR: #008080"> 9</span>
																		<span style="COLOR: #000000">
																				<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																		<span style="COLOR: #008000">//</span>
																		<span style="COLOR: #008000">boolean  packFrame  =  false;  </span>
																		<span style="COLOR: #008000">
																				<br />
																		</span>
																		<span style="COLOR: #008080">10</span>
																		<span style="COLOR: #008000">
																				<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
																		</span>
																		<span style="COLOR: #000000">  </span>
																		<span style="COLOR: #0000ff">private</span>
																		<span style="COLOR: #000000"> File srcPath </span>
																		<span style="COLOR: #000000">=</span>
																		<span style="COLOR: #0000ff">new</span>
																		<span style="COLOR: #000000"> File(</span>
																		<span style="COLOR: #000000">"</span>
																		<span style="COLOR: #000000">d:</span>
																		<span style="COLOR: #000000">"</span>
																		<span style="COLOR: #000000">+</span>
																		<span style="COLOR: #000000">File.separator</span>
																		<span style="COLOR: #000000">+</span>
																		<span style="COLOR: #000000">"</span>
																		<span style="COLOR: #000000">张任全</span>
																		<span style="COLOR: #000000">"</span>
																		<span style="COLOR: #000000">);<br /></span>
																		<span style="COLOR: #008080">11</span>
																		<span style="COLOR: #000000">
																				<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																		<span style="COLOR: #0000ff">private</span>
																		<span style="COLOR: #000000"> String outFilename</span>
																		<span style="COLOR: #000000">=</span>
																		<span style="COLOR: #0000ff">new</span>
																		<span style="COLOR: #000000"> String(</span>
																		<span style="COLOR: #000000">"</span>
																		<span style="COLOR: #000000">d:</span>
																		<span style="COLOR: #000000">"</span>
																		<span style="COLOR: #000000">+</span>
																		<span style="COLOR: #000000">File.separator</span>
																		<span style="COLOR: #000000">+</span>
																		<span style="COLOR: #000000">"</span>
																		<span style="COLOR: #000000">张任全.zip</span>
																		<span style="COLOR: #000000">"</span>
																		<span style="COLOR: #000000">);<br /></span>
																		<span style="COLOR: #008080">12</span>
																		<span style="COLOR: #000000">
																				<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
																		</span>
																		<span style="COLOR: #0000ff">private</span>
																		<span style="COLOR: #000000"> </span>
																		<span style="COLOR: #0000ff">int</span>
																		<span style="COLOR: #000000"> len</span>
																		<span style="COLOR: #000000">=</span>
																		<span style="COLOR: #000000">srcPath.listFiles().length;<br /></span>
																		<span style="COLOR: #008080">13</span>
																		<span style="COLOR: #000000">
																				<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
																		</span>
																		<span style="COLOR: #0000ff">private</span>
																		<span style="COLOR: #000000"> String[] filenames </span>
																		<span style="COLOR: #000000">=</span>
																		<span style="COLOR: #000000"> </span>
																		<span style="COLOR: #0000ff">new</span>
																		<span style="COLOR: #000000"> String[len];<br /></span>
																		<span style="COLOR: #008080">14</span>
																		<span style="COLOR: #000000">
																				<img id="Codehighlighter1_440_470_Open_Image" onclick="this.style.display='none'; Codehighlighter1_440_470_Open_Text.style.display='none'; Codehighlighter1_440_470_Closed_Image.style.display='inline'; Codehighlighter1_440_470_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																				<img id="Codehighlighter1_440_470_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_440_470_Closed_Text.style.display='none'; Codehighlighter1_440_470_Open_Image.style.display='inline'; Codehighlighter1_440_470_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
																		</span>
																		<span style="COLOR: #0000ff">public</span>
																		<span style="COLOR: #000000"> </span>
																		<span style="COLOR: #0000ff">void</span>
																		<span style="COLOR: #000000"> setSrcPath(String src)</span>
																		<span id="Codehighlighter1_440_470_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																				<img src="http://www.blogjava.net/images/dot.gif" />
																		</span>
																		<span id="Codehighlighter1_440_470_Open_Text">
																				<span style="COLOR: #000000">{<br /></span>
																				<span style="COLOR: #008080">15</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   srcPath</span>
																				<span style="COLOR: #000000">=</span>
																				<span style="COLOR: #0000ff">new</span>
																				<span style="COLOR: #000000"> File(src);<br /></span>
																				<span style="COLOR: #008080">16</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
																		</span>
																		<span style="COLOR: #000000">
																				<br />
																		</span>
																		<span style="COLOR: #008080">17</span>
																		<span style="COLOR: #000000">
																				<img id="Codehighlighter1_498_520_Open_Image" onclick="this.style.display='none'; Codehighlighter1_498_520_Open_Text.style.display='none'; Codehighlighter1_498_520_Closed_Image.style.display='inline'; Codehighlighter1_498_520_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																				<img id="Codehighlighter1_498_520_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_498_520_Closed_Text.style.display='none'; Codehighlighter1_498_520_Open_Image.style.display='inline'; Codehighlighter1_498_520_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
																		<span style="COLOR: #0000ff">public</span>
																		<span style="COLOR: #000000"> File getSrcPath()</span>
																		<span id="Codehighlighter1_498_520_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																				<img src="http://www.blogjava.net/images/dot.gif" />
																		</span>
																		<span id="Codehighlighter1_498_520_Open_Text">
																				<span style="COLOR: #000000">{<br /></span>
																				<span style="COLOR: #008080">18</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																				<span style="COLOR: #0000ff">return</span>
																				<span style="COLOR: #000000"> srcPath;<br /></span>
																				<span style="COLOR: #008080">19</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
																		</span>
																		<span style="COLOR: #000000">
																				<br />
																		</span>
																		<span style="COLOR: #008080">20</span>
																		<span style="COLOR: #000000">
																				<img id="Codehighlighter1_560_584_Open_Image" onclick="this.style.display='none'; Codehighlighter1_560_584_Open_Text.style.display='none'; Codehighlighter1_560_584_Closed_Image.style.display='inline'; Codehighlighter1_560_584_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																				<img id="Codehighlighter1_560_584_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_560_584_Closed_Text.style.display='none'; Codehighlighter1_560_584_Open_Image.style.display='inline'; Codehighlighter1_560_584_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
																		</span>
																		<span style="COLOR: #0000ff">public</span>
																		<span style="COLOR: #000000"> </span>
																		<span style="COLOR: #0000ff">void</span>
																		<span style="COLOR: #000000"> setOutFilename(String out)</span>
																		<span id="Codehighlighter1_560_584_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																				<img src="http://www.blogjava.net/images/dot.gif" />
																		</span>
																		<span id="Codehighlighter1_560_584_Open_Text">
																				<span style="COLOR: #000000">{<br /></span>
																				<span style="COLOR: #008080">21</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />   outFilename</span>
																				<span style="COLOR: #000000">=</span>
																				<span style="COLOR: #000000">out;<br /></span>
																				<span style="COLOR: #008080">22</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
																		</span>
																		<span style="COLOR: #000000">
																				<br />
																		</span>
																		<span style="COLOR: #008080">23</span>
																		<span style="COLOR: #000000">
																				<img id="Codehighlighter1_618_644_Open_Image" onclick="this.style.display='none'; Codehighlighter1_618_644_Open_Text.style.display='none'; Codehighlighter1_618_644_Closed_Image.style.display='inline'; Codehighlighter1_618_644_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																				<img id="Codehighlighter1_618_644_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_618_644_Closed_Text.style.display='none'; Codehighlighter1_618_644_Open_Image.style.display='inline'; Codehighlighter1_618_644_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
																		<span style="COLOR: #0000ff">public</span>
																		<span style="COLOR: #000000"> String getOutFilename()</span>
																		<span id="Codehighlighter1_618_644_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																				<img src="http://www.blogjava.net/images/dot.gif" />
																		</span>
																		<span id="Codehighlighter1_618_644_Open_Text">
																				<span style="COLOR: #000000">{<br /></span>
																				<span style="COLOR: #008080">24</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																				<span style="COLOR: #0000ff">return</span>
																				<span style="COLOR: #000000"> outFilename;<br /></span>
																				<span style="COLOR: #008080">25</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
																		</span>
																		<span style="COLOR: #000000">  <br /></span>
																		<span style="COLOR: #008080">26</span>
																		<span style="COLOR: #000000">
																				<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
																				<br />
																		</span>
																		<span style="COLOR: #008080">27</span>
																		<span style="COLOR: #000000">
																				<img id="Codehighlighter1_669_1359_Open_Image" onclick="this.style.display='none'; Codehighlighter1_669_1359_Open_Text.style.display='none'; Codehighlighter1_669_1359_Closed_Image.style.display='inline'; Codehighlighter1_669_1359_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																				<img id="Codehighlighter1_669_1359_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_669_1359_Closed_Text.style.display='none'; Codehighlighter1_669_1359_Open_Image.style.display='inline'; Codehighlighter1_669_1359_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
																		<span style="COLOR: #0000ff">public</span>
																		<span style="COLOR: #000000"> </span>
																		<span style="COLOR: #0000ff">void</span>
																		<span style="COLOR: #000000"> gzip()</span>
																		<span id="Codehighlighter1_669_1359_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																				<img src="http://www.blogjava.net/images/dot.gif" />
																		</span>
																		<span id="Codehighlighter1_669_1359_Open_Text">
																				<span style="COLOR: #000000">{<br /></span>
																				<span style="COLOR: #008080">28</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
																				</span>
																				<span style="COLOR: #0000ff">byte</span>
																				<span style="COLOR: #000000">[] buf </span>
																				<span style="COLOR: #000000">=</span>
																				<span style="COLOR: #000000"> </span>
																				<span style="COLOR: #0000ff">new</span>
																				<span style="COLOR: #000000"> </span>
																				<span style="COLOR: #0000ff">byte</span>
																				<span style="COLOR: #000000">[</span>
																				<span style="COLOR: #000000">1024</span>
																				<span style="COLOR: #000000">];<br /></span>
																				<span style="COLOR: #008080">29</span>
																				<span style="COLOR: #000000">
																						<img id="Codehighlighter1_706_1287_Open_Image" onclick="this.style.display='none'; Codehighlighter1_706_1287_Open_Text.style.display='none'; Codehighlighter1_706_1287_Closed_Image.style.display='inline'; Codehighlighter1_706_1287_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																						<img id="Codehighlighter1_706_1287_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_706_1287_Closed_Text.style.display='none'; Codehighlighter1_706_1287_Open_Image.style.display='inline'; Codehighlighter1_706_1287_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
																				<span style="COLOR: #0000ff">try</span>
																				<span style="COLOR: #000000"> </span>
																				<span id="Codehighlighter1_706_1287_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																						<img src="http://www.blogjava.net/images/dot.gif" />
																				</span>
																				<span id="Codehighlighter1_706_1287_Open_Text">
																						<span style="COLOR: #000000">{<br /></span>
																						<span style="COLOR: #008080">30</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  File[]  files  </span>
																						<span style="COLOR: #000000">=</span>
																						<span style="COLOR: #000000">  srcPath.listFiles(); <br /></span>
																						<span style="COLOR: #008080">31</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																						<span style="COLOR: #0000ff">for</span>
																						<span style="COLOR: #000000">(</span>
																						<span style="COLOR: #0000ff">int</span>
																						<span style="COLOR: #000000">  i</span>
																						<span style="COLOR: #000000">=</span>
																						<span style="COLOR: #000000">0</span>
																						<span style="COLOR: #000000">;i</span>
																						<span style="COLOR: #000000">&lt;</span>
																						<span style="COLOR: #000000">len;i</span>
																						<span style="COLOR: #000000">++</span>
																						<span style="COLOR: #000000">)<br /></span>
																						<span style="COLOR: #008080">32</span>
																						<span style="COLOR: #000000">
																								<img id="Codehighlighter1_778_878_Open_Image" onclick="this.style.display='none'; Codehighlighter1_778_878_Open_Text.style.display='none'; Codehighlighter1_778_878_Closed_Image.style.display='inline'; Codehighlighter1_778_878_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																								<img id="Codehighlighter1_778_878_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_778_878_Closed_Text.style.display='none'; Codehighlighter1_778_878_Open_Image.style.display='inline'; Codehighlighter1_778_878_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
																						<span id="Codehighlighter1_778_878_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																								<img src="http://www.blogjava.net/images/dot.gif" />
																						</span>
																						<span id="Codehighlighter1_778_878_Open_Text">
																								<span style="COLOR: #000000">{<br /></span>
																								<span style="COLOR: #008080">33</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																								<span style="COLOR: #008000">//</span>
																								<span style="COLOR: #008000">if(!files[i].isDirectory())</span>
																								<span style="COLOR: #008000">
																										<br />
																								</span>
																								<span style="COLOR: #008080">34</span>
																								<span style="COLOR: #008000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
																								</span>
																								<span style="COLOR: #000000">filenames[i]</span>
																								<span style="COLOR: #000000">=</span>
																								<span style="COLOR: #000000">srcPath.getPath()</span>
																								<span style="COLOR: #000000">+</span>
																								<span style="COLOR: #000000">File.separator</span>
																								<span style="COLOR: #000000">+</span>
																								<span style="COLOR: #000000">files[i].getName();<br /></span>
																								<span style="COLOR: #008080">35</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
																						</span>
																						<span style="COLOR: #000000">
																								<br />
																						</span>
																						<span style="COLOR: #008080">36</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  ZipOutputStream out </span>
																						<span style="COLOR: #000000">=</span>
																						<span style="COLOR: #000000"> </span>
																						<span style="COLOR: #0000ff">new</span>
																						<span style="COLOR: #000000"> ZipOutputStream(</span>
																						<span style="COLOR: #0000ff">new</span>
																						<span style="COLOR: #000000"> FileOutputStream(outFilename));<br /></span>
																						<span style="COLOR: #008080">37</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																						<span style="COLOR: #0000ff">for</span>
																						<span style="COLOR: #000000"> (</span>
																						<span style="COLOR: #0000ff">int</span>
																						<span style="COLOR: #000000"> i</span>
																						<span style="COLOR: #000000">=</span>
																						<span style="COLOR: #000000">0</span>
																						<span style="COLOR: #000000">; i</span>
																						<span style="COLOR: #000000">&lt;</span>
																						<span style="COLOR: #000000">filenames.length; i</span>
																						<span style="COLOR: #000000">++</span>
																						<span style="COLOR: #000000">) <br /></span>
																						<span style="COLOR: #008080">38</span>
																						<span style="COLOR: #000000">
																								<img id="Codehighlighter1_1004_1261_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1004_1261_Open_Text.style.display='none'; Codehighlighter1_1004_1261_Closed_Image.style.display='inline'; Codehighlighter1_1004_1261_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																								<img id="Codehighlighter1_1004_1261_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1004_1261_Closed_Text.style.display='none'; Codehighlighter1_1004_1261_Open_Image.style.display='inline'; Codehighlighter1_1004_1261_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
																						<span id="Codehighlighter1_1004_1261_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																								<img src="http://www.blogjava.net/images/dot.gif" />
																						</span>
																						<span id="Codehighlighter1_1004_1261_Open_Text">
																								<span style="COLOR: #000000">{<br /></span>
																								<span style="COLOR: #008080">39</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  FileInputStream in </span>
																								<span style="COLOR: #000000">=</span>
																								<span style="COLOR: #000000"> </span>
																								<span style="COLOR: #0000ff">new</span>
																								<span style="COLOR: #000000"> FileInputStream(filenames[i]);<br /></span>
																								<span style="COLOR: #008080">40</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  out.putNextEntry(</span>
																								<span style="COLOR: #0000ff">new</span>
																								<span style="COLOR: #000000"> org.apache.tools.zip.ZipEntry(files[i].getName()));<br /></span>
																								<span style="COLOR: #008080">41</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																								<span style="COLOR: #0000ff">int</span>
																								<span style="COLOR: #000000"> len;<br /></span>
																								<span style="COLOR: #008080">42</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
																								<span style="COLOR: #0000ff">while</span>
																								<span style="COLOR: #000000"> ((len </span>
																								<span style="COLOR: #000000">=</span>
																								<span style="COLOR: #000000"> in.read(buf)) </span>
																								<span style="COLOR: #000000">&gt;</span>
																								<span style="COLOR: #000000"> </span>
																								<span style="COLOR: #000000">0</span>
																								<span style="COLOR: #000000">) <br /></span>
																								<span style="COLOR: #008080">43</span>
																								<span style="COLOR: #000000">
																										<img id="Codehighlighter1_1188_1218_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1188_1218_Open_Text.style.display='none'; Codehighlighter1_1188_1218_Closed_Image.style.display='inline'; Codehighlighter1_1188_1218_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																										<img id="Codehighlighter1_1188_1218_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1188_1218_Closed_Text.style.display='none'; Codehighlighter1_1188_1218_Open_Image.style.display='inline'; Codehighlighter1_1188_1218_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
																								<span id="Codehighlighter1_1188_1218_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																										<img src="http://www.blogjava.net/images/dot.gif" />
																								</span>
																								<span id="Codehighlighter1_1188_1218_Open_Text">
																										<span style="COLOR: #000000">{<br /></span>
																										<span style="COLOR: #008080">44</span>
																										<span style="COLOR: #000000">
																												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  out.write(buf, </span>
																										<span style="COLOR: #000000">0</span>
																										<span style="COLOR: #000000">, len);<br /></span>
																										<span style="COLOR: #008080">45</span>
																										<span style="COLOR: #000000">
																												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
																								</span>
																								<span style="COLOR: #000000">
																										<br />
																								</span>
																								<span style="COLOR: #008080">46</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
																										<br />
																								</span>
																								<span style="COLOR: #008080">47</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  out.closeEntry();<br /></span>
																								<span style="COLOR: #008080">48</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  in.close();<br /></span>
																								<span style="COLOR: #008080">49</span>
																								<span style="COLOR: #000000">
																										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span>
																						</span>
																						<span style="COLOR: #000000">
																								<br />
																						</span>
																						<span style="COLOR: #008080">50</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
																								<br />
																						</span>
																						<span style="COLOR: #008080">51</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      out.close();<br /></span>
																						<span style="COLOR: #008080">52</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
																				</span>
																				<span style="COLOR: #000000"> <br /></span>
																				<span style="COLOR: #008080">53</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
																				<span style="COLOR: #0000ff">catch</span>
																				<span style="COLOR: #000000"> (IOException e) <br /></span>
																				<span style="COLOR: #008080">54</span>
																				<span style="COLOR: #000000">
																						<img id="Codehighlighter1_1321_1355_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1321_1355_Open_Text.style.display='none'; Codehighlighter1_1321_1355_Closed_Image.style.display='inline'; Codehighlighter1_1321_1355_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																						<img id="Codehighlighter1_1321_1355_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1321_1355_Closed_Text.style.display='none'; Codehighlighter1_1321_1355_Open_Image.style.display='inline'; Codehighlighter1_1321_1355_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
																				<span id="Codehighlighter1_1321_1355_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																						<img src="http://www.blogjava.net/images/dot.gif" />
																				</span>
																				<span id="Codehighlighter1_1321_1355_Open_Text">
																						<span style="COLOR: #000000">{<br /></span>
																						<span style="COLOR: #008080">55</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    System.out.println(e); <br /></span>
																						<span style="COLOR: #008080">56</span>
																						<span style="COLOR: #000000">
																								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
																				</span>
																				<span style="COLOR: #000000">
																						<br />
																				</span>
																				<span style="COLOR: #008080">57</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
																		</span>
																		<span style="COLOR: #000000">
																				<br />
																		</span>
																		<span style="COLOR: #008080">58</span>
																		<span style="COLOR: #000000">
																				<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /></span>
																		<span style="COLOR: #008080">59</span>
																		<span style="COLOR: #000000">
																				<img id="Codehighlighter1_1403_1458_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1403_1458_Open_Text.style.display='none'; Codehighlighter1_1403_1458_Closed_Image.style.display='inline'; Codehighlighter1_1403_1458_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
																				<img id="Codehighlighter1_1403_1458_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1403_1458_Closed_Text.style.display='none'; Codehighlighter1_1403_1458_Open_Image.style.display='inline'; Codehighlighter1_1403_1458_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />  </span>
																		<span style="COLOR: #0000ff">public</span>
																		<span style="COLOR: #000000"> </span>
																		<span style="COLOR: #0000ff">static</span>
																		<span style="COLOR: #000000"> </span>
																		<span style="COLOR: #0000ff">void</span>
																		<span style="COLOR: #000000"> main(String arg[])</span>
																		<span id="Codehighlighter1_1403_1458_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
																				<img src="http://www.blogjava.net/images/dot.gif" />
																		</span>
																		<span id="Codehighlighter1_1403_1458_Open_Text">
																				<span style="COLOR: #000000">{<br /></span>
																				<span style="COLOR: #008080">60</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  CDGGzip cdggzip</span>
																				<span style="COLOR: #000000">=</span>
																				<span style="COLOR: #0000ff">new</span>
																				<span style="COLOR: #000000"> CDGGzip();<br /></span>
																				<span style="COLOR: #008080">61</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  cdggzip.gzip();<br /></span>
																				<span style="COLOR: #008080">62</span>
																				<span style="COLOR: #000000">
																						<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span>
																		</span>
																		<span style="COLOR: #000000">
																				<br />
																		</span>
																		<span style="COLOR: #008080">63</span>
																		<span style="COLOR: #000000">
																				<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
																</span>
																<span style="COLOR: #000000">
																		<br />
																</span>
																<span style="COLOR: #008080">64</span>
																<span style="COLOR: #000000">
																		<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																		<br />
																</span>
																<span style="COLOR: #008080">65</span>
																<span style="COLOR: #000000">
																		<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
																</span>
														</div>
												</span>
										</font>
										<br />
								</td>
								<td width="8">
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/42390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-04-21 18:24 <a href="http://www.blogjava.net/zhangrenquan/articles/42390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用ZipOutputStream压缩目录</title><link>http://www.blogjava.net/zhangrenquan/articles/42370.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 21 Apr 2006 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/42370.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/42370.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/42370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/42370.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/42370.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> util;<br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_15_159_Open_Image" onclick="this.style.display='none'; Codehighlighter1_15_159_Open_Text.style.display='none'; Codehighlighter1_15_159_Closed_Image.style.display='inline'; Codehighlighter1_15_159_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_15_159_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_15_159_Closed_Text.style.display='none'; Codehighlighter1_15_159_Open_Image.style.display='inline'; Codehighlighter1_15_159_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_15_159_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
				<span id="Codehighlighter1_15_159_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">本实例采用递归的方法，把指定的目录（包括子目录）压缩成一个ZIP文件。<br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #008000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />原理是：为指定目录的所有文件创建一个ZipEntry（压缩流入口),然后把文件写进去;当遇到子目录时,调用递归函数，把它压缩成另一个zip文件,当作一般文件写进去.<br /></span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #008000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />//使用方法 java Zip &lt;目录名&gt;<br /></span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #008000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />
						</span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">java.util.zip包提供了数据压缩和解压缩的类</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.util.zip.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_256_2130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_256_2130_Open_Text.style.display='none'; Codehighlighter1_256_2130_Closed_Image.style.display='inline'; Codehighlighter1_256_2130_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_256_2130_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_256_2130_Closed_Text.style.display='none'; Codehighlighter1_256_2130_Open_Image.style.display='inline'; Codehighlighter1_256_2130_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> FileZip</span>
				<span id="Codehighlighter1_256_2130_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_256_2130_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">final</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> BUFFER</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">2048</span>
						<span style="COLOR: #000000">; <br /></span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">boolean</span>
						<span style="COLOR: #000000"> flag</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #0000ff">false</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_379_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_379_481_Open_Text.style.display='none'; Codehighlighter1_379_481_Closed_Image.style.display='inline'; Codehighlighter1_379_481_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_379_481_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_379_481_Closed_Text.style.display='none'; Codehighlighter1_379_481_Open_Image.style.display='inline'; Codehighlighter1_379_481_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> main(String args[])</span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> IOException</span>
						<span id="Codehighlighter1_379_481_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_379_481_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">19</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        File file</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> File(args[</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">]);<br /></span>
								<span style="COLOR: #008080">20</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        FileInputStream file1</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> FileInputStream(ZipSubdirectory(file));<br /></span>
								<span style="COLOR: #008080">21</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">22</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /></span>
						<span style="COLOR: #008080">23</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">ZipSubdirectory函数将一个指定目录（包括它子目录）压缩成一个同名压缩文件(这里称为"ORIGIN")</span>
						<span style="COLOR: #008000">
								<br />
						</span>
						<span style="COLOR: #008080">24</span>
						<span style="COLOR: #008000">
								<img id="Codehighlighter1_611_2128_Open_Image" onclick="this.style.display='none'; Codehighlighter1_611_2128_Open_Text.style.display='none'; Codehighlighter1_611_2128_Closed_Image.style.display='inline'; Codehighlighter1_611_2128_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_611_2128_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_611_2128_Closed_Text.style.display='none'; Codehighlighter1_611_2128_Open_Image.style.display='inline'; Codehighlighter1_611_2128_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">static</span>
						<span style="COLOR: #000000"> File ZipSubdirectory(File myDir)</span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> IOException</span>
						<span id="Codehighlighter1_611_2128_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_611_2128_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">25</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">创建缓冲输入流BufferedInputStream </span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">26</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    BufferedInputStream origin</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">;<br /></span>
								<span style="COLOR: #008080">27</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">创建ZipOutputStream对象，将向它传递希望写入文件的输出流</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">28</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    File zipFile</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> File(myDir.getName()</span>
								<span style="COLOR: #000000">+</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">.zip</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080">29</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    FileOutputStream fos</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> FileOutputStream(zipFile);<br /></span>
								<span style="COLOR: #008080">30</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    ZipOutputStream out</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> ZipOutputStream(</span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> BufferedOutputStream(fos,BUFFER));<br /></span>
								<span style="COLOR: #008080">31</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">dirContents[]获取当前目录(myDir)所有文件对象（包括子目录名)</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">32</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    File dirContents[]</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">myDir.listFiles();<br /></span>
								<span style="COLOR: #008080">33</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">创建临时文件tempFile,使用后删除</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">34</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    File tempFile</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">; <br /></span>
								<span style="COLOR: #008080">35</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_1031_2052_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1031_2052_Open_Text.style.display='none'; Codehighlighter1_1031_2052_Closed_Image.style.display='inline'; Codehighlighter1_1031_2052_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_1031_2052_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1031_2052_Closed_Text.style.display='none'; Codehighlighter1_1031_2052_Open_Image.style.display='inline'; Codehighlighter1_1031_2052_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">try</span>
								<span id="Codehighlighter1_1031_2052_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1031_2052_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">36</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000">处理当前目录所有文件对象，包括子目录</span>
										<span style="COLOR: #008000">
												<br />
										</span>
										<span style="COLOR: #008080">37</span>
										<span style="COLOR: #008000">
												<img id="Codehighlighter1_1095_2034_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1095_2034_Open_Text.style.display='none'; Codehighlighter1_1095_2034_Closed_Image.style.display='inline'; Codehighlighter1_1095_2034_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_1095_2034_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1095_2034_Closed_Text.style.display='none'; Codehighlighter1_1095_2034_Open_Image.style.display='inline'; Codehighlighter1_1095_2034_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
										</span>
										<span style="COLOR: #000000">        </span>
										<span style="COLOR: #0000ff">for</span>
										<span style="COLOR: #000000">(</span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000"> i</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">0</span>
										<span style="COLOR: #000000">;i</span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">dirContents.length;i</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">)</span>
										<span id="Codehighlighter1_1095_2034_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.blogjava.net/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_1095_2034_Open_Text">
												<span style="COLOR: #000000">{<br /></span>
												<span style="COLOR: #008080">38</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">使用递归方法将当前目录的子目录转成一个ZIP文件，并作为一个ENTRY加进"ORIGIN" </span>
												<span style="COLOR: #008000">
														<br />
												</span>
												<span style="COLOR: #008080">39</span>
												<span style="COLOR: #008000">
														<img id="Codehighlighter1_1184_1250_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1184_1250_Open_Text.style.display='none'; Codehighlighter1_1184_1250_Closed_Image.style.display='inline'; Codehighlighter1_1184_1250_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
														<img id="Codehighlighter1_1184_1250_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1184_1250_Closed_Text.style.display='none'; Codehighlighter1_1184_1250_Open_Image.style.display='inline'; Codehighlighter1_1184_1250_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            </span>
												<span style="COLOR: #0000ff">if</span>
												<span style="COLOR: #000000">(dirContents[i].isDirectory())</span>
												<span id="Codehighlighter1_1184_1250_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.blogjava.net/images/dot.gif" />
												</span>
												<span id="Codehighlighter1_1184_1250_Open_Text">
														<span style="COLOR: #000000">{<br /></span>
														<span style="COLOR: #008080">40</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                tempFile</span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #000000">ZipSubdirectory(dirContents[i]);<br /></span>
														<span style="COLOR: #008080">41</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                flag</span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #0000ff">true</span>
														<span style="COLOR: #000000">;<br /></span>
														<span style="COLOR: #008080">42</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span>
												</span>
												<span style="COLOR: #000000">
														<br />
												</span>
												<span style="COLOR: #008080">43</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">如果当前文件不是子目录</span>
												<span style="COLOR: #008000">
														<br />
												</span>
												<span style="COLOR: #008080">44</span>
												<span style="COLOR: #008000">
														<img id="Codehighlighter1_1276_1362_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1276_1362_Open_Text.style.display='none'; Codehighlighter1_1276_1362_Closed_Image.style.display='inline'; Codehighlighter1_1276_1362_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
														<img id="Codehighlighter1_1276_1362_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1276_1362_Closed_Text.style.display='none'; Codehighlighter1_1276_1362_Open_Image.style.display='inline'; Codehighlighter1_1276_1362_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            </span>
												<span style="COLOR: #0000ff">else</span>
												<span id="Codehighlighter1_1276_1362_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.blogjava.net/images/dot.gif" />
												</span>
												<span id="Codehighlighter1_1276_1362_Open_Text">
														<span style="COLOR: #000000">{<br /></span>
														<span style="COLOR: #008080">45</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                tempFile</span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #000000">dirContents[i];<br /></span>
														<span style="COLOR: #008080">46</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                </span>
														<span style="COLOR: #008000">//</span>
														<span style="COLOR: #008000">flag标记tempFile是否由子目录压缩成的ZIP文件</span>
														<span style="COLOR: #008000">
																<br />
														</span>
														<span style="COLOR: #008080">47</span>
														<span style="COLOR: #008000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
														</span>
														<span style="COLOR: #000000">                flag</span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #0000ff">false</span>
														<span style="COLOR: #000000">;<br /></span>
														<span style="COLOR: #008080">48</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span>
												</span>
												<span style="COLOR: #000000">
														<br />
												</span>
												<span style="COLOR: #008080">49</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            <br /></span>
												<span style="COLOR: #008080">50</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            System.out.println(</span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">Compress file: </span>
												<span style="COLOR: #000000">"</span>
												<span style="COLOR: #000000">+</span>
												<span style="COLOR: #000000">tempFile.getName());<br /></span>
												<span style="COLOR: #008080">51</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            <br /></span>
												<span style="COLOR: #008080">52</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            FileInputStream fis</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #0000ff">new</span>
												<span style="COLOR: #000000"> FileInputStream(tempFile);<br /></span>
												<span style="COLOR: #008080">53</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            origin</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #0000ff">new</span>
												<span style="COLOR: #000000"> BufferedInputStream(fis,BUFFER);<br /></span>
												<span style="COLOR: #008080">54</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">为被读取的文件创建压缩条目</span>
												<span style="COLOR: #008000">
														<br />
												</span>
												<span style="COLOR: #008080">55</span>
												<span style="COLOR: #008000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            ZipEntry entry</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #0000ff">new</span>
												<span style="COLOR: #000000"> ZipEntry(tempFile.getName());<br /></span>
												<span style="COLOR: #008080">56</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #0000ff">byte</span>
												<span style="COLOR: #000000"> data[]</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #0000ff">new</span>
												<span style="COLOR: #000000"> </span>
												<span style="COLOR: #0000ff">byte</span>
												<span style="COLOR: #000000">[BUFFER];<br /></span>
												<span style="COLOR: #008080">57</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #0000ff">int</span>
												<span style="COLOR: #000000"> count;<br /></span>
												<span style="COLOR: #008080">58</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">在向ZIP输出流写入数据之前，必须首先使用out.putNextEntry(entry); 方法安置压缩条目对象 </span>
												<span style="COLOR: #008000">
														<br />
												</span>
												<span style="COLOR: #008080">59</span>
												<span style="COLOR: #008000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            out.putNextEntry(entry);<br /></span>
												<span style="COLOR: #008080">60</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            <br /></span>
												<span style="COLOR: #008080">61</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">向ZIP 文件写入数据 </span>
												<span style="COLOR: #008000">
														<br />
												</span>
												<span style="COLOR: #008080">62</span>
												<span style="COLOR: #008000">
														<img id="Codehighlighter1_1813_1847_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1813_1847_Open_Text.style.display='none'; Codehighlighter1_1813_1847_Closed_Image.style.display='inline'; Codehighlighter1_1813_1847_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
														<img id="Codehighlighter1_1813_1847_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1813_1847_Closed_Text.style.display='none'; Codehighlighter1_1813_1847_Open_Image.style.display='inline'; Codehighlighter1_1813_1847_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            </span>
												<span style="COLOR: #0000ff">while</span>
												<span style="COLOR: #000000">((count</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #000000">origin.read(data,</span>
												<span style="COLOR: #000000">0</span>
												<span style="COLOR: #000000">,BUFFER))</span>
												<span style="COLOR: #000000">!=-</span>
												<span style="COLOR: #000000">1</span>
												<span style="COLOR: #000000">)</span>
												<span id="Codehighlighter1_1813_1847_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.blogjava.net/images/dot.gif" />
												</span>
												<span id="Codehighlighter1_1813_1847_Open_Text">
														<span style="COLOR: #000000">{<br /></span>
														<span style="COLOR: #008080">63</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                out.write(data,</span>
														<span style="COLOR: #000000">0</span>
														<span style="COLOR: #000000">,count);<br /></span>
														<span style="COLOR: #008080">64</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span>
												</span>
												<span style="COLOR: #000000">
														<br />
												</span>
												<span style="COLOR: #008080">65</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            <br /></span>
												<span style="COLOR: #008080">66</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">tempFile是临时生成的ZIP文件,删除它</span>
												<span style="COLOR: #008000">
														<br />
												</span>
												<span style="COLOR: #008080">67</span>
												<span style="COLOR: #008000">
														<img id="Codehighlighter1_1899_1997_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1899_1997_Open_Text.style.display='none'; Codehighlighter1_1899_1997_Closed_Image.style.display='inline'; Codehighlighter1_1899_1997_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
														<img id="Codehighlighter1_1899_1997_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1899_1997_Closed_Text.style.display='none'; Codehighlighter1_1899_1997_Open_Image.style.display='inline'; Codehighlighter1_1899_1997_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            </span>
												<span style="COLOR: #0000ff">if</span>
												<span style="COLOR: #000000">(flag</span>
												<span style="COLOR: #000000">==</span>
												<span style="COLOR: #0000ff">true</span>
												<span style="COLOR: #000000">)</span>
												<span id="Codehighlighter1_1899_1997_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
														<img src="http://www.blogjava.net/images/dot.gif" />
												</span>
												<span id="Codehighlighter1_1899_1997_Open_Text">
														<span style="COLOR: #000000">{<br /></span>
														<span style="COLOR: #008080">68</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                flag</span>
														<span style="COLOR: #000000">=</span>
														<span style="COLOR: #000000">tempFile.delete();<br /></span>
														<span style="COLOR: #008080">69</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                System.out.println(</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">Delete file:</span>
														<span style="COLOR: #000000">"</span>
														<span style="COLOR: #000000">+</span>
														<span style="COLOR: #000000">tempFile.getName()</span>
														<span style="COLOR: #000000">+</span>
														<span style="COLOR: #000000">flag); <br /></span>
														<span style="COLOR: #008080">70</span>
														<span style="COLOR: #000000">
																<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span>
												</span>
												<span style="COLOR: #000000"> <br /></span>
												<span style="COLOR: #008080">71</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
												<span style="COLOR: #008000">//</span>
												<span style="COLOR: #008000">关闭输入流 </span>
												<span style="COLOR: #008000">
														<br />
												</span>
												<span style="COLOR: #008080">72</span>
												<span style="COLOR: #008000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
												</span>
												<span style="COLOR: #000000">            origin.close(); <br /></span>
												<span style="COLOR: #008080">73</span>
												<span style="COLOR: #000000">
														<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
										</span>
										<span style="COLOR: #000000">
												<br />
										</span>
										<span style="COLOR: #008080">74</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        out.close();<br /></span>
										<span style="COLOR: #008080">75</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">76</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_2073_2098_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2073_2098_Open_Text.style.display='none'; Codehighlighter1_2073_2098_Closed_Image.style.display='inline'; Codehighlighter1_2073_2098_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_2073_2098_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2073_2098_Closed_Text.style.display='none'; Codehighlighter1_2073_2098_Open_Image.style.display='inline'; Codehighlighter1_2073_2098_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">catch</span>
								<span style="COLOR: #000000">(Exception e)</span>
								<span id="Codehighlighter1_2073_2098_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_2073_2098_Open_Text">
										<span style="COLOR: #000000">{System.out.println(e);<br /></span>
										<span style="COLOR: #008080">77</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">78</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">递归返回 </span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">79</span>
								<span style="COLOR: #008000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> zipFile; <br /></span>
								<span style="COLOR: #008080">80</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">81</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">82</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/42370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-04-21 17:11 <a href="http://www.blogjava.net/zhangrenquan/articles/42370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java操作Excel (poi)</title><link>http://www.blogjava.net/zhangrenquan/articles/39212.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 04 Apr 2006 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/39212.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/39212.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/39212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/39212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/39212.html</trackback:ping><description><![CDATA[
		<p class="style3">本篇文章就举例示范如何利用Java 创建和读取Excel文档，并设置单元格的字体和格式。 </p>
		<p class="style3">为了保证示例程序的运行，必须安装Java 2 sdk1.4.0 和Jakarta POI，Jakarta POI的Web站点是: http://jakarta.apache.org/poi/ <br /><br />操作Excel的原理大体是这样:<br />1.创建一个Excel文件<br />2.读取Excel文件<br />3.进行读出和写入操作<br />应该就这么简单!</p>
		<p class="style3">网上有此类文档,不过没有我的完全,可以将示例:CreateXL.java 直接放在工程下即可运行!<br />也可以根据自己需要更改.</p>
		<p class="style3">示例中有关于表名设置为中文的问题迟迟没有解决,望大虾们指点.<br />这是本人第一次在网上发布文档,很希望朋友们多意见!<br />也希望站长指正后发布!</p>
		<p class="style3">可能表述有些问题,如有不明白的朋友,请联系我!</p>
		<p class="style3">示例: CreateXL.java</p>
		<p class="style3">
		</p>
		<pre class="style3">/** 

* Copyright by 2006 A&amp;D. 

* writer: hike. 

*/

package comm;

//如需设置字体,请导入以下两个包
//import org.apache.poi.hssf.usermodel.HSSFCellStyle;
//import org.apache.poi.hssf.usermodel.HSSFFont;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class CreateXL {
	
	/**
	 * 
	 *解决中文问题
	 */
	
	public static String getUnicode(String toEncoded,String encoding){
	  String retString="";
	  if(toEncoded.equals("")||toEncoded.trim().equals(""))
	  {
	    return toEncoded;
	  }
	  try
	  {
	  byte[] b=toEncoded.getBytes(encoding);
	  sun.io.ByteToCharConverter  convertor=sun.io.ByteToCharConverter.getConverter(encoding);
	  char [] c=convertor.convertAll(b);
	  for(int i=0;i&lt; c.length;i++)
	  {
	    retString+=String.valueOf(c[i]);
	  }
	  }catch(java.io.UnsupportedEncodingException usee)
	  {
	   System.out.println("不支持"+encoding+"编码方式");
	   usee.printStackTrace();
	  }catch(sun.io.MalformedInputException mfie)
	  {
	   System.out.println("输入参数无效!!!");
	   mfie.printStackTrace();
	  }
	  return retString;
	}
	
	/**
	 * 写入EXCEL
	 */
	
	//Excel 文件要存放的位置，假定在D盘JTest目录下
	public static String UPath="D:\\JTest";
	//工作簿名称,可以取中文(就是另存为名称).
	public static String outputFile="D:/JTest/test.xls";
	
	public static void main(String argv[]){
		try{
			//	如果UPath不存在,则创建路径
			if(!new java.io.File(UPath).isDirectory()){
				new java.io.File(UPath).mkdirs();
				}
			
			File objFile = new File(outputFile);
			
			HSSFWorkbook workbook = null;
			
			HSSFSheet sheet = null;
			
			String table_name = "sheet1";
			
			//创建文件
			if(!objFile.exists()){   //文件不存在
				//创建新的Excel 工作簿
				System.out.println("检测到文件不存在,正在创建文件...");
				workbook = new HSSFWorkbook();
				//在Excel工作簿中建一工作表，其名为缺省值
				//如要新建一名为"效益指标"的工作表，其语句为：
				//HSSFSheet sheet = workbook.createSheet("效益指标");
				//上一句是来自网上,其实表名并不支持中文,转换后也不行!
				//如有人已解决,请给出,谢谢!
				sheet = workbook.createSheet(table_name);
				
				//新建一输出文件流
				FileOutputStream fOut = new FileOutputStream(outputFile);
				
				//把相应的Excel 工作簿存盘
				workbook.write(fOut);
				fOut.flush();
				
				//操作结束，关闭文件
				fOut.close();
				}
			
			//如果文件存在,将直接插入数据.
			//创建对Excel工作簿文件的引用
			workbook = new HSSFWorkbook(new FileInputStream(outputFile));
			
			//创建对工作表的引用。
			//本例是按名引用（让我们假定那张表有着缺省名"Sheet1"）
			sheet = workbook.getSheet(table_name);
			
			//也可用getSheetAt(int index)按索引引用，
			//在Excel文档中，第一张工作表的缺省索引是0，
			//其语句为：HSSFSheet sheet = workbook.getSheetAt(0);
			//读取左上端单元
			//行和列都是以'0'开头,比如A1为'00'
			for(int i=0; i&lt; 2; i++){
				for(int j=0; j&lt; 5; j++){
					
					//这儿,你可以测试读出一个已存在文件
					//HSSFRow row = sheet.getRow(i);
					//HSSFCell cell = row.getCell((short)j);
					//输出单元内容，cell.getStringCellValue()就是取所在单元的值
					//System.out.println("左上端单元是： " + cell.getStringCellValue());
					
					//在索引0的位置创建行（最顶端的行）
					//这儿,测试插入数据
					//插入之前必需先创建
					HSSFRow row = sheet.createRow((short)i);
					//在索引0的位置创建单元格（左上端)
					HSSFCell cell = row.createCell((short)j);
					
					//在创建之后可以设置单元格格式
					//具体用法将附于文档后面.
					//记得要导入包
					
					//定义单元格为字符串类型
					//这两名非常重要,缺少,则不能显示中文,
					//即使你调用编码转换方法,也不行.
					cell.setCellType(HSSFCell.CELL_TYPE_STRING);
					//指定编码格式
					cell.setEncoding(HSSFCell.ENCODING_UTF_16);
					
					//在单元格中输入一些内容
					String text = ""+i+j+"";
					//调用编码转换方法,只针对中文
					text = getUnicode(text,"gb2312");
					cell.setCellValue(text);
					
					//新建一输出文件流
					FileOutputStream fOut = new FileOutputStream(outputFile);
					
					//把相应的Excel 工作簿存盘
					workbook.write(fOut);
					fOut.flush();
					
					// 操作结束，关闭文件
					fOut.close();
					}
				}
			
			System.out.println("文件已生成!");
			}
		catch(Exception e) {
			System.out.println("已运行 xlCreate() : " + e );
			}
		}
	}


设置单元格格式</pre>
		<p class="style3">在这里，我们将只介绍一些和格式设置有关的语句，<br />我们假定workbook就是对一个工作簿的引用。在Java中，<br />第一步要做的就是创建和设置字体和单元格的格式，然后再应用这些格式：</p>
		<p class="style3">例用开发工具追踪器,可以查看更多参数,自己慢慢去研究!</p>
		<p class="style3">1、创建字体，设置其为红色、粗体：</p>
		<p class="style3">HSSFFont font = workbook.createFont();</p>
		<p class="style3">font.setColor(HSSFFont.COLOR_RED);</p>
		<p class="style3">font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);</p>
		<p class="style3">2、创建格式</p>
		<p class="style3">HSSFCellStyle cellStyle= workbook.createCellStyle();</p>
		<p class="style3">cellStyle.setFont(font);</p>
		<p class="style3">3、应用格式 </p>
		<p class="style3">HSSFCell cell = row.createCell((short) 0);</p>
		<p class="style3">cell.setCellStyle(cellStyle);</p>
		<p class="style3">cell.setCellType(HSSFCell.CELL_TYPE_STRING);</p>
		<p>
				<span class="style3">cell.setCellValue("标题");</span>
				<br />
		</p>
<img src ="http://www.blogjava.net/zhangrenquan/aggbug/39212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-04-04 17:10 <a href="http://www.blogjava.net/zhangrenquan/articles/39212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下Java环境的配置</title><link>http://www.blogjava.net/zhangrenquan/articles/33827.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Mon, 06 Mar 2006 04:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/33827.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/33827.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/33827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/33827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/33827.html</trackback:ping><description><![CDATA[现在用linux的朋友越来越多了，前几天就有两个朋友问我linux下怎么配置java环境，我想还有很多朋友想了解学习这方面的东西，就写一个完全一点的linux java环境配置吧，希望对大家有帮助。
<P>一. 下载jdk5.0 for linux</P>
<P>　　到sun的主页 <A href="http://java.sun.com/j2se/1.5.0/download.jsp"><FONT color=#ffe48d>http://java.sun.com/j2se/1.5.0/download.jsp</FONT></A> 下载jdk安装文件jdk-1_5_0_05-linux-i586.bin</P>
<P>二. 解压安装jdk</P>
<P>　　在shell终端下进入jdk-1_5_0_05-linux-i586.bin文件所在目录，执行命令 ./jdk-1_5_0_05-linux-i586.bin 这时会出现一段协议，连继敲回车，当询问是否同意的时候，输入yes，回车。之后会在当前目录下生成一个jdk-1.5.0_05目录，你可以将它复制到任何一个目录下。</P>
<P>三. 需要配置的环境变量</P>
<P>　　1. PATH环境变量。作用是指定命令搜索路径，在shell下面执行命令时，它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中，bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待，设置好PATH变量后，就可以在任何目录下执行javac/java等工具了。</P>
<P>　　2. CLASSPATH环境变量。作用是指定类搜索路径，要使用已经编写好的类，前提当然是能够找到它们了，JVM就是通过CLASSPTH来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中，当然，当前目录“.”也必须加入到该变量中。</P>
<P>　　3. JAVA_HOME环境变量。它指向jdk的安装目录，Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。</P>
<P>四. 三种配置环境变量的方法</P>
<P>　　1. 修改/etc/profile文件</P>
<P>　　　　如果你的计算机仅仅作为开发使用时推荐使用这种方法，因为所有用户的shell都有权使用这些环境变量，可能会给系统带来安全性问题。</P>
<P>　　　　·用文本编辑器打开/etc/profile<BR>　　　　·在profile文件末尾加入：</P>
<P>　　　　　　JAVA_HOME=/usr/share/jdk1.5.0_05<BR>　　　　　　PATH=$JAVA_HOME/bin:$PATH<BR>　　　　　　CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar<BR>　　　　　　export JAVA_HOME<BR>　　　　　　export PATH<BR>　　　　　　export CLASSPATH</P>
<P>　　　　·重新登录<BR>　　　　·注解<BR>　　　　　　a. 你要将 /usr/share/jdk1.5.0_05jdk 改为你的jdk安装目录<BR>　　　　　　b. linux下用冒号“:”来分隔路径<BR>　　　　　　c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值<BR>　　　　　　　 在设置环境变量时特别要注意不能把原来的值给覆盖掉了，这是一种<BR>　　　　　　　 常见的错误。<BR>　　　　　　d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。<BR>　　　　　　e. export是把这三个变量导出为全局变量。<BR>　　　　　　f. 大小写必须严格区分。</P>
<P>　　2. 修改.bashrc文件<BR>　　　　<BR>　　　　这种方法更为安全，它可以把使用这些环境变量的权限控制到用户级别，如果你需要给某个用户权限使用这些环境变量，你只需要修改其个人用户主目录下的.bashrc文件就可以了。</P>
<P>　　　　·用文本编辑器打开用户目录下的.bashrc文件<BR>　　　　·在.bashrc文件末尾加入：<BR>　　　　　　<BR>　　　　　　set JAVA_HOME=/usr/share/jdk1.5.0_05<BR>　　　　　　export JAVA_HOME<BR>　　　　　　set PATH=$JAVA_HOME/bin:$PATH<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　　export PATH<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　　set CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　　export CLASSPATH</P>
<P>　　　　·重新登录</P>
<P>　　3. 直接在shell下设置变量</P>
<P>　　　　不赞成使用这种方法，因为换个shell，你的设置就无效了，因此这种方法仅仅是临时使用，以后要使用的时候又要重新设置，比较麻烦。</P>
<P>　　　　只需在shell终端执行下列命令：</P>
<P>　　　　export JAVA_HOME=/usr/share/jdk1.5.0_05<BR>　　　　export PATH=$JAVA_HOME/bin:$PATH<BR>　　　　export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar</P>
<P>五. 测试jdk</P>
<P>　　1. 用文本编辑器新建一个Test.java文件，在其中输入以下代码并保存：</P>
<P>　　　　public class test {<BR>　　　　　　public static void main(String args[]) {<BR>　　　　　　　　System.out.println("A new jdk test !");<BR>　　　　　　}<BR>　　　　}</P>
<P>　　2. 编译：在shell终端执行命令 javac Test.java</P>
<P>　　3. 运行：在shell终端执行命令 java Test</P>
<P>　　　　当shell下出现“A new jdk test !”字样则jdk运行正常。</P>
<P>六. 卸载jdk</P>
<P>　　·找到jdk安装目录的_uninst子目录<BR>　　·在shell终端执行命令./uninstall.sh即可卸载jdk。<BR></P><img src ="http://www.blogjava.net/zhangrenquan/aggbug/33827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-06 12:33 <a href="http://www.blogjava.net/zhangrenquan/articles/33827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的RMI编程的一个简单的例子</title><link>http://www.blogjava.net/zhangrenquan/articles/33335.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 02 Mar 2006 16:21:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/33335.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/33335.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/33335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/33335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/33335.html</trackback:ping><description><![CDATA[<P>远程接口RmiHelloRemoteIntfc .java</P>
<P>import java.rmi.*;</P>
<P>public interface RmiHelloRemoteIntfc extends Remote<BR>{<BR>&nbsp;&nbsp; String helloRemoteObj(String client) throws RemoteException;<BR>}</P>
<P>远程接口的实现类RmiHelloRemoteObj.java</P>
<P>import java.rmi.server.*;<BR>import java.rmi.*;</P>
<P>public class RmiHelloRemoteObj extends UnicastRemoteObject implements RmiHelloRemoteIntfc<BR>{</P>
<P>&nbsp; public RmiHelloRemoteObj() throws RemoteException<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; super();<BR>&nbsp; }</P>
<P>&nbsp; public String helloRemoteObj(String client) throws RemoteException<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp; return "Hello World"+client;<BR>&nbsp; }</P>
<P>}</P>
<P>服务器类RmiHelloServer.java</P>
<P>import java.io.*;<BR>import java.rmi.*;<BR>import java.rmi.server.*;<BR>import sun.applet.*;<BR>import java.rmi.registry.LocateRegistry;</P>
<P>public class RmiHelloServer<BR>{</P>
<P>&nbsp; public RmiHelloServer()<BR>&nbsp; {<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; //创建并安装安全管理器<BR>&nbsp;&nbsp;&nbsp; if(System.getSecurityManager()==null)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.setSecurityManager(new RMISecurityManager());<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建远程对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RmiHelloRemoteObj ttt=new RmiHelloRemoteObj();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //启动注册表<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LocateRegistry.createRegistry(2222);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //奖名称绑定到对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Naming.rebind("//Fangm:2222/helloObj",ttt);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("RMI服务器正在运行。。。。。。");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception e)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P><BR>&nbsp; }<BR>}</P>
<P>服务器端的权限文件RmiHelloServer.policy</P>
<P>grant codeBase<BR>"file:/e:/download/rmitest/"<BR>{<BR>&nbsp;permission java.net.SocketPermission <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "*:1000-9999","accept,connect,listen,resolve";<BR>};</P>
<P>&nbsp;</P>
<P>现在就看看Client端是如何连接服务器和进行远程方法的调用的吧</P>
<P><BR>import java.rmi.*;<BR>import java.rmi.server.*;</P>
<P>public class RmiHelloClient<BR>{</P>
<P>&nbsp; public RmiHelloClient()<BR>&nbsp; {<BR>&nbsp; }<BR>&nbsp; public static void main(String[] args)<BR>&nbsp; {<BR>&nbsp;&nbsp;&nbsp; //创建并安装安全管理器<BR>&nbsp;&nbsp;&nbsp; if(System.getSecurityManager()==null)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.setSecurityManager(new RMISecurityManager());<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RmiHelloRemoteIntfc c1=(RmiHelloRemoteIntfc)Naming.lookup("rmi://Fangm:2222/helloObj");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(c1.helloRemoteObj("Everyone"));<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch(Exception e)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; System.exit(0);</P>
<P>&nbsp;</P>
<P>&nbsp; }<BR>}</P>
<P>Client端的权限文件RmiHelloClient.policy</P>
<P>grant codeBase<BR>"file:/e:/download/rmitest/"<BR>{<BR>&nbsp; permission java.net.SocketPermission <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "*:1000-9999","accept,connect,listen,resolve";<BR>};</P>
<P>好了，一个最简单的RMI例子就安无了，对了还少了最重要的一步，那就是编译和运行呢？我们就来了个Bat或Cmd的批处理来进行吧，</P>
<P>看看RmiHello.bat吧</P>
<P>javac RmiHelloRemoteIntfc.java</P>
<P>javac RmiHelloRemoteObj.java</P>
<P>rmic RmiHelloRemoteObj</P>
<P>javac RmiHelloServer.java</P>
<P>javac RmiHelloClient.java</P>
<P>echo 在另一个窗口启动服务器，请稍后。。。<BR>start java&nbsp; -Djava.security.policy=RmiHelloServer.policy RmiHelloServer</P>
<P>echo 运行客户程序。。。<BR>java -Djava.security.policy=RmiHelloClient.policy RmiHelloClient<BR></P><img src ="http://www.blogjava.net/zhangrenquan/aggbug/33335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-03 00:21 <a href="http://www.blogjava.net/zhangrenquan/articles/33335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 的JDBC 数据库连接池实现方法</title><link>http://www.blogjava.net/zhangrenquan/articles/33334.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 02 Mar 2006 16:17:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/33334.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/33334.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/33334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/33334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/33334.html</trackback:ping><description><![CDATA[<P>虽然 J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池，不过对于开发一般的 Java Application 、 Applet 或者 JSP、velocity 时，我们可用的JDBC 数据库连接池并不多，并且一般性能都不好。 Java 程序员都很羡慕 Windows ADO ，只需要 new Connection 就可以直接从数据库连接池中返回 Connection。并且 ADO Connection 是线程安全的，多个线程可以共用一个 Connection， 所以 ASP 程序一般都把 getConnection 放在 Global.asa 文件中，在 IIS 启动时建立数据库连接。ADO 的 Connection 和 Result 都有很好的缓冲，并且很容易使用。</P>
<P>其实我们可以自己写一个JDBC 数据库连接池。写 JDBC connection pool 的注意事项有：</P>
<P>1. 有一个简单的函数从连接池中得到一个 Connection。 <BR>2. close 函数必须将 connection 放回 数据库连接池。 <BR>3. 当数据库连接池中没有空闲的 connection， 数据库连接池必须能够自动增加 connection 个数。 <BR>4. 当数据库连接池中的 connection 个数在某一个特别的时间变得很大，但是以后很长时间只用其中一小部分，应该可以自动将多余的 connection 关闭掉。 <BR>5. 如果可能，应该提供debug 信息报告没有关闭的 new Connection 。 </P>
<P>如果要 new Connection 就可以直接从数据库连接池中返回 Connection， 可以这样写( Mediator pattern ) (以下代码中使用了中文全角空格)：</P>
<P>public class EasyConnection implements java.sql.Connection{<BR>　　private Connection m_delegate = null;</P>
<P>　　public EasyConnection(){<BR>　　　　m_delegate = getConnectionFromPool();<BR>　　}</P>
<P>　　public void close(){<BR>　　　　putConnectionBackToPool(m_delegate);<BR>　　}</P>
<P>　　public PreparedStatement prepareStatement(String sql) throws SQLException{<BR>　　　　m_delegate.prepareStatement(sql);<BR>　　}</P>
<P>　　//...... other method</P>
<P>}</P>
<P>看来并不难。不过不建议这种写法，因为应该尽量避免使用 Java Interface, 关于 Java Interface 的缺点我另外再写文章讨论。大家关注的是 Connection Pool 的实现方法。下面给出一种实现方法。 </P>
<P>import java.sql.*;<BR>import java.lang.reflect.*;<BR>import java.util.*;<BR>import java.io.*;</P>
<P>public class SimpleConnetionPool {<BR>　　private static LinkedList m_notUsedConnection = new LinkedList();<BR>　　private static HashSet m_usedUsedConnection = new HashSet();<BR>　　private static String m_url = "";<BR>　　private static String m_user = "";<BR>　　private static String m_password = "";<BR>　　static final boolean DEBUG = true;<BR>　　static private long m_lastClearClosedConnection = System.currentTimeMillis();<BR>　　public static long CHECK_CLOSED_CONNECTION_TIME = 4 * 60 * 60 * 1000; //4 hours</P>
<P>　　static {<BR>　　　　initDriver();<BR>　　}</P>
<P>　　private SimpleConnetionPool() {<BR>　　}</P>
<P>　　private static void initDriver() {<BR>　　　　Driver driver = null;<BR>　　　　//load mysql driver<BR>　　　　try {<BR>　　　　　　driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();<BR>　　　　　　installDriver(driver);<BR>　　　　} catch (Exception e) {<BR>　　　　}</P>
<P>　　　　//load postgresql driver<BR>　　　　try {<BR>　　　　　　driver = (Driver) Class.forName("org.postgresql.Driver").newInstance();<BR>　　　　　　installDriver(driver);<BR>　　　　} catch (Exception e) {<BR>　　　　}<BR>　　}</P>
<P>　　public static void installDriver(Driver driver) {<BR>　　　　try {<BR>　　　　　　DriverManager.registerDriver(driver);<BR>　　　　} catch (Exception e) {<BR>　　　　　　e.printStackTrace();<BR>　　　　}<BR>　　}</P>
<P><BR>　　public static synchronized Connection getConnection() {<BR>　　　　clearClosedConnection();<BR>　　　　while (m_notUsedConnection.size() &gt; 0) {<BR>　　　　　　try {<BR>　　　　　　　　ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst();<BR>　　　　　　　　if (wrapper.connection.isClosed()) {<BR>　　　　　　　　　　continue;<BR>　　　　　　　　}<BR>　　　　　　　　m_usedUsedConnection.add(wrapper);<BR>　　　　　　　　if (DEBUG) {<BR>　　　　　　　　　　wrapper.debugInfo = new Throwable("Connection initial statement");<BR>　　　　　　　　}<BR>　　　　　　　　return wrapper.connection;<BR>　　　　　　} catch (Exception e) {<BR>　　　　　　}<BR>　　　　}<BR>　　　　int newCount = getIncreasingConnectionCount();<BR>　　　　LinkedList list = new LinkedList();<BR>　　　　ConnectionWrapper wrapper = null;<BR>　　　　for (int i = 0; i &lt; newCount; i++) {<BR>　　　　　　wrapper = getNewConnection();<BR>　　　　　　if (wrapper != null) {<BR>　　　　　　　　list.add(wrapper);<BR>　　　　　　}<BR>　　　　}<BR>　　　　if (list.size() == 0) {<BR>　　　　　　return null;<BR>　　　　}<BR>　　　　wrapper = (ConnectionWrapper) list.removeFirst();<BR>　　　　m_usedUsedConnection.add(wrapper);</P>
<P>　　　　m_notUsedConnection.addAll(list);<BR>　　　　list.clear();</P>
<P>　　　　return wrapper.connection;<BR>　　}</P>
<P>　　private static ConnectionWrapper getNewConnection() {<BR>　　　　try {<BR>　　　　　　Connection con = DriverManager.getConnection(m_url, m_user, m_password);<BR>　　　　　　ConnectionWrapper wrapper = new ConnectionWrapper(con);<BR>　　　　　　return wrapper;<BR>　　　　} catch (Exception e) {<BR>　　　　　　e.printStackTrace();<BR>　　　　}<BR>　　　　return null;<BR>　　}</P>
<P>　　static synchronized void pushConnectionBackToPool(ConnectionWrapper con) {<BR>　　　　boolean exist = m_usedUsedConnection.remove(con);<BR>　　　　if (exist) {<BR>　　　　　　m_notUsedConnection.addLast(con);<BR>　　　　}<BR>　　}</P>
<P>　　public static int close() {<BR>　　　　int count = 0;</P>
<P>　　　　Iterator iterator = m_notUsedConnection.iterator();<BR>　　　　while (iterator.hasNext()) {<BR>　　　　　　try {<BR>　　　　　　　　( (ConnectionWrapper) iterator.next()).close();<BR>　　　　　　　　count++;<BR>　　　　　　} catch (Exception e) {<BR>　　　　　　}<BR>　　　　}<BR>　　　　m_notUsedConnection.clear();</P>
<P>　　　　iterator = m_usedUsedConnection.iterator();<BR>　　　　while (iterator.hasNext()) {<BR>　　　　　　try {<BR>　　　　　　　　ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();<BR>　　　　　　　　wrapper.close();<BR>　　　　　　　　if (DEBUG) {<BR>　　　　　　　　　　wrapper.debugInfo.printStackTrace();<BR>　　　　　　　　}<BR>　　　　　　　　count++;<BR>　　　　　　} catch (Exception e) {<BR>　　　　　　}<BR>　　　　}<BR>　　　　m_usedUsedConnection.clear();</P>
<P>　　　　return count;<BR>　　}</P>
<P>　　private static void clearClosedConnection() {<BR>　　　　long time = System.currentTimeMillis();<BR>　　　　//sometimes user change system time,just return<BR>　　　　if (time &lt; m_lastClearClosedConnection) {<BR>　　　　　　time = m_lastClearClosedConnection;<BR>　　　　　　return;<BR>　　　　}<BR>　　　　//no need check very often<BR>　　　　if (time - m_lastClearClosedConnection &lt; CHECK_CLOSED_CONNECTION_TIME) {<BR>　　　　　　return;<BR>　　　　}<BR>　　　　m_lastClearClosedConnection = time;</P>
<P>　　　　//begin check<BR>　　　　Iterator iterator = m_notUsedConnection.iterator();<BR>　　　　while (iterator.hasNext()) {<BR>　　　　　　ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();<BR>　　　　　　try {<BR>　　　　　　　　if (wrapper.connection.isClosed()) {<BR>　　　　　　　　　　iterator.remove();<BR>　　　　　　　　}<BR>　　　　　　} catch (Exception e) {<BR>　　　　　　　　iterator.remove();<BR>　　　　　　　　if (DEBUG) {<BR>　　　　　　　　　　System.out.println("connection is closed, this connection initial StackTrace");<BR>　　　　　　　　　　wrapper.debugInfo.printStackTrace();<BR>　　　　　　　　}<BR>　　　　　　}<BR>　　　　}</P>
<P>　　　　//make connection pool size smaller if too big<BR>　　　　int decrease = getDecreasingConnectionCount();<BR>　　　　if (m_notUsedConnection.size() &lt; decrease) {<BR>　　　　　　return;<BR>　　　　}</P>
<P>　　　　while (decrease-- &gt; 0) {<BR>　　　　　　ConnectionWrapper wrapper = (ConnectionWrapper) m_notUsedConnection.removeFirst();<BR>　　　　　　try {<BR>　　　　　　　　wrapper.connection.close();<BR>　　　　　　} catch (Exception e) {<BR>　　　　　　}<BR>　　　　}<BR>　　}</P>
<P>　　/**<BR>　　 * get increasing connection count, not just add 1 connection<BR>　　 * @return count<BR>　　 */<BR>　　public static int getIncreasingConnectionCount() {<BR>　　　　int count = 1;<BR>　　　　int current = getConnectionCount();<BR>　　　　count = current / 4;<BR>　　　　if (count &lt; 1) {<BR>　　　　　　count = 1;<BR>　　　　}<BR>　　　　return count;<BR>　　}</P>
<P>　　/**<BR>　　 * get decreasing connection count, not just remove 1 connection<BR>　　 * @return count<BR>　　 */<BR>　　public static int getDecreasingConnectionCount() {<BR>　　　　int count = 0;<BR>　　　　int current = getConnectionCount();<BR>　　　　if (current &lt; 10) {<BR>　　　　　　return 0;<BR>　　　　}<BR>　　　　return current / 3;<BR>　　}</P>
<P>　　public synchronized static void printDebugMsg() {<BR>　　　　printDebugMsg(System.out);<BR>　　}</P>
<P>　　public synchronized static void printDebugMsg(PrintStream out) {<BR>　　　　if (DEBUG == false) {<BR>　　　　　　return;<BR>　　　　}<BR>　　　　StringBuffer msg = new StringBuffer();<BR>　　　　msg.append("debug message in " + SimpleConnetionPool.class.getName());<BR>　　　　msg.append("\r\n");<BR>　　　　msg.append("total count is connection pool: " + getConnectionCount());<BR>　　　　msg.append("\r\n");<BR>　　　　msg.append("not used connection count: " + getNotUsedConnectionCount());<BR>　　　　msg.append("\r\n");<BR>　　　　msg.append("used connection, count: " + getUsedConnectionCount());<BR>　　　　out.println(msg);<BR>　　　　Iterator iterator = m_usedUsedConnection.iterator();<BR>　　　　while (iterator.hasNext()) {<BR>　　　　　　ConnectionWrapper wrapper = (ConnectionWrapper) iterator.next();<BR>　　　　　　wrapper.debugInfo.printStackTrace(out);<BR>　　　　}<BR>　　　　out.println();<BR>　　}</P>
<P>　　public static synchronized int getNotUsedConnectionCount() {<BR>　　　　return m_notUsedConnection.size();<BR>　　}</P>
<P>　　public static synchronized int getUsedConnectionCount() {<BR>　　　　return m_usedUsedConnection.size();<BR>　　}</P>
<P>　　public static synchronized int getConnectionCount() {<BR>　　　　return m_notUsedConnection.size() + m_usedUsedConnection.size();<BR>　　}</P>
<P>　　public static String getUrl() {<BR>　　　　return m_url;<BR>　　}</P>
<P>　　public static void setUrl(String url) {<BR>　　　　if (url == null) {<BR>　　　　　　return;<BR>　　　　}<BR>　　　　m_url = url.trim();<BR>　　}</P>
<P>　　public static String getUser() {<BR>　　　　return m_user;<BR>　　}</P>
<P>　　public static void setUser(String user) {<BR>　　　　if (user == null) {<BR>　　　　　　return;<BR>　　　　}<BR>　　　　m_user = user.trim();<BR>　　}</P>
<P>　　public static String getPassword() {<BR>　　　　return m_password;<BR>　　}</P>
<P>　　public static void setPassword(String password) {<BR>　　　　if (password == null) {<BR>　　　　　　return;<BR>　　　　}<BR>　　　　m_password = password.trim();<BR>　　}</P>
<P>}</P>
<P>class ConnectionWrapper implements InvocationHandler {<BR>　　private final static String CLOSE_METHOD_NAME = "close";<BR>　　public Connection connection = null;<BR>　　private Connection m_originConnection = null;<BR>　　public long lastAccessTime = System.currentTimeMillis();<BR>　　Throwable debugInfo = new Throwable("Connection initial statement");</P>
<P>　　ConnectionWrapper(Connection con) {<BR>　　　　Class[] interfaces = {java.sql.Connection.class};<BR>　　　　this.connection = (Connection) Proxy.newProxyInstance(<BR>　　　　　　con.getClass().getClassLoader(),<BR>　　　　　　interfaces, this);<BR>　　　　m_originConnection = con;<BR>　　}</P>
<P>　　void close() throws SQLException {<BR>　　　　m_originConnection.close();<BR>　　}</P>
<P>　　public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {<BR>　　　　Object obj = null;<BR>　　　　if (CLOSE_METHOD_NAME.equals(m.getName())) {<BR>　　　　　　SimpleConnetionPool.pushConnectionBackToPool(this);<BR>　　　　}<BR>　　　　else {<BR>　　　　　　obj = m.invoke(m_originConnection, args);<BR>　　　　}<BR>　　　　lastAccessTime = System.currentTimeMillis();<BR>　　　　return obj;<BR>　　}<BR>}</P>
<P>使用方法</P>
<P>public class TestConnectionPool{<BR>　　public static void main(String[] args) {<BR>　　　　SimpleConnetionPool.setUrl(DBTools.getDatabaseUrl());<BR>　　　　SimpleConnetionPool.setUser(DBTools.getDatabaseUserName());<BR>　　　　SimpleConnetionPool.setPassword(DBTools.getDatabasePassword());</P>
<P>　　　　Connection con = SimpleConnetionPool.getConnection();<BR>　　　　Connection con1 = SimpleConnetionPool.getConnection();<BR>　　　　Connection con2 = SimpleConnetionPool.getConnection();</P>
<P>　　　　//do something with con ...</P>
<P>　　　　try {<BR>　　　　　　con.close();<BR>　　　　} catch (Exception e) {}</P>
<P>　　　　try {<BR>　　　　　　con1.close();<BR>　　　　} catch (Exception e) {}</P>
<P>　　　　try {<BR>　　　　　　con2.close();<BR>　　　　} catch (Exception e) {}</P>
<P>　　　　con = SimpleConnetionPool.getConnection();<BR>　　　　con1 = SimpleConnetionPool.getConnection();<BR>　　　　try {<BR>　　　　　　con1.close();<BR>　　　　} catch (Exception e) {}</P>
<P>　　　　con2 = SimpleConnetionPool.getConnection();<BR>　　　　SimpleConnetionPool.printDebugMsg();</P>
<P>　　}<BR>}</P>
<P>运行测试程序后打印连接池中 Connection 状态， 以及正在使用的没有关闭 Connection 信息。</P>
<P>&nbsp;</P><img src ="http://www.blogjava.net/zhangrenquan/aggbug/33334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-03 00:17 <a href="http://www.blogjava.net/zhangrenquan/articles/33334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC学习笔记----jdbc性能优化</title><link>http://www.blogjava.net/zhangrenquan/articles/33331.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 02 Mar 2006 16:05:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/33331.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/33331.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/33331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/33331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/33331.html</trackback:ping><description><![CDATA[<P>jdbc程序的性能主要由两个因素决定,一是数据库本身的性质,另一个是与数据库相对独立的jdbc应用程序接口(api)的使用.这里说的是如何正确使用jdbc编程接口,以获得更好的性能.<BR>&nbsp; jdbc主要优化有:<BR>&nbsp;&nbsp;&nbsp;&nbsp; 1.选择正确的jdbc驱动程序<BR>&nbsp;&nbsp;&nbsp;&nbsp; 2.Connention的优化&nbsp; 使用连接池来管理Connection对象<BR>&nbsp;&nbsp;&nbsp;&nbsp; 3.Statement的优化&nbsp;&nbsp; 使用批量更新等<BR>&nbsp;&nbsp;&nbsp;&nbsp; 4.Result的优化&nbsp; 正确的从数据库中get数据等<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; (1)选择正确的jdbc驱动程序:<BR>&nbsp; 1 jdbc-odbc 桥<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 本地api-部分 java驱动<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 jdbc网路协议-纯java驱动<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 jdbc本地协议<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最好选择 jdbc网路协议-纯java驱动&nbsp; 效率比较高&nbsp; 但需要第三方软件的支持 比如corba&nbsp; weblogic属于这种类型<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; (2)优化Connection对象:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.设置适当的参数&nbsp; DriverManager.getConnection(String url,Properties props);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如:&nbsp;&nbsp;&nbsp;&nbsp; Properties props=new Properties();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.put("user","wuwei");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.put("password","wuwei");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.put("defaultRowPrefectch","30");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; props.put("dufaultBatchValue","5");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection con=DriverManager.getConnection("jdbc:oracle:thin:@hostsString",props);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对象可以通过设置setDefaultRowPrefetch(int) 和 setDefaultBatchValue(int) 两个参数类优化连接</P>
<P>&nbsp;2.使用连接池&nbsp; 可以自己写一个连接池 这样程序的灵活性强,便于移植.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; apache项目开发了一套非常通用而表现非常稳定的对象池 <A href="http://jakarta.apache.org/commons/pool.htm">http://jakarta.apache.org/commons/pool.htm</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设计了自己的连接池后 在客户端调用建立对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object makeObject() throws Exception{<BR>&nbsp;&nbsp;&nbsp; Class.forName("oracle.jdbc.driver.OracalDriver");<BR>&nbsp;&nbsp;&nbsp; return DriverManager.getConnection("url","username","password");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 销毁对象时用<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void destroyObject(Object obj) throws Exception{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((Connection)obj.close());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意几点 对象池里有没有回收机制,对象池里有机有容量限制,对象池里有多少个闲置对象(可以释放)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.控制事务的提交&nbsp; 最好手动提交事务,不但可以可以保证数据原子性,而且对新能提高留下余地.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<BR>&nbsp;&nbsp; connection.setAutoCommint(false);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 代码 用PreparedStatement&nbsp; 性能比Statementh好.</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.commit();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.setAutoCommit(true);<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(SQLException e){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally{<BR>&nbsp;&nbsp; //代码<BR>&nbsp;&nbsp; if(connection!=null){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.close();&nbsp; <BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;4.适当的选择事务的隔离级别&nbsp;&nbsp; TRANSACTION_READ_UNCOMMITED&nbsp; 性能最高<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRANSACTION_READ_COMMITED&nbsp;&nbsp;&nbsp; 快<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRANSACTION_REFEATABLE_READ&nbsp; 中等<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RANSACTION_SERIALIZABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 慢<BR>&nbsp;<BR>&nbsp;&nbsp; (3)Statement 优化<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc3个接口用来处理sql的执行,是Statement PreparedStatement CallableStatement<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 提供适当的Statement接口 <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 批量执行sql<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从数据库批量获取数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement 比Statement性能要好 主要体现在一个sql语句多次重复执行的情况<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatemnt只编译解析一次而Statement每次编译一次.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 批量修改数据库&nbsp;&nbsp; <BR>&nbsp;Statement 提供了方法addBatch(String)和executeBatch()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用方法为stmt.addBatch("isnert....."); stmt.addBatch("update.....")<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.executeBatch();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也可以用PreparedStatement从而更好的提高性能.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt=conn.preparedStatement("insert into test_table(......) values(....?)");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt.setString(1,"aaa");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt.addBatch();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt.setString(1,"bbb");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt.addBatch();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt.executeBatch();<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 批量地从数据库中取数据.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过setFetchSize()和getFectchSize()方法来设定和查看这个参数.这个参数对体统的性能影响比较大.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个参数太小会严重地降低程序地性能.<BR>&nbsp;&nbsp; Connection Statement ResultSet都有这个参数,他们对性能地影响顺序是:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet---------Statement---------Connection<BR>&nbsp; (4)优化ResultSet.<BR>&nbsp;&nbsp;&nbsp;&nbsp; 体现在以下几个方面<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 批量读取数据.合理设置ResultSet的getFetchSize()和setFetchSize()方法中的参数<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用正确的get和set方法<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; 例如 setInt(1,100);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setString(2,"aaaa");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比 setInt("id","100");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setString("name","aaaa");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 性能好<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置适当的滚动方向.有3个方向FETCH_FORWORD,FETCH_REVERSE FETCH_UNKNOWN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单向滚动性能比较高.<BR>&nbsp; 其他方面的性能优化<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 及时显示的关闭Connection Statement ResultSet<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中Connection可以用Connetion Pool处理.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用数据库系统的强大查询功能去组织数据.这样程序运行是和数据库服务的交互次数少,数据库返回给<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序的记录条数少的多,所以性能有很大的提高.<BR></P><img src ="http://www.blogjava.net/zhangrenquan/aggbug/33331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-03 00:05 <a href="http://www.blogjava.net/zhangrenquan/articles/33331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jdk 1.5学习</title><link>http://www.blogjava.net/zhangrenquan/articles/33329.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 02 Mar 2006 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/33329.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/33329.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/33329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/33329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/33329.html</trackback:ping><description><![CDATA[<P>[摘录]: http://www.itwen.com<BR><BR>&nbsp;&nbsp;&nbsp; 在jdk1.4的javax.sql包中有一个RowSet接口，但是没有具体实现的类。”Tiger”诞生之后，引入了 javax.sql.rowset包中的五个子接口和com.sun.rowset包里面的对应的五个实现类，这样我们就可是使用功能强大的RowSet 了。jdk1.5中RowSet的五个子接口分别是JdbcRowSet,CachedRowSet,WebRowSet,JoinRowSet和 FilteredRowSet，他们为我们的数据库开发带来了强大的功能和方便的操作。<BR><BR>我的java环境是:RedHat 9<BR>Jdk 1.5.1_01<BR>Eclipse 3.1m4<BR>MySql 4.1.10 (JDBC Driver:org.gjt.mm.mysql.Driver)<BR><BR>我首先在test数据库里面创建了两个表用于这次的学习，下面是脚本：<BR>create table table1 (id int not null , name varchar(20) not null);<BR>create table table2 (id int not null, info varchar(20) not null);&nbsp;<BR>然后我就插入了一些数据用于测试。以下内容以我的环境示意，大家只要修改相应地方就可用于自己的测试。<BR>&nbsp;&nbsp;&nbsp; RowSet 对象可分为两类：有连接的和无连接的。JdbcRowSet是唯一一个有连接的实现，和传统的ResultSet一个样，有连接的实现是基于Jdbc驱动的连接，数据库的连接是贯穿整个对数据库的操作。而无连接的实现是基于Reader和Writer流的连接，在需要读取数据和写入数据的时候才建立连接，在整个操作过程中都是断开连接的，后面四个接口对象都是无连接的实现。下面我就针对每一个接口来介绍一下它们各自的功能。<BR><BR><STRONG><FONT color=#0000ff>JdbcRowSet接口：</FONT></STRONG><BR><BR>我的理解是这个接口基本上和ResultSet有类似的功能，只不过它的结果集默认是ResultSet.TYPE_SCROLL_INSENSITIVE和ResultSet.CONCUR_UPDATABLE的，也就是说默认的结果集就是可以上下滚动和可更新的。<BR>因为本身RowSet接口就是ResultSet的子接口，所以1.5里面的所有RowSet都有ResultSet的方法，而JdbcRowSet又只是在默认的属性和ResultSet有区别，所以它对结果集的操作方法和ResultSet都是一样的，我就不具体介绍了，大家可以参考API。<BR>下面我介绍一下JdbcRowSet的创建方法，这有两种方法，一种是基于传统的JDBC连接数据库的方法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(“org.gjt.mm.mysql.Driver”);<BR></SPAN><SPAN style="COLOR: #008080">2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">DriverManager.getConnection(“jdbc:mydql:</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">localhost:3306/test”,”root’,””);</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">3</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">Statement&nbsp;stmt</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">conn.createStatement();<BR></SPAN><SPAN style="COLOR: #008080">4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>ResultSet&nbsp;rs</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">stamt.executeQuery(“select&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;from&nbsp;table1”);<BR></SPAN><SPAN style="COLOR: #008080">5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>JdbcRowSet&nbsp;jrs</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;JdbcRowSetImpl(rs);</SPAN></DIV>
<P>这样就创建了一个对象（JdbcRowSetImpl是com.sun.rowset包里面的实现类，文中的五个接口在包中都对应有一个实现类），这个对象里面的数据就是和rs里面的数据是一样的。还有一种创建的方法是使用默认的构造方法，然后set属性得到数据，个人推荐使用第二种方法：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">JdbcRowSet&nbsp;jrs</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;JdbcRowSetImpl();<BR></SPAN><SPAN style="COLOR: #008080">2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jrs.setUrl(“jdbc:mydql:</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">localhost:3306/test”);</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">3</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">jrs.setUsername(“root”);<BR></SPAN><SPAN style="COLOR: #008080">4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jrs.setPassword(“”);<BR></SPAN><SPAN style="COLOR: #008080">5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jrs.setCommand(“select&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;from&nbsp;table1”);<BR></SPAN><SPAN style="COLOR: #008080">6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jrs.execute();</SPAN></DIV>
<P>这样创建的对象是和第一种方法是一样的结果。当然这种方法可以连接一个数据源，如果我们在上下文环境种绑定了一个数据源，JNDI名字是dataSource1，那么下面的代码就可以获得对象：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">JdbcRowSet&nbsp;jrs</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;JdbcRowSetImpl();<BR></SPAN><SPAN style="COLOR: #008080">2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jrs.setDataSourceName(“dataSource1”)<BR></SPAN><SPAN style="COLOR: #008080">3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jrs.execute();</SPAN></DIV>
<P>得到对象之后我们就可以使用相应的方法来对数据进行遍历，更新，插入或者删除。<BR><BR>我有2点要说明：第一，其它四个接口的对象中除了JoinRowSet创建方式基本都是一样的，只是接口名字和接口实现类的名字不同而已，后面我就不再说明创建对象的方法了。第二，虽然JdbcRowSet默认是可滚动和可更新的，但是这也是需要数据库驱动支持的，我使用的MySql驱动就不支持更新结果集，所以大家使用之前需要阅读驱动的说明文档。<BR><BR><STRONG><FONT color=#0000ff>CachedRowSet接口：<BR></FONT><BR></STRONG>它继承于RowSet接口，而且他是无连接的RowSet的其他3个实现的父接口，也就是说其他3个接口都直接或者间接继承了它。从名字我们可以知道，它的原理就是读入数据保存在缓存进行相应的操作。<BR>创建接口对象除了上面的两种创建方式，还有一个方法，就是在构造方法里面传递一个SyncProvider。之前我说过无连接的RowSet都是基于流读写的，那么这里所说的SyncProvider就是提供了特定的Reader和Writer。jdk1.5文档的Sample Coder有这样的实现：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">String&nbsp;provider</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;“com.fred.providers.HighAvailabilityProvider”<BR></SPAN><SPAN style="COLOR: #008080">2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>CachedRowSet&nbsp;crs</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CachedRowSetImpl(provider);</SPAN></DIV>
<P>这样我们就为RowSet设置了特定的Reader和Writer，但是这是需要第三方的包支持的。而我们使用无参的构造方法创建的对象是使用了默认的 SyncProvider，当然一般来说这对于我们就已经足够了。创建了对象之后就可以使用和JdbcRowSet一样的方法来进行就结果集的增删改操作了，但是唯一不同的就是在更新了结果集之后必须调用Writer将缓存中的数据写入数据库，而其方法就是crs.acceptChages();<BR>CachedRowSet提供的最令人兴奋的功能就是分页功能。以前程序员很头疼的问题就是怎么处理数据分页而不影响性能，现在有了CachedRowSet一切都变得那么简单，请看下面的代码：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">CachedRowSet&nbsp;crs</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CaehedRowSetImpl();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs.setUrl(“jdbc:mydql:</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">localhost:3306/test”);</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">crs.setUsername(“root”);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs.setPassword(“”);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs.setCommand(“select&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;from&nbsp;table1”);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs.setPageSize(</SPAN><SPAN style="COLOR: #000000">5</SPAN><SPAN style="COLOR: #000000">);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs.execute();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(crs.nextPage())<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(crs.next())<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>System.out.println(crs.getInt(“id”</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">”\t\t”</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">crs.getString(“name”));</SPAN></DIV>
<P>我们在crs.execute()之前设置每页的数据行数，那么Reader读取数据的时候就只读指定的行数的数据，这样我们就避免了一次读取所有数据再进行分页操作。是不是很简单呢？</P>
<P><FONT color=#0000ff><STRONG>JoinRowSet接口：</STRONG></FONT><BR><BR>这个接口可以提供我们在无连接的状态下直接对结果集进行Join。下面的代码提供了JoinRowSet的实现：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">CachedRowSet&nbsp;crs1</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CaehedRowSetImpl();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs1.setUrl(“jdbc:mydql:</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">localhost:3306/test”);</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">crs1.setUsername(“root”);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs1.setPassword(“”);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs1.setCommand(“select&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;from&nbsp;table1”);<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs1.execute();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>CachedRowSet&nbsp;crs2</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CaehedRowSetImpl();<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs2.setUrl(“jdbc:mydql:</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">localhost:3306/test”);</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">crs2.setUsername(“root”);<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs2.setPassword(“”);<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs2.setCommand(“select&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;from&nbsp;table2”);<BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>crs2.execute();<BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>JoinRowSet&nbsp;jrs</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;JoinRowSetImpl();<BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jrs.addRowSet(crs1,”id”);<BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jrs.addRowSet(crs2,”id”);<BR></SPAN><SPAN style="COLOR: #008080">16</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">while</SPAN><SPAN style="COLOR: #000000">(jrs.next())<BR></SPAN><SPAN style="COLOR: #008080">17</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>System.out.println(jrs.getInt(“id”)</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">”\t\t”</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">jrs.getString(“name”)</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">”\t\t”</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">jrs.getString(“info”);</SPAN></DIV>
<P>这段代码的作用和执行select * from table1 inner join table2 on table1.id=table2.id语句得到的结果集是一样的。但是我个人认为与其这样复杂地使用JoinRowSet，不如直接使用这条Join语句来得到CachedRowSet。<BR>默认的Join是inner join的，接口还支持cross join,full join,left outer join和right outer join，我们通过setJoinType()方法来修改连接类型，当然这还是需要数据库的支持。还有一个值得注意的地方就是，在这个例子里我连接的列在两个表里面都叫id，那么我们取数据的时候就使用id这个名字，那如果两列的名字不一样呢？系统就会为这个连接列取一个默认的名字叫做” MergedCol”。<BR><BR><FONT color=#0000ff><STRONG>FilteredRowSet接口：</STRONG></FONT><BR><BR>.NET的ADO.NET支持获取结果集使用一定的条件过滤从而得到不同的结果，那现在jdk1.5也能做到了，FilterRowSet接口让我们可以灵活地定义过滤条件达到不同的效果。Javax.sql.rowset包里面的Predicate接口就是这个过滤器，我们通过实现这个接口定义过滤条件，下面是示意代码：<BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">&nbsp;1</SPAN><IMG id=Codehighlighter1_41_348_Open_Image onclick="this.style.display='none'; Codehighlighter1_41_348_Open_Text.style.display='none'; Codehighlighter1_41_348_Closed_Image.style.display='inline'; Codehighlighter1_41_348_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_41_348_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_348_Closed_Text.style.display='none'; Codehighlighter1_41_348_Open_Image.style.display='inline'; Codehighlighter1_41_348_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Filter&nbsp;</SPAN><SPAN style="COLOR: #0000ff">implements</SPAN><SPAN style="COLOR: #000000">&nbsp;Predicate&nbsp;</SPAN><SPAN id=Codehighlighter1_41_348_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_41_348_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;min;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;max;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;String&nbsp;colName;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;5</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_150_202_Open_Image onclick="this.style.display='none'; Codehighlighter1_150_202_Open_Text.style.display='none'; Codehighlighter1_150_202_Closed_Image.style.display='inline'; Codehighlighter1_150_202_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_150_202_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_150_202_Closed_Text.style.display='none'; Codehighlighter1_150_202_Open_Image.style.display='inline'; Codehighlighter1_150_202_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;Filter&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;min&nbsp;,</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;max&nbsp;,String&nbsp;colName)&nbsp;</SPAN><SPAN id=Codehighlighter1_150_202_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_150_202_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.min</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">min;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.max</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">max;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.colName</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">colName;<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">&nbsp;8</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_240_346_Open_Image onclick="this.style.display='none'; Codehighlighter1_240_346_Open_Text.style.display='none'; Codehighlighter1_240_346_Closed_Image.style.display='inline'; Codehighlighter1_240_346_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_240_346_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_240_346_Closed_Text.style.display='none'; Codehighlighter1_240_346_Open_Image.style.display='inline'; Codehighlighter1_240_346_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">boolean</SPAN><SPAN style="COLOR: #000000">&nbsp;evaluate&nbsp;(RowSet&nbsp;rs)&nbsp;</SPAN><SPAN id=Codehighlighter1_240_346_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_240_346_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">&nbsp;9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>CachedRowSet&nbsp;crs</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">(CachedRowSet)rs;<BR></SPAN><SPAN style="COLOR: #008080">10</SPAN><SPAN style="COLOR: #000000"><IMG id=Codehighlighter1_328_342_Open_Image onclick="this.style.display='none'; Codehighlighter1_328_342_Open_Text.style.display='none'; Codehighlighter1_328_342_Closed_Image.style.display='inline'; Codehighlighter1_328_342_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_328_342_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_328_342_Closed_Text.style.display='none'; Codehighlighter1_328_342_Open_Image.style.display='inline'; Codehighlighter1_328_342_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">((crs.getInt(colName)</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">min)</SPAN><SPAN style="COLOR: #000000">&amp;&amp;</SPAN><SPAN style="COLOR: #000000">&nbsp;(crs.getInt(colName)</SPAN><SPAN id=Codehighlighter1_328_342_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_328_342_Open_Text><SPAN style="COLOR: #000000">{<BR></SPAN><SPAN style="COLOR: #008080">11</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><IMG src="http://www.blogjava.net/images/dot.gif">&nbsp;<IMG src="http://www.blogjava.net/images/dot.gif"><BR></SPAN><SPAN style="COLOR: #008080">12</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">13</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">14</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR></SPAN><SPAN style="COLOR: #008080">15</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P>&nbsp;</P>
<P><BR><BR>&nbsp;</P><img src ="http://www.blogjava.net/zhangrenquan/aggbug/33329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-03-02 23:46 <a href="http://www.blogjava.net/zhangrenquan/articles/33329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的socket编程</title><link>http://www.blogjava.net/zhangrenquan/articles/31159.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 17 Feb 2006 03:18:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/31159.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/31159.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/31159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/31159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/31159.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一步　充分理解Socket1.什么是socket　　所谓socket通常也称作"套接字"，用于描述IP地址和端口，是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。　　以J2SDK-1.3为例，Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端，Socket是建立网络连接时使用的。在连接成功时，应用程序两端都会产生...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangrenquan/articles/31159.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/31159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-02-17 11:18 <a href="http://www.blogjava.net/zhangrenquan/articles/31159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JAVA开发短信</title><link>http://www.blogjava.net/zhangrenquan/articles/31140.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Fri, 17 Feb 2006 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/31140.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/31140.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/31140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/31140.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/31140.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首先,你要选择一台移动或者联通的短信服务器做你们的发送短信接口.这是最关键的一步,也是最底层的,当然这是需要much money的,呵呵.没办法!现实了点....然后你就是在连接接口的服务器做技术了.用JAVA 的 SOCKET 来监听客户端的SOCKET,当然这是需要一定的难度,和普通是有很多的区别,例如每秒钟可以同时接受3000条SOCKET... ...,要进行客户端的认证.要进...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhangrenquan/articles/31140.html'>阅读全文</a><img src ="http://www.blogjava.net/zhangrenquan/aggbug/31140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-02-17 10:06 <a href="http://www.blogjava.net/zhangrenquan/articles/31140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP实现上传文件的两种方法</title><link>http://www.blogjava.net/zhangrenquan/articles/30960.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Thu, 16 Feb 2006 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/30960.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/30960.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/30960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/30960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/30960.html</trackback:ping><description><![CDATA[[摘录]: <A href="http://www.manbu.net/Lib/Class4/Sub6/4/21.asp">http://www.manbu.net/Lib/Class4/Sub6/4/21.asp</A><BR><BR>在用Java开发企业器系统的使用,特别是涉及到与办公相关的软件开发的时候,文件的上传是客户经常要提到的要求.因此有 一套很好文件上传的解决办法也能方便大家在这一块的开发. <BR><BR>首先申明,该文章是为了自己记录一备以后开发需要的时候,不用手忙脚乱哈哈........ <BR><BR>现在在国内用的非常多的一般是两种方法解决来解决文件上传. <BR><BR>cos.jar + uploadbean.jar + filemover.jar <BR>这个是用的非常普遍的,原因是因为他操作方便,是我们不必再去关注,那些文件的输入和输出流,使我们从底层的流中解脱出来. <BR>UploadFile,UploadBean,MultipartFormDataRequest <BR>&lt;%@ page contentType="text/html;charset=gb2312" %&gt; <BR>&lt;head&gt; <BR>&lt;title&gt;fbysss UploadBean 示例&lt;/title&gt; <BR>&lt;!--meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"--&gt; <BR>&lt;!--meta http-equiv="Content-Type" content="text/html; charset=gb2312"--&gt; <BR>&lt;/head&gt; <BR>&lt;FORM name="form1" METHOD="POST" ACTION="sssupload.jsp" ENCTYPE="multipart/form-data"&gt; <BR>&lt;input name="title" type= "text" value="中文字"&gt; <BR>&lt;td class="bodystyle"&gt;附件&lt;/td&gt; <BR>&lt;td class="bodystyle"&gt; &lt;input name="attach" type="FILE" id="attach" size="50" &gt; &lt;/td&gt; <BR>&lt;input name="ok" type= "submit" value="提交"&gt; <BR>&lt;/form&gt; <BR>2.读取表单页面sssgetdata.jsp <BR>&lt;!-- <BR>//========================================================================== <BR>//文件：UploadBean上传实例 <BR>//功能：解决中文乱码，完成文件上传，并提供上传改名解决方案 <BR>//作者：fbysss <BR>//msn:jameslastchina@hotmail.com <BR>//========================================================================== <BR>--&gt; <BR>&lt;%@ page contentType="text/html;charset=GBK" %&gt; <BR>&lt;%@ page language="java" import="com.jspsmart.upload.*"%&gt; <BR>&lt;%@ page import="java.text.SimpleDateFormat"%&gt; <BR>&lt;%@ page import="java.io.File"%&gt; <BR>&lt;%@ page import="java.util.*"%&gt; <BR>&lt;%@ page import="javazoom.upload.*"%&gt; <BR>&lt;%@ page import="uploadutilities.FileMover"%&gt; <BR>&lt;head&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <BR>&lt;/head&gt; <BR>&lt;% <BR>request.setCharacterEncoding("GBK");//设置编码格式，就不用一个个转码了。 <BR>FileMover fileMover = new FileMover();//你也可以使用自带的实例中jsp:useBean的形式。 <BR>UploadBean upBean = new UploadBean(); <BR>MultipartFormDataRequest mrequest = null; <BR>Hashtable files = null; <BR><BR>if (MultipartFormDataRequest.isMultipartFormData(request)) <BR>{ <BR>mrequest = new MultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,"GBK");//注意这里也要设置编码参数 <BR>String sTt0 = mrequest.getParameter("title"); <BR>out.println("&lt;br&gt;Title0是："+sTt0+"&lt;br&gt;"); <BR>String sTt1 = new String(sTt0.getBytes("ISO-8859-1"),"GBK"); <BR>out.println("&lt;br&gt;Title1是："+sTt1+"&lt;br&gt;"); <BR>//这里用来测试title参数是否正确。调试的时候，加一句if (true)return;即可。 <BR>files = mrequest.getFiles(); <BR>} <BR><BR><BR>//获取修改前的文件名 <BR>String sOldFileName =mrequest.getParameter("oldfilename"); <BR>out.println("sOldFileName:"+sOldFileName); <BR>String sWebRootPath = request.getRealPath("/");//得到你的web应用的根。 <BR>String sPath=sWebRootPath+"attach"; <BR>int iFileCount = 0; <BR>String sServerFileName=""; <BR>String sLocalFileName = ""; <BR>//文件获取 <BR>if ( (files != null) || (!files.isEmpty()) ) { <BR><BR>iFileCount = files.size(); <BR>UploadFile file = (UploadFile) files.get("attach"); <BR>sLocalFileName=file.getFileName(); <BR>out.println("sLocalFileName:"+sLocalFileName); <BR>int ii= sLocalFileName.indexOf("."); //取文件名的后缀 <BR>String sExt = sLocalFileName.substring(ii,sLocalFileName.length()); <BR>//得到不重复的文件名 <BR>java.util.Date dt = new java.util.Date(System.currentTimeMillis()); <BR>SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS"); <BR>sServerFileName= fmt.format(dt); <BR>sServerFileName =sServerFileName + sExt; <BR>//如果不存在该目录，则新建一个 <BR>File dir =new File(sPath); <BR>if (!dir.exists()){ <BR>dir.mkdirs(); <BR>} <BR>upBean.setFolderstore(sPath);//设置要上传的目录 <BR>upBean.addUploadListener(fileMover);//增加filMover监听 <BR>fileMover.setNewfilename(sServerFileName);//设置服务器上的文件名 <BR>upBean.store(mrequest, "attach");//上传 <BR>out.println("file path is "+sPath+"/"+sServerFileName); <BR>} <BR><BR>%&gt; <BR><BR>Demo注意事项：cos.jar，uploadbean.jar，filemover.jar这几个包必须有。 <BR>必备下载地址： <BR>UploadBean1.5：http://wcarchive.cdrom.com/pub/simtelnet/winnt/java/uploadbean1_5.zip <BR>FileMover1.3：http://www.javazoom.net/jzservlets/uploadbean/addons/filemover1.3.zip <BR>参考下载地址： <BR>ChinesUpload例子：http://www.javazoom.net/jzservlets/uploadbean/addons/ChineseUpload.zip <BR>参考了fbysss的一篇文章 <BR>2. org.apache.struts.upload.FormFile <BR>Struts1.1的org.apache.struts.upload.FormFile类。很方便，不用自己写。也不用写一个jsp调用jspsmartupload就可以搞定。 <BR><BR><BR>选择上传文件页面：selfile.jsp <BR><BR><BR>-------------------------------------------------------------------------------- <BR>&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%&gt; <BR>&lt;html:html&gt; <BR>&lt;html:form action="/uploadsAction.do" enctype="multipart/form-data"&gt; <BR>&lt;html:file property="theFile"/&gt; <BR>&lt;html:submit/&gt; <BR>&lt;/html:form&gt; <BR>&lt;/html:html&gt; <BR><BR>-------------------------------------------------------------------------------- <BR>UpLoadAction.java <BR>-------------------------------------------------------------------------------- <BR>import java.io.*; <BR>import javax.servlet.http.*; <BR>import org.apache.struts.action.*; <BR>import org.apache.struts.upload.FormFile; <BR><BR>/** <BR>* &lt;p&gt;Title:UpLoadAction&lt;/p&gt; <BR>* &lt;p&gt;Description: QRRSMMS &lt;/p&gt; <BR>* &lt;p&gt;Copyright: Copyright (c) 2004 jiahansoft&lt;/p&gt; <BR>* &lt;p&gt;Company: jiahansoft&lt;/p&gt; <BR>* @author wanghw <BR>* @version 1.0 <BR>*/ <BR><BR>public class UpLoadAction extends Action { <BR>public ActionForward execute(ActionMapping mapping, <BR>ActionForm form, <BR>HttpServletRequest request, <BR>HttpServletResponse response) <BR>throws Exception { <BR>if (form instanceof uploadsForm) {//如果form是uploadsForm <BR>String encoding = request.getCharacterEncoding(); <BR>if ((encoding != null) &amp;&amp; (encoding.equalsIgnoreCase("utf-8"))) <BR>{ <BR>response.setContentType("text/html; charset=gb2312");//如果没有指定编码，编码格式为gb2312 <BR>} <BR>UpLoadForm theForm = (UpLoadForm ) form; <BR>FormFile file = theForm.getTheFile();//取得上传的文件 <BR>try { <BR>InputStream stream = file.getInputStream();//把文件读入 <BR>String filePath = request.getRealPath("/");//取当前系统路径 <BR>ByteArrayOutputStream baos = new ByteArrayOutputStream(); <BR>OutputStream bos = new FileOutputStream(filePath + "/" + <BR>file.getFileName());//建立一个上传文件的输出流 <BR>//System.out.println(filePath+"/"+file.getFileName()); <BR>int bytesRead = 0; <BR>byte[] buffer = new byte[8192]; <BR>while ( (bytesRead = stream.read(buffer, 0, 8192)) != -1) { <BR>bos.write(buffer, 0, bytesRead);//将文件写入服务器 <BR>} <BR>bos.close(); <BR>stream.close(); <BR>}catch(Exception e){ <BR>System.err.print(e); <BR>} <BR>//request.setAttribute("dat",file.getFileName()); <BR>return mapping.findForward("display"); <BR>} <BR>return null; <BR>} <BR>} <BR><BR><BR>-------------------------------------------------------------------------------- <BR><BR>UpLoadForm.java <BR><BR>-------------------------------------------------------------------------------- <BR><BR><BR>import javax.servlet.http.HttpServletRequest; <BR>import org.apache.struts.action.*; <BR>import org.apache.struts.upload.*; <BR><BR>/** <BR>* &lt;p&gt;Title:UpLoadForm&lt;/p&gt; <BR>* &lt;p&gt;Description: QRRSMMS &lt;/p&gt; <BR>* &lt;p&gt;Copyright: Copyright (c) 2004 jiahansoft&lt;/p&gt; <BR>* &lt;p&gt;Company: jiahansoft&lt;/p&gt; <BR>* @author wanghw <BR>* @version 1.0 <BR>*/ <BR><BR>public class UpLoadForm extends ActionForm { <BR>public static final String ERROR_PROPERTY_MAX_LENGTH_EXCEEDED = "org.apache.struts.webapp.upload.MaxLengthExceeded"; <BR>protected FormFile theFile; <BR>public FormFile getTheFile() { <BR>return theFile; <BR>} <BR>public void setTheFile(FormFile theFile) { <BR>this.theFile = theFile; <BR>} <BR>public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) <BR>{ <BR>ActionErrors errors = null; <BR>//has the maximum length been exceeded? <BR>Boolean maxLengthExceeded = (Boolean) <BR>request.getAttribute(MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED); <BR>if ((maxLengthExceeded != null) &amp;&amp; (maxLengthExceeded.booleanValue())) <BR>{ <BR>errors = new ActionErrors(); <BR>errors.add(ERROR_PROPERTY_MAX_LENGTH_EXCEEDED, new ActionError("maxLengthExceeded")); <BR>} <BR>return errors; <BR><BR>} <BR>} <BR>//这是相对应的form，还有其他属性可以设置，具体可以参考struts的上传例子。 <BR><BR><BR><BR>-------------------------------------------------------------------------------- <BR><BR>struts-config.xml <BR><BR>-------------------------------------------------------------------------------- <BR><BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt; <BR>&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&gt; <BR>&lt;struts-config&gt; <BR>&lt;form-beans&gt; <BR>&lt;form-bean name="uploadsForm" type="UpLoadForm" /&gt; <BR>&lt;/form-beans&gt; <BR>&lt;action-mappings&gt; <BR>&lt;action name="uploadsForm" type="UpLoadAction" path="/uploadsAction"&gt; <BR>&lt;forward name="display" path="/display.jsp" /&gt; <BR>&lt;/action&gt; <BR>&lt;/action-mappings&gt; <BR>&lt;/struts-config&gt; <BR>&lt;!--display.jsp就是随便写一个成功页--&gt; <BR><img src ="http://www.blogjava.net/zhangrenquan/aggbug/30960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-02-16 12:28 <a href="http://www.blogjava.net/zhangrenquan/articles/30960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java连接各种数据库</title><link>http://www.blogjava.net/zhangrenquan/articles/29409.html</link><dc:creator>kelven</dc:creator><author>kelven</author><pubDate>Tue, 31 Jan 2006 17:00:00 GMT</pubDate><guid>http://www.blogjava.net/zhangrenquan/articles/29409.html</guid><wfw:comment>http://www.blogjava.net/zhangrenquan/comments/29409.html</wfw:comment><comments>http://www.blogjava.net/zhangrenquan/articles/29409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhangrenquan/comments/commentRss/29409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhangrenquan/services/trackbacks/29409.html</trackback:ping><description><![CDATA[<P><STRONG>1、Oracle8/8i/9i数据库（thin模式）</STRONG> </P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">oracle.jdbc.driver.OracleDriver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).newInstance();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;url</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:oracle:thin:@localhost:1521:orcl</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">orcl为数据库的SID&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">String&nbsp;user</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">test</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DriverManager.getConnection(url,user,password);</SPAN></DIV><BR><BR><STRONG>2、DB2数据库</STRONG> <BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">com.ibm.db2.jdbc.app.DB2Driver&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).newInstance();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;url</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:db2://localhost:5000/sample</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">sample为你的数据库名&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">String&nbsp;user</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">admin</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DriverManager.getConnection(url,user,password);</SPAN></DIV><BR><BR><STRONG>3、Sql Server7.0/2000数据库</STRONG> <BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">com.microsoft.jdbc.sqlserver.SQLServerDriver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).newInstance();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;url</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">mydb为数据库&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">String&nbsp;user</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">sa</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DriverManager.getConnection(url,user,password);</SPAN></DIV><BR><BR><STRONG>4、Sybase数据库</STRONG> <BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">com.sybase.jdbc.SybDriver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).newInstance();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;jdbc:sybase:Tds:localhost:5007/myDB</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">myDB为你的数据库名&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">Properties&nbsp;sysProps&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;System.getProperties();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>SysProps.put(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">user</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">userid</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>SysProps.put(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">password</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">user_password</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DriverManager.getConnection(url,&nbsp;SysProps);</SPAN></DIV><BR><BR><STRONG>5、Informix数据库</STRONG> <BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">com.informix.jdbc.IfxDriver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).newInstance();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;&nbsp;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">user</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">testuser;password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">testpassword</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;//myDB为数据库名&nbsp;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DriverManager.getConnection(url);</SPAN></DIV><BR><BR><STRONG>6、MySQL数据库</STRONG> <BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.gjt.mm.mysql.Driver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).newInstance();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:mysql://localhost/myDB?user=soft&amp;password=soft1234&amp;useUnicode=true&amp;characterEncoding=8859_1</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">myDB为数据库名&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DriverManager.getConnection(url);</SPAN></DIV><BR><BR><STRONG>7、PostgreSQL数据库</STRONG> <BR><BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.postgresql.Driver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">).newInstance();&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:postgresql://localhost/myDB</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">myDB为数据库名&nbsp;</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">String&nbsp;user</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">myuser</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;password</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">mypassword</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Connection&nbsp;conn</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DriverManager.getConnection(url,user,password);</SPAN></DIV><BR><BR><STRONG>8、access数据库直连用ODBC的<BR><BR></STRONG>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Class.forName(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">sun.jdbc.odbc.JdbcOdbcDriver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)&nbsp;;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>String&nbsp;url</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">jdbc:odbc:Driver={MicroSoft&nbsp;Access&nbsp;Driver&nbsp;(*.mdb)};DBQ=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">application.getRealPath(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">/Data/ReportDemo.mdb</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Connection&nbsp;conn&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DriverManager.getConnection(url,</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #000000">""</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>Statement&nbsp;stmtNew</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">conn.createStatement()&nbsp;;</SPAN></DIV>
<P class=code><BR><STRONG><FONT size=4>*以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧</FONT><BR><BR></STRONG>　　<STRONG>1、在客户端软件开发中使用Thin驱动程序</STRONG><BR><BR>　　在开发Java软件方面，Oracle的数据库提供了四种类型的驱动程序，二种用于应用软件、applets、servlets等客户端软件，另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中，我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口（JNI），通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序，它直接与数据库进行通讯。为了获得最高的性能，Oracle建议在客户端软件的开发中使用OCI驱动程序，这似乎是正确的。但我建议使用Thin驱动程序，因为通过多次测试发现，在通常情况下，Thin驱动程序的性能都超过了OCI驱动程序。<BR><BR>　　<STRONG>2、关闭自动提交功能，提高系统性能</STRONG><BR><BR>　　在第一次建立与数据库的连接时，在缺省情况下，连接是在自动提交模式下的。为了获得更好的性能，可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能，如下所示：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">conn.setAutoCommit(</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV>
<P class=code>　　值得注意的是，一旦关闭了自动提交功能，我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。<BR><BR>　　<STRONG>3、在动态SQL或有时间限制的命令中使用Statement对象</STRONG><BR><BR>　　在执行SQL命令时，我们有二种选择：可以使用PreparedStatement对象，也可以使用Statement对象。无论多少次地使用同一个SQL命令，PreparedStatement都只对它解析和编译一次。当使用Statement对象时，每次执行一个SQL命令时，都会对它进行解析和编译。这可能会使你认为，使用PreparedStatement对象比使用Statement对象的速度更快。然而，我进行的测试表明，在客户端软件中，情况并非如此。因此，在有时间限制的SQL操作中，除非成批地处理SQL命令，我们应当考虑使用Statement对象。<BR><BR>　　此外，使用Statement对象也使得编写动态SQL命令更加简单，因为我们可以将字符串连接在一起，建立一个有效的SQL命令。因此，我认为，Statement对象可以使动态SQL命令的创建和执行变得更加简单。<BR><BR>　　<STRONG>4、利用helper函数对动态SQL命令进行格式化</STRONG><BR><BR>　　在创建使用Statement对象执行的动态SQL命令时，我们需要处理一些格式化方面的问题。例如，如果我们想创建一个将名字O'Reilly插入表中的SQL命令，则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法，然后在连接字符串心服用公式表达一个SQL命令时，使用创建的helper方法。与此类似的是，我们可以让helper方法接受一个Date型的值，然后让它输出基于Oracle的to_date()函数的字符串表达式。<BR><BR>　　<STRONG>5、利用PreparedStatement对象提高数据库的总体效率</STRONG><BR><BR>　　在使用PreparedStatement对象执行SQL命令时，命令被数据库进行解析和编译，然后被放到命令缓冲区。然后，每当执行同一个PreparedStatement对象时，它就会被再解析一次，但不会被再次编译。在缓冲区中可以发现预编译的命令，并且可以重新使用。在有大量用户的企业级应用软件中，经常会重复执行相同的SQL命令，使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务，我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。<BR><BR>　　<STRONG>6、在成批处理重复的插入或更新操作中使用PreparedStatement对象</STRONG><BR><BR>　　如果成批地处理插入和更新操作，就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理，只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理，或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制，可以以如下所示的方式调用setExecuteBatch()：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">PreparedStatement&nbsp;pstmt3D&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG id=Codehighlighter1_36_122_Open_Image onclick="this.style.display='none'; Codehighlighter1_36_122_Open_Text.style.display='none'; Codehighlighter1_36_122_Closed_Image.style.display='inline'; Codehighlighter1_36_122_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_36_122_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_122_Closed_Text.style.display='none'; Codehighlighter1_36_122_Open_Image.style.display='inline'; Codehighlighter1_36_122_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_36_122_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_36_122_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>　((OraclePreparedStatement)pstmt).setExecuteBatch(</SPAN><SPAN style="COLOR: #000000">30</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>　<IMG src="http://www.blogjava.net/images/dot.gif"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>　pstmt.executeUpdate();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN></DIV>
<P class=code>　　调用setExecuteBatch()时指定的值是一个上限，当达到该值时，就会自动地引发SQL命令执行，标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。<BR><BR>　　<STRONG>7、使用Oracle locator方法插入、更新大对象（LOB）</STRONG><BR><BR>　　Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理，尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值，也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB，但需要使用locator才能获取LOB的值。由于存在这二个问题，因此，我建议使用locator的方法来插入、更新或获取LOB的值。<BR><BR>　　<STRONG>8、使用SQL92语法调用存储过程</STRONG><BR><BR>　　在调用存储过程时，我们可以使用SQL92或Oracle PL/SQL，由于使用Oracle PL/SQL并没有什么实际的好处，而且会给以后维护你的应用程序的开发人员带来麻烦，因此，我建议在调用存储过程时使用SQL92。<BR><BR>　　<STRONG>9、使用Object SQL将对象模式转移到数据库中</STRONG><BR><BR>　　既然可以将Oracle的数据库作为一种面向对象的数据库来使用，就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象，将它们的属性映射到关系表中，然后在这些bean中添加方法。尽管这样作在Java中没有什么问题，但由于操作都是在数据库之外进行的，因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术，可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作，然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式，不但Java应用程序可以使用应用软件的对象模式，其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。<BR><BR>　　<STRONG>10、利用SQL完成数据库内的操作</STRONG><BR><BR>　　我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求，而不是使用Java等过程化的编程语言。<BR><BR>　　如果编程人员要在一个表中查找许多行，结果中的每个行都会查找其他表中的数据，最后，编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务，何必要让数据在网上流来流去的？我建议用户认真学习如何最大限度地发挥SQL的功能。 <BR clear=all></P><img src ="http://www.blogjava.net/zhangrenquan/aggbug/29409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhangrenquan/" target="_blank">kelven</a> 2006-02-01 01:00 <a href="http://www.blogjava.net/zhangrenquan/articles/29409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>