﻿<?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-天问的学习笔记</title><link>http://www.blogjava.net/sunnyliu/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 06:22:51 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 06:22:51 GMT</pubDate><ttl>60</ttl><item><title>Oracle时间日期操作(转)</title><link>http://www.blogjava.net/sunnyliu/archive/2010/07/14/326084.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Wed, 14 Jul 2010 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2010/07/14/326084.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/326084.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2010/07/14/326084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/326084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/326084.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: oracle 日期 时间&nbsp;&nbsp;<a href='http://www.blogjava.net/sunnyliu/archive/2010/07/14/326084.html'>阅读全文</a><img src ="http://www.blogjava.net/sunnyliu/aggbug/326084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2010-07-14 14:52 <a href="http://www.blogjava.net/sunnyliu/archive/2010/07/14/326084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 9i，10G和11G软件及补丁下载地址  </title><link>http://www.blogjava.net/sunnyliu/archive/2010/03/17/315714.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Wed, 17 Mar 2010 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2010/03/17/315714.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/315714.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2010/03/17/315714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/315714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/315714.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/sunnyliu/archive/2010/03/17/315714.html'>阅读全文</a><img src ="http://www.blogjava.net/sunnyliu/aggbug/315714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2010-03-17 21:48 <a href="http://www.blogjava.net/sunnyliu/archive/2010/03/17/315714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle函数值取字符串真实长度</title><link>http://www.blogjava.net/sunnyliu/archive/2008/10/08/233098.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Wed, 08 Oct 2008 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2008/10/08/233098.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/233098.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2008/10/08/233098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/233098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/233098.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Oracle函数之取字符串真实长度&nbsp;&nbsp;<a href='http://www.blogjava.net/sunnyliu/archive/2008/10/08/233098.html'>阅读全文</a><img src ="http://www.blogjava.net/sunnyliu/aggbug/233098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2008-10-08 11:49 <a href="http://www.blogjava.net/sunnyliu/archive/2008/10/08/233098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 内置函数之常见单行字符串函数</title><link>http://www.blogjava.net/sunnyliu/archive/2008/10/08/233090.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Wed, 08 Oct 2008 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2008/10/08/233090.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/233090.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2008/10/08/233090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/233090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/233090.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Oracle 内置函数 常见单行字符串函数&nbsp;&nbsp;<a href='http://www.blogjava.net/sunnyliu/archive/2008/10/08/233090.html'>阅读全文</a><img src ="http://www.blogjava.net/sunnyliu/aggbug/233090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2008-10-08 11:37 <a href="http://www.blogjava.net/sunnyliu/archive/2008/10/08/233090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate主键生成方式（转）</title><link>http://www.blogjava.net/sunnyliu/archive/2008/09/24/hibernate.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Wed, 24 Sep 2008 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2008/09/24/hibernate.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/230848.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2008/09/24/hibernate.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/230848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/230848.html</trackback:ping><description><![CDATA[<div><strong>1) assigned<br />
主键由外部程序负责生成，无需<span class="hilite1">Hibernate</span>参与。<br />
<br />
2) hilo<br />
通过hi/lo 算法实现的主键生成机制，需要额外的数据库表保存主<br />
键生成历史状态。<br />
<br />
3) seqhilo<br />
与hilo 类似，通过hi/lo 算法实现的主键生成机制，只是主键历史<br />
状态保存在Sequence中，适用于支持Sequence的数据库，如Oracle。<br />
<br />
4) increment<br />
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持<br />
一个变量，以保存着当前的最大值，之后每次需要生成主键的时候<br />
将此值加1作为主键。<br />
这种方式可能产生的问题是：如果当前有多个实例访问同一个数据<br />
库，那么由于各个实例各自维护主键状态，不同实例可能生成同样<br />
的主键，从而造成主键重复异常。因此，如果同一数据库有多个实<br />
例访问，此方式必须避免使用。<br />
<br />
5) identity<br />
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL<br />
中的主键生成机制。<br />
<br />
6) sequence<br />
采用数据库提供的sequence 机制生成主键。如Oralce 中的<br />
Sequence。<br />
<br />
7) native<br />
由<span class="hilite1">Hibernate</span>根据底层数据库自行判断采用identity、hilo、sequence<br />
其中一种作为<span class="hilite2">主键生成方式</span>。<br />
<br />
8) uuid.hex<br />
由<span class="hilite1">Hibernate</span>基于128 位唯一值产生算法生成16 进制数值（编码后<br />
以长度32 的字符串表示）作为主键。<br />
<br />
9) uuid.string<br />
与uuid.hex 类似，只是生成的主键未进行编码（长度16）。在某些<br />
数据库中可能出现问题（如PostgreSQL）。<br />
<br />
10) foreign<br />
使用外部表的字段作为主键。<br />
一般而言，利用uuid.hex方式生成主键将提供最好的性能和数据库平台适<br />
应性。<br />
<br />
另外由于常用的数据库，如Oracle、DB2、SQLServer、MySql 等，都提<br />
供了易用的主键生成机制（Auto-Increase 字段或者Sequence）。我们可以在数<br />
据库提供的主键生成机制上，采用generator-class=native的<span class="hilite2">主键生成方式</span>。<br />
不过值得注意的是，一些数据库提供的主键生成机制在效率上未必最佳，<br />
大量并发insert数据时可能会引起表之间的互锁。<br />
数据库提供的主键生成机制，往往是通过在一个内部表中保存当前主键状<br />
态（如对于自增型主键而言，此内部表中就维护着当前的最大值和递增量），<br />
之后每次插入数据会读取这个最大值，然后加上递增量作为新记录的主键，之<br />
后再把这个新的最大值更新回内部表中，这样，一次Insert操作可能导致数据<br />
库内部多次表读写操作，同时伴随的还有数据的加锁解锁操作，这对性能产生<br />
了较大影响。<br />
因此，对于并发Insert要求较高的系统，推荐采用uuid.hex 作为主键生成<br />
机制。 </strong><br />
</div>
 <img src ="http://www.blogjava.net/sunnyliu/aggbug/230848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2008-09-24 11:54 <a href="http://www.blogjava.net/sunnyliu/archive/2008/09/24/hibernate.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于禁用浏览器的后退按钮(转)</title><link>http://www.blogjava.net/sunnyliu/archive/2008/09/22/230427.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Mon, 22 Sep 2008 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2008/09/22/230427.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/230427.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2008/09/22/230427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/230427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/230427.html</trackback:ping><description><![CDATA[浏览器的后退按钮使得我们能够方便地返回以前访问过的页面，它无疑非常有用。但有时候我们不得不关闭这个功能，以防止用户打乱预定的页面访问次序。本文介绍网络上可找到的各种禁用浏览器后退按钮方案，分析它们各自的优缺点和适用场合。 <br />
&nbsp; &nbsp; 一、概述&nbsp; <br />
&nbsp; &nbsp; 曾经有许多人问起，&#8220;怎样才能&#8216;禁用&#8217;浏览器的后退按钮？&#8221;，或者&#8220;怎样才能防止用户点击后退按钮返回以前浏览过的页面？&#8221;我访问了许多网站，参考了这些网站所介绍的各种实现方法。如果你经常访问ASP编程网站，本文所介绍的部分内容你可能已经见到过。本文的任务是把各种可能的方法都介绍给大家，然后找出最好的方法！&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; 二、禁止缓存&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; 在我找到的许多方案中，其中有一种建议禁止页面缓存。具体是使用服务器端脚本，如下所示：&nbsp; <br />
&lt;% <br />
Response.Buffer = True <br />
Response.ExpiresAbsolute = Now() - 1 <br />
Response.Expires = 0 <br />
Response.CacheControl = "no-cache" <br />
%&gt;&nbsp; <br />
&nbsp; &nbsp; &nbsp; 这种方法非常有效！它强制浏览器重新访问服务器下载页面，而不是从缓存读取页面。使用这种方法时，编程者的主要任务是创建一个会话级的变量，通过这个变量确定用户是否仍旧可以查看那个不适合通过后退按钮访问的页面。由于浏览器不再缓存这个页面，当用户点击后退按钮时浏览器将重新下载该页面，此时程序就可以检查那个会话变量，看看是否应该允许用户打开这个页面。&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; 例如，假设我们有如下表单：&nbsp; <br />
&lt;% <br />
Response.Buffer = True <br />
Response.ExpiresAbsolute = Now() - 1 <br />
Response.Expires = 0 <br />
Response.CacheControl = "no-cache" <br />
If Len(Session("FirstTimeToPage")) &gt; 0 then&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; "用户已经访问过当前页面，现在是再次返回访问。&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; "清除会话变量，将用户重定向到登录页面。&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; Session("FirstTimeToPage") = ""&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; Response.Redirect "/Bar.asp"&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; Response.End&nbsp; &nbsp; &nbsp; &nbsp; <br />
End If&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; "如果程序运行到这里，说明用户能够查看当前页面&nbsp; <br />
&nbsp; &nbsp; "以下开始创建表单&nbsp; &nbsp; &nbsp; &nbsp; <br />
%&gt;&nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;form method=post action="SomePage.asp"&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;input type=submit&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;/form&gt;&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 我们借助会话变量FirstTimeToPage检查用户是否是第一次访问当前页面。如果不是第一次（即Session ("FirstTimeToPage")包含某个值），那么我们就清除会话变量的值，然后把用户重新定向到一个开始页面。这样，当表单提交时（此时 SompePage.asp被打开），我们必须赋予FirstTimeToPage一个值。即，在SomePage.asp中我们需要加上下面的代码： <br />
&nbsp; &nbsp; Session("FirstTimeToPage") = "NO"&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 这样，已经打开SomePage.asp的用户如果点击后退按钮，浏览器将重新请求服务器下载页面，服务器检查到Session ("FirstTimeToPage")包含了一个值，于是就清除Session("FirstTimeToPage")，并把用户重定向到其他页面。当然，所有这一切都需要用户启用了Cookie，否则会话变量将是无效的。&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; 另外，我们也可以用客户端代码使浏览器不再缓存Web页面：&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;html&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;head&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;meta http-equiv="Expires" CONTENT="0"&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;meta http-equiv="Cache-Control" CONTENT="no-cache"&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;meta http-equiv="Pragma" CONTENT="no-cache"&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;/head&gt;&nbsp; &nbsp; <br />
&nbsp; &nbsp; 如果使用上面的方法强制浏览器不再缓存Web页面，必须注意以下几点：&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; 只有在使用安全连接时&#8220;Pragma: no-cache&#8221;才防止浏览器缓存页面。对于不受安全保护的页面，&#8220;Pragma: no-cache&#8221;被视为与&#8220;Expires: -1&#8221;相同，此时浏览器仍旧缓存页面，但把页面标记为立即过期。&nbsp; <br />
&nbsp; &nbsp; 在IE 4或5中，&#8220;Cache-Control&#8221;META HTTP-EQUIV标记将被忽略，不起作用。&nbsp; <br />
&nbsp; &nbsp; 在实际应用中我们可以加上所有这些代码。然而，由于这种方法不能适用于所有的浏览器，所以是不推荐使用的。但如果是在Intranet环境下，管理员可以控制用户使用哪种浏览器，我想还是有人会使用这种方法。 <br />
&nbsp; &nbsp; 三、其他方法&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 接下来我们要讨论的方法以后退按钮本身为中心，而不是浏览器缓存。这儿有一篇文章Rewiring the Back Button很值得参考。不过我注意到，如果使用这种方法，虽然用户点击一下后退按钮时他不会看到以前输入数据的页面，但只要点击两次就可以，这可不是我们希望的 <br />
<br />
<br />
效果，因为很多时候，固执的用户总是能够找到绕过预防措施的办法。&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 另外一种禁用后退按钮的办法是用客户端JavaScript打开一个没有工具条的窗口，这使得用户很难返回前一页面，但不是不可能。一种更安全但相当恼人的方法是，当表单提交时打开一个新的窗口，与此同时关闭表单所在的窗口。但我觉得这种方法不值得认真考虑，因为我 <br />
<br />
<br />
们总不能让用户每提交一个表单就打开一个新窗口。&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 那么，在那个我们不想让用户返回的页面是否也可以加入JavaScript代码呢？在这个页面中加入的JavaScript代码可用来产生点击前进按钮的效果，这样也就抵消了用户点击后退按钮所产生的动作。用于实现该功能的JavaScript代码如下所示：&nbsp; <br />
&nbsp; &nbsp; &lt;script language="JavaScript"&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;!-- <br />
javascript:window.history.forward(1); <br />
&nbsp; &nbsp; //--&gt;&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;/script&gt;&nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 同样地，这种方法虽然有效，但距离&#8220;最好的方法&#8221;还差得很远。后来我又看到有人建议用location.replace从一个页面转到另一个页面。这种方法的原理是，用新页面的URL替换当前的历史纪录，这样浏览历史记录中就只有一个页面，后退按钮永远不会变为可用。我想这可能正是许多人所寻求的方法，但这种方法仍旧不是任何情况下的最好方法。使用这种方法的实例如下所示：&nbsp; &nbsp; <br />
&nbsp; &nbsp; &lt;A HREF="PageName.htm" onclick="javascript:location.replace(this.href); event.returnValue=false; "&gt;&nbsp; <br />
&nbsp; &nbsp; 禁止后退到本页面的链接&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; 试试下面这个链接：&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; 禁止后退到本页面的链接！&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 这种方法的缺点在于：简单地运用Response.Redirect将不再有效，这是因为每次用户从一个页面转到另一个页面，我们都必须用客户端代码清除 location.history。另外还要注意，这种方法清除的是最后一个访问历史记录，而不是全部的访问记录。&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; 点击上面的链接，你将打开一个简单的HTML页面。再点击后退按钮，你可以看到这时打开的不是本页面，而是本页面之前的页面！（当然，你必须在浏览器中启用了客户端JavaScript代码。）&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 经过一番仔细的寻寻觅觅之后，我发现仍旧无法找出真正能够完全禁用浏览器后退按钮的办法。所有这里介绍的方法都能够在不同程度上、以不同的方式禁止用户返回前一页面，但它们都有各自的局限。由于不存在能够完全禁用后退按钮的方法，所以最好的方案应该是：混合运用客户端脚本和服务器端脚本。
<img src ="http://www.blogjava.net/sunnyliu/aggbug/230427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2008-09-22 14:47 <a href="http://www.blogjava.net/sunnyliu/archive/2008/09/22/230427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用存储过程实现oracle的分页查询</title><link>http://www.blogjava.net/sunnyliu/archive/2008/07/01/211829.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Tue, 01 Jul 2008 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2008/07/01/211829.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/211829.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2008/07/01/211829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/211829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/211829.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: oracle 分页查询&nbsp;&nbsp;<a href='http://www.blogjava.net/sunnyliu/archive/2008/07/01/211829.html'>阅读全文</a><img src ="http://www.blogjava.net/sunnyliu/aggbug/211829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2008-07-01 10:19 <a href="http://www.blogjava.net/sunnyliu/archive/2008/07/01/211829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作Linux系统　必学的60个命令</title><link>http://www.blogjava.net/sunnyliu/archive/2007/10/24/linux.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Wed, 24 Oct 2007 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2007/10/24/linux.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/155608.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2007/10/24/linux.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/155608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/155608.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 操作Linux系统　必学的60个命令&nbsp;&nbsp;<a href='http://www.blogjava.net/sunnyliu/archive/2007/10/24/linux.html'>阅读全文</a><img src ="http://www.blogjava.net/sunnyliu/aggbug/155608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2007-10-24 15:38 <a href="http://www.blogjava.net/sunnyliu/archive/2007/10/24/linux.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MD5算法在java中的实现类</title><link>http://www.blogjava.net/sunnyliu/archive/2007/09/18/146120.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Tue, 18 Sep 2007 04:17:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2007/09/18/146120.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/146120.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2007/09/18/146120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/146120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/146120.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MD5算法java实现类&nbsp;&nbsp;<a href='http://www.blogjava.net/sunnyliu/archive/2007/09/18/146120.html'>阅读全文</a><img src ="http://www.blogjava.net/sunnyliu/aggbug/146120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2007-09-18 12:17 <a href="http://www.blogjava.net/sunnyliu/archive/2007/09/18/146120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Java实现zip压缩解压缩(转)</title><link>http://www.blogjava.net/sunnyliu/archive/2007/06/26/126348.html</link><dc:creator>天问</dc:creator><author>天问</author><pubDate>Tue, 26 Jun 2007 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/sunnyliu/archive/2007/06/26/126348.html</guid><wfw:comment>http://www.blogjava.net/sunnyliu/comments/126348.html</wfw:comment><comments>http://www.blogjava.net/sunnyliu/archive/2007/06/26/126348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sunnyliu/comments/commentRss/126348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sunnyliu/services/trackbacks/126348.html</trackback:ping><description><![CDATA[<p>由于网络带宽有限,所以数据文件的压缩有利于数据在Internet上的快速传输,同时也节省服务器的外存空间。Java 1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解压缩的实现比较容易,下面介绍利用ZipEntry、ZipInputStream和ZipOutputStream三个Java 类实现zip数据压缩方式的编程方法。 <br>　　zip压缩文件结构:一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的数据项存储压缩数据。 </p>
<p>　　与zip文件有关的几个Java类 </p>
<p>　　&#183;类ZipEntry </p>
<p>　　public ZipEntry(String name); </p>
<p>　　name为指定的数据项名。 </p>
<p>　　&#183;类ZipOutputStream </p>
<p>　　ZipOutputStream实现了zip压缩文件的写输出流,支持压缩和非</p>
<p>　　public ZipOutputStream(OutputStream out); </p>
<p>　　∥利用输出流out构造一个ZIP输出流。 </p>
<p>　　public void setMethod(int method); </p>
<p>　　∥设置entry压缩方法,缺省值为DEFLATED。 </p>
<p>　　public void putNextEntry(ZipEntry newe); </p>
<p>　　∥如果当前的entry存在且处于激活状态时,关闭它,在zip文件<br>中写入新的entry-newe </p>
<p>并将数据流定位于entry数据项的起始位置,压缩方法为setMethod指<br>定的方法。 </p>
<p>　　&#183;类ZipInputStream </p>
<p>　　ZipInputStream实现了zip压缩文件的读输入流,支持压缩和非<br>压缩entry。下面是它的 </p>
<p>几个函数: </p>
<p>　　public ZipInputStream(InputStream in); </p>
<p>　　∥利用输入流in构造一个ZIP输出流。 </p>
<p>　　public ZipEntry getNextEntry(); </p>
<p>　　∥返回ZIP文件中的下一个entry,并将输出流定位在此entry数据项的起始位置。 </p>
<p>　　public void closeEntry(); </p>
<p>　　∥关闭当前的zip entry,并将数据流定位于下一个entry的起始位置。 </p>
<p>　　程序代码及其注释 </p>
<p>　　下列的程序实现了数据文件zip方式的压缩和解压缩方法。randomData()函数随机生成50个double数据,并放在doc字符串变量中;openFile()函数读取ZIP压缩文件;saveFile()函数将随机生成的数据存到ZIP格式的压缩文件中。 </p>
<p>　　import java.util.zip.*; </p>
<p>　　import java.awt.event.*; </p>
<p>　　import java.awt.*; </p>
<p>　　import java.lang.Math; </p>
<p>　　import java.io.*; </p>
<p>　　public class TestZip extends Frame implements <br>ActionListener { </p>
<p>　　TextArea textarea; ∥显示数据文件的多行文本显示域 </p>
<p>　　TextField infotip; ∥显示数据文件未压缩大小及压缩大小单<br>行文本显示域 </p>
<p>　　String doc; ∥存储随机生成的数据 </p>
<p>　　long doczipsize = 0;∥压缩数据文件的大小 </p>
<p>　　public TestZip(){ </p>
<p>　　∥生成菜单 </p>
<p>　　MenuBar menubar = new MenuBar(); </p>
<p>　　setMenuBar(menubar); </p>
<p>　　Menu file = new Menu("File",true); </p>
<p>　　menubar.add(file); </p>
<p>　　MenuItem neww= new MenuItem("New"); </p>
<p>　　neww.addActionListener(this); </p>
<p>　　file.add(neww); </p>
<p>　　MenuItem open=new MenuItem("Open"); </p>
<p>　　open.addActionListener(this); </p>
<p>　　file.add(open); </p>
<p>　　MenuItem save=new MenuItem("Save"); </p>
<p>　　save.addActionListener(this); </p>
<p>　　file.add(save); </p>
<p>　　MenuItem exit=new MenuItem("Exit"); </p>
<p>　　exit.addActionListener(this); </p>
<p>　　file.add(exit); </p>
<p>　　∥随机生成的数据文件的多行文本显示域 </p>
<p>　　add("Center",textarea = new TextArea()); </p>
<p>　　∥提示文本原始大小、压缩大小的单行文本显示域 </p>
<p>　　add("South",infotip = new TextField()); </p>
<p>　　} </p>
<p>　　public static void main(String args[]){ </p>
<p>　　TestZip ok=new TestZip(); </p>
<p>　　ok.setTitle("zip sample"); </p>
<p>　　ok.setSize(600,300); </p>
<p>　　ok.show(); </p>
<p>　　} </p>
<p>　　private void randomData(){ </p>
<p>　　∥随机生成50个double数据,并放在doc字符串变量中。 </p>
<p>　　doc=""; </p>
<p>　　for(int i=1;i&amp;lt;51;i++){ </p>
<p>　　 double rdm=Math.random()*10; </p>
<p>　　 doc=doc+new Double(rdm).toString(); </p>
<p>　　 if(i%5 == 0) doc=doc+"\n"; </p>
<p>　　 else doc=doc+" "; </p>
<p>　　} </p>
<p>　　doczipsize = 0; </p>
<p>　　showTextandInfo(); </p>
<p>　　} </p>
<p>　　private void openFile(){ </p>
<p>　　∥打开zip文件,将文件内容读入doc字符串变量中。 </p>
<p>　　FileDialog dlg=new <br>FileDialog(this,"Open",FileDialog.LOA D); </p>
<p>　　dlg.show(); </p>
<p>　　String filename=dlg.getDirectory()+dlg.getFile(); </p>
<p>　　try{ </p>
<p>　　∥创建一个文件实例 </p>
<p>　　File f=new File(filename); </p>
<p>　　if(!f.exists()) return; ∥文件不存在,则返回 </p>
<p>　　∥用文件输入流构建ZIP压缩输入流 </p>
<p>　　ZipInputStream zipis=new ZipInputStream(new <br>FileInputStream(f)); </p>
<p>　　zipis.getNextEntry(); </p>
<p>　　∥将输入流定位在当前entry数据项位置 </p>
<p>　　DataInputStream dis=new DataInputStream(zipis); </p>
<p>　　∥用ZIP输入流构建DataInputStream </p>
<p>　　doc=dis.readUTF();∥读取文件内容 </p>
<p>　　dis.close();∥关闭文件 </p>
<p>　　doczipsize = f.length();∥获取ZIP文件长度 </p>
<p>　　showTextandInfo();∥显示数据 </p>
<p>　　} </p>
<p>　　catch(IOException ioe){ </p>
<p>　　System.out.println(ioe); </p>
<p>　　} </p>
<p>　　} </p>
<p>　　private void saveFile(){ </p>
<p>　　∥打开zip文件,将doc字符串变量写入zip文件中。 </p>
<p>　　FileDialog dlg=new <br>FileDialog(this,"Save",FileDialog.SAVE); </p>
<p>　　dlg.show(); </p>
<p>　　String filename=dlg.getDirectory()+dlg.getFile(); </p>
<p>　　try{ </p>
<p>　　∥创建一个文件实例 </p>
<p>　　File f=new File(filename); </p>
<p>　　if(!f.exists()) return; ∥文件不存在,则返回 </p>
<p>　　∥用文件输出流构建ZIP压缩输出流 </p>
<p>　　ZipOutputStream zipos=new ZipOutputStream(new <br>FileOutputStream(f)); </p>
<p>　　zipos.setMethod(ZipOutputStream.DEFLATED); ∥设置压缩方<br>法 </p>
<p>　　zipos.putNextEntry(new ZipEntry("zip")); </p>
<p>　　∥生成一个ZIP entry,写入文件输出流中,并将输出流定位于<br>entry起始处。 </p>
<p>　　DataOutputStream os=new DataOutputStream(zipos); </p>
<p>　　∥用ZIP输出流构建DataOutputStream; </p>
<p>　　os.writeUTF(doc);∥将随机生成的数据写入文件中 </p>
<p>　　os.close();∥关闭数据流 </p>
<p>　　doczipsize = f.length(); </p>
<p>　　∥获取压缩文件的长度 </p>
<p>　　showTextandInfo();∥显示数据 </p>
<p>　　} </p>
<p>　　catch(IOException ioe){ </p>
<p>　　System.out.println(ioe); </p>
<p>　　} </p>
<p>　　} </p>
<p>　　private void showTextandInfo(){ </p>
<p>　　∥显示数据文件和压缩信息 </p>
<p>　　<br>textarea.replaceRange(doc,0,textarea.getText().length()); </p>
<p>　　infotip.setText("uncompressed size: <br>"+doc.length()+"compressed size: "+dc zipsize); </p>
<p>　　} </p>
<p>　　public void actionPerformed(ActionEvent e){ </p>
<p>　　String arg = e.getActionCommand(); </p>
<p>　　if ("New".equals(arg)) randomData(); </p>
<p>　　else if ("Open".equals(arg)) openFile(); </p>
<p>　　else if ("Save".equals(arg)) saveFile(); </p>
<p>　　else if ("Exit".equals(arg)){ </p>
<p>　　 dispose();∥关闭窗口 </p>
<p>　　 System.exit(0);∥关闭程序 </p>
<p>　　} </p>
<p>　　else { </p>
<p>　　 System.out.println("no this command!"); </p>
<p>　　} </p>
<p>　　} </p>
<p>　　} </p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/sunnyliu/aggbug/126348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sunnyliu/" target="_blank">天问</a> 2007-06-26 15:13 <a href="http://www.blogjava.net/sunnyliu/archive/2007/06/26/126348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>