﻿<?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-NewMoring</title><link>http://www.blogjava.net/NewMoring/</link><description>与Java同路，赢在未来。</description><language>zh-cn</language><lastBuildDate>Sun, 10 May 2026 08:30:03 GMT</lastBuildDate><pubDate>Sun, 10 May 2026 08:30:03 GMT</pubDate><ttl>60</ttl><item><title>随机码的生成</title><link>http://www.blogjava.net/NewMoring/articles/279584.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Tue, 02 Jun 2009 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/279584.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/279584.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/279584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/279584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/279584.html</trackback:ping><description><![CDATA[<p>image.jsp页面:<br />
<br />
&lt;%@ page contentType="image/jpeg"<br />
&nbsp;import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%&gt;<br />
&lt;%!Color getRandColor(int fc, int bc) {//给定范围获得随机颜色<br />
&nbsp;&nbsp;Random random = new Random();<br />
&nbsp;&nbsp;if (fc &gt; 255)<br />
&nbsp;&nbsp;&nbsp;fc = 255;<br />
&nbsp;&nbsp;if (bc &gt; 255)<br />
&nbsp;&nbsp;&nbsp;bc = 255;<br />
&nbsp;&nbsp;int r = fc + random.nextInt(bc - fc);<br />
&nbsp;&nbsp;int g = fc + random.nextInt(bc - fc);<br />
&nbsp;&nbsp;int b = fc + random.nextInt(bc - fc);<br />
&nbsp;&nbsp;return new Color(r, g, b);<br />
&nbsp;}%&gt;<br />
&lt;%<br />
&nbsp;//设置页面不缓存<br />
&nbsp;response.setHeader("Pragma", "No-cache");<br />
&nbsp;response.setHeader("Cache-Control", "no-cache");<br />
&nbsp;response.setDateHeader("Expires", 0);</p>
<p>&nbsp;// 在内存中创建图象<br />
&nbsp;int width = 60, height = 20;<br />
&nbsp;BufferedImage image = new BufferedImage(width, height,<br />
&nbsp;&nbsp;&nbsp;BufferedImage.TYPE_INT_RGB);</p>
<p>&nbsp;// 获取图形上下文<br />
&nbsp;Graphics g = image.getGraphics();</p>
<p>&nbsp;//生成随机类<br />
&nbsp;Random random = new Random();</p>
<p>&nbsp;// 设定背景色<br />
&nbsp;g.setColor(getRandColor(200, 250));<br />
&nbsp;g.fillRect(0, 0, width, height);</p>
<p>&nbsp;//设定字体<br />
&nbsp;g.setFont(new Font("Times New Roman", Font.PLAIN, 18));</p>
<p>&nbsp;//画边框<br />
&nbsp;//g.setColor(new Color());<br />
&nbsp;//g.drawRect(0,0,width-1,height-1);</p>
<p>&nbsp;// 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到<br />
&nbsp;g.setColor(getRandColor(160, 200));<br />
&nbsp;for (int i = 0; i &lt; 155; i++) {<br />
&nbsp;&nbsp;int x = random.nextInt(width);<br />
&nbsp;&nbsp;int y = random.nextInt(height);<br />
&nbsp;&nbsp;int xl = random.nextInt(12);<br />
&nbsp;&nbsp;int yl = random.nextInt(12);<br />
&nbsp;&nbsp;g.drawLine(x, y, x + xl, y + yl);<br />
&nbsp;}</p>
<p>&nbsp;// 取随机产生的认证码(4位数字)<br />
&nbsp;String sRand = "";<br />
&nbsp;for (int i = 0; i &lt; 4; i++) {<br />
&nbsp;&nbsp;String rand = String.valueOf(random.nextInt(10));<br />
&nbsp;&nbsp;sRand += rand;<br />
&nbsp;&nbsp;// 将认证码显示到图象中<br />
&nbsp;&nbsp;g.setColor(new Color(20 + random.nextInt(110), 20 + random<br />
&nbsp;&nbsp;.nextInt(110), 20 + random.nextInt(110)));<br />
&nbsp;&nbsp;//调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成<br />
&nbsp;&nbsp;g.drawString(rand, 13 * i + 6, 16);<br />
&nbsp;}</p>
<p>&nbsp;// 将认证码存入SESSION<br />
&nbsp;session.setAttribute("rand", sRand);</p>
<p>&nbsp;// 图象生效<br />
&nbsp;g.dispose();</p>
<p>&nbsp;// 输出图象到页面<br />
&nbsp;ImageIO.write(image, "JPEG", response.getOutputStream());<br />
%&gt;</p>
<img src ="http://www.blogjava.net/NewMoring/aggbug/279584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-06-02 14:24 <a href="http://www.blogjava.net/NewMoring/articles/279584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>*.jsp(1,84) quote symbol expected </title><link>http://www.blogjava.net/NewMoring/articles/279443.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Mon, 01 Jun 2009 10:13:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/279443.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/279443.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/279443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/279443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/279443.html</trackback:ping><description><![CDATA[<span style="color: red"><span style="color: #000000">type Exception report <br />
<br />
message <br />
<br />
description The server encountered an internal error () that prevented it from fulfilling this request. <br />
<br />
exception <br />
<br />
org.apache.jasper.JasperException: /ProductManage.jsp(1,84) quote symbol expected <br />
</span><br />
解决办法：<br />
&nbsp;&nbsp;&nbsp;&nbsp; 它说第一行的第84处需要加引号!，一般都是ContentType后的引号错了。。。。</span>
<img src ="http://www.blogjava.net/NewMoring/aggbug/279443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-06-01 18:13 <a href="http://www.blogjava.net/NewMoring/articles/279443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NullPointerException 解决方法</title><link>http://www.blogjava.net/NewMoring/articles/279430.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Mon, 01 Jun 2009 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/279430.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/279430.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/279430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/279430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/279430.html</trackback:ping><description><![CDATA[<p>主要有以下几种原因： <br />
1、使用了未初始化的变量（虽然已经声明） <br />
2、使用了未初始化的对象（虽然已经声明） <br />
3，使用了关键字或已存在的类名作变量对象方法或类名。</p>
<p>一般报java.lang.NullPointerException的原因有以下几种： <br />
&#183;字符串变量未初始化； <br />
&#183;接口类型的对象没有用具体的类初始化，比如： <br />
List lt；会报错 <br />
List lt = new ArrayList()；则不会报错了 <br />
&#183;当一个对象的值为空时，你没有判断为空的情况。 <br />
你可以试着把下面的代码前加一行代码： <br />
if(rb!=null &amp;&amp; rb!="") <br />
改成： <br />
if(rb==null); <br />
if(rb!==null&amp;&amp;rb!="") </p>
<p>解决步骤：</p>
<p>1、打开Console面板，找到出错信息。</p>
<p>2、从打印出来的信息中找出一个文件及其出错行数。</p>
<p>3、在出错行处设置断点，重新执行程序。</p>
<p>4、打开Variables视图，从中查找出错行所用到的所有对象及其值，如果其中对象的值为空，则可以进一步分析问题。</p>
<p>5、如果该行的对象都不为空而是调用了一个函数，则到这个函数里设置断点（或step into F5 ），继续进行调试。这时需要用F6（执行一行），直到再次报错，从而定位到出错处。重复步骤4.</p>
<p>6、结束。</p>
<p><br />
如果不会断点,教你个狠的,你把用到的变量都输出出来,就知道谁是NULL了,然后在想办法改正,就简单多了</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/aisitemasu/archive/2008/05/29/2493246.aspx</p>
<img src ="http://www.blogjava.net/NewMoring/aggbug/279430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-06-01 17:10 <a href="http://www.blogjava.net/NewMoring/articles/279430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Struts开发web应用时经常碰到的一些异常和错误&lt;转帖&gt;</title><link>http://www.blogjava.net/NewMoring/articles/279412.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Mon, 01 Jun 2009 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/279412.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/279412.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/279412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/279412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/279412.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本篇文章包含了在用Struts开发web应用时经常碰到的一些异常和错误，根据异常或错误信息本身，经常可以找到潜在的错误发生原因。下面列出了一些Struts的常见错误和异常，并给出了一些可能发生此类错误或异常的原因。有的后面有相关连接，你可以通过它找到更多的信息。&nbsp;                                    Cannot retrie...&nbsp;&nbsp;<a href='http://www.blogjava.net/NewMoring/articles/279412.html'>阅读全文</a><img src ="http://www.blogjava.net/NewMoring/aggbug/279412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-06-01 16:17 <a href="http://www.blogjava.net/NewMoring/articles/279412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cannot find message resources under key org.apache.struts.action.MESSAGE错误</title><link>http://www.blogjava.net/NewMoring/articles/279411.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Mon, 01 Jun 2009 08:15:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/279411.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/279411.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/279411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/279411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/279411.html</trackback:ping><description><![CDATA[<p>运行程序出现<strong><font color="#ff0000">Cannot find message resources under key org.apache.struts.action.MESSAGE</font></strong>错误，是说明找不到<strong><font color="#0000ff">ApplicationResources.properties</font></strong>，要注意以下四方面。</p>
<p>　　第一：在web.xml文件&lt;web-app&gt; &lt;servlet&gt;"把下面的内容放在这里"&lt;/servlet&gt;&lt;/web-app&gt;中加入</p>
<p><font color="#0000ff">&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;application&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;ApplicationResources&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;</font></p>
<p>　　第二：在struts-config.xml中加入如下设置：</p>
<p>　　 &lt;message-resources parameter="ApplicationResources"/&gt;</p>
<p>　 &nbsp; 该设置最好放在：&lt;/action-mappings&gt;"<strong><font color="#ff0000">放到</font><font color="#ff0000">这里</font></strong>"&lt;/struts-config&gt;</p>
<p>　　第三：确保<font color="#0000ff"><strong>ApplicationResources.properties</strong></font>文件在你建立的WEB-INF\classes文件夹中。</p>
<p>　　可以把applicationResources.properties放到classes文件夹下其它目录，例如：<br />
　　把ApplicationResources.properties放入WEB-INF\classes\mydir文件夹下。<strong><font color="#ff0000">struts-config.xml</font></strong>中的设置必须改</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;<strong><font color="#0000ff">&lt;message-resources parameter="mydir/ApplicationResources"/&gt;</font></strong><br />
　　<br />
&nbsp;&nbsp;&nbsp; 第四：就可能是键值的问题，struts的资源文件也是可以分多资源文件配置的，比如配备是这样的</p>
<p><font color="#0000ff"><strong>&nbsp;&nbsp;&nbsp; &lt;message-resources parameter="ApplicationResources" key="myAppRes"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong></font></p>
<p><font color="#000000">&nbsp;&nbsp; 如果只有一个带key的资源文件，那就会抛出<strong><font color="#ff0000"> org.apache.struts.action.MESSAGE</font></strong>错误了,删除key即可。<br />
</font></p>
<img src ="http://www.blogjava.net/NewMoring/aggbug/279411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-06-01 16:15 <a href="http://www.blogjava.net/NewMoring/articles/279411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见的Oracle 命令</title><link>http://www.blogjava.net/NewMoring/articles/279284.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Sun, 31 May 2009 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/279284.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/279284.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/279284.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/279284.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/279284.html</trackback:ping><description><![CDATA[<strong>oracle常用命令</strong> <br />
<br />
<div>
<div style="padding-bottom: 10px; float: left">
<p>
<p>
<div style="word-wrap: normal; overflow: hidden; word-break: normal" id="post0">第一章：日志管理 <br />
1.forcing log switches <br />
sql&gt; alter system switch logfile; <br />
2.forcing checkpoints <br />
sql&gt; alter system checkpoint; <br />
3.adding _disibledevent= <br />
b. sql&gt; execute dbms_logmnr_d.build(oradb.ora,c:\orac<wbr>le\oradb\log); <br />
c. sql&gt; execute dbms_logmnr_add_logfile(c:\oracle\orada<wbr>ta\oradb\redo01.log, <br />
&nbsp;&nbsp;&nbsp;sql&gt; dbms_logmnr.new); <br />
d. sql&gt; execute dbms_logmnr.add_logfile(c:\oracle\orada<wbr>ta\oradb\redo02.log, <br />
&nbsp;&nbsp;&nbsp;sql&gt; dbms_logmnr.addfile); <br />
e. sql&gt; execute dbms_logmnr.start_logmnr(dictfilename=&gt;<wbr>c:\oracle\oradb\log\oradb.ora); <br />
f. sql&gt; select * from v$logmnr_contents(v$logmnr_dictionary,v$<wbr>logmnr_parameters <br />
&nbsp;&nbsp;&nbsp;sql&gt; v$logmnr_logs); <br />
g. sql&gt; execute dbms_logmnr.end_logmnr;<br />
<br />
第二章：表空间管理 <br />
1.create tablespaces <br />
sql&gt; create tablespace tablespace_name datafile c:\oracle\oradata\file1.dbf size 100m, <br />
sql&gt; c:\oracle\oradata\file2.dbf size 100m minimum extent 550k [logging/nologging] <br />
sql&gt; default storage (initial 500k next 500k maxextents 500 pctinccease 0) <br />
sql&gt; [online/offline] [permanent/temporary] [extent_management_clause] <br />
2.locally managed tablespace <br />
sql&gt; create tablespace user_data datafile c:\oracle\oradata\user_data01.dbf <br />
sql&gt; size 500m extent management local uniform size 10m; <br />
3.temporary tablespace <br />
sql&gt; create temporary tablespace temp tempfile c:\oracle\oradata\temp01.dbf <br />
sql&gt; size 500m extent management local uniform size 10m; <br />
4.change the storage setting <br />
sql&gt; alter tablespace app_data minimum extent 2m; <br />
sql&gt; alter tablespace app_data default storage(initial 2m next 2m maxextents 999); <br />
5.taking tablespace offline or _disibledevent= (average row size - initial row size) *100 /average row size <br />
&nbsp;&nbsp;pctused = 100-pctfree- (average row size*100/available data space) <br />
5.change storage and block utilization parameter <br />
sql&gt; alter table table_name pctfree=30 pctused=50 storage(next 500k <br />
sql&gt; minextents 2 maxextents 100); <br />
6.manually allocating extents <br />
sql&gt; alter table table_name allocate extent(size 500k datafile c:/oracle/data.dbf); <br />
7.move tablespace <br />
sql&gt; alter table employee move tablespace users; <br />
8.deallocate of unused space <br />
sql&gt; alter table table_name deallocate unused [keep integer] <br />
9.truncate a table <br />
sql&gt; truncate table table_name; <br />
10.drop a table <br />
sql&gt; drop table table_name [cascade constraints]; <br />
11.drop a column <br />
sql&gt; alter table table_name drop column comments cascade constraints checkpoint 1000; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alter table table_name drop columns continue; <br />
12.mark a column as unused <br />
sql&gt; alter table table_name set unused column comments cascade constraints; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alter table table_name drop unused columns checkpoint 1000; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alter table orders drop columns continue checkpoint 1000 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data_dictionary : dba_unused_col_tabs<br />
<br />
第四章：索引 <br />
1.creating function-based indexes <br />
sql&gt; create index summit.item_quantity _disibledevent=(maximum number of rows-initial number of rows)*100/maximum number of rows <br />
4.creating reverse key indexes <br />
sql&gt; create unique index xay_id _disibledevent= immediate/deferred/default; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set constraint[s] constraint_name/all immediate/deferred; <br />
2. sql&gt; drop table table_name cascade constraints <br />
&nbsp;&nbsp;&nbsp;sql&gt; drop tablespace tablespace_name including contents cascade constraints <br />
3. define constraints while create a table <br />
sql&gt; create table xay(id number(7) constraint xay_id primary key deferrable <br />
sql&gt; using index storage(initial 100k next 100k) tablespace indx); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primary key/unique/references table(column)/check <br />
&nbsp;&nbsp;&nbsp;&nbsp;4.enable constraints <br />
sql&gt; alter table xay enable novalidate constraint xay_id; <br />
5.enable constraints <br />
sql&gt; alter table xay enable validate constraint xay_id;<br />
<br />
第六章：LOAD数据 <br />
1.loading data using direct_load insert <br />
sql&gt; insert /*+append */ into emp nologging <br />
sql&gt; select * from emp_old; <br />
2.parallel direct-load insert <br />
sql&gt; alter session enable parallel dml; <br />
sql&gt; insert /*+parallel(emp,2) */ into emp nologging <br />
sql&gt; select * from emp_old; <br />
3.using sql*loader <br />
sql&gt; sqlldr scott/tiger \ <br />
sql&gt; control = ulcase6.ctl \ <br />
sql&gt; log = ulcase6.log direct=true <br />
<br />
第七章：reorganizing data <br />
1.using expoty <br />
$exp scott/tiger tables(dept,emp) file=c:\emp.dmp log=exp.log compress=n direct=y <br />
2.using import <br />
$imp scott/tiger tables(dept,emp) file=emp.dmp log=imp.log ignore=y <br />
3.transporting a tablespace <br />
sql&gt;alter tablespace sales_ts read _disibledevent=xay.dmp transport_tablespace=y tablespace=sales_ts <br />
triggers=n constraints=n <br />
$copy datafile <br />
$imp sys/.. file=xay.dmp transport_tablespace=y datafiles=(/disk1/sles01.dbf,/disk2 <br />
/sles02.dbf) <br />
sql&gt; alter tablespace sales_ts read write; <br />
4.checking transport set <br />
sql&gt; DBMS_tts.transport_set_check(ts_list =&gt;sales_ts ..,incl_constraints=&gt;true); <br />
在表transport_set_violations 中查看 <br />
sql&gt; dbms_tts.isselfcontained 为true 是， 表示自包含<br />
<br />
第八章： managing password security and resources <br />
1.controlling account lock and password <br />
sql&gt; alter user juncky identified by oracle account unlock; <br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.user_provided password function <br />
sql&gt; function_name(userid in varchar2(30),password in varchar2(30), <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;old_password in varchar2(30)) return boolean <br />
3.create a profile : password setting <br />
sql&gt; create profile grace_5 limit failed_login_attempts 3 <br />
sql&gt; password_lock_time unlimited password_life_time 30 <br />
sql&gt;password_reuse_time 30 password_verify_function verify_function <br />
sql&gt; password_grace_time 5; <br />
4.altering a profile <br />
sql&gt; alter profile default failed_login_attempts 3 <br />
sql&gt; password_life_time 60 password_grace_time 10; <br />
5.drop a profile <br />
sql&gt; drop profile grace_5 [cascade]; <br />
6.create a profile : resource limit <br />
sql&gt; create profile developer_prof limit sessions_per_user 2 <br />
sql&gt; <a class="keyword" href="http://product.pcpop.com/CPU/00000_1.html" target="_blank">CPU</a>_per_session 10000 idle_time 60 connect_time 480; <br />
7. view =&gt; resource_cost : alter resource cost <br />
dba_Users,dba_profiles <br />
8. enable resource limits <br />
sql&gt; alter system set resource_limit=true;<br />
<br />
第九章：Managing users <br />
1.create a user: database authentication <br />
sql&gt; create user juncky identified by oracle default tablespace users <br />
sql&gt; temporary tablespace temp quota 10m _disibledevent=&gt; system_privilege_map ,dba_sys_privs,session_privs <br />
2.grant system privilege <br />
sql&gt; grant create session,create table to managers; <br />
sql&gt; grant create session to scott with admin option; <br />
with admin option can grant or revoke privilege from any user or role; <br />
3.sysdba and sysoper privileges: <br />
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile, <br />
alter tablespace begin/end backup,recover database <br />
alter database archivelog,restricted session <br />
sysdba: sysoper privileges with admin option,create database,recover database until <br />
4.password file members: view:=&gt; v$pwfile_users <br />
5.O7_dictionary_accessibility =true restriction access to view or tables in other schema <br />
6.revoke system privilege <br />
sql&gt; revoke create table from karen; <br />
sql&gt; revoke create session from scott; <br />
7.grant object privilege <br />
sql&gt; grant execute _disibledevent=&gt; dba_tab_privs, dba_col_privs <br />
9.revoke object privilege <br />
sql&gt; revoke execute _disibledevent=&gt; sys.aud$ <br />
11. protecting the audit trail <br />
sql&gt; audit delete _disibledevent=&gt; all_def_audit_opts,dba_stmt_audit_opts,d<wbr>ba_priv_audit_opts,<br />
dba_obj_audit_opts <br />
16.view audit result: view=&gt; dba_audit_trail,dba_audit_exists,dba_aud<wbr>it_object,<br />
dba_audit_session,dba_audit_statement<br />
<br />
第十一章： manager role <br />
1.create roles<br />
sql&gt; create role sales_clerk; <br />
sql&gt; create role hr_clerk identified by bonus; <br />
sql&gt; create role hr_manager identified externally; <br />
2.modify role <br />
sql&gt; alter role sales_clerk identified by commission; <br />
sql&gt; alter role hr_clerk identified externally; <br />
sql&gt; alter role hr_manager not identified; <br />
3.assigning roles <br />
sql&gt; grant sales_clerk to scott; <br />
sql&gt; grant hr_clerk to hr_manager; <br />
sql&gt; grant hr_manager to scott with admin option; <br />
4.establish default role <br />
sql&gt; alter user scott default role hr_clerk,sales_clerk; <br />
sql&gt; alter user scott default role all; <br />
sql&gt; alter user scott default role all except hr_clerk; <br />
sql&gt; alter user scott default role none; <br />
5.enable and disable roles <br />
sql&gt; set role hr_clerk; <br />
sql&gt; set role sales_clerk identified by commission; <br />
sql&gt; set role all except sales_clerk; <br />
sql&gt; set role none; <br />
6.remove role from user <br />
sql&gt; revoke sales_clerk from scott; <br />
sql&gt; revoke hr_manager from public; <br />
7.remove role <br />
sql&gt; drop role hr_manager; <br />
8.display role information <br />
view: =&gt;dba_roles,dba_role_privs,role_role_pri<wbr>vs,dba_sys_privs,<br />
role_sys_privs,role_tab_privs,session_ro<wbr>les<br />
<br />
第十二章: BACKUP and RECOVERY <br />
1. v$sga,v$instance,v$process,v$bgprocess,v<wbr>$database,v$datafile,v$sgastat <br />
2. Rman need set dbwr_IO_slaves or backup_tape_IO_slaves and large_pool_size <br />
3. Monitoring Parallel Rollback <br />
&gt; v$fast_start_servers , v$fast_start_transactions <br />
4.perform a closed database backup (noarchivelog) <br />
&gt; shutdown immediate <br />
&gt; cp files /backup/ <br />
&gt; startup <br />
5.restore to a different location <br />
&gt; connect system/manager as sysdba <br />
&gt; startup mount <br />
&gt; alter database rename file /disk1/../user.dbfto /disk2/../user.dbf; <br />
&gt; alter database open; <br />
6.recover syntax <br />
--recover a mounted database <br />
&gt;recover database; <br />
&gt;recover datafile /disk1/data/df2.dbf; <br />
&gt;alter database recover database; <br />
--recover an opened database <br />
&gt;recover tablespace user_data; <br />
&gt;recover datafile 2; <br />
&gt;alter database recover datafile 2; <br />
7.how to apply redo log files automatically <br />
&gt;set autorecovery on <br />
&gt;recover automatic datafile 4; <br />
8.complete recovery: <br />
--method 1(mounted databae) <br />
&gt;copy c:\backup\user.dbf c:\oradata\user.dbf <br />
&gt;startup mount <br />
&gt;recover datafile c:\oradata\user.dbf; <br />
&gt;alter database open; <br />
--method 2(opened database,initially opened,not system or rollback datafile)<br />
&gt;copy c:\backup\user.dbf c:\oradata\user.dbf (alter tablespace offline) <br />
&gt;recover datafile c:\oradata\user.dbf or <br />
&gt;recover tablespace user_data; <br />
&gt;alter database datafile c:\oradata\user.dbf online or <br />
&gt;alter tablespace user_data online; <br />
--method 3(opened database,initially closed not system or rollback datafile) <br />
&gt;startup mount <br />
&gt;alter database datafile c:\oradata\user.dbf offline; <br />
&gt;alter database open <br />
&gt;copy c:\backup\user.dbf d:\oradata\user.dbf <br />
&gt;alter database rename file c:\oradata\user.dbfto d:\oradata\user.dbf <br />
&gt;recover datafile e:\oradata\user.dbf or recover tablespace user_data; <br />
&gt;alter tablespace user_data online; <br />
--method 4(loss of data file with no backup and have all archive log) <br />
&gt;alter tablespace user_data offline immediate; <br />
&gt;alter database create datafile d:\oradata\user.dbfas c:\oradata\user.dbf <br />
&gt;recover tablespace user_data; <br />
&gt;alter tablespace user_data online <br />
9.perform an open database backup <br />
&gt; alter tablespace user_data begin backup; <br />
&gt; copy files /backup/ <br />
&gt; alter database datafile /c:/../data.dbf end backup; <br />
&gt; alter system switch logfile; <br />
10.backup a control file <br />
&gt; alter database backup controlfile to control1.bkp; <br />
&gt; alter database backup controlfile to trace; <br />
11.recovery (noarchivelog mode) <br />
&gt; shutdown abort <br />
&gt; cp files <br />
&gt; startup <br />
12.recovery of file in backup mode <br />
&gt;alter database datafile 2 end backup; <br />
13.clearing redo log file <br />
&gt;alter database clear unarchived logfile group 1; <br />
&gt;alter database clear unarchived logfile group 1 unrecoverable datafile; <br />
14.redo log recovery <br />
&gt;alter database add logfile group 3 c:\oradata\redo03.logsize 1000k; <br />
&gt;alter database drop logfile group 1; <br />
&gt;alter database open; <br />
or &gt;cp c:\oradata\redo02.log c:\oradata\redo01.log <br />
&gt;alter database clear logfile c:\oradata\log01.log;<br />
<br />
</div>
</div>
</div><img src ="http://www.blogjava.net/NewMoring/aggbug/279284.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-05-31 21:13 <a href="http://www.blogjava.net/NewMoring/articles/279284.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解除oracle10g密码锁定</title><link>http://www.blogjava.net/NewMoring/articles/279261.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Sun, 31 May 2009 10:34:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/279261.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/279261.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/279261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/279261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/279261.html</trackback:ping><description><![CDATA[<p><span id="ctl00_ContentPlaceHolder1_ArtBody2_lblContent">&nbsp; </p>
<div>
<p>解除oracle10g密码锁定</p>
<p>oracle10g密码被锁定了，这么搞定它，cmd下</p>
<p>&gt;sqlplus /nolog<br />
<br />
&gt;conn sys/password as sysdba</p>
<p>更改锁定的密码：</p>
<p style="font-size: 10pt">&nbsp;&nbsp; 执行ALTER USER DBSNMP ACCOUNT UNLOCK；</p>
<p style="font-size: 10pt">&nbsp;&nbsp; 从新用SQL/PLUS登录，设置用户名、密码；</p>
<p style="font-size: 10pt">注：由于刚才解锁的用户名是DBSNMP，所以这里设置的用户名也是DBSNMP</p>
<p style="font-size: 10pt"><strong><span style="font-size: 9pt; mso-fareast-: 1.0pt">Oracle <ST1:CHMETCNV unitname="g" sourcevalue="10" hasspace="False" negative="False" numbertype="1" tcsc="0">10g</ST1:CHMETCNV> </span><span style="font-size: 9pt; mso-font-kerning: 1.0pt">默认安装带来的用户名</span><span style="font-size: 9pt; mso-fareast-: 1.0pt">/</span><span style="font-size: 9pt; mso-font-kerning: 1.0pt">密码</span><br />
</strong></p>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
    <thead>
        <tr>
            <td style="font-size: 10pt" valign="bottom">
            <p style="font-size: 10pt" align="left">Username</p>
            </td>
            <td style="font-size: 10pt" valign="bottom">
            <p style="font-size: 10pt" align="left">Password</p>
            </td>
            <td style="font-size: 10pt" valign="bottom">
            <p style="font-size: 10pt" align="left">Description</p>
            </td>
            <td style="font-size: 10pt" valign="bottom">
            <p style="font-size: 10pt" align="left">See Also</p>
            </td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">CTXSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">CTXSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The Oracle Text account</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Text Reference</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">DBSNMP</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">DBSNMP</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The account used by the Management Agent component of Oracle Enterprise Manager to monitor and manage the database</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Enterprise Manager Grid Control Installation and Basic Configuration</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">LBACSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">LBACSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The Oracle Label Security administrator account</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Label Security Administrator's Guide</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">MDDATA</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">MDDATA</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The schema used by Oracle Spatial for storing Geocoder and router data</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Spatial User's Guide and Reference</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">MDSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">MDSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The Oracle Spatial and Oracle interMedia Locator administrator account</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Spatial User's Guide and Reference</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">DMSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">DMSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The Oracle Data Mining account.</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Data Mining Administrator's Guide</p>
            <p style="font-size: 10pt" align="left">Oracle Data Mining Concepts</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">OLAPSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">MANAGER</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The account used to create OLAP metadata structures. It owns the OLAP Catalog (CWMLite).</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle OLAP Application Developer's Guide</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">ORDPLUGINS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">ORDPLUGINS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The Oracle interMedia user. Plug-ins supplied by Oracle and third party format plug-ins are installed in this schema.</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle interMedia User's Guide</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">ORDSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">ORDSYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The Oracle interMedia administrator account</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle interMedia User's Guide</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">OUTLN</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">OUTLN</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The account that supports plan stability. Plan stability enables you to maintain the same execution plans for the same SQL statements. OUTLN acts as a role to centrally manage metadata associated with stored outlines.</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Database Performance Tuning Guide</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">SI_INFORMTN_SCHEMA</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">SI_INFORMTN_SCHEMA</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The account that stores the information views for the SQL/MM Still Image Standard</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle interMedia User's Guide</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">SYS</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">CHANGE_ON_INSTALL</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The account used to perform database administration tasks</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Database Administrator's Guide</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">SYSMAN</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">CHANGE_ON_INSTALL</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">The account used to perform Oracle Enterprise Manager database administration tasks. Note that SYS and SYSTEM can also perform these tasks.</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Oracle Enterprise Manager Grid Control Installation and Basic Configuration</p>
            </td>
        </tr>
        <tr>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">SYSTEM</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">MANAGER</p>
            </td>
            <td style="font-size: 10pt" valign="top">
            <p style="font-size: 10pt" align="left">Another account used to perform database administration tasks.</p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
</div>
<p>本文来自德仔工作室 http://www.dezai.cn</span> </p>
 <img src ="http://www.blogjava.net/NewMoring/aggbug/279261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-05-31 18:34 <a href="http://www.blogjava.net/NewMoring/articles/279261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中文乱码大总结《转帖》</title><link>http://www.blogjava.net/NewMoring/articles/278963.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Fri, 29 May 2009 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/278963.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/278963.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/278963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/278963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/278963.html</trackback:ping><description><![CDATA[1.字节和unicode <br />
&nbsp; &nbsp; java内核是unicode的，就连class文件也是，但是很多媒体，包括文件/流的保存方式是使用字节流的。因此java要对这些字节流经行转化。char是unicode的，而byte是字节。java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度，可以用来告诉你，你用的convertor。其中两个很常用的静态函数是 <br />
public static ByteToCharConverter getDefault(); <br />
public static ByteToCharConverter getConverter(String encoding); <br />
如果你不指定converter，则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用8859_1。 <br />
byte ??〉char： <br />
"你"的gb码是：0xc4e3 ,unicode是0x4f60 <br />
&nbsp; String encoding = "gb2312"; <br />
&nbsp; byte b[] = {(byte)'u00c4',(byte)'u00e3'}; <br />
&nbsp; ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding); <br />
&nbsp; char c[] = converter.convertAll(b); <br />
&nbsp; for (int i = 0; i &lt; c.length; i++) { <br />
&nbsp; &nbsp; &nbsp; System.out.println(Integer.toHexString(c[i])); <br />
&nbsp; } <br />
结果是什么？0x4f60 <br />
如果encoding ="8859_1"，结果又是什么？0x00c4,0x00e3 <br />
如果代码改为 <br />
byte b[] = {(byte)'u00c4',(byte)'u00e3'}; <br />
ByteToCharConverter converter = ByteToCharConverter. getDefault(); <br />
char c[] = converter.convertAll(b); <br />
for (int i = 0; i &lt; c.length; i++) { <br />
&nbsp; &nbsp; System.out.println(Integer.toHexString(c[i])); <br />
} <br />
结果将又是什么？根据平台的编码而定。 <br />
<br />
char ??〉byte： <br />
&nbsp; &nbsp;
<dl class="code">
<dt>Java code
<dd>
<pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000">String encoding </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">gb2312</span><span style="color: #000000">"</span><span style="color: #000000">;
</span><span style="color: #0000ff">char</span><span style="color: #000000"> c[] </span><span style="color: #000000">=</span><span style="color: #000000"> {</span><span style="color: #000000">'</span><span style="color: #000000">u4f60</span><span style="color: #000000">'</span><span style="color: #000000">};
CharToByteConverter converter </span><span style="color: #000000">=</span><span style="color: #000000"> CharToByteConverter.getConverter(encoding);
</span><span style="color: #0000ff">byte</span><span style="color: #000000"> b[] </span><span style="color: #000000">=</span><span style="color: #000000"> converter.convertAll(c);
</span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> b.length; i</span><span style="color: #000000">++</span><span style="color: #000000">) {
System.out.println(Integer.toHexString(b[i]));
}</span></div>
</pre>
</dd></dl>结果是什么？0x00c4,0x00e3 <br />
如果encoding ="8859_1"，结果又是什么？0x3f <br />
如果代码改为 <br />
<dl class="code">
<dt>Java code
<dd>
<pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000">String encoding </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">gb2312</span><span style="color: #000000">"</span><span style="color: #000000">;
</span><span style="color: #0000ff">char</span><span style="color: #000000"> c[] </span><span style="color: #000000">=</span><span style="color: #000000"> {</span><span style="color: #000000">'</span><span style="color: #000000">u4f60</span><span style="color: #000000">'</span><span style="color: #000000">};
CharToByteConverter converter </span><span style="color: #000000">=</span><span style="color: #000000"> CharToByteConverter.getDefault();
</span><span style="color: #0000ff">byte</span><span style="color: #000000"> b[] </span><span style="color: #000000">=</span><span style="color: #000000"> converter.convertAll(c);
</span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> b.length; i</span><span style="color: #000000">++</span><span style="color: #000000">) {
System.out.println(Integer.toHexString(b[i]));
}</span></div>
</pre>
</dd></dl><br />
结果将又是什么？根据平台的编码而定。 <br />
很多中文问题就是从这两个最简单的类派生出来的。而却有很多类不直接支持把encoding输入，这给我们带来诸多不便。很多程序难得用encoding了，直接用default的encoding，这就给我们移植带来了很多困难。 <br />
<br />
2.utf-8 <br />
utf-8是和unicode一一对应的，其实现很简单 <br />
7位的unicode: 0 _ _ _ _ _ _ _ <br />
11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _ <br />
16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ <br />
21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ <br />
大多数情况是只使用到16位以下的unicode: <br />
"你"的gb码是：0xc4e3 ,unicode是0x4f60 <br />
&nbsp; &nbsp; 0xc4e3的二进制： <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1100 ，0100 ，1110 ，0011 <br />
由于只有两位我们按照两位的编码来排，但是我们发现这行不通，因为第７位不是0因此，返回"?" <br />
&nbsp; &nbsp; 0x4f60的二进制： <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0100 ，1111 ，0110 ，0000 <br />
&nbsp; &nbsp; &nbsp; &nbsp; 我们用utf-8补齐，变成： <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1110 ，0100 ，1011 ，1101 ，1010 ，0000 <br />
&nbsp; &nbsp; &nbsp; &nbsp; e4--bd-- a0 <br />
&nbsp; &nbsp; &nbsp; &nbsp; 于是返回：0xe4,0xbd,0xa0。 <br />
<br />
3.string和byte[] <br />
string其实核心是char[],然而要把byte转化成string，必须经过编码。string.length()其实就是char数组的长度，如果使用不同的编码，很可能会错分，造成散字和乱码。 <br />
例如： <br />
String encoding = &#8220;&#8221;; <br />
byte [] b={(byte)'u00c4',(byte)'u00e3'}; <br />
String str=new String(b,encoding);　　 <br />
如果encoding=8859_1，会有两个字，但是encoding=gb2312只有一个字这个问题在处理分页是经常发生 。 <br />
<br />
4.Reader,Writer / InputStream,OutputStream <br />
Reader和Writer核心是char，InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char读/写InputStream/OutputStream。 <br />
例如： <br />
文件test.txt只有一个"你"字，0xc4,0xe3 <br />
<dl class="code">
<dt>Java code
<dd>
<pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #000000">String encoding </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">gb2312</span><span style="color: #000000">"</span><span style="color: #000000">;
InputStreamReader reader </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> InputStreamReader(</span><span style="color: #0000ff">new</span><span style="color: #000000"> FileInputStream(
</span><span style="color: #000000">"</span><span style="color: #000000">text.txt</span><span style="color: #000000">"</span><span style="color: #000000">), encoding);
</span><span style="color: #0000ff">char</span><span style="color: #000000"> c[] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> </span><span style="color: #0000ff">char</span><span style="color: #000000">[</span><span style="color: #000000">10</span><span style="color: #000000">];
</span><span style="color: #0000ff">int</span><span style="color: #000000"> length </span><span style="color: #000000">=</span><span style="color: #000000"> reader.read(c);
</span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000">&lt;</span><span style="color: #000000"> length; i</span><span style="color: #000000">++</span><span style="color: #000000">) {
System.out.println(c[i]);
}</span></div>
</pre>
</dd></dl>结果是什么？你 <br />
如果encoding ="8859_1"，结果是什么？??两个字符，表示不认识。 <br />
反过来的例子自己做。 <br />
<br />
5.我们要对java的编译器有所了解： <br />
javac ?encoding <br />
我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。如果没有指定encoding，则按照系统的默认encoding,gb平台上是gb2312，英文平台上是iso8859_1。 <br />
java的编译器实际上是调用sun.tools.javac.main的类，对文件进行编译，这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取java文件的，然后把用utf-8形式编译成class文件。 <br />
例子代码： <br />
String str = "你"; <br />
&nbsp; &nbsp; FileWriter writer = new FileWriter("text.txt"); <br />
&nbsp; &nbsp; write.write(str); <br />
&nbsp; &nbsp; writer.close(); <br />
<br />
如果用gb2312编译，你会找到e4 bd a0的字段 ； <br />
如果用8859_1编译， 00c4 00e3的二进制： <br />
0000，0000 ，1100，0100 ，0000，0000 ，1110，0011 <br />
因为每个字符都大于7位，因此用11位编码： <br />
1100，0001，1000，0100，1100，0011，1010，0011 <br />
c1-- 84--　c3--　 a3 <br />
你会找到c1 84 c3 a3 。 <br />
<br />
但是我们往往忽略掉这个参数，因此这样往往会有跨平台的问题： <br />
样例代码在中文平台上编译，生成zhclass <br />
样例代码在英文平台上编译，输出enclass <br />
&nbsp; (1).　 zhclass在中文平台上执行ok,但是在英文平台上不行 <br />
&nbsp; (2).&nbsp; &nbsp; enclass在英文平台上执行ok,但是在中文平台上不行 <br />
原因： <br />
&nbsp; (1).&nbsp; &nbsp; 在中文平台上编译后，其实str在运行态的char[]是0x4f60,　在中文平台上运行，filewriter的缺省编码是gb2312,因此 chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中，于是0xc4,0xe3放进了文件。 <br />
但是如果是在英文平台下，chartobyteconverter的缺省值是8859_1, filewriter会自动调用8859_1去转化str,但是他无法解释，因此他会输出"?" <br />
&nbsp; (2).&nbsp; &nbsp; 在英文平台上编译后，其实str在运行态的char[]是0x00c4 0x00e3, 在中文平台上运行，中文无法识别，因此会出现??； <br />
在英文平台上，0x00c4--&gt;0xc4,0x00e3-&gt;0xe3，因此0xc4,0xe3被放进了文件。 <br />
<br />
6.&nbsp; &nbsp; 其它原因： &lt;%@ page contentType="text/html; charset=GBK" %&gt; <br />
设置浏览器的显示编码，如果response的数据是utf8编码，显示将是乱码，但是乱码和上述原因还不一样。 <br />
<br />
7.&nbsp; &nbsp; 发生编码的地方： <br />
&nbsp; &nbsp; 从数据库到java程序 byte??〉char <br />
&nbsp; &nbsp; 从java程序到数据库 char??〉byte <br />
&nbsp; &nbsp; 从文件到java程序 byte??〉char <br />
&nbsp; &nbsp; 从java程序到文件 char??〉byte <br />
&nbsp; &nbsp; 从java程序到页面显示 char??〉byte <br />
&nbsp; &nbsp; 从页面form提交数据到java程序byte??〉char <br />
&nbsp; &nbsp; 从流到java程序byte??〉char <br />
&nbsp; &nbsp; 从java程序到流char??〉byte <br />
<br />
谢志钢的解决方法： <br />
我是使用配置过滤器的方法解决中文乱码的： <br />
<br />
<dl class="code">
<dt>XML code
<dd>
<pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">RequestFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">net.golden.uirs.util.RequestFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">charset</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">gb2312</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">RequestFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span></div>
</pre>
</dd></dl><br />
<br />
<br />
&nbsp;
<dl class="code">
<dt>Java code
<dd>
<pre>
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> doFilter(ServletRequest req, ServletResponse res,
FilterChain fChain) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> IOException, ServletException {
HttpServletRequest request </span><span style="color: #000000">=</span><span style="color: #000000"> (HttpServletRequest) req;
HttpServletResponse response </span><span style="color: #000000">=</span><span style="color: #000000"> (HttpServletResponse) res;
HttpSession session </span><span style="color: #000000">=</span><span style="color: #000000"> request.getSession();
String userId </span><span style="color: #000000">=</span><span style="color: #000000"> (String) session.getAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">userid</span><span style="color: #000000">"</span><span style="color: #000000">);
req.setCharacterEncoding(</span><span style="color: #0000ff">this</span><span style="color: #000000">.filterConfig.getInitParameter(</span><span style="color: #000000">"</span><span style="color: #000000">charset</span><span style="color: #000000">"</span><span style="color: #000000">)); </span><span style="color: #008000">//</span><span style="color: #008000"> 设置字符集？实际上是设置了byte ??〉char的encoding</span><span style="color: #008000">
</span><span style="color: #000000">    </span><span style="color: #0000ff">try</span><span style="color: #000000"> {
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (userId </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">||</span><span style="color: #000000"> userId.equals(</span><span style="color: #000000">""</span><span style="color: #000000">)) {
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">request.getRequestURL().toString().matches(
</span><span style="color: #000000">"</span><span style="color: #000000">.*/uirs/logon/logon(Controller){0,1}x2Ejsp$</span><span style="color: #000000">"</span><span style="color: #000000">)) {
session.invalidate();
response.sendRedirect(request.getContextPath() </span><span style="color: #000000">+</span><span style="color: #000000">
</span><span style="color: #000000">"</span><span style="color: #000000">/uirs/logon/logon.jsp</span><span style="color: #000000">"</span><span style="color: #000000">);
}
}
</span><span style="color: #0000ff">else</span><span style="color: #000000"> { </span><span style="color: #008000">//</span><span style="color: #008000"> 看看是否具有信息上报系统的权限</span><span style="color: #008000">
</span><span style="color: #000000">        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">net.golden.uirs.util.UirsChecker.check(userId, </span><span style="color: #000000">"</span><span style="color: #000000">信息上报系统</span><span style="color: #000000">"</span><span style="color: #000000">,
net.golden.uirs.util.UirsChecker.ACTION_DO)) {
</span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">request.getRequestURL().toString().matches(
</span><span style="color: #000000">"</span><span style="color: #000000">.*/uirs/logon/logon(Controller){0,1}x2Ejsp$</span><span style="color: #000000">"</span><span style="color: #000000">)) {
response.sendRedirect(request.getContextPath() </span><span style="color: #000000">+</span><span style="color: #000000">
</span><span style="color: #000000">"</span><span style="color: #000000">/uirs/logon/logonController.jsp</span><span style="color: #000000">"</span><span style="color: #000000">);
}
}
}
}
</span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception ex) {
response.sendRedirect(request.getContextPath() </span><span style="color: #000000">+</span><span style="color: #000000">
</span><span style="color: #000000">"</span><span style="color: #000000">/uirs/logon/logon.jsp</span><span style="color: #000000">"</span><span style="color: #000000">);
}
fChain.doFilter(req, res);
}</span></div>
</pre>
</dd></dl>
<img src ="http://www.blogjava.net/NewMoring/aggbug/278963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-05-29 23:38 <a href="http://www.blogjava.net/NewMoring/articles/278963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 序列化 2 《转帖》</title><link>http://www.blogjava.net/NewMoring/articles/278196.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Wed, 27 May 2009 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/278196.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/278196.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/278196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/278196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/278196.html</trackback:ping><description><![CDATA[<table border="0" cellspacing="0" cellpadding="0" width="99%">
    <tbody>
        <tr>
            <td>
            <p>目前网络上关于对象序列化的文章不少，但是我发现详细叙述用法和原理的文章太少。本人把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家。希望能为整个java社区的繁荣做一点事情。<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后，可以用java.io包中的各种字节流类将其保存到文件中，管道到另 一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大，在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网 络编程中并不是最激动人心的课题，但却相当重要，具有许多实用意义。<br />
            <br />
            <font color="#0000ff">一：对象序列化可以实现分布式对象。<br />
            </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要应用例如：RMI要利用对象序列化运行远程主机上的服务，就像在本地机上运行对象时一样。</p>
            </td>
        </tr>
        <tr>
            <td colspan="2">
            <p>二： <font color="#0000ff">java对象序列化不仅保留一个对象的数据，</font>而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中，可以保存在文件中或在网络连接上传 递。利用对象序列化可以进行对象的&#8220;深复制&#8221;，即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。<br />
            <br />
            &nbsp;&nbsp; 从上面的叙述中，我们知道了对象序列化是java编程中的必备武器，那么让我们从基础开始，好好学习一下它的机制和用法。 <br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp; java 序列化比较简单，通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Serializable接口的类对象可以转换成字节流或从字节流恢 复，不需要在类中增加任何代码。只有极少数情况下才需要定制代码保存或恢复对象状态。这里要注意：不是每个类都可序列化，有些类是不能序列化的，例如涉及 线程的类与特定JVM有非常复杂的关系。<br />
            序列化机制：</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; 序列化分为两大部分：序列化和反序列化。 序列化是这个过程的第一部分，将数据分解成字节流，以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型 转换成字节表示，有时还要恢复数据。恢复数据要求有恢复数据的对象实例。ObjectOutputStream中的序列化过程与字节流连接，包括对象类型 和版本信息。反序列化时，JVM用头信息生成对象实例，然后将对象字节流中的数据复制到对象数据成员中。下面我们分两大部分来阐述：<br />
            <br />
            <font color="#0000ff">处理对象流：</font><br />
            （序列化过程和反序列化过程）</p>
            <p>&nbsp;&nbsp; java.io包有两个序列化对象的类。ObjectOutputStream负责将对象写入字节流，ObjectInputStream从字节流重构对象。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 我们先了解ObjectOutputStream类吧。ObjectOutputStream类扩展DataOutput接口。<br />
            writeObject ()方法是最重要的方法，用于对象序列化。如果对象包含其他对象的引用，则writeObject()方法递归序列化这些对象。每个 ObjectOutputStream维护序列化的对象引用表，防止发送同一对象的多个拷贝。（这点很重要）由于writeObject()可以序列化整 组交叉引用的对象，因此同一ObjectOutputStream实例可能不小心被请求序列化同一对象。这时，进行反引用序列化，而不是再次写入对象字节 流。<br />
            <br />
            下面，让我们从例子中来了解ObjectOutputStream这个类吧。<br />
            1. // 序列化 today's date 到一个文件中. <br />
            2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream f = new FileOutputStream("tmp"); <br />
            3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectOutputStream s = new ObjectOutputStream(f); <br />
            4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.writeObject("Today"); <br />
            5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.writeObject(new Date()); <br />
            6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.flush(); </p>
            <p>&nbsp;&nbsp;&nbsp; 现在，让我们来了解ObjectInputStream这个类。它与 ObjectOutputStream相似。它扩展DataInput接口。ObjectInputStream中的方法镜像 DataInputStream中读取Java基本数据类型的公开方法。readObject()方法从字节流中反序列化对象。每次调用 readObject()方法都返回流中下一个Object。对象字节流并不传输类的字节码，而是包括类名及其签名。readObject()收到对象 时，JVM装入头中指定的类。如果找不到这个类，则readObject()抛出ClassNotFoundException,如果需要传输对象数据和 字节码，则可以用RMI框架。ObjectInputStream的其余方法用于定制反序列化过程。<br />
            <br />
            例子如下：<br />
            1. //从文件中反序列化 string 对象和 date 对象 <br />
            2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream in = new FileInputStream("tmp"); <br />
            3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectInputStream s = new ObjectInputStream(in); <br />
            4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String today = (String)s.readObject(); <br />
            5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date date = (Date)s.readObject(); </p>
            <p><font color="#0000ff">定制序列化过程:</font></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 序列化通常可以自动完成，但有时可能要对这个过程进行控制。java可以将类声明为serializable，但仍可手工控制声明为static或transient的数据成员。<br />
            例子：一个非常简单的序列化类。<br />
            1. public class simpleSerializableClass implements Serializable{ <br />
            2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sToday="Today:"; <br />
            3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transient Date dtToday=new Date(); <br />
            4. } </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 序列化时，类的所有数据成员应可序列化除了声明为transient或static的成员。将变量声明为 transient告诉JVM我们会负责将变元序列化。将数据成员声明为transient后，序列化过程就无法将其加进对象字节流中，没有从 transient数据成员发送的数据。后面数据反序列化时，要重建数据成员（因为它是类定义的一部分），但不包含任何数据，因为这个数据成员不向流中写 入任何数据。记住，对象流不序列化static或transient。我们的类要用writeObject()与readObject()方法以处理这些 数据成员。使用writeObject()与readObject()方法时，还要注意按写入的顺序读取这些数据成员。<br />
            <br />
            关于如何使用定制序列化的部分代码如下：<br />
            <br />
            1. //重写writeObject()方法以便处理transient的成员。 <br />
            2. public void writeObject(ObjectOutputStream outputStream) throws IOException{ <br />
            3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputStream.defaultWriteObject();//使定制的writeObject()方法可以 <br />
            4.&nbsp;&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 />
            5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputStream.writeObject(oSocket.getInetAddress()); <br />
            6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputStream.writeInt(oSocket.getPort()); <br />
            7. } <br />
            8. //重写readObject()方法以便接收transient的成员。 <br />
            9. private void readObject(ObjectInputStream inputStream) throws IOException,ClassNotFoundException{ <br />
            10.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputStream.defaultReadObject();//defaultReadObject()补充自动序列化 <br />
            11.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InetAddress oAddress=(InetAddress)inputStream.readObject(); <br />
            12.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iPort =inputStream.readInt(); <br />
            13.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oSocket = new Socket(oAddress,iPort); <br />
            14.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iID=getID(); <br />
            15.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dtToday =new Date(); <br />
            16. } </p>
            <p><font color="#0000ff">完全定制序列化过程:</font></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果一个类要完全负责自己的序列化，则实现 Externalizable接口而不是Serializable接口。Externalizable接口定义包括两个方法writeExternal ()与readExternal()。利用这些方法可以控制对象数据成员如何写入字节流.类实现Externalizable时，头写入对象流中，然后类 完全负责序列化和恢复数据成员，除了头以外，根本没有自动序列化。这里要注意了。声明类实现Externalizable接口会有重大的安全风险。 writeExternal()与readExternal()方法声明为public，恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信 息，则要格外小心。这包括使用安全套接或加密整个字节流。到此为至，我们学习了序列化的基础部分知识.</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/NewMoring/aggbug/278196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-05-27 14:18 <a href="http://www.blogjava.net/NewMoring/articles/278196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java Serializable 类 序列化1《转帖》</title><link>http://www.blogjava.net/NewMoring/articles/278195.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Wed, 27 May 2009 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/NewMoring/articles/278195.html</guid><wfw:comment>http://www.blogjava.net/NewMoring/comments/278195.html</wfw:comment><comments>http://www.blogjava.net/NewMoring/articles/278195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/NewMoring/comments/commentRss/278195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/NewMoring/services/trackbacks/278195.html</trackback:ping><description><![CDATA[<p>1.5 定义类的可序列化域<br />
可用两种不同的方式来定义类的可序列化域。类的可序列化域被缺省定义为非瞬态和非静态域。 通过在 Serializable 类中声明一个指定的域 serialPersistentFields，即可覆盖该缺省值。 该域的初始化必须用 ObjectStreamField 对象的数组来完成，该对象列出了可序列化域的名称和类型。该域的修饰符应为 private、static 和 final。<br />
例如，以下声明将复制缺省行为。<br />
class List implements Serializable {<br />
&nbsp;&nbsp;&nbsp; List next;<br />
&nbsp;&nbsp;&nbsp; private static final ObjectStreamField[] serialPersistentFields<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = {new ObjectStreamField("next", List.class)};</p>
<p>}<br />
用 serialPersistentFields 为某个类定义可序列化域后，即无需再将可序列化域限制在当前 Serializable 类的定义之内。利用第 1.7 节，"访问类的可序列化域" 中描述的接口，Serializable 类的 writeObject 和 readObject 方法可将该类的当前实现映射到其可序列化域。因此，后续版本中可以改变 Serializable 类的域，但前提是保持与版本兼容的 Serializable 域的映射。</p>
<p>1.6 对类的可序列化域和数据存档<br />
对类的可序列化状态进行存档以使其与 Serializable 类的其它实现间可互操作，或者对类演变进行存档，这些都非常必要。对可序列化域进行存档可帮助用户最终确定该域是否应序列化。 序列化 javadoc 标记 @serial、@serialField 和 @serialData 可提供对源代码中 Serializable 类的序列化形式进行存档的方法。</p>
<p>对于缺省的可序列化域，@serial 标记应放在 javadoc 注释中。语法如下：@serial field-description 其中可选项 field-description 描述域及其容许值的含义。 field-description 可跨多行。当初始版本中增加一个域时，@since 标记指出所添域的版本。@serial 的 field-description 提供针对序列化的文档。在序列化形式文档内，field-description 将被添加到 javadoc 注释中。 <br />
@serialField 标记用于对 serialPersistentFields 数组的 ObjectStreamField 组件进行存档。每个 ObjectStreamField 组件都应使用其中的一个标记。语法如下：@serialField field-name field-type field-description <br />
@serialData 标记描述写入或读取数据的次序和类型。该标记描述 writeObject 所写入的可选数据或 Externalizable.writeExternal 方法所写入的所有数据的次序或类型。语法如下：@serialData data-description <br />
javadoc 应用程序识别序列化 javadoc 标记并为每个 Serializable 和 Externalizable 类生成说明文字。有关这些标记用法的示例，参见第 C.1 节 "java.io.File 可替代实现的示例。"</p>
<p>当某个类被声明为 Serializable 时，即通过可序列化域及可选数据（按名称和类型）定义了该对象的可序列化状态。可选数据只能用 Serializable 类中的 writeObject 方法显式写入，而其读取则可通过 Serializable 类和 readObject 方法进行。否则，序列化将跳过无法读取的可选数据。 </p>
<p>当一个类被声明为 Externalizable 时，通过类自身写入流的数据即定义了该类的序列化状态。 该类必须指定顺序、类型及写入流的每个数据的含义。同时还必须处理其自身的演变，从而可读取以前版本所写入的数据，或写入以前版本所能读取的数据。在存储和恢复数据时，该类必须与父类相一致。必须指定流中父类数据的位置。</p>
<p>类的设计者必须确保为类存储的信息对于持久性是合适的，而且遵循为实现序列化的互操作性和演变而指定的序列化规则。第 5 章&#8220;可序列化对象的版本演变&#8221;对类的演变进行了更详细的说明。 </p>
<p>1.10 Serializable 接口<br />
Serialization 对象生成流，其中提供有关所存对象的 JavaTM 类的信息。对于可序列化对象，即使存在该类的不同（但兼容）版本的实现，也要保持足够的信息以恢复这些对象。定义 Serializable 接口可以标识实现可序列化协议的类：</p>
<p><br />
package java.io;</p>
<p>public interface Serializable {};</p>
<p>Serializable 类必须具备如下功能：</p>
<p>实现 java.io.Serializable 接口 <br />
标识应序列化的域<br />
(使用 serialPersistentFields 成员以显式声明其可序列化，或者使用瞬态关键字来指示非序列域。) <br />
可访问其第一个非序列化父类的无参数构造函数。 <br />
该类可根据需要定义如下方法：</p>
<p>writeObject 方法，用于控制要保存哪些信息或将附加信息添加到流中 <br />
readObject 方法，用于读取由相应 writeObject 方法写入的信息，或在对象恢复后更新其状态 <br />
writeReplace 方法，用于允许类指定写入流的替换对象<br />
readResolve 方法，用于允许类为刚从流中读取的对象指定替换对象<br />
ObjectOutputStream 和 ObjectInputStream 支持所操作的可序列化类的演变（允许类发生改变以兼容早期版本的类）。有关实现兼容变化的机制的信息，参见第 5.5 节&#8220;兼容的 JavaTM 类型演变&#8221;。<br />
--------------------------------------------------------------------------<br />
class ObjectYouWannaSave implements Serializable{<br />
&nbsp;&nbsp; int x; int y; <br />
&nbsp;&nbsp; SubObject so = new SubObject();<br />
&nbsp;&nbsp; ..........<br />
}</p>
<p>class SubObject implements Serializable{<br />
&nbsp;&nbsp; String s = "abc"; //String is OK, because String is java.io.Serializable<br />
}</p>
<p>public class Save{ // in Save.java<br />
&nbsp;&nbsp; public void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectYouWannaSave original = new ObjectYouWannaSave();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; original.x = -1; original.y = 100; .....<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectOutputStream out = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = new ObjectOutputStream(new FileOutputStream(new File("c:/save.dat")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.writeObject(original);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exceptione){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{out.close();}catch(Exception e){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</p>
<p>public class Read{ // in Read.java<br />
&nbsp;&nbsp; public void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectInputStream in = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = new ObjectInStream(new FileInStream(new File("c:/save.dat")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ObjectYouWannaSave o = (ObjectYouWannaSave)in.readObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("x="+o.x); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("subobject.string=" + o.so.s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exceptione){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{in.close();}catch(Exception e){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</p>
<p>这是个最简单的例子，先运行Save,以后什么时候运行Read都可以（只要c:\save.dat文件还存在就可以了）<br />
--------------------------------------------------<br />
对象的寿命通常随着生成该对象的程序终止而终止，有时候，可能需要将对象的状态保存下来，在需要的时候<br />
再将对象恢复，我们把对象的这种记录自己状态的以便将来再生的能力，叫做对象的持续性（PERSISTENCE），<br />
对象通过写出描述自己状态的数值来记录自己，这个过程叫对象的串行化Serializable。串行化的主要任务是写<br />
出对象实例变量的值。如果变量是另一个对象的引用，则引用的对象也要串行化，这是个递归过程。<br />
--------------------------------------------------------------------<br />
java.io.Serializable interface是一个较为特殊的接口：<br />
The serialization interface has no methods or fields and serves <br />
only to identify the semantics of being serializable<br />
即：它主要是一个用于通知JVM的标志</p>
<p>class X implements java.io.Serializable{...}</p>
<p>如果你要定制你自己的serializable行为，你应该在X中实现以下2个方法：<br />
&nbsp;private void writeObject(java.io.ObjectOutputStream out)<br />
&nbsp;&nbsp;&nbsp;&nbsp; throws IOException<br />
&nbsp;private void readObject(java.io.ObjectInputStream in)<br />
&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ClassNotFoundException;</p>
<p>否则将按缺省的策略进行。</p>
<p>由于上述2个方法是private的，所以在某些情况下，可以使用<br />
java.io.Serializable的子接口java.io.Externalizable，<br />
在这个interface中有2个public方法：</p>
<p>public void writeExternal(ObjectOutput out)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException</p>
<p>public void readExternal(ObjectInput in)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException,<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; ClassNotFoundException</p>
<p><br />
----------------------------------------------------------------------------<br />
Serializable是一个串行化接口，它没有任何的属性和方法，一个类实现了串行化接口，就表明<br />
该类具有持久性，通过WriteObjcet可将其持久保存在磁盘，在需要时，可用ReadObject从磁盘中读出，次时，对象的状态和存入似的相同。上面给出的列子比较简单，可通过串行化保存一个<br />
链表对象，它的每个节点数据也会被保存。 当然，串行化接口还有其他用途，例如HTTP隧道等<br />
。<br />
-----------------------------------------------------------------------<br />
对象序列化的持续性要和永久对象分别开。序列化只能达到有线持续性<br />
在同一个jvm上可以重构对象的内容，达到持续性<br />
---------------------------------------------------------------------<br />
java序列化主要是用于两个方面：<br />
一个是java的RMI（远程方法调用－Remote method invocation），你可以使用别人机器上的对象就像在你自己的机器上使用它一样（通过序列化），另外，在使用javabean时也需要使用序列化，序列化主要就是使用在这两方面。<br />
-------------------------------------------------------------<br />
所谓序列化就是把把对象以一个代码串的形式表示出来，<br />
这样可以保存到磁盘或则通过网络传输，接受方可以在把代码串恢复成对象<br />
具体的串形化方法可以自己写，接收放就可以根据您串形的规则把对象恢复出来<br />
--------------------------------------------------------------------<br />
序列化是把一个对象的状态写入一个字节流的过程，它执行RMI，RMI允许一台机器上的JAVA对象调用不同机器上的JAVA对象方法，对象可以作为参数提供给那个远程方法，发送机序列化该对象并传送它，接收机执行反序列化。 <br />
序列化和反序列化的关系图表可形成包含循环引用的顺序图表。这是整个序列化的总体思想。 <br />
而Serializable接口属于支持序列化的一个接口，只有一个实现它的对象可以被序列化工具存储和回复，Serializable接口没有定义任何成员，只用来表示一个累可以被序列化，若该类可以序列化，那么它的所有子类都可以。 <br />
下面是关于序列化的一个实例： <br />
[b:a55efb5f91]程序名称：SerializationDemo.java <br />
程序主题：实现对象的序列化和反序列化 <br />
程序说明：该程序由实例化一个MyClass类的对象开始，该对象有三个实例变量，类型分别为String、int、double，是希望存储和恢复的信息。[/b:a55efb5f91] </p>
<p>[code:1:a55efb5f91] </p>
<p>import java.io.*; </p>
<p>public class SerializationDemo{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String args[]){ </p>
<p>//Object serialization <br />
try{ <br />
MyClass object1=new MyClass("Hello",-7,2.7e10); <br />
System.out.println("object1:"+object1); <br />
FileOutputStream fos=new FileOutputStream("serial"); <br />
ObjectOutputStream oos=new ObjectOutputStream(fos); <br />
oos.writeObject(object1); <br />
oos.flush(); <br />
oos.close(); <br />
} <br />
catch(Exception e){ <br />
System.out.println("Exception during serialization:"+e); <br />
System.exit(0); <br />
} </p>
<p>//Object deserialization <br />
try{ <br />
MyClass object2; <br />
FileInputStream fis=new FileInputStream("serial"); <br />
ObjectInputStream ois=new ObjectInputStream(fis); <br />
object2=(MyClass)ois.readObject(); <br />
ois.close(); <br />
System.out.println("object2:"+object2); <br />
} <br />
catch(Exception e){ <br />
System.out.println("Exception during deserialization:"+e); <br />
System.exit(0); <br />
} <br />
} <br />
} </p>
<p>class MyClass implements Serializable{ <br />
String s; <br />
int i; <br />
double d; <br />
public MyClass(String s,int i,double d){ <br />
this.s=s; <br />
this.i=i; <br />
this.d=d; <br />
} <br />
public String toString(){ <br />
return "s="+s+";i="+i+";d="+d; <br />
} <br />
} <br />
[/code:1:a55efb5f91] </p>
<p>程序运行结果：object1和object2的实例变量是一样的，输出如下：[code:1:a55efb5f91]object1:s=Hello;i=-7;d=2.7E10 <br />
object2:s=Hello;i=-7;d=2.7E10[/code:1:a55efb5f91]<br />
--------------------------------------------------------------------------------<br />
Object serialization的定义： <br />
Object serialization 允许你将实现了Serializable接口的对象转换为字节序列，这些字节序列可以被完全存储以备以后重新生成原来的对象。&nbsp; </p>
<p>serialization不但可以在本机做，而且可以经由网络操作（就是猫小说的RMI）。这个好处是很大的----因为它自动屏蔽了操作系统的差异，字节顺序（用Unix下的c开发过网络编程的人应该知道这个概念，我就容易在这上面犯错）等。比如，在Window平台生成一个对象并序列化之，然后通过网络传到一台Unix机器上，然后可以在这台Unix机器上正确地重构这个对象。 </p>
<p><br />
Object serialization主要用来支持2种主要的特性： <br />
1。Java的RMI(remote method invocation).RMI允许象在本机上一样操作远程机器上的对象。当发送消息给远程对象时，就需要用到serializaiton机制来发送参数和接收返回直。 </p>
<p>2。Java的JavaBeans.&nbsp;&nbsp; Bean的状态信息通常是在设计时配置的。Bean的状态信息必须被存起来，以便当程序运行时能恢复这些状态信息。这也需要serializaiton机制。 </p>
<p>&nbsp;</p>
<p>二。持久化 <br />
持久化应该是英文里的persistence.但是Java语言里现在只支持lightweight persistence,就是轻量级持久化，这是通过serialization机制来实现的。 </p>
<p>persistence是指一个对象的生命周期不由程序是否执行来决定，即使是在程序终止时这个对象也存在。它把一个serializable的对象写到磁盘（本机或其他机器上的非RAM存储器），并在程序重新调用时再读取对象到通常的RAM存储器。 </p>
<p>为什么说Java的serialization机制实现的是lightweight persistence?因为你必须显式的序列化和反序列化程序里的对象；而不是直接由一个关键词来定义一个对象是序列化的然后由系统做相应的处理。&nbsp; 如果以后的Java版本出现一个新的关键字来实现这种机制，比如就是persistence,如果我用 </p>
<p>persistence&nbsp; (String s="chinaunix") </p>
<p>然后系统自动做上面程序里的那些处理，那么Java就实现了persistence. </p>
 <img src ="http://www.blogjava.net/NewMoring/aggbug/278195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/NewMoring/" target="_blank">清晨</a> 2009-05-27 14:16 <a href="http://www.blogjava.net/NewMoring/articles/278195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>