﻿<?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-Rex Mao</title><link>http://www.blogjava.net/RexMao/</link><description>分享java技术与生活</description><language>zh-cn</language><lastBuildDate>Sat, 02 May 2026 16:19:03 GMT</lastBuildDate><pubDate>Sat, 02 May 2026 16:19:03 GMT</pubDate><ttl>60</ttl><item><title>Oracle SQLPLUS 常用命令小结（一）</title><link>http://www.blogjava.net/RexMao/archive/2008/05/17/201089.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Sat, 17 May 2008 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2008/05/17/201089.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/201089.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2008/05/17/201089.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/201089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/201089.html</trackback:ping><description><![CDATA[<p dir="ltr" style="margin-right: 0px"><br />
<strong>1. 显示当前连接。</strong><br />
<br />
SQL：<br />
<span style="color: #999999"><span style="color: #999999"><span style="color: #999999"><span style="color: #000000; background-color: #c0c0c0"><font style="background-color: #c0c0c0" color="#999999"><span style="color: #999999"><span style="color: #999999"><span style="color: #999999"><span style="color: #000000; background-color: #ffffff"><font color="#999999">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font>SELECT *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM V$SESSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE STATUS = 'INACTIVE'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND USERNAME IS NOT NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></span></font><span style="background-color: #999999"><br />
</span></span></span></span><span style="color: #000000; background-color: #999999"><br />
</span></span></p>
<strong>2. 强制关闭用户的连接</strong><br />
<br />
SQL:<br />
<span style="background-color: #ffffff"><span style="color: #000000"><span style="background-color: #c0c0c0"><font style="background-color: #c0c0c0"><span style="background-color: #ffffff"><span style="color: #000000">&nbsp;&nbsp;&nbsp; a) SELECT&nbsp;USERNAME, SID,&nbsp;SERIAL#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM V$SESSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE STATUS = 'INACTIVE'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND USERNAME IS NOT NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;b) ALTER SYSTEM&nbsp;KILL SESSION 'SID, SERIAL#'; --SID 和 SERIAL#是在步骤a)中得到的结果。</span></span></font><br />
</span></span></span><br />
<strong>3.&nbsp;从返回的结果中选择第m到n条记录</strong><br />
<br />
SQL:<br />
<span style="background-color: #c0c0c0"><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">SELECT *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM (&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT A.*, ROWNUM RN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;FROM (&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&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;SELECT *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&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;FROM&nbsp;YOURTABLE --这里请用你的SELECT语句代替&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&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; ) A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE ROWNUM &lt;= n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE RN &gt;= m;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span></span></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<strong>4. 重新编译包 (package) 和 包体 (package body)</strong><br />
&nbsp;&nbsp;&nbsp; 此命令可以用于查看在SQLPLUS中创建的package的编译错误。<br />
<br />
SQL:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a)&nbsp;编译 package<br />
<span style="color: #000000; background-color: #c0c0c0"><span style="background-color: #ffffff"><span style="background-color: #c0c0c0"><span style="color: #000000"><span style="background-color: #ffffff"><span style="color: #000000"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">ALTER PACKAGE YOUR_PACKAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMPILE SPECIFICATION;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;<span style="color: #999999"><span style="color: #000000"><br />
</span></span></span></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b)&nbsp;编译 package body</span></span></span></span></span><br />
<span style="color: #000000; background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ALTER PACKAGE YOUR_PACKAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMPILE BODY;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c) 查看错误<br />
</span><span style="color: #000000; background-color: #c0c0c0"><span style="background-color: #ffffff"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SHOW ERR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><br />
</span><br />
<strong>5. 解除锁定的用户<br />
<br />
SQL:<br />
SQL:<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;ALERT USER USERNAME UNLOCK;<br />
<br />
<br />
&nbsp;<span style="color: #000000"><span style="color: #c0c0c0"><span style="background-color: #999999"><br />
</span></span></span>
<img src ="http://www.blogjava.net/RexMao/aggbug/201089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2008-05-17 14:11 <a href="http://www.blogjava.net/RexMao/archive/2008/05/17/201089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA文件传输程序</title><link>http://www.blogjava.net/RexMao/archive/2007/11/03/157892.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Sat, 03 Nov 2007 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/11/03/157892.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/157892.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/11/03/157892.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/157892.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/157892.html</trackback:ping><description><![CDATA[这个是我做的另一个毕业设计，使用的最基本的socket通信实现文件传输，使用该程序可同时给多个人发送不同的文件并支持断点续传。<br />
由于只为毕业设计而写的，只实现了功能，没有在速度上优化，发上来只为给要做类似程序的朋友做个参考。以下是毕业论文中的节选。<br />
<p>源代码已经上传了。<br />
<span style="font-family: 宋体"><br />
第</span>3<span style="font-family: 宋体">章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设计文档</span></p>
<p>3<span style="font-family: 宋体">．</span>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">任务概述</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">本项任务要开发一款</span>P2P<span style="font-family: 宋体">文件传输软件，该软件可以在局域网和互连上使用，具有文件传输，断点续传，多线程连接等功能。</span></p>
<p>3<span style="font-family: 宋体">．</span>1<span style="font-family: 宋体">．</span>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">开发背景</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">随着网络的普及，在网络中交换信息，特别是文件成为使用网络时经常性工作，现有的文件传输工具如</span>QQ<span style="font-family: 宋体">、</span>MSN<span style="font-family: 宋体">等，主要功能是作为即时通讯工具使用，而且在局域网中使用时仍需连接到互连网。本文开发的软件基于</span>P2P<span style="font-family: 宋体">结构实现文件传输，不依靠服务器维护用户资料，所以，只要两台机器可以连通，就可以进行文件传输。</span></p>
<p>3<span style="font-family: 宋体">．</span>1<span style="font-family: 宋体">．</span>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">定义</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P2P<span style="font-family: 宋体">：即</span>peer-to-peer<span style="font-family: 宋体">，可以理解为点对点，或对等传输的意思。</span></p>
<p>3<span style="font-family: 宋体">．</span>1<span style="font-family: 宋体">．</span>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">开发工具</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">开发采用</span>JAVA<span style="font-family: 宋体">语言，开发工具为</span>jbuilder 2005</p>
<p>3<span style="font-family: 宋体">．</span>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">文件传输业务流程</span></p>
<p>3<span style="font-family: 宋体">．</span>2<span style="font-family: 宋体">．</span>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">通讯顺序关系</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在文件传输时，传输过程可以简单的分为</span>4<span style="font-family: 宋体">步，如图</span> <span style="font-family: 宋体">：</span></p>
<p style="margin-left: 57.75pt; text-indent: -36.75pt; tab-stops: list 57.75pt">1、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">由文件发送者发起文件传输，他首先发送文件名，文件大小，验证消息等信息给文件接收者。</span></p>
<p style="margin-left: 57.75pt; text-indent: -36.75pt; tab-stops: list 57.75pt">2、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">文件接收者收到文件信息和发送者信息，决定是否接收，如不接收，则发送拒绝接收消息给文件发送者，文件传输结束。如同意接收，发送同意接收消息和文件传输起始字节（用于断点续传）给发送者。</span></p>
<p style="margin-left: 57.75pt; text-indent: -36.75pt; tab-stops: list 57.75pt">3、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">发送者开始发送文件数据包，直到最后一个文件数据包，发送者在最后一个文件数据包上加上标记。</span></p>
<p style="margin-left: 57.75pt; text-indent: -36.75pt; tab-stops: list 57.75pt">4、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">接收者识别最后一个文件数据包，文件传输成功。</span></p>
<img alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/1.JPG" border="0" /><br />
<p class="MsoNormal"><span lang="EN-US">3</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span><span lang="EN-US">2</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span><span lang="EN-US">2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件发送端的详细业务流程</span></p>
<img height="778" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/2.JPG" width="539" border="0" /><br />
&nbsp;
<p><span style="font-family: 宋体">图中显示了发送文件时的详细业务流程。</span></p>
<p>1<span style="font-family: 宋体">、首先，要选择要发送的文件，可以选择一个文件或同一个文件夹下的多个文件发送，当选择多个文件时，软件将为每个文件建立一个传输线程。选择文件后，发送者要填写目标</span>IP<span style="font-family: 宋体">和端口，由于是基于</span>P2P<span style="font-family: 宋体">的文件传输，不存在服务器维护好友列表，所以需要知道目标</span>IP<span style="font-family: 宋体">才能传输文件，用户也可以填写验证消息用于描述自己的身份和文件的介绍。</span></p>
<p>2<span style="font-family: 宋体">、发送者收到确认包，判断是否接收文件，如果不接收，则传输结束，如果接收，则打开要发送的文件，设置起始传输字节。</span></p>
<p>3<span style="font-family: 宋体">、发送者读取一个文件片段，加入是否是最后一个文件片段的标志，打包发给接收者。</span></p>
<p>4<span style="font-family: 宋体">、发送完最后一个文件片段时，文件传输结束。</span></p>
<p>3<span style="font-family: 宋体">．</span>2<span style="font-family: 宋体">．</span>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">文件接收者详细业务流程</span></p>
<img height="667" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/3.JPG" width="549" border="0" /><br />
&nbsp;
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1、&nbsp;<span style="font-family: 宋体">从一打开软件开始，监听线程就会启动，这时用户就扮演者文件接收者的角色，当有文件发送者发来请求时，监听线程建立与发送者的连接，并创建传输线程，接收者得到发送者传来的文件信息和验证消息，用户还能得到发送者的</span>IP<span style="font-family: 宋体">地址，用户根据这些信息决定是否接收文件，并发送确认包给发送者，确认包里包含了是否接收的标志，和开始传输的起始字节。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2、&nbsp;<span style="font-family: 宋体">接收者开始接收数据包，解包，写入文件中，直到最后一个文件片段，关闭文件，文件传输结束。</span></p>
<p>3<span style="font-family: 宋体">．</span>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">软件的传输协议设计</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">为了更好的控制文件传输的流程，开发设计了文件传输协议，该协议属于应用层协议，为了不使传输过程过于复杂，协议尽量简单设计。主要的内容是传输包的格式。</span></p>
<p>3<span style="font-family: 宋体">．</span>3<span style="font-family: 宋体">．</span>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">传输包的格式<br />
</span></p>
<img height="69" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/t0.JPG" width="575" border="0" /><br />
&nbsp;
<p><span style="font-family: 宋体">其中传输包的类型有</span>3<span style="font-family: 宋体">种：</span></p>
<p>PACKAGE_TYPE_FILENAME = 0x01</p>
<p><span style="font-family: 宋体">文件名包，该包用于文件发送者向接收者发送文件信息和验证消息</span></p>
<p>PACKAGE_TYPE_CONTEXT = 0x02</p>
<p><span style="font-family: 宋体">文件内容包，该包用于传输文件内容</span></p>
<p>PACKAGE_TYPE_CONFIRMRECEIVE = 0x03</p>
<p><span style="font-family: 宋体">文件传输确认包，该包用于文件接收者向发送者确认文件的接收</span></p>
<p>3<span style="font-family: 宋体">．</span>3<span style="font-family: 宋体">．</span>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">文件名包格式<br />
<img height="67" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/t1.JPG" width="599" border="0" /></span></p>
<br />
&nbsp;
<p class="MsoNormal"><span lang="EN-US">3</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span><span lang="EN-US">3</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">．</span><span lang="EN-US">3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件传输包格式<br />
<img height="69" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/t2.JPG" width="458" border="0" /><br />
</span></p>
&nbsp;
<p><span style="font-family: 宋体">其中</span>MORE_DATA<span style="font-family: 宋体">用于确认是否是文件片段的最后一个包，以结束文件的传输。</span>0<span style="font-family: 宋体">表示没有数据，</span>1<span style="font-family: 宋体">表示还有数据。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3．&nbsp;3<span style="font-family: 宋体">．</span>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">文件接受确认包格式</span></p>
<img height="68" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/t3.JPG" width="369" border="0" /><br />
&nbsp;
<p><span style="font-family: 宋体">其中</span>CONFIRM_FLAG<span style="font-family: 宋体">表示是否确认文件接收，</span>1<span style="font-family: 宋体">表示接收，</span>0<span style="font-family: 宋体">表示不接收，当接收时，</span>OFF<span style="font-family: 宋体">表示文件传输的起始字节，用来实现断点续传。</span></p>
<p style="margin-left: 42pt; text-indent: -42pt; tab-stops: list 42.0pt">3．4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font: 7pt 'Times New Roman'">&nbsp;</span><span style="font-family: 宋体">文件传输的状态机</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">文件传输线程的地层其实就是一个状态转换机，线程具有几个状态，线程从文件名传输状态开始，根据文件传输的不同情况，在各个状态间转换，直到传输成功或传输失败。</span></p>
<p style="margin-left: 21pt">FILE_TRANS_STATUS_FILENAME = 0x01</p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">文件名称传输状态，文件传输刚建立连接时，传输状态处于文件名传输状态</span></p>
<p style="margin-left: 21pt">FILE_TRANS_STATUS_CONTEXT = 0x02</p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">文件内容传输转台，在传输文件内容时，传输状态属于该状态</span></p>
<p style="margin-left: 21pt">FILE_TRANS_STATUS_WAITFORCONFIRM = 0x03</p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">等待确认状态，文件发送者，发送完文件信息和验证消息后，处于该状态，文件接收者接收到文件信息和验证消息后处于该状态</span></p>
<p style="margin-left: 21pt">FILE_TRANS_STATUS_SUCCESS = 0x04</p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">文件传输成功状态，表示文件已成功传输完毕</span></p>
<p style="margin-left: 21pt">FILE_TRANS_STATUS_FAIL = 0x05</p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">文件传输失败状态，表示文件传输已经失败，失败原因可能是对方取消了文件传输或网络错误</span></p>
<img height="298" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/4.JPG" width="544" border="0" /><br />
<br />
<img height="309" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/5.JPG" width="554" border="0" /><br />
&nbsp;
<p class="MsoNormal" style="margin-left: 42pt; text-indent: -42pt; mso-list: l0 level2 lfo1; tab-stops: list 42.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3．5 <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构设计</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">软件主要由</span><span lang="EN-US">MainFrame,TransFileManager,SocketThread,Server,TransFilePanel</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">五个类构成图</span> <span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示了这几个类之间的关系。</span></p>
<img height="382" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/6.JPG" width="632" border="0" /><br />
&nbsp;
<p style="margin-left: 21pt"><span style="font-family: 宋体">类功能介绍</span></p>
<p style="margin-left: 21pt">MainFrame</p>
<p style="margin-left: 21pt">MainFrame<span style="font-family: 宋体">类是软件的主界面类，负责与用户的交互。</span></p>
<p style="margin-left: 21pt">TransFileManager</p>
<p style="margin-left: 21pt">TransFileManager<span style="font-family: 宋体">类是文件传输的控制类，负责管理文件的传输，它维护一个传输线程（</span>SocketThread<span style="font-family: 宋体">）的列表，每个线程都表示一个正在传输的任务。</span>TransFileManager<span style="font-family: 宋体">类定时的扫描各个线程的状态，根据不同状态做出不同处理，如计算传输速度，显示传输进度等。</span></p>
<p style="margin-left: 21pt">SocketThread</p>
<p style="margin-left: 21pt">SocketThread<span style="font-family: 宋体">类是文件传输线程类，它负责底层的具体传输工作，包括打包与解包，并且转换自己的状态，完成文件的传输。</span></p>
<p style="margin-left: 21pt">Server</p>
<p style="margin-left: 21pt">Server<span style="font-family: 宋体">类是为</span>TransFileManager<span style="font-family: 宋体">类使用的，它负责本地端口的监听，一旦有用户连接，</span>TransFileManager<span style="font-family: 宋体">就创建一个传输线程，放入线程列表。而它继续监听端口。</span></p>
<p style="margin-left: 21pt">TransFilePanel</p>
<p style="margin-left: 21pt">TransFilePanel<span style="font-family: 宋体">是一个面板，它用有按钮、进度条，标签等用来显示文件的传输状态。</span></p>
<p style="margin-left: 42pt; text-indent: -42pt; tab-stops: list 42.0pt">3．6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">类设计</span></p>
<p>3<span style="font-family: 宋体">．</span>6<span style="font-family: 宋体">．</span>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MainFrame</p>
<p><span style="font-family: 宋体">该类是视图类，是软件的主界面。<br />
<img height="247" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/7.JPG" width="225" border="0" /><br />
</span></p>
&nbsp;
<p><span style="font-family: 宋体">成员变量：</span></p>
<p>contentPane</p>
<p>contentPane<span style="font-family: 宋体">是</span>JPanel<span style="font-family: 宋体">类的对象，是主界面的面板。</span></p>
<p>jbtnSend</p>
<p>jbtnSend<span style="font-family: 宋体">是</span>JButton<span style="font-family: 宋体">类对象，点击它将打开文件传输对话框。</span></p>
<p>jbtnSetting</p>
<p>jbtnSetting<span style="font-family: 宋体">是</span>JButton<span style="font-family: 宋体">类对象，点击它将打开设置对话框。</span></p>
<p>jlblIP</p>
<p>jlblIP<span style="font-family: 宋体">是</span>JLable<span style="font-family: 宋体">类对象，它显示本机的</span>IP<span style="font-family: 宋体">地址，方便文件的传输。</span></p>
<p>jtpTransFile</p>
<p>jtpTransFile<span style="font-family: 宋体">是</span>JTabbedPane<span style="font-family: 宋体">类对象，是选项卡控件，用于显示多个文件同时传输。</span></p>
<p>tfm</p>
<p>tfm<span style="font-family: 宋体">是</span>TransFileManager<span style="font-family: 宋体">类对象，负责控制文件的传输。</span></p>
<p><span style="font-family: 宋体">成员方法：</span></p>
<p>jbtnSend_anctionPerformed()</p>
<p><span style="font-family: 宋体">该方法为</span>jbtnSend<span style="font-family: 宋体">按钮的点击事件</span></p>
<p>jbtnSetting_actionPerformed()</p>
<p><span style="font-family: 宋体">该方法为</span>jbtnSetting<span style="font-family: 宋体">按钮的点击事件</span></p>
<p>This_windowClosed()</p>
<p><span style="font-family: 宋体">该方法为窗口关闭事件</span></p>
<p><span style="font-family: 宋体">界面截图：</span></p>
<img height="375" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/8.JPG" width="457" border="0" /><br />
&nbsp;
<p>3<span style="font-family: 宋体">．</span>6<span style="font-family: 宋体">．</span>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TransFileManager<span style="font-family: 宋体">类</span></p>
<p><span style="font-family: 宋体">该类负责传输过程中对各个传输线程的检测与控制。</span></p>
<img height="301" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/9.JPG" width="176" border="0" /><br />
&nbsp;
<p><span style="font-family: 宋体">成员变量：</span></p>
<p>jtp</p>
<p>jtp<span style="font-family: 宋体">是选项卡控件对象，是</span>MainFrame<span style="font-family: 宋体">类中</span>jtpTransFile<span style="font-family: 宋体">对象的一个引用。</span></p>
<p>panelist</p>
<p>paneList<span style="font-family: 宋体">是</span>ArrayList<span style="font-family: 宋体">类对象，它是一个链表结构，存储使用的选项卡。</span></p>
<p>running</p>
<p>running<span style="font-family: 宋体">是一个</span>boolean<span style="font-family: 宋体">型的对象，用来表示线程是否在执行。</span></p>
<p>s</p>
<p>s<span style="font-family: 宋体">是</span>Server<span style="font-family: 宋体">类的对象，用来坚听本地端口，等待用户的连接。</span></p>
<p>threadList</p>
<p>threadList<span style="font-family: 宋体">是</span>ArrayList<span style="font-family: 宋体">类对象，它是一个链表结构，存储使用的传输线程。</span></p>
<p>maxThreadNum</p>
<p>maxTreadNum<span style="font-family: 宋体">是整型变量，表示最大允许的线程数。</span></p>
<p>port</p>
<p>port<span style="font-family: 宋体">是整型变量，表示使用的端口号。</span></p>
<p><span style="font-family: 宋体">成员方法：</span></p>
<p>close()</p>
<p><span style="font-family: 宋体">该方法用于关闭文件传输的控制。</span></p>
<p>sendFile()</p>
<p><span style="font-family: 宋体">该方法用于建立一个文件发送，要求输入参数为，目标</span>IP<span style="font-family: 宋体">，端口号，要发送的文件和验证消息。</span></p>
<p style="margin-left: 54pt; text-indent: -54pt; tab-stops: list 54.0pt">3．6．3<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>SocketThread<span style="font-family: 宋体">类</span></p>
<p>SocketThread<span style="font-family: 宋体">类是文件传输的底层支持类，它提供文件传输的服务。</span></p>
<img height="487" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/10.JPG" width="592" border="0" /><br />
&nbsp;
<p><span style="font-family: 宋体">成员变量：</span></p>
<p>sendBuf</p>
<p>sendBuf<span style="font-family: 宋体">是一个字节型数据，它是文件发送和接收时的缓冲区。</span></p>
<p>dis</p>
<p>dis<span style="font-family: 宋体">是</span>DataInputStream<span style="font-family: 宋体">型对象，它是由</span>Socket<span style="font-family: 宋体">对象得到的输入流。</span></p>
<p>dos</p>
<p>dos<span style="font-family: 宋体">是</span>DataOutputStream<span style="font-family: 宋体">型对象，它是由</span>Socket<span style="font-family: 宋体">对象得到的输出流。</span></p>
<p>fDis</p>
<p>fDis<span style="font-family: 宋体">是</span>DataInputStream<span style="font-family: 宋体">型对象，它是要发送的文件的输入流。</span></p>
<p>raf</p>
<p>raf<span style="font-family: 宋体">是</span>RandomAccessFile<span style="font-family: 宋体">型对象，该对象允许设置输出流的位置，以支持断点续传。</span></p>
<p>running</p>
<p>running<span style="font-family: 宋体">是一个</span>boolean<span style="font-family: 宋体">型对象，用来表示线程是否在执行。</span></p>
<p>serverName</p>
<p>serverName<span style="font-family: 宋体">是字符串型对象，表示服务器的地址，该对象只有在线程作为发送者时使用。</span></p>
<p>errorMessage</p>
<p>errorMessage<span style="font-family: 宋体">是字符串型对象，表示出错的信息。</span></p>
<p>fileName</p>
<p>fileName<span style="font-family: 宋体">是字符串型对象，表示文件名。</span></p>
<p>fileSender</p>
<p>fileSender<span style="font-family: 宋体">是一个</span>boolean<span style="font-family: 宋体">型对象，表示是文件发送者还是文件接收者。</span></p>
<p>IP</p>
<p>IP<span style="font-family: 宋体">是字符串型对象，用来存放目的机的</span>IP<span style="font-family: 宋体">地址。</span></p>
<p>message</p>
<p>message<span style="font-family: 宋体">是字符串型对象，用来表示验证信息。</span></p>
<p>port</p>
<p>port<span style="font-family: 宋体">是整型变量，表示连接的端口号。</span></p>
<p>transFileLength</p>
<p>transFileLength<span style="font-family: 宋体">是长整型变量，表示已经传输的文件长度，</span>TransFileManager<span style="font-family: 宋体">可以用它来计算传输进度和传输速度</span></p>
<p><span style="font-family: 宋体">成员方法：</span></p>
<p>cancelTrans()</p>
<p><span style="font-family: 宋体">该方法用于取消传输</span></p>
<p>confirmReceiveFile()</p>
<p><span style="font-family: 宋体">该方法用于确认传输文件</span></p>
<p><span style="font-family: 宋体">参数</span>flag<span style="font-family: 宋体">用来表示是否同意传输</span></p>
<p><span style="font-family: 宋体">参数</span>fileName<span style="font-family: 宋体">用来表示保存的文件</span></p>
<p><span style="font-family: 宋体">参数</span>off<span style="font-family: 宋体">用来表示起始传输字节</span></p>
<p>getFileTransMessage()</p>
<p><span style="font-family: 宋体">该方法用于得到文件传输的基本信息。如：文件发送的目标，端口号等。</span></p>
<p>getStatus()</p>
<p><span style="font-family: 宋体">该方法返回一个整型变量，表示当前线程的传输状态。</span></p>
<p>run()</p>
<p><span style="font-family: 宋体">线程的执行方法，该方法中循环执行发送或接收方法，完成文件的发送或接收。</span></p>
<p>setError()</p>
<p><span style="font-family: 宋体">该方法通过一个字符串型的参数设置错误信息。</span></p>
<p>stopThread()</p>
<p><span style="font-family: 宋体">该方法用于停止线程的执行。</span></p>
<p>doPackage()</p>
<p><span style="font-family: 宋体">打包方法，该方法中，根据线程所处的不同状态，对数据加入不同的包头和其他信息，进行打包。</span></p>
<p>readFromFile()</p>
<p><span style="font-family: 宋体">该方法从要发送的文件中读取一个整型数。</span></p>
<p>readFromSocket()</p>
<p><span style="font-family: 宋体">该方法从</span>Socket<span style="font-family: 宋体">输入流读取一个整型数，它有一个重载版本读取一个字节数组的数据。</span></p>
<p>receiveFile()</p>
<p><span style="font-family: 宋体">该方法为接收文件的方法，是线程循环中，文件接收者执行的方法。</span></p>
<p>sendFile()</p>
<p><span style="font-family: 宋体">该方法为发送文件方法，是线程循环中，文件发送者执行的方法。</span></p>
<p>writeToFile()</p>
<p><span style="font-family: 宋体">该方法写一个字节数据的数据到保存的文件中。</span></p>
<p>writeToSocket()</p>
<p><span style="font-family: 宋体">该方法写数据到</span>Socket<span style="font-family: 宋体">输出流中，它有三个重载版本，分别是写入整型数，写入长整型数和写入字节数组数据。</span></p>
<p style="margin-left: 54pt; text-indent: -54pt; tab-stops: list 54.0pt">3．6．3<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TransFilePanel<span style="font-family: 宋体">类</span></p>
<p style="margin-left: 21pt"><span style="font-family: 宋体">这个类属于视图类，它作为主界面上的一个对象使用，含有进度条，按钮，标签的对象，用于显示文件传输状态，每一个传输线程都拥有自己的</span>TransFilePanel<span style="font-family: 宋体">类对象。</span></p>
<img height="334" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/11.JPG" width="225" border="0" /><br />
&nbsp;
<p><span style="font-family: 宋体">成员变量：</span></p>
<p>fileName</p>
<p>fileName<span style="font-family: 宋体">是一个字符串，表示传输文件的文件名。</span></p>
<p>fileSender</p>
<p>fileSender<span style="font-family: 宋体">是</span>boolean<span style="font-family: 宋体">型对象，表示是文件发送者还是接收者。</span></p>
<p>isCanneled</p>
<p>isCanneled<span style="font-family: 宋体">是</span>boolean<span style="font-family: 宋体">型对象，传输过程中，用户点了取消按钮后，该标志位置</span>true<span style="font-family: 宋体">，</span>TransFileManager<span style="font-family: 宋体">会循环检测</span>isCanneled<span style="font-family: 宋体">标志，当发现其为</span>true<span style="font-family: 宋体">后，它会关闭对应的传输线程，而对方会检测到传输错误，文件传输就停止了。</span></p>
<p>isClosed</p>
<p>isClosed<span style="font-family: 宋体">是</span>boolean<span style="font-family: 宋体">型对象，它表示当传输过程已经停止时，用户点击了关闭按钮，</span>TransFileManager<span style="font-family: 宋体">检测到</span>isClosed<span style="font-family: 宋体">为</span>true<span style="font-family: 宋体">时，会在列表中去掉对应的传输线程和</span>TransFilePanel<span style="font-family: 宋体">。</span></p>
<p>isConfirm</p>
<p>isConfirm<span style="font-family: 宋体">是</span>boolean<span style="font-family: 宋体">型对象，它表示文件接收者是否确认了文件接收后（包括同意和拒绝），</span>TransFileManager<span style="font-family: 宋体">检测到</span>isConfirm<span style="font-family: 宋体">为</span>true<span style="font-family: 宋体">时，会将确认状态发给文件发送者。</span></p>
<p>jbtnCannel</p>
<p>jbtnCannel<span style="font-family: 宋体">是取消按钮。</span></p>
<p>jbtnOK</p>
<p>jbtnOK<span style="font-family: 宋体">是确定按钮。</span></p>
<p>jpgbFileTrans</p>
<p>jpgbFileTrans<span style="font-family: 宋体">是文件传输的进度条。</span></p>
<p>jtaFileTransStatus</p>
<p>jtaFileTransStatus<span style="font-family: 宋体">是一个文本框，用来显示文件传输的状态。</span></p>
<p>transFileLength</p>
<p>transFileLength<span style="font-family: 宋体">是一个长整型变量，用来表示已经传输的文件长度。</span></p>
<p>status</p>
<p>status<span style="font-family: 宋体">是一个整行变量，表示文件传输的状态，所表示的状态与</span>SocketThread<span style="font-family: 宋体">中的对应。</span></p>
<p><span style="font-family: 宋体">界面截图</span></p>
<img height="182" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/12.JPG" width="389" border="0" /><br />
&nbsp;
<p style="margin-left: 42pt; text-indent: -42pt; tab-stops: list 42.0pt">3．7<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">算法介绍</span></p>
<p>3<span style="font-family: 宋体">．</span>7<span style="font-family: 宋体">．</span>1 TransFileManager<span style="font-family: 宋体">的循环监听</span></p>
<p>TransFileManger<span style="font-family: 宋体">类继承了</span>Thread<span style="font-family: 宋体">类，实现多线程，避免循环监听时产生阻塞。</span></p>
<p><span style="font-family: 宋体">以下是在每次循环中做的工作</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1、&nbsp;<span style="font-family: 宋体">得到传输线程</span>(SocketThread)<span style="font-family: 宋体">的数量和传输状态显示面板</span>(TransFilePanel)<span style="font-family: 宋体">的数量。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2、&nbsp;<span style="font-family: 宋体">从传输线程列表中依次取出一个传输线程。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3、&nbsp;<span style="font-family: 宋体">判断当前取出的线程是否有对应的传输状态显示面板，如果有执行</span>5<span style="font-family: 宋体">，如果没有执行</span>4<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">4、&nbsp;<span style="font-family: 宋体">增加传输状态显示面板，并且在主界面上增加选项卡。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">5、&nbsp;<span style="font-family: 宋体">判断传输线程的状态，根据不同的状态做不同的处理。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">6、&nbsp;<span style="font-family: 宋体">如果列表中的线程取完，执行</span>1<span style="font-family: 宋体">，没有取完执行</span>2<span style="font-family: 宋体">。</span></p>
<p><span style="font-family: 宋体">程序流程图：</span></p>
<br />
<img height="919" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/13.JPG" width="585" border="0" /><br />
&nbsp;
<p>3<span style="font-family: 宋体">．</span>7<span style="font-family: 宋体">．</span>2 <span style="font-family: 宋体">断点续传</span></p>
<p><span style="font-family: 宋体">软件支持断点续传的功能，该功能主要算法如下：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1、&nbsp;<span style="font-family: 宋体">当文件传输中途停止时，文件接收者程序为接收的文件创建一个以该文件名</span>+.tmp<span style="font-family: 宋体">为文件名的临时文件，临时文件与该文件保存在同一个路径下。临时文件中保存文件以传输的字节数和文件的大小。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2、&nbsp;<span style="font-family: 宋体">当文件接收者接收该文件时，如果有对应的临时文件，程序会检测到该文件的临时文件，读取以传输的字节数和文件大小，并且比较传输的字节数与未完成传输的文件大小是否相等，文件大小和发送来的文件大小是否相等，如果都相等，执行</span>3<span style="font-family: 宋体">，否则执行</span>4<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3、&nbsp;<span style="font-family: 宋体">将文件的输出流设置到应该继续传输的位置，并将起始传输字节数发给发送者，执行</span>5<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">4、&nbsp;<span style="font-family: 宋体">如果有未完成的传输文件，将其删除，执行</span>5<span style="font-family: 宋体">。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt">5、&nbsp;<span style="font-family: 宋体">进行文件传输。</span></p>
<p><span style="font-family: 宋体">程序流程图：</span></p>
<img height="417" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/14.JPG" width="549" border="0" /><br />
<br />
<img height="782" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/15.JPG" width="549" border="0" />、<br />
&nbsp;
<p class="MsoNormal" style="margin-left: 54pt; text-indent: -54pt; mso-list: l1 level3 lfo1; tab-stops: list 54.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3．7．3<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本地端口的多连接监听</span></p>
<p class="MsoNormal"><span lang="EN-US">Server</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类对象负责本地端口的监听，可以支持多了连接，具体数量由用户设置。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1、<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用用户设置的端口创建监听，等待连接。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2、<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当有用户连接上后，用该连接创建一个</span><span lang="EN-US">SocketThread</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">传输线程，加入到线程列表。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3、<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果停止监听则退出，否则执行</span><span lang="EN-US">1</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序流程图：<br />
<img height="490" alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/16.JPG" width="549" border="0" /></span></p>
<img src ="http://www.blogjava.net/RexMao/aggbug/157892.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-11-03 11:19 <a href="http://www.blogjava.net/RexMao/archive/2007/11/03/157892.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>准备开工</title><link>http://www.blogjava.net/RexMao/archive/2007/07/21/131596.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Sat, 21 Jul 2007 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/07/21/131596.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/131596.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/07/21/131596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/131596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/131596.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;经过毕业后的休息，来到上海已经快一个星期了，总体感觉一般，城市没有传说中那么现代，路上一样有小广告，一样有人不走人行横道，一样有破破的楼房，地铁站外一样有黑车拉客。昨天去了外滩，才看到几处高楼，不过怎么看也没有电视上放的那样有气势。南京路上老外还是比较多（老外的眼神很迷茫）。<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;<img height=98 alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/keyboard.jpg" width=140 border=0> 
<img src ="http://www.blogjava.net/RexMao/aggbug/131596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-07-21 10:32 <a href="http://www.blogjava.net/RexMao/archive/2007/07/21/131596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML的DOM解析器的java实现（三） 类设计</title><link>http://www.blogjava.net/RexMao/archive/2007/05/31/121107.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Thu, 31 May 2007 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/05/31/121107.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/121107.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/05/31/121107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/121107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/121107.html</trackback:ping><description><![CDATA[&nbsp;<br><strong>类设计<br><br></strong><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>软件中起关键作用的类为<span>CharCollector</span>字符收集器类、<span>SimpleDOMParser</span>解析内核类和<span>Manager</span>中间层控制类。<br><br><strong>字符收集器类<br></strong><br></span>
<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/CharCollector.jpg" border=0></p>
<p><span>字符收集器类是软件的底层类，它与<span>XML</span>文件交互，读取文件中的字符信息，经过处理，形成标签，文本，属性等数据为上层提供服务。</span></p>
<p>&nbsp;</p>
<p><span>成员变量介绍：</span></p>
<p><span>aReader:Reader</span><span>对象，输入流为文件输入流，它将<span>XML</span>文件的字符数据以流的形式提供给类。</span></p>
<p><span>成员方法介绍：</span></p>
<p><span>comparedArray(): </span><span>输入：两个<span>int</span>型数组，输出：<span>boolean</span>型，返回两个数组是否相同。用于比较两个数组是否相同，在方法中，对两个数组的数逐一比较。</span></p>
<p><span>hasMoreChars():&nbsp;</span><span>输入：无，输出：<span>boolean</span>型，表示文件中是否还有字符，该方法用于确定文件中是否还有字符。</span></p>
<p><span>peek():<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>输入：<span>int</span>型数组。用于存储窥探到的字符，输出：无，该方法用于从文件中窥探数组长度的字符数据。窥探就是从文件中读取数据后，将输入流标记回以前的位置，以免丢失数据。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>算法简述：</span></p>
<p><span>在<span>aReader</span>上标记数组的长度</span></p>
<p><span>aReader.mark(buffer.length);</span></p>
<p><span>2</span><span>、将数据依次读入数组</span></p>
<p><span>for (int i = 0; i &lt; buffer.length; i++) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>buffer[i] = aReader.read();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span>恢复<span>aReader</span></span></p>
<p><span>aReader.reset();</span></p>
<p><span>peek():<span>&nbsp;&nbsp;&nbsp; </span></span><span>输入：无，输出：<span>int</span>型，是窥探到的字符，该方法从文件中窥探一个字符数据。</span></p>
<p><span>processCDATA():&nbsp;</span><span>输入：<span>StringBuffer</span>型，用于存放<span>CDATA</span>数据，输出：无，用于处理<span>XML</span>文件中的<span>CDATA</span>节点。得到的<span>CDATA</span>节点存放到<span>StringBuffer</span>对象中。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>算法简述：</span></p>
<p><span>预设两个数组</span></p>
<p><span>int[] cdataHead = {'&lt;', '!', '[', 'C', 'D', 'A', 'T', 'A', '['};</span></p>
<p><span>int[] cdataTail = {']', ']', '&gt;'};</span></p>
<p><span>窥探<span>cdataHead</span>长度的字符存在数组<span>buf</span>中</span></p>
<p><span>peek(buf);</span></p>
<p><span>比较<span>buf</span>与<span>cdataHead</span>数组的内容是否相同，如果不同返回<span>falase,</span>如果相同继续执行。</span></p>
<p><span>将<span>aReader</span>跳过<span>cdataHead</span>的长度，然后循环读取直到窥探的字符数组与<span>cdataTail</span>相同，将中间的字符存放到<span>StringBuffer</span>对象中。</span></p>
<p><span>while (true) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>peek(buf);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (comparedArray(buf, cdataTail)) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>aReader.skip(cdataTail.length);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flag = true;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>break;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>} else {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>bufChar = aReader.read();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (bufChar == -1) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>throw new IOException("CDATA node without end tag");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>sb.append((char) bufChar);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p>
<p><span>}</span></p>
<p><span>processEntity(): </span><span>输入：<span>StringBuffer</span>型，用于存放实体数据，输出：无，用语处理<span>XML</span>文件中的内建实体类型。得到的实体存放到<span>StringBuffer</span>对象中。</span></p>
<p><span>readTag():<span> </span></span><span>输入：无，输出：<span>String</span>型，是读到的标签，从<span>XML</span>文件中读取并整理成一个标签数据存放在<span>String</span>对象中。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>算法简述：</span></p>
<p><span>窥探一个字符，如果不是<span>&#8217;&lt;&#8217;</span>，抛出异常。否则继续执行。</span></p>
<p><span>int nextChar = peek();</span></p>
<p><span>if (nextChar != '&lt;') {</span></p>
<p><span><span>&nbsp;&nbsp; </span>throw new IOException("expect '&lt;',but got '" + (char) nextChar +"'");</span></p>
<p><span>}</span></p>
<p><span>窥探一个字符<span>aChar</span></span></p>
<p><span>int aChar = peek();</span></p>
<p><span>如果字符为<span>&#8217;&lt;&#8217;</span>，进行<span>CDATA</span>节点处理</span></p>
<p><span>if (aChar == '&lt;') {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (processCDATA(sb)) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>aChar = peek();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>continue;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span>}</span></p>
<p><span>&nbsp;</span><span>如果字符为<span>&#8217;&amp;&#8217;</span>，进行内建实体处理</span></p>
<p><span>if (aChar == '&amp;') {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (processEntity(sb)) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>aChar = peek();</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>continue;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span>}</span></p>
<p><span>&nbsp;</span><span>如果字符为<span>&#8217;&gt;&#8217;</span>或文件结束，返回<span>StringBuffer</span>对象。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>如果是其它字符，加入到<span>StringBuffer</span>对象中。</span></p>
<p><span>readText():<span>&nbsp;&nbsp; </span></span><span>输入：无，输出：<span>String</span>型，是读到的文本内容，从<span>XML</span>文件中读取并整理成一个文本数据存放在<span>Sting</span>对象中。</span></p>
<p><span>skipOtherTag():<span>&nbsp;&nbsp; </span></span><span>输入：无，输出：无，跳过一个不处理的标签。</span></p>
<p><span>skipOtherTags():&nbsp;</span><span>输入：无，输出：无，跳过多个不处理的标签。</span></p>
<p><span>skipWhitespace():</span><span>输入：无，输出：无，跳过空格。<br><br><strong>解析内核类<br></strong><br></span></p>
<p><img height=310 alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/SimpleDOMParser.jpg" width=242 border=0></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span>该类用于解析<span>XML</span>文件，包含<span>parser()</span>方法，是该类的核心方法。</p>
<p>&nbsp;</p>
<p><span>成员变量介绍：</span></p>
<p><span>aCharCollector:CharCollector</span><span>类对象，负责字符收集。</span></p>
<p><span>currentNode:&nbsp;SimpleElement</span><span>类对象，表示当前处理的元素。</span></p>
<p><span>Elements:<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>Stack</span><span>类对象，用栈的存储结构，表示元素之间的层次关系。</span></p>
<p><span>成员方法介绍：</span></p>
<p><span>Parser():<span>&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>输入：无，输出：<span>SimpleDocument</span>类对象，是返回的整个文档树型结构。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>算法简述：</span></p>
<p><span><span>1、</span></span><span>读取一个标签</span></p>
<p><span><span>2、</span></span><span>判断是开始标签还是结束标签，如果是结束标签，转入结束标签处理<span>3</span></span></p>
<p><span>如果是开始标签，转入开始标签处理<span>6</span></span></p>
<p><span><span>3、</span></span><span>得到标签的名称，判断是否与<span>currentNode</span>的名称相同，如果相同，执行</span></p>
<p><span>4</span><span>，否则抛出异常</span></p>
<p><span><span>4、</span></span><span>判断是否还有标签，如果有继续执行<span>5</span>，否则退出。</span></p>
<p><span><span>5、</span></span><span>从栈中弹出一个节点给<span>currentNode</span>，执行<span>1</span></span></p>
<p><span><span>6、</span></span><span>得到标签的名称，属性，文本内容，将标签加入到<span>DOM</span>树中，并且压栈。</span></p>
<p><span>执行<span>1</span></span></p>
<p><span>算法的程序流程图<br><br><img height=612 alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/liuchenttu.jpeg" width=562 border=0><br><br><strong>中间层管理类<br></strong><br></span></p>
<p><img height=335 alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/Manager.jpg" width=251 border=0></p>
<p>中间层管理类用于控制和协调解析器与用户界面。</p>
<p>&nbsp;</p>
<p><span>成员变量介绍：</span></p>
<p><span>isParsered: boolean</span><span>型，判断是否已经解析过了。</span></p>
<p><span>document:&nbsp;SimpleDocument</span><span>型对象，表示整个<span>XML</span>文档树，也是解析器返回的。</span></p>
<p><span>parser:<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SimpleDOMParser</span><span>型对象，表示解析器。</span></p>
<p><span>成员方法介绍：</span></p>
<p><span>getTreeRoot(): </span><span>输入：无，输出：<span>DefaultMutableTreeNode</span>型对象，是得到的树的根节点，用于得到树的根节点。</span></p>
<p><span>parser():&nbsp;<span>&nbsp;&nbsp; </span></span><span>输入：无，输出：无，用于执行解析操作。</span></p>
<p><span>setInputStream(): </span><span>输入：<span>InputStream</span>型对象，是要设置的输入流，输出：无，用于设置解析源。</span></p>
<p><span>setXMLFile()</span><span>：<span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</span>输入：<span>File</span>型对象，是要设置的<span>XML</span>文件，输出：无，用于设置<span>XML</span>文件源。</span></p>
<p><span>getTreeNode():<span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>输入：<span>SimpleElement</span>型对象，是要转换的对象，输出：<span>DefaultMutableTreeNode</span>型对象，是转换后的对象，用</span></p>
<p><span>于转换相应元素为树的节点对象。</span></p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/RexMao/aggbug/121107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-05-31 11:32 <a href="http://www.blogjava.net/RexMao/archive/2007/05/31/121107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML的DOM解析器的java实现（二） 程序结构设计</title><link>http://www.blogjava.net/RexMao/archive/2007/05/27/120276.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Sun, 27 May 2007 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/05/27/120276.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/120276.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/05/27/120276.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/120276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/120276.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>结构设计<br><img height=526 alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/b.jpeg" width=657 border=0><br></span></p>
<p><span>各个类的功能介绍</span></p>
<p><span>Node</span><span>、</span><span>Element</span><span>、</span><span>Document</span><span>、</span><span>Attr</span><span>为</span><span>W3C</span><span>的</span><span>DOM</span><span>规范要求实现的接口。还有其它接口未列出。</span></p>
<p><span>SimpleNode </span><span>继承</span><span>Node</span><span>接口，实现</span><span>Node</span><span>接口的基本功能。</span></p>
<p>&nbsp;</p>
<p><span>SimpleElement</span><span>继承</span><span>Node</span><span>和</span><span>Element</span><span>接口，对应</span><span>DOM</span><span>树中的标准节点，也就是</span><span>XML</span><span>文件中的一个标签。</span></p>
<p>&nbsp;</p>
<p><span>SimpleDocument </span><span>继承</span><span>Node</span><span>和</span><span>Document</span><span>接口，对应整个</span><span>DOM</span><span>树，它是解析器解析完成后，返回的对象。用户可以使用该对象访问整个</span><span>DOM</span><span>树。</span></p>
<p>&nbsp;</p>
<p><span>SimpleAttr </span><span>继承</span><span>Node</span><span>和</span><span>Attr</span><span>接口，对应</span><span>DOM</span><span>树中的属性节点，用于存放属性名称和属性值。</span></p>
<p>&nbsp;</p>
<p><span>CharCollector </span><span>字符收集器类，它直接与</span><span>XML</span><span>文件接触，根据需要向调用者提供下一个标签或文本等数据。</span></p>
<p>&nbsp;</p>
<p><span>SimpleDOMParser </span><span>解析器的核心类，它使用</span><span>CharCollector</span><span>类，得到标签、文本等数据。使用</span><span>SimpleElement</span><span>、</span><span>SimpleAttr</span><span>等类存放数据，生成</span><span>SimpleDocumnet</span><span>对象返回给调用者。</span></p>
<p>&nbsp;</p>
<p><span>MainFrame </span><span>用户界面类，它将解析结果展示给用户，并且根据用户的操作，与用户进行交互。</span></p>
<p>&nbsp;</p>
<p><span>Manager </span><span>中间层管理类，它协调用户界面（</span><span>MainFrame</span><span>）与解析器内核</span><span>(SimpleDOMParser)</span><span>之间的关系，实现解析器的控制。</span></p>
<p>&nbsp;</p>
<p><span>内部接口设计</span></p>
<table cellSpacing=0 cellPadding=0 border=1>
    <tbody>
        <tr>
            <td vAlign=top width=134>
            <p><span>类名称</span></p>
            </td>
            <td vAlign=top width=134>
            <p><span>调用类</span></p>
            </td>
            <td vAlign=top width=254>
            <p><span>调用功能</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=134>
            <p><span>SimpleDOMParser</span></p>
            </td>
            <td vAlign=top width=134>
            <p><span>SimpleElement</span></p>
            </td>
            <td vAlign=top width=254>
            <p><span>节点的存储，查找，删除。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=134>
            <p><span>SimpleDOMParser</span></p>
            </td>
            <td vAlign=top width=134>
            <p><span>SimpleAttr</span></p>
            </td>
            <td vAlign=top width=254>
            <p><span>属性节点的存储，查找，删除。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=134>
            <p><span>SimpleDOMParser</span></p>
            </td>
            <td vAlign=top width=134>
            <p><span>SimpleDocument</span></p>
            </td>
            <td vAlign=top width=254>
            <p><span>生成</span><span>DOM</span><span>树</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=134>
            <p><span>SimpleDomParser</span></p>
            </td>
            <td vAlign=top width=134>
            <p><span>CharCollector</span></p>
            </td>
            <td vAlign=top width=254>
            <p><span>字符收集，得到标签与文本等。</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=134>
            <p><span>Manager</span></p>
            </td>
            <td vAlign=top width=134>
            <p><span>SimpleDOMParser</span></p>
            </td>
            <td vAlign=top width=254>
            <p><span>解析</span><span>XML</span><span>文档</span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=134>
            <p><span>Manager</span></p>
            </td>
            <td vAlign=top width=134>
            <p><span>MainFrame</span></p>
            </td>
            <td vAlign=top width=254>
            <p><span>用户界面的相关操作</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p><span>用例关系设计</span></p>
<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/c.jpeg" border=0></p>
<p><span>用例介绍</span></p>
<p><span>用户：</span> <span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>参与者，</span><span>&nbsp;</span><span>即软件的使用者。</span></p>
<p><span>XML</span><span>文件：</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>参与者，</span><span>XML</span><span>文件。</span></p>
<p><span>链接的文件：</span><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>参与者，</span><span>XML</span><span>文件中链接的外部文件。</span></p>
<p><span>选择</span><span>XML</span><span>文件：</span><span>&nbsp;</span><span>用户通过文件选择框选择一个本地的</span><span>XML</span><span>文件。</span></p>
<p><span>选择</span><span>URL</span><span>地址：</span><span>&nbsp;</span><span>用户输入一个有效的</span><span>URL</span><span>，指向网络上的</span><span>XML</span><span>格式的网页。</span></p>
<p><span>解析</span><span>XML</span><span>文件：</span><span>&nbsp;</span><span>用户确定对</span><span>XML</span><span>文件进行解析，该项操作要发生在选择</span><span>XML</span><span>文件或选择</span><span>URL</span><span>地址之后。</span></p>
<p><span>修改文件：</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>用户对</span><span>XML</span><span>文件进行修改</span></p>
<p><span>保存文件：</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>用户通过文件选择框，选择位置保存</span><span>XML</span><span>文件。</span></p>
<p><span>选择</span><span>DOM</span><span>树节点：用户选择解析后的</span><span>DOM</span><span>树型结构上的节点。</span></p>
<p><span>解析器解析：</span><span><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>解析器对</span><span>XML</span><span>进行解析</span></p>
<p><span>收集字符：</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>字符收集器负责处理</span><span>XML</span><span>的字符数据</span></p>
<p><span>界面展示：</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;</span><span>通过树型结构和图表向用户展示数据。</span></p>
<p>&nbsp;</p>
<p><span>字符收集器有限状态机</span></p>
<p><span>DFA M=</span><span>（</span><span>{S,Ts,Tp,Tq,Cp,Ep,Er,Q},{LT,RT,A,C,EC,,EOF,NL,NLRA},f,S,{Q}</span><span>）</span></p>
<p>&nbsp;</p>
<p><span>其中</span> <span>字符集：</span></p>
<p><span>LT={&lt;}</span></p>
<p><span>RT={/&gt;}</span></p>
<p><span>A={&amp;amp,&amp;lt,&amp;gt,&amp;apos,&amp;qout}</span></p>
<p><span>C={&lt;!CDATA[[}</span></p>
<p><span>EC={]]&gt;}</span></p>
<p><span>EOF</span><span>代表文件结束</span></p>
<p><span>NL</span><span>代表不是</span><span>&lt;</span><span>的字符</span></p>
<p><span>NLRA </span><span>代表除去</span><span>LT,RT,LTL,A,C</span><span>的所有字符</span></p>
<p>&nbsp;</p>
<p><span>状态：</span></p>
<p><span>S</span><span>：</span> <span>开始状态</span></p>
<p><span>Ts</span><span>：标签处理开始状态</span></p>
<p><span>Tp</span><span>：标签处理状态</span></p>
<p><span>Tq</span><span>：标签处理结束状态</span></p>
<p><span>Cp</span><span>：</span><span>CDATA</span><span>节点处理状态</span></p>
<p><span>Ep</span><span>：内建实体处理状态</span></p>
<p><span>Er</span><span>：错误状态</span></p>
<p><span>Q</span><span>：结束状态</span></p>
<p>&nbsp;</p>
<p><span>状态转换函数：</span></p>
<p>&nbsp;</p>
<p><span>f(S,LT)=Ts</span></p>
<p><span>f(S,NL)=Er</span></p>
<p><span>f(Tp,RT)=Tq</span></p>
<p><span>f(Tp,A)=Cp</span></p>
<p><span>f(Tp,C)=Ep</span></p>
<p><span>f(Ep,EC)=Tp</span></p>
<p><span>f(Ep,EOF)=Er</span></p>
<p><span>f(Tq,LT)=Ts</span></p>
<p><span>f(Tq,EOF)=Q</span></p>
<p><span>f(Tq,NLRA)=Tq</span></p>
<p><img height=395 alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/d.jpeg" width=555 border=0></p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/RexMao/aggbug/120276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-05-27 13:10 <a href="http://www.blogjava.net/RexMao/archive/2007/05/27/120276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中怎样把图片存放在代码中</title><link>http://www.blogjava.net/RexMao/archive/2007/05/26/120139.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Sat, 26 May 2007 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/05/26/120139.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/120139.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/05/26/120139.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/120139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/120139.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>有时候不想把图片资源放在目录里，让用户看到，我用的方法是将图片的像素矩阵存在代码里。可能比较笨，具体做法是：</span></p>
<p><span>MediaTracker mt = new MediaTracker(aFrame); //</span><span>媒体跟踪器</span></p>
<p><span>Image img = Toolkit.getDefaultToolkit().createImage("</span><span>画刷</span><span>.jpg"); //</span><span>得到图片</span></p>
<p><span>mt.addImage(img, 1);</span></p>
<p><span>try {</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>mt.waitForAll();</span></p>
<p><span><span>&nbsp;&nbsp; </span>}</span></p>
<p><span>catch (InterruptedException ex) {</span></p>
<p><span><span>&nbsp;&nbsp; </span>}</span></p>
<p><span>BufferedImage bi = new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB);</span></p>
<p><span>bi.getGraphics().drawImage(img, 0, 0, 16, 16, f);</span></p>
<p><span>int[] rbg = new int[bi.getWidth() * bi.getHeight()];</span></p>
<p><span>bi.getRGB(0, 0, 16, 16, rbg, 0, 16); //</span><span>利用</span><span>BufferedImage</span><span>得到像素矩阵</span></p>
<p><span>for (int i = 0; i &lt; rbg.length; i++) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print(rbg[i] + ","); //</span><span>打印</span></p>
<p><span><span>&nbsp;&nbsp; </span>}</span></p>
<p>&nbsp;</p>
<p><span>再在代码中创建静态对象</span></p>
<p><span>private static int[] penPixels = {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, -16777216, -16777216, -16777216, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, -16777216, -2031616, -2031616, -2031616, -16777216, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, -16777216, -2031616, -1, 16777215, -16777216, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-16777216, -16777216, -2031616, -1, -16777216, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-16777216, -256, -16777216, -16777216, -16777216, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, -16777216,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-256, -1, -1842205, -16777216, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, -16777216, -1,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-256, -16777216, -16777216, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215,</span></p>
<p><span>&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, -16777216, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-256, -1842205, -16777216, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, -16777216, -256, -1,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span>-16777216, -16777216, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, -16777216, -256, -1, -1842205,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-16777216, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -256,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-16777216, -16777216, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -16777216,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>-16777216, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, -16777216, -16777216, -16777216,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, -16777216, -16777216, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, -16777216, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215, 16777215, 16777215, 16777215, 16777215, 16777215,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>16777215, 16777215</span></p>
<p><span>&nbsp;};//</span><span>打印出来的矩阵</span></p>
<p><span>private static MemoryImageSource misPen = new MemoryImageSource(16, 16,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>penPixels, 0, 16);</span></p>
<p><span>public static Image imgPen = Toolkit.getDefaultToolkit().createImage(misPen);</span></p>
<p><span>这样就可以直接使用</span><span>imgPen</span><span>图片了。</span></p>
<img src ="http://www.blogjava.net/RexMao/aggbug/120139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-05-26 10:15 <a href="http://www.blogjava.net/RexMao/archive/2007/05/26/120139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xml的DOM解析器的java实现 （一） DOM规范简介</title><link>http://www.blogjava.net/RexMao/archive/2007/05/23/119304.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Wed, 23 May 2007 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/05/23/119304.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/119304.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/05/23/119304.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/119304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/119304.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>这是我的毕业设计，本来以为挺简单的，做了以后发现还是能学到点知识，发来给大家一起学习。</span></p>
<p><span>DOM</span><span>规范定义了一组接口，用户通过这些接口来访问</span><span>DOM</span><span>解析器返回的树型结构。</span><span>DOM</span><span>不同于</span><span>SAX</span><span>的事件驱动模式，它是将整个文档解析完成后，形成一个树型结构放在内存中。下面是</span><span>DOM</span><span>规范中的所有接口，灰色显示的是本解析器实现的接口。<br><img style="WIDTH: 582px; HEIGHT: 438px" height=438 alt="" src="http://www.blogjava.net/images/blogjava_net/rexmao/DOM.JPG" width=582 border=0></span></p>
&nbsp;
<p><span>DOMImplementation</span></p>
<p><span>DOMImplementation</span><span>接口允许代码访问</span><span>DOM</span><span>的具体实现，以找出对各种特性的有效支持。其中的</span><span>hasFeature(String feature, String version)</span><span>方法可以测试具体的</span><span>DOM</span><span>实现是否支持某特性。</span></p>
<p>&nbsp;</p>
<p><span>NodeList</span></p>
<p><span>NodeList</span><span>对象是</span><span>Node</span><span>对象的一个简单的有序集合。例如，可以用来存放一个节点的子节点。</span></p>
<p>&nbsp;</p>
<p><span>Node</span></p>
<p><span>Node</span><span>对象是</span><span>DOM</span><span>中所有节点的基对象。</span><span>Element</span><span>、</span><span>Attr</span><span>、</span><span>Text</span><span>、</span><span>CDATASection</span><span>、</span><span>EntityReference</span><span>、</span><span>Entity</span><span>、</span><span>ProcessingInstruction</span><span>、</span><span>Comment</span><span>、</span><span>Document</span><span>、</span><span>DocumentType</span><span>、</span><span>DocumentFragment</span><span>和</span><span>Notation</span><span>对象都派生于</span><span>Node</span><span>对象。</span></p>
<p>&nbsp;</p>
<p><span>NamedNodeMap</span></p>
<p><span>NamedNodeMap</span><span>对象是可以通过猛成访问的</span><span>Node</span><span>对象集合。可以用来存放节点的属性。</span></p>
<p>&nbsp;</p>
<p><span>DOMException</span></p>
<p><span>异常接口</span></p>
<p>&nbsp;</p>
<p><span>DocumentFragment</span></p>
<p><span>DocumentFragment</span><span>对象是文档片段，是文档（</span><span>Document</span><span>）对象的一个简单的版本。它可以用来表示文档的任意子树。</span></p>
<p>&nbsp;</p>
<p><span>Document</span></p>
<p><span>Document</span><span>对象是能在</span><span>DOM</span><span>示例的主要对象。它代表整个的</span><span>xml</span><span>文档，也是解析器返回的对象。</span></p>
<p>&nbsp;</p>
<p><span>Element</span></p>
<p><span>Element</span><span>对象包含文档中的元素的信息。代表一个标签。</span></p>
<p>&nbsp;</p>
<p><span>Attr</span></p>
<p><span>Attr</span><span>是属性对象，一个节点的属性存在</span><span>NamedNodeMap</span><span>里。</span></p>
<p>&nbsp;</p>
<p><span>CharacterData</span></p>
<p><span>CharacterData</span><span>对象表示</span><span>xml</span><span>文件中的字符信息。</span></p>
<p>&nbsp;</p>
<p><span>DocumentType</span></p>
<p><span>DocumentType</span><span>对象表示文档类型，也就是</span><span>DTD</span><span>声明里的内容。</span></p>
<p>&nbsp;</p>
<p><span>Notation</span></p>
<p><span>Notation</span><span>对象表示</span><span>DTD</span><span>声明中的关于表示法的信息。</span></p>
<p>&nbsp;</p>
<p><span>Entity</span></p>
<p><span>Entity</span><span>对象包含</span><span>DTD</span><span>中有关实体的信息。</span></p>
<p>&nbsp;</p>
<p><span>EntityReference</span></p>
<p><span>EntityReference</span><span>对象包含对已解析文档中的实体的引用信息。</span></p>
<p>&nbsp;</p>
<p><span>ProcessingInstruction</span></p>
<p><span>ProcessingInstruction</span><span>对象包含文档中内嵌的处理指令的信息。</span></p>
<p>&nbsp;</p>
<p><span>Text</span></p>
<p><span>Text</span><span>对象表示节点的文本数据。</span></p>
<p>&nbsp;</p>
<p><span>Comment</span></p>
<p><span>Comment</span><span>对象表示注释。</span></p>
<p>&nbsp;</p>
<p><span>CDATASection</span></p>
<p><span>CDATASection</span><span>对象包含文本中未被解析块的内容。</span></p>
<img src ="http://www.blogjava.net/RexMao/aggbug/119304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-05-23 09:13 <a href="http://www.blogjava.net/RexMao/archive/2007/05/23/119304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 调用本地文件</title><link>http://www.blogjava.net/RexMao/archive/2007/05/15/117511.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Tue, 15 May 2007 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/05/15/117511.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/117511.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/05/15/117511.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/117511.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/117511.html</trackback:ping><description><![CDATA[好几天没有写了，今天在做毕业设计时遇到要打开系统上的文件，而文件类型事先是不可知的，所以不能用以前知道的那种方法，Runtime.getRuntime().exec("notepad c:/a.txt");在网上搜到一个类BrowserLauncher，这个类可以调用文件关联打开文件，好处在于它对不同的系统可以不同的对待，保持了java的跨平台性，有兴趣的可以用google搜BrowserLauncher，不要用baidu。<br>我看了一下Windows XP/NT系统的调用，就是写成Runtime.getRuntime.exec("cmd /c start "+url);<br>
<img src ="http://www.blogjava.net/RexMao/aggbug/117511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-05-15 09:45 <a href="http://www.blogjava.net/RexMao/archive/2007/05/15/117511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java画图程序技术小结（三） 画图的鼠标事件处理</title><link>http://www.blogjava.net/RexMao/archive/2007/04/24/113260.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Tue, 24 Apr 2007 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/04/24/113260.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/113260.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/04/24/113260.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/113260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/113260.html</trackback:ping><description><![CDATA[<p><span>画图的鼠标事件处理是画图程序中比较复杂的内容，这里只是简单介绍，有兴趣的可以看程序。</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point p0,p1;//</span><span>记录拖拽画图的起点和终点</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p0=new Point();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1=new Point();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span>鼠标按下，主要记录按下的点</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void jPaneDraw_mousePressed(MouseEvent e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p0=new Point(e.getX(),e.getY());<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span>鼠标拖拽过程，根据不同的图形，画出拖拽过程的图形，复杂图形可以用矩形代替</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void jPaneDraw_mouseDragged(MouseEvent e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch(toolMode){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 0:{ //</span><span>直线</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.x = e.getX();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p1.y = e.getY();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.setColor(col);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.drawLine(p0.x, p0.y, p1.x, p1.y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jPaneDraw.repaint();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...//</span><span>其它图形</span><span><br>}<br>}<br>//</span><span>鼠标抬起，根据</span><span>p0</span><span>和</span><span>p1</span><span>生成对应的图形</span><span><br>void jPaneDraw_mouseReleased(MouseEvent e) {<br>&nbsp;&nbsp;&nbsp;switch(toolMode){<br>case 0:{ //</span><span>直线</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CusLine2D aCusShape = new CusLine2D(p0.x, p0.y, p1.x, p1.y); //</span><span>建立图形</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...//</span><span>将图形加入到图形列表</span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...//</span><span>其它图形</span><span><br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jPaneDraw.repaint();<br>}</span></p>
<img src ="http://www.blogjava.net/RexMao/aggbug/113260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-04-24 17:07 <a href="http://www.blogjava.net/RexMao/archive/2007/04/24/113260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java画图程序技术小结（二） 重绘与双缓冲</title><link>http://www.blogjava.net/RexMao/archive/2007/04/23/113040.html</link><dc:creator>Rex Mao</dc:creator><author>Rex Mao</author><pubDate>Mon, 23 Apr 2007 13:47:00 GMT</pubDate><guid>http://www.blogjava.net/RexMao/archive/2007/04/23/113040.html</guid><wfw:comment>http://www.blogjava.net/RexMao/comments/113040.html</wfw:comment><comments>http://www.blogjava.net/RexMao/archive/2007/04/23/113040.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RexMao/comments/commentRss/113040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RexMao/services/trackbacks/113040.html</trackback:ping><description><![CDATA[双缓冲，我记得有两种方法，一种是两个图象，一个前台Graphics，一个后台Graphics，画图时在后台画，画好了，再用前台的Graphics画后台Graphics的图片。另一种是有两个或多个图象，不分前后台，显示一个图象时，另外的在画，图象循环使用（c语言时用过）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;给出第一种的java实现<br><span lang=EN-US><span><font face="Times New Roman"><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a、</font><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></font></span></span><span style="FONT-FAMILY: 宋体"><font size=3>定义后台图象</font></span><span lang=EN-US><font face="Times New Roman" size=3>BufferedImage offScreenImg=offScreenImg = new BufferedImage(this.maxX, this.maxY,<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; BufferedImage.TYPE_INT_RGB);<br></font></span>
<p><font face="Times New Roman"><span lang=EN-US><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span lang=EN-US><span><font size=3>b、</font><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span></font><font size=3><span style="FONT-FAMILY: 宋体">得到后台的</span><span lang=EN-US><font face="Times New Roman">Graphics</font></span><span style="FONT-FAMILY: 宋体">实例</span></font>
<p><font size=3><span style="FONT-FAMILY: 宋体"></span></font><span lang=EN-US><font face="Times New Roman" size=3><font face=宋体>&nbsp;&nbsp;&nbsp; </font>Graphics2D offScreenG;</font></span>
<p><font size=3><span lang=EN-US><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span lang=EN-US><font face="Times New Roman">offScreenG = offScreenImg.createGraphics();</font></span></font>
<p><font face="Times New Roman"><font size=3><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font><span lang=EN-US><span><font size=3>c、</font><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span></font><font size=3><span style="FONT-FAMILY: 宋体">覆盖</span><span lang=EN-US><font face="Times New Roman">paintComponent</font></span><span style="FONT-FAMILY: 宋体">方法</span></font>
<p><font size=3><span style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></font><span lang=EN-US><font face="Times New Roman" size=3>public void paintComponent(Graphics g) {</font></span>
<p><font size=3><span lang=EN-US><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span lang=EN-US><font face="Times New Roman">super.paintComponent(g);</font></span></font>
<p><font face="Times New Roman" size=3><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><span lang=EN-US><font size=3><font face="Times New Roman">g.drawImage(offScreenImg, 0, 0, this.maxX, this.maxY, this);</font></font></span>
<p><font size=3><span lang=EN-US><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span lang=EN-US><font face="Times New Roman">}</font></span></font>
<p><font face="Times New Roman" size=3><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font><font size=3><span style="FONT-FAMILY: 宋体">绘制时用后台</span><span lang=EN-US><font face="Times New Roman">Graphics</font></span><span style="FONT-FAMILY: 宋体">，绘制好后，调用</span><span lang=EN-US><font face="Times New Roman">repaint()</font></span><span style="FONT-FAMILY: 宋体">，将</span><span lang=EN-US><font face="Times New Roman">offScreenImg</font></span><span style="FONT-FAMILY: 宋体">绘到面板上。</span></font><span style="FONT-FAMILY: 宋体"> </p>
</span><br>
<img src ="http://www.blogjava.net/RexMao/aggbug/113040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RexMao/" target="_blank">Rex Mao</a> 2007-04-23 21:47 <a href="http://www.blogjava.net/RexMao/archive/2007/04/23/113040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>