﻿<?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-I'll be back!</title><link>http://www.blogjava.net/zolly/</link><description>　　Focus on BPM, celebrate PegaRULES Process Commander (PRPC)</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 16:55:40 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 16:55:40 GMT</pubDate><ttl>60</ttl><item><title>"No suitable driver found" error when connecting to different database with Pega rule base</title><link>http://www.blogjava.net/zolly/archive/2014/06/03/No_suitable_driver_found.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Mon, 02 Jun 2014 18:15:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2014/06/03/No_suitable_driver_found.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/414326.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2014/06/03/No_suitable_driver_found.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/414326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/414326.html</trackback:ping><description><![CDATA[<div>Go into SMA -&gt; Advanced -&gt; Etier Runtime Environment</div><div>For Java class name (e.g.: com.microsoft.sqlserver.jdbc.SQLServerDriver) click on the Lookup Java Class button and confirm that the Java class is being found in the lib directory where you have put the jar file.&nbsp;</div><div></div><div>If the class is not found there please confirm that you restarted the app server after adding the jar file to the lib directory.</div><div></div><div>If the class is found in the lib directory like it should be please go back to the Database rule and try the test connection again and this time it should work.</div><img src ="http://www.blogjava.net/zolly/aggbug/414326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2014-06-03 02:15 <a href="http://www.blogjava.net/zolly/archive/2014/06/03/No_suitable_driver_found.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringFramework 4 + Hibernate 4 + Maven 实例</title><link>http://www.blogjava.net/zolly/archive/2014/04/01/SpringFramework4_Hibernate4_Maven.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Tue, 01 Apr 2014 00:40:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2014/04/01/SpringFramework4_Hibernate4_Maven.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/411766.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2014/04/01/SpringFramework4_Hibernate4_Maven.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/411766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/411766.html</trackback:ping><description><![CDATA[1. 下载Eclipse工程文件：<a href="http://www.blogjava.net/Files/zolly/RequestLogging.zip" target="_blank" title="Eclipse 工程文件">ClientLogging.zip<br /></a>2. 根据工程文件中的SQL文件db-mssql.sql创建数据库表。<br />3. 根据需要修改db-mssql.properties<br />4. 执行Maven Install生成war包，部署到Tomcat。或者在Eclipse中部署Tomcat Server运行。<br />5. 访问http://localhost:8080/RequestLogging/loggings<img src ="http://www.blogjava.net/zolly/aggbug/411766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2014-04-01 08:40 <a href="http://www.blogjava.net/zolly/archive/2014/04/01/SpringFramework4_Hibernate4_Maven.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java读写Oracle BLOB字段示例</title><link>http://www.blogjava.net/zolly/archive/2013/05/28/CopyOracleBLOB.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Tue, 28 May 2013 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2013/05/28/CopyOracleBLOB.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/399864.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2013/05/28/CopyOracleBLOB.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/399864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/399864.html</trackback:ping><description><![CDATA[导入导出Oracle BLOB字段不能使用SQL，可以使用EXP或者EXPDP<br /><br />EXP导出示例：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->exp&nbsp;name/password@orcl&nbsp;file=E:/exp.dump&nbsp;log=E:/exp.log table=(tb_emp) query="""where&nbsp;UserName='FN'"""</div><br />EXPDP导出示例：<br />Sample.bat<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->expdp&nbsp;name/password@orcl&nbsp;parfile=E:/expdp.par</div>expdp.par<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->DIRECTORY=dir_dump<br />DUMPFILE=backup.dump<br />LOGFILE=backup.log<br />TABLES=pr_data_admin<br />QUERY=pr_data_admin:"where&nbsp;UserName='FN'"</div><br />以上方法因为我电脑上的Oracle版本对不上，总是报错，后来采用java的方法，本文主要介绍如何使用java读写Oracle的BLOB字段，达到复制转移BLOB数据的目的。代码如下，加入ojdbc.jar，复制代码可以直接运行：<br />DBConnection.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.zolly.blob;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.sql.Connection;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.sql.DriverManager;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DBConnection&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Connection&nbsp;getDBConnectionFrom()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;driver&nbsp;=&nbsp;"oracle.jdbc.driver.OracleDriver";<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;database&nbsp;driver</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;"jdbc:oracle:thin:@192.168.1.2:1545:ORCL";<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;database&nbsp;URL</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;user&nbsp;=&nbsp;"user1";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;database&nbsp;name</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password&nbsp;=&nbsp;"password1";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;database&nbsp;Password</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(driver);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con&nbsp;=&nbsp;DriverManager.getConnection(url,&nbsp;user,&nbsp;password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;con;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Connection&nbsp;getDBConnectionTo()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;driver&nbsp;=&nbsp;"oracle.jdbc.driver.OracleDriver";<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;database&nbsp;driver</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;"jdbc:oracle:thin:@192.168.1.3:1521:ORCL";<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;database&nbsp;URL</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;user&nbsp;=&nbsp;"user2";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;database&nbsp;name</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password&nbsp;=&nbsp;"password2";&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;database&nbsp;Password</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class.forName(driver);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con&nbsp;=&nbsp;DriverManager.getConnection(url,&nbsp;user,&nbsp;password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;con;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />BLOBUtil.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.zolly.blob;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileInputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileOutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.OutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.sql.Connection;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.sql.ResultSet;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.sql.Statement;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;oracle.sql.BLOB;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;BLOBUtil&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings("deprecation")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;writeBLOB()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;start&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;count&nbsp;runtime</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;fin&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;outStream&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;=&nbsp;"E:\\requestor.txt";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(path);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con&nbsp;=&nbsp;DBConnection.getDBConnectionTo();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(<span style="color: #0000FF; ">false</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;stmt&nbsp;=&nbsp;con.createStatement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;stmt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.executeQuery("select&nbsp;pzPVStream&nbsp;from&nbsp;pr_data_admin&nbsp;where&nbsp;pxInsName='PEGA!BROWSER'&nbsp;for&nbsp;update");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;get&nbsp;specially&nbsp;columns&nbsp;and&nbsp;rows&nbsp;for&nbsp;update</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(rs.next())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;System.out.print(rs.getInt(1)+rs.getString(2)+"\n");</span><span style="color: #008000; ">//</span><span style="color: #008000; ">print<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;select&nbsp;sql&nbsp;for&nbsp;debug</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLOB&nbsp;blob&nbsp;=&nbsp;(BLOB)&nbsp;rs.getBlob("pzPVStream");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream&nbsp;=&nbsp;blob.getBinaryOutputStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fin&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream(file);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;put&nbsp;file&nbsp;into&nbsp;stream</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;b&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">byte</span>[blob.getBufferSize()];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((len&nbsp;=&nbsp;fin.read(b))&nbsp;!=&nbsp;-1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.write(b,&nbsp;0,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fin.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.flush();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("\nupdate&nbsp;ok\n");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.commit();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;end&nbsp;=&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(end&nbsp;-&nbsp;start);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;readBLOB()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;start&nbsp;=&nbsp;System.currentTimeMillis();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;count&nbsp;runtime</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;=&nbsp;"E:\\requestor.txt";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(path);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con&nbsp;=&nbsp;DBConnection.getDBConnectionFrom();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(<span style="color: #0000FF; ">false</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;stmt&nbsp;=&nbsp;con.createStatement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;stmt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.executeQuery("select&nbsp;pzPVStream&nbsp;from&nbsp;pr_data_admin&nbsp;where&nbsp;pxInsName='PEGA!BROWSER'");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;get&nbsp;blob&nbsp;form&nbsp;your&nbsp;table</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(rs.next())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLOB&nbsp;blob&nbsp;=&nbsp;(BLOB)&nbsp;rs.getBlob("pzPVStream");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;get&nbsp;word&nbsp;column</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;output&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileOutputStream(file);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;define&nbsp;a&nbsp;file&nbsp;output&nbsp;stream</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;input&nbsp;=&nbsp;blob.getBinaryStream();<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;put&nbsp;blob&nbsp;into<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;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;input</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;buffer&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">byte</span>[blob.getBufferSize()];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;if&nbsp;use&nbsp;1024&nbsp;it&nbsp;will&nbsp;lose&nbsp;some&nbsp;bytes</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((len&nbsp;=&nbsp;input.read(buffer))&nbsp;!=&nbsp;-1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;get&nbsp;all&nbsp;input&nbsp;stream&nbsp;into&nbsp;output&nbsp;file&nbsp;stream</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.write(buffer,&nbsp;0,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.flush();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("\ndownload&nbsp;ok\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;end&nbsp;=&nbsp;System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(end&nbsp;-&nbsp;start);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLOBUtil.readBLOB();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLOBUtil.writeBLOB();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><img src ="http://www.blogjava.net/zolly/aggbug/399864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2013-05-28 13:33 <a href="http://www.blogjava.net/zolly/archive/2013/05/28/CopyOracleBLOB.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Java API的DESede(Triple-DES)加密解密示例</title><link>http://www.blogjava.net/zolly/archive/2013/05/25/DESede_Encryption.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Fri, 24 May 2013 17:50:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2013/05/25/DESede_Encryption.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/399685.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2013/05/25/DESede_Encryption.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/399685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/399685.html</trackback:ping><description><![CDATA[DESede又称Triple-DES即三重DES加密算法，加强了DES的安全性，但速度稍慢，它是一种对称加密算法，加密解密都是用同一个密钥。本文介绍使用Java自带的API实现DEDede加密解密。<br /><br />Bouncy Castle也支持DES算法，具体没有深入研究，有兴趣的可以下载相应的API进行测试。<br /><a href="http://www.bouncycastle.org/">http://www.bouncycastle.org/</a><br /><br />以下代码基本上覆盖了生成密钥以及加密解密的全过程，拷贝代码可以直接运行。(代码摘自网络)<br />每次生成密钥都会不一样，一般来说密钥需要生成文件并妥善保存。<br /><div>DESedeCoder.java</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.zolly.bouncycastle;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.BufferedOutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileOutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.Key;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.Cipher;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.KeyGenerator;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.SecretKey;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.SecretKeyFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.spec.DESedeKeySpec;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.sun.org.apache.xml.internal.security.utils.Base64;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;DESede对称加密算法演示<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;zolly<br />&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DESedeCoder&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;密钥算法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;KEY_ALGORITHM&nbsp;=&nbsp;"DESede";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加密/解密算法/工作模式/填充方式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;CIPHER_ALGORITHM&nbsp;=&nbsp;"DESede/ECB/PKCS5Padding";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;生成密钥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;byte[]&nbsp;二进制密钥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;initkey()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;实例化密钥生成器</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyGenerator&nbsp;kg&nbsp;=&nbsp;KeyGenerator.getInstance(KEY_ALGORITHM);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;初始化密钥生成器</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kg.init(168);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;生成密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;secretKey&nbsp;=&nbsp;kg.generateKey();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;获取二进制密钥编码形式</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;key&nbsp;=&nbsp;secretKey.getEncoded();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedOutputStream&nbsp;keystream&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedOutputStream(<span style="color: #0000FF; ">new</span>&nbsp;FileOutputStream("DESedeKey.dat"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keystream.write(key,&nbsp;0,&nbsp;key.length);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keystream.flush();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keystream.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;key;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;转换密钥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二进制密钥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;Key&nbsp;密钥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Key&nbsp;toKey(<span style="color: #0000FF; ">byte</span>[]&nbsp;key)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;实例化Des密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DESedeKeySpec&nbsp;dks&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DESedeKeySpec(key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;实例化密钥工厂</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecretKeyFactory&nbsp;keyFactory&nbsp;=&nbsp;SecretKeyFactory<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getInstance(KEY_ALGORITHM);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;生成密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;secretKey&nbsp;=&nbsp;keyFactory.generateSecret(dks);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;secretKey;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;加密数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;待加密数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;密钥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;byte[]&nbsp;加密后的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;encrypt(<span style="color: #0000FF; ">byte</span>[]&nbsp;data,&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;key)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;还原密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;k&nbsp;=&nbsp;toKey(key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;实例化</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;cipher&nbsp;=&nbsp;Cipher.getInstance(CIPHER_ALGORITHM);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;初始化，设置为加密模式</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cipher.init(Cipher.ENCRYPT_MODE,&nbsp;k);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;执行操作</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cipher.doFinal(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解密数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;待解密数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;密钥<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;byte[]&nbsp;解密后的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;decrypt(<span style="color: #0000FF; ">byte</span>[]&nbsp;data,&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;key)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;欢迎密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;k&nbsp;=&nbsp;toKey(key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;实例化</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;cipher&nbsp;=&nbsp;Cipher.getInstance(CIPHER_ALGORITHM);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;初始化，设置为解密模式</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cipher.init(Cipher.DECRYPT_MODE,&nbsp;k);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;执行操作</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cipher.doFinal(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;进行加解密的测试<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;"DESede";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("原文："&nbsp;+&nbsp;str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;初始化密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;key&nbsp;=&nbsp;DESedeCoder.initkey();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("密钥："&nbsp;+&nbsp;Base64.encode(key));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;加密数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;data&nbsp;=&nbsp;DESedeCoder.encrypt(str.getBytes(),&nbsp;key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("加密后："&nbsp;+&nbsp;Base64.encode(data));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;解密数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;DESedeCoder.decrypt(data,&nbsp;key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("解密后："&nbsp;+&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(data));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br />正对以上代码，我进行了适当修改，使其变得更加实用。我的主要应用是把客户的数据加密保存到数据库，取出来的时候再解密，保证数据库数据的安全。注意我固定了密钥，以防密钥一旦丢失，所有数据都变成乱码了，固定密钥安全性有所降低，但是对数据库字段加密安全性已经足够了。<br /><div>DESedeTest.java</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.zolly.bouncycastle;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.InvalidKeyException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.NoSuchAlgorithmException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.spec.InvalidKeySpecException;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.BadPaddingException;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.Cipher;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.IllegalBlockSizeException;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.NoSuchPaddingException;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.SecretKey;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.SecretKeyFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.spec.DESedeKeySpec;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.sun.org.apache.xml.internal.security.utils.Base64;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DESedeTest&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;args<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br /><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strText&nbsp;=&nbsp;"This is a testing";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text1&nbsp;=&nbsp;DESedeTest.encryptProperty(strText);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;text2&nbsp;=&nbsp;DESedeTest.decryptProperty(text1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(text1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(text2);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;encryptProperty(String&nbsp;clearText)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;KEY_STRING&nbsp;= "RRYa6li5NGFodgKUtvS1I6fZwY8xpJjI";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;key&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;Base64.decode(KEY_STRING);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Base64DecodingException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DESedeTest.performDESedeCoder(clearText,&nbsp;key,&nbsp;<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;decryptProperty(String&nbsp;cipherText)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;KEY_STRING&nbsp;= "RRYa6li5NGFodgKUtvS1I6fZwY8xpJjI";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;key&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;Base64.decode(KEY_STRING);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Base64DecodingException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DESedeTest.performDESedeCoder(cipherText,&nbsp;key,&nbsp;<span style="color: #0000FF; ">false</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;performDESedeCoder(String&nbsp;inputValue,&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;key,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;encrypt)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;rtnValue&nbsp;=&nbsp;"";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;KEY_ALGORITHM&nbsp;=&nbsp;"DESede";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;CIPHER_ALGORITHM&nbsp;=&nbsp;"DESede/ECB/PKCS5Padding";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;data&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DESedeKeySpec&nbsp;dks&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DESedeKeySpec(key);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecretKeyFactory&nbsp;keyFactory&nbsp;=&nbsp;SecretKeyFactory<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getInstance(KEY_ALGORITHM);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SecretKey&nbsp;secretKey&nbsp;=&nbsp;keyFactory.generateSecret(dks);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;cipher&nbsp;=&nbsp;Cipher.getInstance(CIPHER_ALGORITHM);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;input&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(encrypt)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cipher.init(Cipher.ENCRYPT_MODE,&nbsp;secretKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;=&nbsp;inputValue.getBytes();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cipher.init(Cipher.DECRYPT_MODE,&nbsp;secretKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input&nbsp;=&nbsp;Base64.decode(inputValue);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;cipher.doFinal(input);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InvalidKeyException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(NoSuchAlgorithmException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InvalidKeySpecException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(NoSuchPaddingException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IllegalBlockSizeException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(BadPaddingException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Base64DecodingException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(data&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rtnValue&nbsp;=&nbsp;inputValue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(encrypt)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rtnValue&nbsp;=&nbsp;com.sun.org.apache.xml.internal.security.utils.Base64<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;.encode(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rtnValue&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;rtnValue;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><img src ="http://www.blogjava.net/zolly/aggbug/399685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2013-05-25 01:50 <a href="http://www.blogjava.net/zolly/archive/2013/05/25/DESede_Encryption.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Java Bouncy Castle的PGP加密解密示例</title><link>http://www.blogjava.net/zolly/archive/2013/05/24/PGP_Encryption.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Fri, 24 May 2013 00:37:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2013/05/24/PGP_Encryption.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/399684.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2013/05/24/PGP_Encryption.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/399684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/399684.html</trackback:ping><description><![CDATA[<div>PGP即Pretty Good Privacy，是一个基于RSA公钥&amp;私钥及AES等非对称加密算法的加密软件系列，比较具有代表性加密解密客户端已被Symantec收购，详见www.pgp.com，在Symantec的网站上可以下载最新版客户端软件。<br /><br />本文讲的是使用Java基于Bouncy Castle包的PGP加密解密示例，按照以下步骤即可轻松实现：<br /><br />1. 客户端软件<br />由于Symantec的PGP客户端是收费软件，本文只需要使用其中的生成秘钥和加密文件的功能，用该软件有些浪费，所以我下载了Java 免费版的Portable PGP(<a href="http://sourceforge.net/projects/ppgp/">http://sourceforge.net/projects/ppgp/</a>)<br /><br />2. 下载Bouncy Castle包<br /><a href="http://www.bouncycastle.org/latest_releases.html">http://www.bouncycastle.org/latest_releases.html<br /></a><div>bcprov-jdk15on-148.jar和bcpg-jdk15on-148.jar<br />Bouncy Castle支持大量的密码术算法，其中包括OpenPGP，引用很广泛，Pega就是使用Bouncy Castle对邮件和客户重要数据进行加密解密的。<br />它既可以安装成JDK扩展也可以放到特定java项目中使用。<br /><br />3. 在Oracle官网下载UnlimitedJCEPolicy<br /><div><a href="http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html">http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html<br /></a>JDK默认Policy只能支持&lt;=128位Key，GPG的密钥从1024-2048，所以必须扩展该Policy。具体安装方法参考文件中的ReadMe文件。</div><br />4. 编写代码</div>使用Portable PGP加密文件后生成Public Key和Private Key。把试用Public Key加密的文件"Encrypted File.txt"和Private Key "Key.asc"一同放到项目文件夹中。<br />使用以下代码即可解密文件。(拷贝以下代码可以直接执行，以下代码也是来自Bouncy Castle源代码包)<br /><br /><div>PGPExampleUtil.java</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.zolly.bouncycastle;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.BufferedInputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.ByteArrayOutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileInputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.NoSuchProviderException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Iterator;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPCompressedDataGenerator;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPException;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPLiteralData;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPPrivateKey;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPPublicKey;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPPublicKeyRing;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPPublicKeyRingCollection;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPSecretKey;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPSecretKeyRing;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPSecretKeyRingCollection;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPUtil;<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;PGPExampleUtil<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;compressFile(String&nbsp;fileName,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;algorithm)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;bOut&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ByteArrayOutputStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPCompressedDataGenerator&nbsp;comData&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPCompressedDataGenerator(algorithm);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPUtil.writeFileToLiteralData(comData.open(bOut),&nbsp;PGPLiteralData.BINARY,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(fileName));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comData.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;bOut.toByteArray();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Search&nbsp;a&nbsp;secret&nbsp;key&nbsp;ring&nbsp;collection&nbsp;for&nbsp;a&nbsp;secret&nbsp;key&nbsp;corresponding&nbsp;to&nbsp;keyID&nbsp;if&nbsp;it<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;exists.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;pgpSec&nbsp;a&nbsp;secret&nbsp;key&nbsp;ring&nbsp;collection.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;keyID&nbsp;keyID&nbsp;we&nbsp;want.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;pass&nbsp;passphrase&nbsp;to&nbsp;decrypt&nbsp;secret&nbsp;key&nbsp;with.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;PGPException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;NoSuchProviderException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;PGPPrivateKey&nbsp;findSecretKey(PGPSecretKeyRingCollection&nbsp;pgpSec,&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;keyID,&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;pass)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;PGPException,&nbsp;NoSuchProviderException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPSecretKey&nbsp;pgpSecKey&nbsp;=&nbsp;pgpSec.getSecretKey(keyID);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pgpSecKey&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pgpSecKey.extractPrivateKey(pass,&nbsp;"BC");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;PGPPublicKey&nbsp;readPublicKey(String&nbsp;fileName)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;PGPException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;keyIn&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedInputStream(<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream(fileName));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPPublicKey&nbsp;pubKey&nbsp;=&nbsp;readPublicKey(keyIn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyIn.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pubKey;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;A&nbsp;simple&nbsp;routine&nbsp;that&nbsp;opens&nbsp;a&nbsp;key&nbsp;ring&nbsp;file&nbsp;and&nbsp;loads&nbsp;the&nbsp;first&nbsp;available&nbsp;key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;suitable&nbsp;for&nbsp;encryption.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;input<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;IOException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;PGPException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;PGPPublicKey&nbsp;readPublicKey(InputStream&nbsp;input)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;PGPException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPPublicKeyRingCollection&nbsp;pgpPub&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPPublicKeyRingCollection(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPUtil.getDecoderStream(input));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;we&nbsp;just&nbsp;loop&nbsp;through&nbsp;the&nbsp;collection&nbsp;till&nbsp;we&nbsp;find&nbsp;a&nbsp;key&nbsp;suitable&nbsp;for&nbsp;encryption,&nbsp;in&nbsp;the&nbsp;real<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;world&nbsp;you&nbsp;would&nbsp;probably&nbsp;want&nbsp;to&nbsp;be&nbsp;a&nbsp;bit&nbsp;smarter&nbsp;about&nbsp;this.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//<br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;keyRingIter&nbsp;=&nbsp;pgpPub.getKeyRings();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(keyRingIter.hasNext())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPPublicKeyRing&nbsp;keyRing&nbsp;=&nbsp;(PGPPublicKeyRing)keyRingIter.next();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;keyIter&nbsp;=&nbsp;keyRing.getPublicKeys();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(keyIter.hasNext())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPPublicKey&nbsp;key&nbsp;=&nbsp;(PGPPublicKey)keyIter.next();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.isEncryptionKey())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;key;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalArgumentException("Can't&nbsp;find&nbsp;encryption&nbsp;key&nbsp;in&nbsp;key&nbsp;ring.");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;PGPSecretKey&nbsp;readSecretKey(String&nbsp;fileName)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;PGPException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;keyIn&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedInputStream(<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream(fileName));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPSecretKey&nbsp;secKey&nbsp;=&nbsp;readSecretKey(keyIn);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyIn.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;secKey;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;A&nbsp;simple&nbsp;routine&nbsp;that&nbsp;opens&nbsp;a&nbsp;key&nbsp;ring&nbsp;file&nbsp;and&nbsp;loads&nbsp;the&nbsp;first&nbsp;available&nbsp;key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;suitable&nbsp;for&nbsp;signature&nbsp;generation.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;input&nbsp;stream&nbsp;to&nbsp;read&nbsp;the&nbsp;secret&nbsp;key&nbsp;ring&nbsp;collection&nbsp;from.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;a&nbsp;secret&nbsp;key.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;IOException&nbsp;on&nbsp;a&nbsp;problem&nbsp;with&nbsp;using&nbsp;the&nbsp;input&nbsp;stream.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;PGPException&nbsp;if&nbsp;there&nbsp;is&nbsp;an&nbsp;issue&nbsp;parsing&nbsp;the&nbsp;input&nbsp;stream.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;PGPSecretKey&nbsp;readSecretKey(InputStream&nbsp;input)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;PGPException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPSecretKeyRingCollection&nbsp;pgpSec&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPSecretKeyRingCollection(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPUtil.getDecoderStream(input));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;we&nbsp;just&nbsp;loop&nbsp;through&nbsp;the&nbsp;collection&nbsp;till&nbsp;we&nbsp;find&nbsp;a&nbsp;key&nbsp;suitable&nbsp;for&nbsp;encryption,&nbsp;in&nbsp;the&nbsp;real<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;world&nbsp;you&nbsp;would&nbsp;probably&nbsp;want&nbsp;to&nbsp;be&nbsp;a&nbsp;bit&nbsp;smarter&nbsp;about&nbsp;this.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//<br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;keyRingIter&nbsp;=&nbsp;pgpSec.getKeyRings();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(keyRingIter.hasNext())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPSecretKeyRing&nbsp;keyRing&nbsp;=&nbsp;(PGPSecretKeyRing)keyRingIter.next();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;keyIter&nbsp;=&nbsp;keyRing.getSecretKeys();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(keyIter.hasNext())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPSecretKey&nbsp;key&nbsp;=&nbsp;(PGPSecretKey)keyIter.next();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.isSigningKey())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;key;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalArgumentException("Can't&nbsp;find&nbsp;signing&nbsp;key&nbsp;in&nbsp;key&nbsp;ring.");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><div>KeyBasedLargeFileProcessor.java</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;com.zolly.bouncycastle;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.BufferedInputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.BufferedOutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileInputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileOutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.OutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.NoSuchProviderException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.SecureRandom;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.security.Security;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Iterator;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.bcpg.ArmoredOutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.jce.provider.BouncyCastleProvider;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPCompressedData;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPCompressedDataGenerator;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPEncryptedData;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPEncryptedDataGenerator;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPEncryptedDataList;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPException;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPLiteralData;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPObjectFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPOnePassSignatureList;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPPrivateKey;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPPublicKey;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPPublicKeyEncryptedData;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPSecretKeyRingCollection;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.PGPUtil;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.bouncycastle.util.io.Streams;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;A&nbsp;simple&nbsp;utility&nbsp;class&nbsp;that&nbsp;encrypts/decrypts&nbsp;public&nbsp;key&nbsp;based<br />&nbsp;*&nbsp;encryption&nbsp;large&nbsp;files.<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;KeyBasedLargeFileProcessor<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;decryptFile(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;inputFileName,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;keyFileName,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;passwd,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;defaultFileName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;NoSuchProviderException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;in&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedInputStream(<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream(inputFileName));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;keyIn&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedInputStream(<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream(keyFileName));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decryptFile(in,&nbsp;keyIn,&nbsp;passwd,&nbsp;defaultFileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keyIn.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;decrypt&nbsp;the&nbsp;passed&nbsp;in&nbsp;message&nbsp;stream<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;decryptFile(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;in,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;keyIn,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;passwd,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultFileName)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;NoSuchProviderException<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;=&nbsp;PGPUtil.getDecoderStream(in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPObjectFactory&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pgpF&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPObjectFactory(in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPEncryptedDataList&nbsp;&nbsp;&nbsp;&nbsp;enc;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o&nbsp;=&nbsp;pgpF.nextObject();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;the&nbsp;first&nbsp;object&nbsp;might&nbsp;be&nbsp;a&nbsp;PGP&nbsp;marker&nbsp;packet.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(o&nbsp;<span style="color: #0000FF; ">instanceof</span>&nbsp;PGPEncryptedDataList)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enc&nbsp;=&nbsp;(PGPEncryptedDataList)o;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enc&nbsp;=&nbsp;(PGPEncryptedDataList)pgpF.nextObject();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;find&nbsp;the&nbsp;secret&nbsp;key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it&nbsp;=&nbsp;enc.getEncryptedDataObjects();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPPrivateKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sKey&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPPublicKeyEncryptedData&nbsp;&nbsp;&nbsp;pbe&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPSecretKeyRingCollection&nbsp;&nbsp;pgpSec&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPSecretKeyRingCollection(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPUtil.getDecoderStream(keyIn));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(sKey&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;it.hasNext())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbe&nbsp;=&nbsp;(PGPPublicKeyEncryptedData)it.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sKey&nbsp;=&nbsp;PGPExampleUtil.findSecretKey(pgpSec,&nbsp;pbe.getKeyID(),&nbsp;passwd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(sKey&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalArgumentException("secret&nbsp;key&nbsp;for&nbsp;message&nbsp;not&nbsp;found.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clear&nbsp;=&nbsp;pbe.getDataStream(<span style="color: #0000FF; ">new</span>&nbsp;JcePublicKeyDataDecryptorFactoryBuilder().setProvider("BC").build(sKey));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPObjectFactory&nbsp;&nbsp;&nbsp;&nbsp;plainFact&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPObjectFactory(clear);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPCompressedData&nbsp;&nbsp;&nbsp;cData&nbsp;=&nbsp;(PGPCompressedData)plainFact.nextObject();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compressedStream&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedInputStream(cData.getDataStream());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPObjectFactory&nbsp;&nbsp;&nbsp;&nbsp;pgpFact&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPObjectFactory(compressedStream);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;pgpFact.nextObject();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(message&nbsp;<span style="color: #0000FF; ">instanceof</span>&nbsp;PGPLiteralData)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPLiteralData&nbsp;ld&nbsp;=&nbsp;(PGPLiteralData)message;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;outFileName&nbsp;=&nbsp;ld.getFileName();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(outFileName.length()&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outFileName&nbsp;=&nbsp;defaultFileName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;unc&nbsp;=&nbsp;ld.getInputStream();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;fOut&nbsp;=&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedOutputStream(<span style="color: #0000FF; ">new</span>&nbsp;FileOutputStream(outFileName));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Streams.pipeAll(unc,&nbsp;fOut);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fOut.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(message&nbsp;<span style="color: #0000FF; ">instanceof</span>&nbsp;PGPOnePassSignatureList)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPException("encrypted&nbsp;message&nbsp;contains&nbsp;a&nbsp;signed&nbsp;message&nbsp;-&nbsp;not&nbsp;literal&nbsp;data.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPException("message&nbsp;is&nbsp;not&nbsp;a&nbsp;simple&nbsp;encrypted&nbsp;file&nbsp;-&nbsp;type&nbsp;unknown.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pbe.isIntegrityProtected())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!pbe.verify())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("message&nbsp;failed&nbsp;integrity&nbsp;check");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("message&nbsp;integrity&nbsp;check&nbsp;passed");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("no&nbsp;message&nbsp;integrity&nbsp;check");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(PGPException&nbsp;e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(e.getUnderlyingException()&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.getUnderlyingException().printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;encryptFile(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputFileName,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputFileName,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encKeyFileName,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;armor,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;withIntegrityCheck)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;NoSuchProviderException,&nbsp;PGPException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;out&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedOutputStream(<span style="color: #0000FF; ">new</span>&nbsp;FileOutputStream(outputFileName));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPPublicKey&nbsp;encKey&nbsp;=&nbsp;PGPExampleUtil.readPublicKey(encKeyFileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encryptFile(out,&nbsp;inputFileName,&nbsp;encKey,&nbsp;armor,&nbsp;withIntegrityCheck);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;encryptFile(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;&nbsp;&nbsp;&nbsp;out,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileName,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPPublicKey&nbsp;&nbsp;&nbsp;&nbsp;encKey,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;armor,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;withIntegrityCheck)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;NoSuchProviderException<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(armor)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArmoredOutputStream(out);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPEncryptedDataGenerator&nbsp;&nbsp;&nbsp;cPk&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPEncryptedDataGenerator(<span style="color: #0000FF; ">new</span>&nbsp;JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5).setWithIntegrityPacket(withIntegrityCheck).setSecureRandom(<span style="color: #0000FF; ">new</span>&nbsp;SecureRandom()).setProvider("BC"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cPk.addMethod(<span style="color: #0000FF; ">new</span>&nbsp;JcePublicKeyKeyEncryptionMethodGenerator(encKey).setProvider("BC"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cOut&nbsp;=&nbsp;cPk.open(out,&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">byte</span>[1&nbsp;&lt;&lt;&nbsp;16]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPCompressedDataGenerator&nbsp;&nbsp;comData&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PGPCompressedDataGenerator(<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;PGPCompressedData.ZIP);<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;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PGPUtil.writeFileToLiteralData(comData.open(cOut),&nbsp;PGPLiteralData.BINARY,&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(fileName),&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">byte</span>[1&nbsp;&lt;&lt;&nbsp;16]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comData.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cOut.close();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(armor)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(PGPException&nbsp;e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(e.getUnderlyingException()&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.getUnderlyingException().printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Security.addProvider(<span style="color: #0000FF; ">new</span>&nbsp;BouncyCastleProvider());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;decryptFile("Encypted File.txt.pgp",&nbsp;"Key.asc",&nbsp;"123456789".toCharArray(),&nbsp;"Encypted File.txt");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><img src ="http://www.blogjava.net/zolly/aggbug/399684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2013-05-24 08:37 <a href="http://www.blogjava.net/zolly/archive/2013/05/24/PGP_Encryption.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL删除某些字段重复的记录(只保留一条)</title><link>http://www.blogjava.net/zolly/archive/2013/05/03/SQL_Delete_Duplication.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Thu, 02 May 2013 16:30:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2013/05/03/SQL_Delete_Duplication.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/398697.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2013/05/03/SQL_Delete_Duplication.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/398697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/398697.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: Verdana, Arial, Tahoma; line-height: 25px; background-color: #ffffff;">会员数据需要用到的是下面三个字段:ID(自增),MemberName,MemberAddress.只要会员姓名与会员地址相同就认为是重复记录,重复记录在删除时只保留ID最大的那个.SQL如下:<br /><br /></span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">delete</span>&nbsp;MemberInfo&nbsp;<span style="color: #0000FF; ">where</span>&nbsp;ID&nbsp;<span style="color: #808080; ">not</span>&nbsp;<span style="color: #808080; ">in</span>&nbsp;(<br /><span style="color: #0000FF; ">select</span>&nbsp;<span style="color: #FF00FF; ">max</span>(ID)&nbsp;<span style="color: #0000FF; ">from</span>&nbsp;MemberInfo&nbsp;<span style="color: #0000FF; ">group</span>&nbsp;<span style="color: #0000FF; ">by</span>&nbsp;MemberName,&nbsp;MemberAddress)</div><br /><span style="color: #333333; font-family: Verdana, Arial, Tahoma; line-height: 25px; background-color: #ffffff;">not in的效率可能会低些,但因为是直接操作数据库,所以这并不重要.这个句子还是非常的简单有效的.</span><br style="padding: 0px; margin: 0px; color: #333333; font-family: Verdana, Arial, Tahoma; line-height: 25px; background-color: #ffffff;" /><span style="color: #333333; font-family: Verdana, Arial, Tahoma; line-height: 25px; background-color: #ffffff;">在真正的删除操作前,通常会先了解一下重复记录的情况.可以使用下面的句子:<br /></span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">SELECT</span>&nbsp;<span style="color: #FF00FF; ">COUNT</span>(MemberName)&nbsp;<span style="color: #0000FF; ">AS</span>&nbsp;TheCount,&nbsp;MemberName,&nbsp;MemberAddress<br /><span style="color: #0000FF; ">FROM</span>&nbsp;MemberInfo<br /><span style="color: #0000FF; ">GROUP</span>&nbsp;<span style="color: #0000FF; ">BY</span>&nbsp;MemberName,&nbsp;MemberAddress<br /><span style="color: #0000FF; ">HAVING</span>&nbsp;(<span style="color: #FF00FF; ">COUNT</span>(<span style="color: #808080; ">*</span>)&nbsp;<span style="color: #808080; ">&gt;</span>&nbsp;<span style="color: #800000; font-weight: bold; ">1</span>)</div><img src ="http://www.blogjava.net/zolly/aggbug/398697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2013-05-03 00:30 <a href="http://www.blogjava.net/zolly/archive/2013/05/03/SQL_Delete_Duplication.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>美国洛杉矶申请社会安全号(Social Security Number)指南</title><link>http://www.blogjava.net/zolly/archive/2012/12/14/Apply_US_SSN.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Thu, 13 Dec 2012 23:15:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2012/12/14/Apply_US_SSN.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/392961.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2012/12/14/Apply_US_SSN.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/392961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/392961.html</trackback:ping><description><![CDATA[@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
美国社会安全号简称SSN，相当于中国的身份证，银行开户，驾照，交税，发工资，保险都要用到。参考：www.socialsecurity.gov
<div>到美国后第二周开始申请社保安全号。
<div><br />
</div>
<div>在社会安全局网站上(https://secure.ssa.gov/apps6z/FOLO/fo001.jsp)根据所在地区的邮政编码查询到服务该地区的Social Security Office。office的一般工作时间是周一到周五，早上9点到下午5点，国定假日不开放。</div>
<div><br />
</div>
<div>在Metro网站上查询路线(http://socaltransport.org/tm2_text.php)。坐Metro公交车到那里后已经9：30了，大概100平米的大厅中坐满了人，5、60人的样子，总共才8个窗口，心想要等一上午了。首先在门口的排号机上取了一个号码Q79，然后走到大厅后面的桌子上取了一份申请表开始填，这时听到广播报Q73到8号窗口，我一下子兴奋起来，这么快阿，2分钟填好表格后已经Q76了。后来发现大厅里做的大部分人都是申请退休阿，修改地址等的，可能对新申请的有专门的窗口。</div>
<div><br />
</div>
<div>轮到我了，我在1号窗口，一个阿三摸样的小姑娘问我需要什么服务，我说申请新卡，然后她要求我出示了护照，Visa，I-94，准备出示I-797的，她说不用了，然后问我是否是第一次来美国，我说是，然后她录入、扫描等，2分钟后就递给一张确认单，说1到2周，卡就会寄给我。</div>
<div><br />
</div>
<div>从头到尾不到半个小时，一分钱没花，效率还算比较高。</div>
</div><img src ="http://www.blogjava.net/zolly/aggbug/392961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2012-12-14 07:15 <a href="http://www.blogjava.net/zolly/archive/2012/12/14/Apply_US_SSN.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pega引入Apache POI读Excel</title><link>http://www.blogjava.net/zolly/archive/2012/09/12/Pega_POI_Excel.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Wed, 12 Sep 2012 14:43:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2012/09/12/Pega_POI_Excel.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/387600.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2012/09/12/Pega_POI_Excel.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/387600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/387600.html</trackback:ping><description><![CDATA[<div>read xls - before Excel 2007<br />
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;PRFile&nbsp;file&nbsp;=<span style="color: #0000ff; ">new</span>&nbsp;PRFile("Excel File Name.xls");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;java.io.BufferedInputStream&nbsp;in&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;java.io.BufferedInputStream(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PRInputStream(file));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;open&nbsp;HSSFWorkbook</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.poifs.filesystem.POIFSFileSystem&nbsp;fs&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;org.apache.poi.poifs.filesystem.POIFSFileSystem(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in);<br />
&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.hssf.usermodel.HSSFWorkbook&nbsp;wb&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;org.apache.poi.hssf.usermodel.HSSFWorkbook(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fs);<br />
&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.hssf.usermodel.HSSFCell&nbsp;cell&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;sheetIndex&nbsp;=&nbsp;0;&nbsp;sheetIndex&nbsp;&lt;&nbsp;wb.getNumberOfSheets();&nbsp;sheetIndex++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.hssf.usermodel.HSSFSheet&nbsp;st&nbsp;=&nbsp;wb<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getSheetAt(sheetIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;rowIndex&nbsp;=&nbsp;0;&nbsp;rowIndex&nbsp;&lt;=&nbsp;st.getLastRowNum();&nbsp;rowIndex++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.hssf.usermodel.HSSFRow&nbsp;row&nbsp;=&nbsp;st<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getRow(rowIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(row&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strJobName&nbsp;=&nbsp;"";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell&nbsp;=&nbsp;row.getCell(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strJobName&nbsp;=&nbsp;cell.getStringCellValue().trim();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClipboardProperty&nbsp;propJobName&nbsp;=&nbsp;myStepPage.getProperty(".Jobs(&lt;append&gt;).JobName");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propJobName.setValue(strJobName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />
}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(java.io.FileNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;oLog.error(e.getMessage());<br />
}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(java.io.IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;oLog.error(e.getMessage());<br />
}</div>
</div>
<br />Excel 2007 or later<br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;PRFile&nbsp;file&nbsp;=<span style="color: #0000FF; ">new</span>&nbsp;PRFile("Excel File Name.xlsx");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;java.io.BufferedInputStream&nbsp;in&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;java.io.BufferedInputStream(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PRInputStream(file));<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;open&nbsp;XSSFWorkbook</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.openxml4j.opc.OPCPackage&nbsp;docPackage&nbsp;=&nbsp;org.apache.poi.openxml4j.opc.OPCPackage<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.open(in);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.xssf.usermodel.XSSFWorkbook&nbsp;wb&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;org.apache.poi.xssf.usermodel.XSSFWorkbook(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;docPackage);<br />&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.xssf.usermodel.XSSFCell&nbsp;cell&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;sheetIndex&nbsp;=&nbsp;0;&nbsp;sheetIndex&nbsp;&lt;&nbsp;wb.getNumberOfSheets();&nbsp;sheetIndex++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.xssf.usermodel.XSSFSheet&nbsp;st&nbsp;=&nbsp;wb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getSheetAt(sheetIndex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;rowIndex&nbsp;=&nbsp;0;&nbsp;rowIndex&nbsp;&lt;=&nbsp;st.getLastRowNum();&nbsp;rowIndex++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.poi.xssf.usermodel.XSSFRow&nbsp;row&nbsp;=&nbsp;st<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getRow(rowIndex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(row&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strJobName&nbsp;=&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell&nbsp;=&nbsp;row.getCell(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strJobName&nbsp;=&nbsp;cell.getStringCellValue().trim();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClipboardProperty&nbsp;propJobName&nbsp;=&nbsp;myStepPage.getProperty(".Jobs(&lt;append&gt;).JobName");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propJobName.setValue(strJobName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(java.io.FileNotFoundException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;oLog.error(e.getMessage());<br />}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(java.io.IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;oLog.error(e.getMessage());<br />}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(org.apache.poi.openxml4j.exceptions.InvalidFormatException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;oLog.error(e.getMessage());<br />}</div><img src ="http://www.blogjava.net/zolly/aggbug/387600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2012-09-12 22:43 <a href="http://www.blogjava.net/zolly/archive/2012/09/12/Pega_POI_Excel.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BPM中文论坛推荐</title><link>http://www.blogjava.net/zolly/archive/2011/10/13/BPMCN.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Thu, 13 Oct 2011 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2011/10/13/BPMCN.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/361149.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2011/10/13/BPMCN.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/361149.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/361149.html</trackback:ping><description><![CDATA[推荐一个论坛，BPM中文论坛，网址是<a href="http://bpmcn.5d6d.com/bbs.php">http://bpmcn.5d6d.com/bbs.php</a><br />该论坛旨在为BPM相关专业人员，开发人员或者感兴趣的人提供一个互动交流的平台。<br />坛主做过5年Pega BPM开发，所以目前论中Pega BPM话题居多，Pega BPM在国内并不被大多人知道，但是它在BPM国际市场上的领头羊。所谓"大树底下好乘凉"，不知道未来会怎么样，但是至少BPM领域是近几年的热点，它随着云计算，物联网一起成为2011年的热点词汇，BPM在不久的将来在中国必将成为企业高端应用的典范。<img src ="http://www.blogjava.net/zolly/aggbug/361149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2011-10-13 14:52 <a href="http://www.blogjava.net/zolly/archive/2011/10/13/BPMCN.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样取得临时文件夹StaticContent中文件的绝对路径</title><link>http://www.blogjava.net/zolly/archive/2010/10/20/GetRealPathOfTempDic.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Wed, 20 Oct 2010 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2010/10/20/GetRealPathOfTempDic.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/335677.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2010/10/20/GetRealPathOfTempDic.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/335677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/335677.html</trackback:ping><description><![CDATA[从PRPC用Clipboard得到的Static Content文件的路径类似于这种形式：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">file://web:/StaticContent/global/ServiceExport/文件.xls</span></div>
<br />
有时候需要取得这个文件在服务器上的绝对路径，方法如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">String&nbsp;strFileName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">file://web:/StaticContent/global/ServiceExport/文件.xls</span><span style="color: #000000">"</span><span style="color: #008000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">String&nbsp;myFileRealPath&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;com.pega.pegarules.storage.FileStorageManager.getRealPathForFile(strFileName)</span><span style="color: #008000">;</span></div><img src ="http://www.blogjava.net/zolly/aggbug/335677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2010-10-20 12:44 <a href="http://www.blogjava.net/zolly/archive/2010/10/20/GetRealPathOfTempDic.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决 SQL Server 2005 中文乱码</title><link>http://www.blogjava.net/zolly/archive/2010/08/17/SQLServer2005ChineseCharacter.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Tue, 17 Aug 2010 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2010/08/17/SQLServer2005ChineseCharacter.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/329124.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2010/08/17/SQLServer2005ChineseCharacter.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/329124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/329124.html</trackback:ping><description><![CDATA[如果SQL Server 2005系统排序规则为"Chinese_PRC_CI_AS"，那么数据库及数据库字段排序规则都默认为"Chinese_PRC_CI_AS"，如果字段为varchar，插入中文是完全没问题的。<br />
<br />
如果SQL Server 2005系统排序规则为"SQL_Latin1_General_CP1_CI_AS"，那么数据库及数据库字段排序规则都默认为"SQL_Latin1_General_CP1_CI_AS"，如果字段为varchar，插入中文，数据库显示为"?????"，且数据无法修复。解决办法如下：<br />
<br />
1。 修改字段排序规则为"Chinese_PRC_CI_AS"，varchar改nvarchar，SQL插入语句中，中文字符前加"N"，可以插入中文字符。<br />
2。 修改数据库排序规则为"Chinese_PRC_CI_AS"，字段保持varchar，SQL语句不变，插入中文失败，查看字段属性后发现，字段排序规则实际上没有变化，还是默认为"SQL_Latin1_General_CP1_CI_AS"，再修改字段排序规则，varchar不变，SQL不变，可以插入中文字符。<br />
<br />
总结：<br />
1。 修改系统排序规则没有试过。<br />
2。 修改数据库排序规则不会把数据库中字段的排序规则改掉，但是为了显示中文，数据库排序规则必须改。<br />
3。 仅仅修改字段排序规则，还不能完全解决问题。<img src ="http://www.blogjava.net/zolly/aggbug/329124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2010-08-17 17:23 <a href="http://www.blogjava.net/zolly/archive/2010/08/17/SQLServer2005ChineseCharacter.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突</title><link>http://www.blogjava.net/zolly/archive/2010/06/21/SQLServer2005Collaction.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Sun, 20 Jun 2010 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2010/06/21/SQLServer2005Collaction.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/324024.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2010/06/21/SQLServer2005Collaction.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/324024.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/324024.html</trackback:ping><description><![CDATA[<p>无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。<br />
Cannot resolve the collation conflict between SQL_Latin1_General_CP1_CI_AS and Finnish_Swedish_CI_AS in the equal to operation.</p>
<p>网上有很多解决办法，但基本上都要改动SQL语句。</p>
<p>工作中，从国外得到一个MS SQL Server 2005的备份文件，打算把他还原到本地服务器使用里面的数据。</p>
<p>本地操作系统是MS Windows XP Professional 英文版，安装了MS SQL Server 2005 开发版，还原数据库后，运行数据出现错误如下：<br />
&#8220;无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。&#8221;</p>
<p>检查数据库发现：SQL Server 2005服务器的排序规则是"Chinese_PRC_CI_AS"，而数据库的排序规则是"SQL_Latin1_General_CP1_CI_AS"，在网上查询得知，原因是这两种排序规则不统一所致。我尝试过两种方法让他们统一，但结果都无效：<br />
1。 更改数据库的排序规则为"Chinese_PRC_CI_AS"。通过SQL Server Management Studio图形界面Property-Options-Collaction或SQL语句&#8220;ALTER DATABAS [DBName] COLLATE Chinese_PRC_CI_AS&#8221;更改无效。<br />
2。 重构数据库&#8220;setup.exe /qn INSTANCENAME=SQL2005 REINSTALL=SQL_Engine REBUILDDATABASE=1 SAPWD=sa2005 SQLCOLLATION=SQL_Latin1_General_CP1_CI_AS&#8221; 方法无效。</p>
<p>后来研究了很多种方法，如下载SQL Server 2005企业版安装，但是企业版不适合安装在XP Professional系统上，以失败告终。</p>
<p>最后实在没办法，决定在此重装SQL Server，推测原因最可能还是本地系统使用了中文的排序规则，必须让本Server的地排序规则安装的时候就设置成"SQL_Latin1_General_CP1_CI_AS"，即在纯英文操作系统下安装SQL Server 2005，后来实验成功。具体方法如下：<br />
1。 尽管我的操作系统是XP系统，但是&#8220;区域语言设置&#8221;中全部设置为中文了，当前系统和中文操作系统无异。要让SQL Server 2005顺利安装，需要将所有&#8220;区域语言设置&#8221;都切换成英语(美国)，这个在中文操作系统中也应该有效。<br />
2。 安装MS SQL Server 2005，到&#8220;排序规则设置&#8221;界面时，系统默认选择的是以下拉框的形式选择排序规则的选项，英文状态下应该默认是&#8220;Latin1_General&#8221;，<strong>切忌不要选择这个排序规则，需要选择的是第二个单选框：SQL排序规则(用于确保与旧版本的SQL Server兼容) 这个选项，在列表中选择&#8220;字典顺序，不区分大小写，用于1252字符集。&#8221;</strong>就ok了，这就是传说中的"SQL_Latin1_General_CP1_CI_AS"字符集，即英文字符集。</p>
<p>SQL Server安装好后，打开SQL Server Management Studio界面查看Server的排序规则，确认为"SQL_Latin1_General_CP1_CI_AS"，重新导入外来备份文件，大功告成！</p><img src ="http://www.blogjava.net/zolly/aggbug/324024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2010-06-21 00:23 <a href="http://www.blogjava.net/zolly/archive/2010/06/21/SQLServer2005Collaction.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Legacy System (or Legacy based Application) definition</title><link>http://www.blogjava.net/zolly/archive/2009/12/18/LegacySystem.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Fri, 18 Dec 2009 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2009/12/18/LegacySystem.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/306579.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2009/12/18/LegacySystem.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/306579.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/306579.html</trackback:ping><description><![CDATA[<div>1.&nbsp;Obsolete computer system that may still be in use because its data cannot be changed to newer or standard formats, or its application programs cannot be upgraded.&nbsp;<br />
<a href="http://www.businessdictionary.com/definition/legacy-system.html">http://www.businessdictionary.com/definition/legacy-system.html</a></div>
<div><span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; ">2. &nbsp;An information technology or other automated system that is technologically obsolete. It may be too expensive to update or replace, but it is still needed for the company&#194;&#8217;s operations and thus is kept operational even though a newer system is in use.<br />
<a href="http://www.yourdictionary.com/finance/legacy-system">http://www.yourdictionary.com/finance/legacy-system</a></span></div>
<div><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><span style="font-size: 14px; ">3.&nbsp;Legacy system from Wikipedia&nbsp;(<a href="http://en.wikipedia.org/wiki/Legacy_system">http://en.wikipedia.org/wiki/Legacy_system</a>)</span></font></div>
<div><font  face="Verdana, Arial, Helvetica, sans-serif" size="4"><span  style="font-size: 14px;"><br />
</span></font></div>
<div><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><span style="font-size: 14px; ">*计算机技术飞速发展，日新月异，许多企业因为业务发展的需要和市场竞争的压力，需要建设新的企业信息系统。在这种升级改造的过程中，怎么处理和利用那些历史遗留下来的老系统，成为影响新系统建设成败和开发效率的关键因素之一。我们称这些老系统为遗留系统（legacy &nbsp; system）。 &nbsp;<br />
<a href="http://topic.csdn.net/t/20050719/22/4155342.html">http://topic.csdn.net/t/20050719/22/4155342.html</a>&nbsp;</span></font></div>
<div><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><span style="font-size: 14px; ">&nbsp;&nbsp;　　目前，学术和工业界对遗留系统的定义没有统一的意见。Bennett在1995年对遗留系统作了如下的定义[1]：遗留系统是我们不知道如何处理但对我们的组织又是至关重要的系统。Brodie和Stonebraker对遗留系统的定义如下[2]：遗留系统是指任何基本上不能进行修改和进化以满足新的变化了的业务需求的信息系统。 &nbsp;&nbsp;</span></font></div>
<div><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><span style="font-size: 14px;">&nbsp;&nbsp;　　我们认为，遗留系统应该具有以下特点： &nbsp;&nbsp;</span></font></div>
<div><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><span style="font-size: 14px;">&nbsp;&nbsp;　　（1）系统虽然完成企业中许多重要的业务管理工作，但已经不能完全满足要求。一般实现业务处理电子化及部分企业管理功能，很少涉及经营决策。 &nbsp;&nbsp;</span></font></div>
<div><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><span style="font-size: 14px;">&nbsp;&nbsp;　　（2）系统在性能上已经落后，采用的技术已经过时。如多采用主机/终端形式或小型机系统，软件使用汇编语言或第三代程序设计语言的早期版本开发，使用文件系统而不是数据库。 &nbsp;&nbsp;</span></font></div>
<div><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><span style="font-size: 14px;">&nbsp;&nbsp;　　（3）通常是大型的软件系统，已经融入企业的业务运行和决策管理机制之中，维护工作十分困难。 &nbsp;&nbsp;</span></font></div>
<div><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><span style="font-size: 14px;">&nbsp;&nbsp;　　（4）系统没有使用现代软件工程方法进行管理和开发，现在基本上已经没有文档，很难理解。</span></font></div><img src ="http://www.blogjava.net/zolly/aggbug/306579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2009-12-18 16:26 <a href="http://www.blogjava.net/zolly/archive/2009/12/18/LegacySystem.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to read and write Properties from pzPVStream column?</title><link>http://www.blogjava.net/zolly/archive/2009/06/01/pzPVStream.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Mon, 01 Jun 2009 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2009/06/01/pzPVStream.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/279433.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2009/06/01/pzPVStream.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/279433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/279433.html</trackback:ping><description><![CDATA[As we know, we can extract unexposed Property rules value&nbsp;from pzPVStream by using Obj-Open or Obj-List method in Activity steps, that is the&nbsp;only way we could operate binary data stored in pzPVStream.<br />
<br />
I don't know how Obj-Open and Obj-List work, how to read pzPVStream to get the unexposed property. Is there any general&nbsp;way to get the binary data form database? If the pzPVStream image&nbsp;data is standardized data format, if not, how the PegaSystems to write and read it.<br />
<br />
Can we&nbsp;read and write column value from pzPVStream by Java code directly out of PRPC? Any body who could provide any solution? <br />
<br />
PDN said, Rules XML stream is stored in BLOB. Generally, BLOB column is not encoded if we don't check "Encrypt BLOB?". <br />
Developer can read information by following: it is the way to read XML Stream from CLOB column.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Reader&nbsp;reader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ResultSet.getCharacterStream();</span></div>
I try to use this method to write the stream into file, the content is always encode. I don't know what was wrong.<img src ="http://www.blogjava.net/zolly/aggbug/279433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2009-06-01 17:22 <a href="http://www.blogjava.net/zolly/archive/2009/06/01/pzPVStream.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PRPC JSR94 Troubleshooting</title><link>http://www.blogjava.net/zolly/archive/2009/05/31/JSR94TroubleShooting.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Sun, 31 May 2009 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2009/05/31/JSR94TroubleShooting.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/279254.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2009/05/31/JSR94TroubleShooting.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/279254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/279254.html</trackback:ping><description><![CDATA[Product Version: PRPC V5.3<br />
Reference Document: jsr94service52.pdf<br />
<br />
按照来自PDN文档jsr94service52中的JSR94 Sample一步一步重现时，无论采用Ant还是Eclipse编译运行，都可能会出现如下的问题：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">2009</span><span style="color: #000000">-</span><span style="color: #000000">05</span><span style="color: #000000">-</span><span style="color: #000000">31</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">17</span><span style="color: #000000">:</span><span style="color: #000000">14</span><span style="color: #000000">:</span><span style="color: #000000">43</span><span style="color: #000000">,</span><span style="color: #000000">500</span><span style="color: #000000">&nbsp;</span><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user-5a57c3e103</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;etier.engine.EngineStartup)&nbsp;ERROR&nbsp;&nbsp;&nbsp;-&nbsp;PegaRULES&nbsp;initialization&nbsp;failed.&nbsp;Server:&nbsp;user-5a57c3e103<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />com.pega.pegarules.pub.context.InitializationFailedError:&nbsp;PRNodeImpl&nbsp;init&nbsp;failed<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.engine.context.PREnvironment.getThreadAndInitialize(PREnvironment.java:</span><span style="color: #000000">338</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.etier.engine.EngineStartup.initEngine(EngineStartup.java:</span><span style="color: #000000">456</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.etier.impl.EngineImpl._initEngine_privact(EngineImpl.java:</span><span style="color: #000000">125</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.etier.impl.EngineImpl.doStartup(EngineImpl.java:</span><span style="color: #000000">98</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.priv.services.jsr94.PRRuntime.startEngine(PRRuntime.java:</span><span style="color: #000000">327</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.priv.services.jsr94.PRRuntime.getEngine(PRRuntime.java:</span><span style="color: #000000">87</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.priv.services.jsr94.PRRuntime.&lt;init&gt;(PRRuntime.java:</span><span style="color: #000000">78</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.priv.services.jsr94.PRAdministrator.&lt;init&gt;(PRAdministrator.java:</span><span style="color: #000000">81</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.pub.services.jsr94.PRuleServiceProvider.&lt;init&gt;(PRuleServiceProvider.java:</span><span style="color: #000000">64</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native&nbsp;Method)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:</span><span style="color: #000000">39</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:</span><span style="color: #000000">27</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.reflect.Constructor.newInstance(Constructor.java:</span><span style="color: #000000">513</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.Class.newInstance0(Class.java:</span><span style="color: #000000">355</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.Class.newInstance(Class.java:</span><span style="color: #000000">308</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;javax.rules.RuleServiceProviderManager.registerRuleServiceProvider(RuleServiceProviderManager.java:</span><span style="color: #000000">84</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;javax.rules.RuleServiceProviderManager.registerRuleServiceProvider(RuleServiceProviderManager.java:</span><span style="color: #000000">67</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.pub.services.jsr94.PRuleServiceProvider.&lt;clinit&gt;(PRuleServiceProvider.java:</span><span style="color: #000000">52</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.sample.service.jsr94.client.SubmitClaim.run(SubmitClaim.java:</span><span style="color: #000000">97</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Caused&nbsp;by:&nbsp;com.pega.pegarules.pub.PRRuntimeException:&nbsp;Method&nbsp;Invocation&nbsp;exception<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.engine.context.PREnvironment.doWithRequestorLocked(PREnvironment.java:</span><span style="color: #000000">731</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.engine.context.PREnvironment.doWithRequestorLocked(PREnvironment.java:</span><span style="color: #000000">568</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.engine.context.PREnvironment.getThreadAndInitialize(PREnvironment.java:</span><span style="color: #000000">328</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #000000">18</span><span style="color: #000000">&nbsp;more<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Caused&nbsp;by:&nbsp;java.lang.reflect.InvocationTargetException<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.NativeMethodAccessorImpl.invoke0(Native&nbsp;Method)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:</span><span style="color: #000000">39</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:</span><span style="color: #000000">25</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.reflect.Method.invoke(Method.java:</span><span style="color: #000000">597</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.engine.context.PREnvironment.doWithRequestorLocked(PREnvironment.java:</span><span style="color: #000000">729</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #000000">20</span><span style="color: #000000">&nbsp;more<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Caused&nbsp;by:&nbsp;java.lang.NoClassDefFoundError:&nbsp;javax/servlet/jsp/JspFactory<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.engine.context.PRNodeImpl.updateSystemStart(PRNodeImpl.java:</span><span style="color: #000000">1519</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.engine.context.PRNodeImpl.startNode(PRNodeImpl.java:</span><span style="color: #000000">1157</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.pega.pegarules.engine.context.PREnvironment.finishInit(PREnvironment.java:</span><span style="color: #000000">833</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #000000">25</span><span style="color: #000000">&nbsp;more<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Caused&nbsp;by:&nbsp;java.lang.ClassNotFoundException:&nbsp;javax.servlet.jsp.JspFactory<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.net.URLClassLoader$</span><span style="color: #000000">1</span><span style="color: #000000">.run(URLClassLoader.java:</span><span style="color: #000000">200</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.security.AccessController.doPrivileged(Native&nbsp;Method)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.net.URLClassLoader.findClass(URLClassLoader.java:</span><span style="color: #000000">188</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.ClassLoader.loadClass(ClassLoader.java:</span><span style="color: #000000">307</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:</span><span style="color: #000000">301</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.ClassLoader.loadClass(ClassLoader.java:</span><span style="color: #000000">252</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.lang.ClassLoader.loadClassInternal(ClassLoader.java:</span><span style="color: #000000">320</span><span style="color: #000000">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #000000">28</span><span style="color: #000000">&nbsp;more</span></div>
<br />
如果出现类似javax.serverlet.jsp.JspFactory相关的问题，可能有两个原因引起：<br />
1. 在所有引用的Jar path中，没找到javax.serverlet.jsp.JspFactory类。<br />
2. 在多个Jar path中，都找到javax.serverlet.jsp.JspFactory类，出现冲突。<br />
<br />
在PRPC中使用JSR94，需要调用servlet-api.jar，该jar包来自Tomcat/common/lib，查询<a href="http://www.findjar.com/index.jsp?query=javax.servlet.jsp.JspFactory">http://www.findjar.com/index.jsp?query=javax.servlet.jsp.JspFactory</a>可知在servlet-api.jar中应该（不敢肯定）包括javax.serverlet.jsp.JspFactory类，但程序仍然报告错误信息。从查询结果中得知在同样的目录下，还有一个jar包jsp-api.jar也包含该类。于是，本人将两个jar包同时放到Eclipse的Path中去，结果编译运行成功。所以本人推测，在apache-tomcat-5.5.17版本中，servlet-api.jar中并不包含javax.serverlet.jsp.JspFactory类。<br />
<br />
如有异议，还请高手指点，以上推断，纯属个人愚见。<img src ="http://www.blogjava.net/zolly/aggbug/279254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2009-05-31 18:00 <a href="http://www.blogjava.net/zolly/archive/2009/05/31/JSR94TroubleShooting.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Business Intelligence Extract (BIX)</title><link>http://www.blogjava.net/zolly/archive/2009/05/27/BIX.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Wed, 27 May 2009 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2009/05/27/BIX.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/278149.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2009/05/27/BIX.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/278149.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/278149.html</trackback:ping><description><![CDATA[What is BIX? <br />
BIX stands for Business Intelligence Extract , enables custormer to extract SmartBPM case data for the purpose of merging it with information from other enterprise systems in a centralized data warehouse. Organizations now have the ablility to quickly and easily select and extract all BPM data including work detail, assignment in various formats including SQL tables, comma-separated-values (CSV) files, and XML files. You can directly import these outputs into popular business intelligence applications for analysis and reporting. BIX can be added to any V5.1+system.<br />
<br />
All data available for BIX. Extract concurrentlyfrom one or multiple&nbsp;PRPC.<br />
<br />
BIX actually is a PRPC rules which havd functions that can extract Property rules data including Blob data from database into SQL statement, CSV and XML format&nbsp;file.<br />
BIX as an general system&nbsp;rules be deployed on V5.5+ system.<br />
<br />
Please refer to: <a href="http://pdn.pega.com">http://pdn.pega.com</a><img src ="http://www.blogjava.net/zolly/aggbug/278149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2009-05-27 09:48 <a href="http://www.blogjava.net/zolly/archive/2009/05/27/BIX.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java规则引擎JSR94在PRPC中应用的调研</title><link>http://www.blogjava.net/zolly/archive/2009/05/20/PRPCJSR94.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Wed, 20 May 2009 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2009/05/20/PRPCJSR94.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/271823.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2009/05/20/PRPCJSR94.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/271823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/271823.html</trackback:ping><description><![CDATA[Java Specification Request 94 (JSR 94), Java规则引擎API由javax.rules包定义，是访问规则引擎的标准企业级API。Java规则引擎API允许客户程序使用统一的方式和不同厂商的规则引擎产品交互，就像使用JDBC编写独立于厂商访问不同的数据库产品一样。(<em>摘自：</em><a href="http://www.ibm.com/developerworks/cn/java/j-java-rules/index.html?ca=dwcn-newsletter-java" target="_blank"><em>Java规则引擎与其API(JSR-94)</em></a>)<br />
<br />
PegaRULES&#174; JSR 94 服务可以接收来自完全独立于PRPC的外部系统的请求并给出反应。PRPC实现了所有JSR94规范中的所有Java 接口，一个外部JSR客户端程序能够通过PegaRULES引擎直接访问PRPC数据库来读取Rules，而不经过PRPC Web应用程序；如果PRPC Web 应用程序正在运行，JSR94客户端程序和PRPC应用程序可以作为完全独立的系统共享同一个PegaRULES数据库。<br />
<br />
在PRPC中提供JSR94服务的Class是Rule-Service-JSR94，当然至少也需要一个ServicePackage，一个驱动Activity。<br />
<br />
PRPC为JSR94提供的Provider class 是com.pega.pegarules.pub.services.jsr94.PRuleServiceProvider。<br />
<br />
下图为JSR94 Service的系统架构图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/zolly/14482/o_PRPC JSR94.jpg" border="0" /><br />
<br />
Please Refer to: <a href="http://pdn.pega.com">http://pdn.pega.com</a><img src ="http://www.blogjava.net/zolly/aggbug/271823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2009-05-20 23:35 <a href="http://www.blogjava.net/zolly/archive/2009/05/20/PRPCJSR94.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java操作MS Word -- jacob资源收集</title><link>http://www.blogjava.net/zolly/archive/2009/05/20/Jacob.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Wed, 20 May 2009 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2009/05/20/Jacob.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/271819.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2009/05/20/Jacob.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/271819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/271819.html</trackback:ping><description><![CDATA[Jacob 是Java-COM Bridge的缩写，它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库，并通过JNI的方式实现了在Java平台上对COM程序的调用。下载的地址：<a title="http://sourceforge.net/projects/jacob-project/" href="http://sourceforge.net/projects/jacob-project/">http://sourceforge.net/projects/jacob-project/<br />
<br />
</a><strong>以下来自网络收集：</strong><br />
<br />
Java COM Automation with Jacob and JBuilder (读-修改-另存为)<br />
<a href="http://edn.embarcadero.com/article/33305">http://edn.embarcadero.com/article/33305</a><br />
<br />
Jacob解决Word文档的读写问题 (常用操作方法)<br />
<a href="http://www.cnblogs.com/xinxindiandeng/archive/2008/12/10/1351570.html">http://www.cnblogs.com/xinxindiandeng/archive/2008/12/10/1351570.html</a><br />
<br />
有关jacob的word操作研究 (常用较全面的操作方法)<br />
<a href="http://zhuxue-feng.javaeye.com/blog/35350">http://zhuxue-feng.javaeye.com/blog/35350</a><br />
<br />
Java操作Microsoft Word之jacob (123) (比较全面的操作方法)<br />
<a href="http://www.cn-java.com/www1/?action-viewnews-itemid-13102">http://www.cn-java.com/www1/?action-viewnews-itemid-13102</a><br />
<a href="http://tech.ddvip.com/2009-04/1239274932114206_2.html">http://tech.ddvip.com/2009-04/1239274932114206_2.html</a><br />
<a href="http://shenzhenchufa.blog.51cto.com/730213/147806">http://shenzhenchufa.blog.51cto.com/730213/147806</a>&nbsp;(在当前文档指定的位置拷贝来自另一个文档中的段落)<br />
<br />
jacob的使用方法总结 (比较全面的操作方法)<br />
<a href="http://blog.csdn.net/yangyinbo/archive/2008/11/25/3373576.aspx">http://blog.csdn.net/yangyinbo/archive/2008/11/25/3373576.aspx</a><br />
<br /><img src ="http://www.blogjava.net/zolly/aggbug/271819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2009-05-20 23:00 <a href="http://www.blogjava.net/zolly/archive/2009/05/20/Jacob.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>规则引擎 (Rule Engine)</title><link>http://www.blogjava.net/zolly/archive/2009/05/20/RuleEngine.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Wed, 20 May 2009 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2009/05/20/RuleEngine.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/271687.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2009/05/20/RuleEngine.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/271687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/271687.html</trackback:ping><description><![CDATA[<strong>规则引擎出现的目的：</strong><br />
复杂企业级项目的开发以及其中随外部条件不断变化的业务规则(business logic),迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策，并把这些商业决策放在中心数据库或其他统一的地方，让它们能在运行时（即商务时间）可以动态地管理和修改从而提供软件系统的柔性和适应性。规则引擎正是应用于上述动态环境中的一种解决方法。<br />
<br />
<strong><strong>规则引擎出现的</strong>相关背景：</strong><br />
企业管理者对企业级IT系统的开发有着如下的要求：(1)为提高效率，管理流程必须自动化，即使现代商业规则异常复杂(2)市场要求业务规则经常变化，IT系统必须依据业务规则的变化快速、低成本的更新(3)为了快速、低成本的更新，业务人员应能直接管理IT系统中的规则，不需要程序开发人员参与。<br />
而项目开发人员则碰到了以下问题:(1)程序=算法+数据结构，有些复杂的商业规则很难推导出算法和抽象出数据模型(2)软件工程要求从需求-&gt;设计-&gt;编码，然而业务规则常常在需求阶段可能还没有明确，在设计和编码后还在变化，业务规则往往嵌在系统各处代码中(3)对程序员来说，系统已经维护、更新困难，更不可能让业务人员来管理。<br />
<br />
<strong>什么是业务规则：<br />
</strong>一个业务规则包含一组条件和在此条件下执行的操作，它们表示业务规则应用程序的一段业务逻辑。业务规则通常应该由业务分析人员和策略管理者开发和修改，但有些复杂的业务规则也可以由技术人员使用面向对象的技术语言或脚本来定制。<strong><u><span style="color: red">业务规则的理论基础是:设置一个或多个条件，当满足这些条件时会触发一个或多个操作。<br />
</span><br />
</u>什么是规则引擎：<br />
</strong>规则引擎由推理引擎发展而来，是一种嵌入在应用程序中的组件，实现了将业务决策从应用程序代码中分离出来，并使用预定义的语义模块编写业务决策。接受数据输入，解释业务规则，并根据规则做出业务决策。<br />
<br />
<strong>规则引擎的算法：<br />
</strong>大部分规则引擎产品的算法，基本上都来自于Dr. Charles Forgy在1979年提出的RETE算法及其变体，Rete算法是目前效率最高的一个Forward-Chaining推理算法，Drools项目是Rete算法的一个面向对象的Java实现，Rete算法其核心思想是将分离的匹配项根据内容动态构造匹配树，以达到显著降低计算量的效果。<br />
<br />
<strong>Java规则引擎API(JSR-94)</strong><br />
Java规则引擎API由javax.rules包定义，是访问规则引擎的标准企业级API。Java规则引擎API允许客户程序使用统一的方式和不同厂商的规则引擎产品交互，就像使用JDBC编写独立于厂商访问不同的数据库产品一样。<br />
<br />
原文请参考：<a href="http://www.ibm.com/developerworks/cn/java/j-java-rules/#N10041">http://www.ibm.com/developerworks/cn/java/j-java-rules/#N10041</a>&nbsp;(Java规则引擎与其API(JSR-94))<img src ="http://www.blogjava.net/zolly/aggbug/271687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2009-05-20 12:37 <a href="http://www.blogjava.net/zolly/archive/2009/05/20/RuleEngine.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>What is a Healthy PRPC System? -- Done</title><link>http://www.blogjava.net/zolly/archive/2009/05/20/HealthyPRPC.html</link><dc:creator>zolly</dc:creator><author>zolly</author><pubDate>Wed, 20 May 2009 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/zolly/archive/2009/05/20/HealthyPRPC.html</guid><wfw:comment>http://www.blogjava.net/zolly/comments/271649.html</wfw:comment><comments>http://www.blogjava.net/zolly/archive/2009/05/20/HealthyPRPC.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/zolly/comments/commentRss/271649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zolly/services/trackbacks/271649.html</trackback:ping><description><![CDATA[<p>我们做PRPC项目的维护，测试，优化，更新等等，都是在已有的产品上的一种后续服务，都是一种&#8220;发现问题，解决问题&#8221;的思路，这种方式往往使得项目周期变长，成本提高，这些都是客户不愿意看到的结果。<br />
<br />
定义一套Healthy PRPC的准则，达到这个标准后的产品才允许发布到客户，或者在前期就按照这个标准严格实施，这才是防患于未然，未雨绸缪的最好方式，即便有大的变动，后期也会大大减少时间周期和人力财力。<br />
<br />
这个问题我想也许不会找到标准答案，或许也只存在于BPM开发设计管理实施的人员之间经验的潜移默化。但是找到一个全面的检测标准，可以成为PRPC，甚至BPM所遵循的标准，这就是它的意义所在。<br />
</p>
Following comes&nbsp;from Frank:<br />
No entry in Pega-Alerts log<br />
Normally check the alerts log file.<br />
That's the benchmark from Pega...and normally 500ms is the standard...any SQL/Activity , if the execution exceeds 500ms, it's not normal., we need to find out why...<br />
That needs some expericne, you should be very familar with the table structure, and needs advacned DB knowledge.<img src ="http://www.blogjava.net/zolly/aggbug/271649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zolly/" target="_blank">zolly</a> 2009-05-20 09:23 <a href="http://www.blogjava.net/zolly/archive/2009/05/20/HealthyPRPC.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>