??xml version="1.0" encoding="utf-8" standalone="yes"?>久久伊人亚洲AV无码网站,亚洲av无码有乱码在线观看,在线a亚洲v天堂网2018http://www.tkk7.com/NewMoring/与Java同\Q赢在未来?/description>zh-cnSat, 10 May 2025 19:18:24 GMTSat, 10 May 2025 19:18:24 GMT60随机码的生成http://www.tkk7.com/NewMoring/articles/279584.html清晨清晨Tue, 02 Jun 2009 06:24:00 GMThttp://www.tkk7.com/NewMoring/articles/279584.htmlhttp://www.tkk7.com/NewMoring/comments/279584.htmlhttp://www.tkk7.com/NewMoring/articles/279584.html#Feedback0http://www.tkk7.com/NewMoring/comments/commentRss/279584.htmlhttp://www.tkk7.com/NewMoring/services/trackbacks/279584.htmlimage.jsp面:

<%@ page contentType="image/jpeg"
 import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
<%!Color getRandColor(int fc, int bc) {//l定范围获得随机颜色
  Random random = new Random();
  if (fc > 255)
   fc = 255;
  if (bc > 255)
   bc = 255;
  int r = fc + random.nextInt(bc - fc);
  int g = fc + random.nextInt(bc - fc);
  int b = fc + random.nextInt(bc - fc);
  return new Color(r, g, b);
 }%>
<%
 //讄面不缓?br />  response.setHeader("Pragma", "No-cache");
 response.setHeader("Cache-Control", "no-cache");
 response.setDateHeader("Expires", 0);

 // 在内存中创徏图象
 int width = 60, height = 20;
 BufferedImage image = new BufferedImage(width, height,
   BufferedImage.TYPE_INT_RGB);

 // 获取囑Ş上下?br />  Graphics g = image.getGraphics();

 //生成随机c?br />  Random random = new Random();

 // 讑֮背景?br />  g.setColor(getRandColor(200, 250));
 g.fillRect(0, 0, width, height);

 //讑֮字体
 g.setFont(new Font("Times New Roman", Font.PLAIN, 18));

 //画边?br />  //g.setColor(new Color());
 //g.drawRect(0,0,width-1,height-1);

 // 随机产生155条干扰线Q图象中的认证码不易被其它E序探测?br />  g.setColor(getRandColor(160, 200));
 for (int i = 0; i < 155; i++) {
  int x = random.nextInt(width);
  int y = random.nextInt(height);
  int xl = random.nextInt(12);
  int yl = random.nextInt(12);
  g.drawLine(x, y, x + xl, y + yl);
 }

 // 取随Z生的认证?4位数?
 String sRand = "";
 for (int i = 0; i < 4; i++) {
  String rand = String.valueOf(random.nextInt(10));
  sRand += rand;
  // 认证码昄到图象中
  g.setColor(new Color(20 + random.nextInt(110), 20 + random
  .nextInt(110), 20 + random.nextInt(110)));
  //调用函数出来的颜色相同,可能是因为种子太接近Q所以只能直接生?br />   g.drawString(rand, 13 * i + 6, 16);
 }

 // 认证码存入SESSION
 session.setAttribute("rand", sRand);

 // 图象生效
 g.dispose();

 // 输出图象到页?br />  ImageIO.write(image, "JPEG", response.getOutputStream());
%>



清晨 2009-06-02 14:24 发表评论
]]>
*.jsp(1,84) quote symbol expected http://www.tkk7.com/NewMoring/articles/279443.html清晨清晨Mon, 01 Jun 2009 10:13:00 GMThttp://www.tkk7.com/NewMoring/articles/279443.htmlhttp://www.tkk7.com/NewMoring/comments/279443.htmlhttp://www.tkk7.com/NewMoring/articles/279443.html#Feedback0http://www.tkk7.com/NewMoring/comments/commentRss/279443.htmlhttp://www.tkk7.com/NewMoring/services/trackbacks/279443.htmltype Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: /ProductManage.jsp(1,84) quote symbol expected

解决办法Q?br />      它说W一行的W?4处需要加引号!Q一般都是ContentType后的引号错了。。。?/span>

清晨 2009-06-01 18:13 发表评论
]]>
NullPointerException 解决Ҏhttp://www.tkk7.com/NewMoring/articles/279430.html清晨清晨Mon, 01 Jun 2009 09:10:00 GMThttp://www.tkk7.com/NewMoring/articles/279430.htmlhttp://www.tkk7.com/NewMoring/comments/279430.htmlhttp://www.tkk7.com/NewMoring/articles/279430.html#Feedback0http://www.tkk7.com/NewMoring/comments/commentRss/279430.htmlhttp://www.tkk7.com/NewMoring/services/trackbacks/279430.html主要有以下几U原因:
1、用了未初始化的变量(虽然已经声明Q?
2、用了未初始化的对象(虽然已经声明Q?
3Q用了关键字或已存在的cd作变量对象方法或cd?/p>

一般报java.lang.NullPointerException的原因有以下几种Q?
·字符串变量未初始化;
·接口cd的对象没有用具体的类初始化,比如Q?
List ltQ会报错
List lt = new ArrayList()Q则不会报错?
·当一个对象的gؓI时Q你没有判断为空的情c?
你可以试着把下面的代码前加一行代码:
if(rb!=null && rb!="")
ҎQ?
if(rb==null);
if(rb!==null&&rb!="")

解决步骤Q?/p>

1、打开Console面板Q找到出错信息?/p>

2、从打印出来的信息中扑և一个文件及其出错行数?/p>

3、在出错行处讄断点Q重新执行程序?/p>

4、打开Variables视图Q从中查扑և错行所用到的所有对象及其|如果其中对象的gؓI,则可以进一步分析问题?/p>

5、如果该行的对象都不为空而是调用了一个函敎ͼ则到q个函数里设|断点(或step into F5 Q,l箋q行调试。这旉要用F6Q执行一行)Q直到再ơ报错,从而定位到出错处。重复步?.

6、结束?/p>


如果不会断点,教你个狠?你把用到的变量都输出出来,q道谁是NULL?然后在想办法Ҏ,q单多?/p>

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/aisitemasu/archive/2008/05/29/2493246.aspx



清晨 2009-06-01 17:10 发表评论
]]>
用Struts开发web应用时经常碰到的一些异常和错误<转帖>http://www.tkk7.com/NewMoring/articles/279412.html清晨清晨Mon, 01 Jun 2009 08:17:00 GMThttp://www.tkk7.com/NewMoring/articles/279412.htmlhttp://www.tkk7.com/NewMoring/comments/279412.htmlhttp://www.tkk7.com/NewMoring/articles/279412.html#Feedback0http://www.tkk7.com/NewMoring/comments/commentRss/279412.htmlhttp://www.tkk7.com/NewMoring/services/trackbacks/279412.html阅读全文

清晨 2009-06-01 16:17 发表评论
]]>
Cannot find message resources under key org.apache.struts.action.MESSAGE错误http://www.tkk7.com/NewMoring/articles/279411.html清晨清晨Mon, 01 Jun 2009 08:15:00 GMThttp://www.tkk7.com/NewMoring/articles/279411.htmlhttp://www.tkk7.com/NewMoring/comments/279411.htmlhttp://www.tkk7.com/NewMoring/articles/279411.html#Feedback0http://www.tkk7.com/NewMoring/comments/commentRss/279411.htmlhttp://www.tkk7.com/NewMoring/services/trackbacks/279411.htmlq行E序出现Cannot find message resources under key org.apache.struts.action.MESSAGE错误Q是说明找不?strong>ApplicationResources.propertiesQ要注意以下四方面?/p>

  W一Q在web.xml文g<web-app> <servlet>"把下面的内容攑֜q里"</servlet></web-app>中加?/p>

    <init-param>
    <param-name>application</param-name>
    <param-value>ApplicationResources</param-value>
    </init-param>

  W二Q在struts-config.xml中加入如下设|:

   <message-resources parameter="ApplicationResources"/>

    该设|最好放在:</action-mappings>"攑ֈq里"</struts-config>

  W三Q确?font color="#0000ff">ApplicationResources.properties文g在你建立的WEB-INF\classes文g夹中?/p>

  可以把applicationResources.properties攑ֈclasses文g夹下其它目录Q例如:
  把ApplicationResources.properties攑օWEB-INF\classes\mydir文g夹下?strong>struts-config.xml中的讄必须?/p>

     <message-resources parameter="mydir/ApplicationResources"/>
  
    W四Q就可能是键值的问题Qstruts的资源文件也是可以分多资源文仉|的Q比如配备是q样?/p>

    <message-resources parameter="ApplicationResources" key="myAppRes"/>      

   如果只有一个带key的资源文Ӟ那就会抛?strong> org.apache.struts.action.MESSAGE错误?删除key卛_?br />



清晨 2009-06-01 16:15 发表评论
]]>
常见的Oracle 命ohttp://www.tkk7.com/NewMoring/articles/279284.html清晨清晨Sun, 31 May 2009 13:13:00 GMThttp://www.tkk7.com/NewMoring/articles/279284.htmlhttp://www.tkk7.com/NewMoring/comments/279284.htmlhttp://www.tkk7.com/NewMoring/articles/279284.html#Feedback0http://www.tkk7.com/NewMoring/comments/commentRss/279284.htmlhttp://www.tkk7.com/NewMoring/services/trackbacks/279284.htmloracle常用命o

W一章:日志理
1.forcing log switches
sql> alter system switch logfile;
2.forcing checkpoints
sql> alter system checkpoint;
3.adding _disibledevent=
b. sql> execute dbms_logmnr_d.build(oradb.ora,c:\oracle\oradb\log);
c. sql> execute dbms_logmnr_add_logfile(c:\oracle\oradata\oradb\redo01.log,
   sql> dbms_logmnr.new);
d. sql> execute dbms_logmnr.add_logfile(c:\oracle\oradata\oradb\redo02.log,
   sql> dbms_logmnr.addfile);
e. sql> execute dbms_logmnr.start_logmnr(dictfilename=>c:\oracle\oradb\log\oradb.ora);
f. sql> select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters
   sql> v$logmnr_logs);
g. sql> execute dbms_logmnr.end_logmnr;

W二章:表空间管?
1.create tablespaces
sql> create tablespace tablespace_name datafile c:\oracle\oradata\file1.dbf size 100m,
sql> c:\oracle\oradata\file2.dbf size 100m minimum extent 550k [logging/nologging]
sql> default storage (initial 500k next 500k maxextents 500 pctinccease 0)
sql> [online/offline] [permanent/temporary] [extent_management_clause]
2.locally managed tablespace
sql> create tablespace user_data datafile c:\oracle\oradata\user_data01.dbf
sql> size 500m extent management local uniform size 10m;
3.temporary tablespace
sql> create temporary tablespace temp tempfile c:\oracle\oradata\temp01.dbf
sql> size 500m extent management local uniform size 10m;
4.change the storage setting
sql> alter tablespace app_data minimum extent 2m;
sql> alter tablespace app_data default storage(initial 2m next 2m maxextents 999);
5.taking tablespace offline or _disibledevent= (average row size - initial row size) *100 /average row size
  pctused = 100-pctfree- (average row size*100/available data space)
5.change storage and block utilization parameter
sql> alter table table_name pctfree=30 pctused=50 storage(next 500k
sql> minextents 2 maxextents 100);
6.manually allocating extents
sql> alter table table_name allocate extent(size 500k datafile c:/oracle/data.dbf);
7.move tablespace
sql> alter table employee move tablespace users;
8.deallocate of unused space
sql> alter table table_name deallocate unused [keep integer]
9.truncate a table
sql> truncate table table_name;
10.drop a table
sql> drop table table_name [cascade constraints];
11.drop a column
sql> alter table table_name drop column comments cascade constraints checkpoint 1000;
     alter table table_name drop columns continue;
12.mark a column as unused
sql> alter table table_name set unused column comments cascade constraints;
     alter table table_name drop unused columns checkpoint 1000;
     alter table orders drop columns continue checkpoint 1000
     data_dictionary : dba_unused_col_tabs

W四章:索引
1.creating function-based indexes
sql> create index summit.item_quantity _disibledevent=(maximum number of rows-initial number of rows)*100/maximum number of rows
4.creating reverse key indexes
sql> create unique index xay_id _disibledevent= immediate/deferred/default;
     set constraint[s] constraint_name/all immediate/deferred;
2. sql> drop table table_name cascade constraints
   sql> drop tablespace tablespace_name including contents cascade constraints
3. define constraints while create a table
sql> create table xay(id number(7) constraint xay_id primary key deferrable
sql> using index storage(initial 100k next 100k) tablespace indx);
     primary key/unique/references table(column)/check
    4.enable constraints
sql> alter table xay enable novalidate constraint xay_id;
5.enable constraints
sql> alter table xay enable validate constraint xay_id;

W六章:LOAD数据
1.loading data using direct_load insert
sql> insert /*+append */ into emp nologging
sql> select * from emp_old;
2.parallel direct-load insert
sql> alter session enable parallel dml;
sql> insert /*+parallel(emp,2) */ into emp nologging
sql> select * from emp_old;
3.using sql*loader
sql> sqlldr scott/tiger \
sql> control = ulcase6.ctl \
sql> log = ulcase6.log direct=true

W七章:reorganizing data
1.using expoty
$exp scott/tiger tables(dept,emp) file=c:\emp.dmp log=exp.log compress=n direct=y
2.using import
$imp scott/tiger tables(dept,emp) file=emp.dmp log=imp.log ignore=y
3.transporting a tablespace
sql>alter tablespace sales_ts read _disibledevent=xay.dmp transport_tablespace=y tablespace=sales_ts
triggers=n constraints=n
$copy datafile
$imp sys/.. file=xay.dmp transport_tablespace=y datafiles=(/disk1/sles01.dbf,/disk2
/sles02.dbf)
sql> alter tablespace sales_ts read write;
4.checking transport set
sql> DBMS_tts.transport_set_check(ts_list =>sales_ts ..,incl_constraints=>true);
在表transport_set_violations 中查?
sql> dbms_tts.isselfcontained 为true 是, 表示自包?br />
W八章: managing password security and resources
1.controlling account lock and password
sql> alter user juncky identified by oracle account unlock;
    
    2.user_provided password function
sql> function_name(userid in varchar2(30),password in varchar2(30),
     old_password in varchar2(30)) return boolean
3.create a profile : password setting
sql> create profile grace_5 limit failed_login_attempts 3
sql> password_lock_time unlimited password_life_time 30
sql>password_reuse_time 30 password_verify_function verify_function
sql> password_grace_time 5;
4.altering a profile
sql> alter profile default failed_login_attempts 3
sql> password_life_time 60 password_grace_time 10;
5.drop a profile
sql> drop profile grace_5 [cascade];
6.create a profile : resource limit
sql> create profile developer_prof limit sessions_per_user 2
sql> CPU_per_session 10000 idle_time 60 connect_time 480;
7. view => resource_cost : alter resource cost
dba_Users,dba_profiles
8. enable resource limits
sql> alter system set resource_limit=true;

W九章:Managing users
1.create a user: database authentication
sql> create user juncky identified by oracle default tablespace users
sql> temporary tablespace temp quota 10m _disibledevent=> system_privilege_map ,dba_sys_privs,session_privs
2.grant system privilege
sql> grant create session,create table to managers;
sql> grant create session to scott with admin option;
with admin option can grant or revoke privilege from any user or role;
3.sysdba and sysoper privileges:
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile,
alter tablespace begin/end backup,recover database
alter database archivelog,restricted session
sysdba: sysoper privileges with admin option,create database,recover database until
4.password file members: view:=> v$pwfile_users
5.O7_dictionary_accessibility =true restriction access to view or tables in other schema
6.revoke system privilege
sql> revoke create table from karen;
sql> revoke create session from scott;
7.grant object privilege
sql> grant execute _disibledevent=> dba_tab_privs, dba_col_privs
9.revoke object privilege
sql> revoke execute _disibledevent=> sys.aud$
11. protecting the audit trail
sql> audit delete _disibledevent=> all_def_audit_opts,dba_stmt_audit_opts,dba_priv_audit_opts,
dba_obj_audit_opts
16.view audit result: view=> dba_audit_trail,dba_audit_exists,dba_audit_object,
dba_audit_session,dba_audit_statement

W十一章: manager role
1.create roles
sql> create role sales_clerk;
sql> create role hr_clerk identified by bonus;
sql> create role hr_manager identified externally;
2.modify role
sql> alter role sales_clerk identified by commission;
sql> alter role hr_clerk identified externally;
sql> alter role hr_manager not identified;
3.assigning roles
sql> grant sales_clerk to scott;
sql> grant hr_clerk to hr_manager;
sql> grant hr_manager to scott with admin option;
4.establish default role
sql> alter user scott default role hr_clerk,sales_clerk;
sql> alter user scott default role all;
sql> alter user scott default role all except hr_clerk;
sql> alter user scott default role none;
5.enable and disable roles
sql> set role hr_clerk;
sql> set role sales_clerk identified by commission;
sql> set role all except sales_clerk;
sql> set role none;
6.remove role from user
sql> revoke sales_clerk from scott;
sql> revoke hr_manager from public;
7.remove role
sql> drop role hr_manager;
8.display role information
view: =>dba_roles,dba_role_privs,role_role_privs,dba_sys_privs,
role_sys_privs,role_tab_privs,session_roles

W十二章: BACKUP and RECOVERY
1. v$sga,v$instance,v$process,v$bgprocess,v$database,v$datafile,v$sgastat
2. Rman need set dbwr_IO_slaves or backup_tape_IO_slaves and large_pool_size
3. Monitoring Parallel Rollback
> v$fast_start_servers , v$fast_start_transactions
4.perform a closed database backup (noarchivelog)
> shutdown immediate
> cp files /backup/
> startup
5.restore to a different location
> connect system/manager as sysdba
> startup mount
> alter database rename file /disk1/../user.dbfto /disk2/../user.dbf;
> alter database open;
6.recover syntax
--recover a mounted database
>recover database;
>recover datafile /disk1/data/df2.dbf;
>alter database recover database;
--recover an opened database
>recover tablespace user_data;
>recover datafile 2;
>alter database recover datafile 2;
7.how to apply redo log files automatically
>set autorecovery on
>recover automatic datafile 4;
8.complete recovery:
--method 1(mounted databae)
>copy c:\backup\user.dbf c:\oradata\user.dbf
>startup mount
>recover datafile c:\oradata\user.dbf;
>alter database open;
--method 2(opened database,initially opened,not system or rollback datafile)
>copy c:\backup\user.dbf c:\oradata\user.dbf (alter tablespace offline)
>recover datafile c:\oradata\user.dbf or
>recover tablespace user_data;
>alter database datafile c:\oradata\user.dbf online or
>alter tablespace user_data online;
--method 3(opened database,initially closed not system or rollback datafile)
>startup mount
>alter database datafile c:\oradata\user.dbf offline;
>alter database open
>copy c:\backup\user.dbf d:\oradata\user.dbf
>alter database rename file c:\oradata\user.dbfto d:\oradata\user.dbf
>recover datafile e:\oradata\user.dbf or recover tablespace user_data;
>alter tablespace user_data online;
--method 4(loss of data file with no backup and have all archive log)
>alter tablespace user_data offline immediate;
>alter database create datafile d:\oradata\user.dbfas c:\oradata\user.dbf
>recover tablespace user_data;
>alter tablespace user_data online
9.perform an open database backup
> alter tablespace user_data begin backup;
> copy files /backup/
> alter database datafile /c:/../data.dbf end backup;
> alter system switch logfile;
10.backup a control file
> alter database backup controlfile to control1.bkp;
> alter database backup controlfile to trace;
11.recovery (noarchivelog mode)
> shutdown abort
> cp files
> startup
12.recovery of file in backup mode
>alter database datafile 2 end backup;
13.clearing redo log file
>alter database clear unarchived logfile group 1;
>alter database clear unarchived logfile group 1 unrecoverable datafile;
14.redo log recovery
>alter database add logfile group 3 c:\oradata\redo03.logsize 1000k;
>alter database drop logfile group 1;
>alter database open;
or >cp c:\oradata\redo02.log c:\oradata\redo01.log
>alter database clear logfile c:\oradata\log01.log;



清晨 2009-05-31 21:13 发表评论
]]>
解除oracle10g密码锁定http://www.tkk7.com/NewMoring/articles/279261.html清晨清晨Sun, 31 May 2009 10:34:00 GMThttp://www.tkk7.com/NewMoring/articles/279261.htmlhttp://www.tkk7.com/NewMoring/comments/279261.htmlhttp://www.tkk7.com/NewMoring/articles/279261.html#Feedback0http://www.tkk7.com/NewMoring/comments/commentRss/279261.htmlhttp://www.tkk7.com/NewMoring/services/trackbacks/279261.html 

解除oracle10g密码锁定

oracle10g密码被锁定了Q这么搞定它Qcmd?/p>

>sqlplus /nolog

>conn sys/password as sysdba

更改锁定的密码:

   执行ALTER USER DBSNMP ACCOUNT UNLOCKQ?/p>

   从新用SQL/PLUSdQ设|用户名、密码;

注:׃刚才解锁的用户名是DBSNMPQ所以这里设|的用户名也是DBSNMP

Oracle 10g 默认安装带来的用户名/密码

Username

Password

Description

See Also

CTXSYS

CTXSYS

The Oracle Text account

Oracle Text Reference

DBSNMP

DBSNMP

The account used by the Management Agent component of Oracle Enterprise Manager to monitor and manage the database

Oracle Enterprise Manager Grid Control Installation and Basic Configuration

LBACSYS

LBACSYS

The Oracle Label Security administrator account

Oracle Label Security Administrator's Guide

MDDATA

MDDATA

The schema used by Oracle Spatial for storing Geocoder and router data

Oracle Spatial User's Guide and Reference

MDSYS

MDSYS

The Oracle Spatial and Oracle interMedia Locator administrator account

Oracle Spatial User's Guide and Reference

DMSYS

DMSYS

The Oracle Data Mining account.

Oracle Data Mining Administrator's Guide

Oracle Data Mining Concepts

OLAPSYS

MANAGER

The account used to create OLAP metadata structures. It owns the OLAP Catalog (CWMLite).

Oracle OLAP Application Developer's Guide

ORDPLUGINS

ORDPLUGINS

The Oracle interMedia user. Plug-ins supplied by Oracle and third party format plug-ins are installed in this schema.

Oracle interMedia User's Guide

ORDSYS

ORDSYS

The Oracle interMedia administrator account

Oracle interMedia User's Guide

OUTLN

OUTLN

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.

Oracle Database Performance Tuning Guide

SI_INFORMTN_SCHEMA

SI_INFORMTN_SCHEMA

The account that stores the information views for the SQL/MM Still Image Standard

Oracle interMedia User's Guide

SYS

CHANGE_ON_INSTALL

The account used to perform database administration tasks

Oracle Database Administrator's Guide

SYSMAN

CHANGE_ON_INSTALL

The account used to perform Oracle Enterprise Manager database administration tasks. Note that SYS and SYSTEM can also perform these tasks.

Oracle Enterprise Manager Grid Control Installation and Basic Configuration

SYSTEM

MANAGER

Another account used to perform database administration tasks.

 

本文来自德仔工作?http://www.dezai.cn



清晨 2009-05-31 18:34 发表评论
]]>
中文q大ȝ《{帖?/title><link>http://www.tkk7.com/NewMoring/articles/278963.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Fri, 29 May 2009 15:38:00 GMT</pubDate><guid>http://www.tkk7.com/NewMoring/articles/278963.html</guid><wfw:comment>http://www.tkk7.com/NewMoring/comments/278963.html</wfw:comment><comments>http://www.tkk7.com/NewMoring/articles/278963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/NewMoring/comments/commentRss/278963.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/NewMoring/services/trackbacks/278963.html</trackback:ping><description><![CDATA[1.字节和unicode <br />     java内核是unicode的,pclass文g也是Q但是很多媒体,包括文g/的保存方式是用字节流的。因此java要对q些字节经行{化。char是unicode的,而byte是字节。java中byte/char互{的函数在sun.io的包中间有。其中ByteToCharConvertercL中调度,可以用来告诉你,你用的convertor。其中两个很常用的静态函数是 <br /> public static ByteToCharConverter getDefault(); <br /> public static ByteToCharConverter getConverter(String encoding); <br /> 如果你不指定converterQ则pȝ会自动用当前的encoding,gbq_上用gbk,enq_上用8859_1?<br /> byte ??〉charQ?<br /> "?的gb码是Q?xc4e3 ,unicode?x4f60 <br />   String encoding = "gb2312"; <br />   byte b[] = {(byte)'u00c4',(byte)'u00e3'}; <br />   ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding); <br />   char c[] = converter.convertAll(b); <br />   for (int i = 0; i < c.length; i++) { <br />       System.out.println(Integer.toHexString(c[i])); <br />   } <br /> l果是什么?0x4f60 <br /> 如果encoding ="8859_1"Q结果又是什么?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 < c.length; i++) { <br />     System.out.println(Integer.toHexString(c[i])); <br /> } <br /> l果又是什么?Ҏq_的编码而定?<br /> <br /> char ??〉byteQ?<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.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"><</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>l果是什么?0x00c4,0x00e3 <br /> 如果encoding ="8859_1"Q结果又是什么?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"><</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 /> l果又是什么?Ҏq_的编码而定?<br /> 很多中文问题是从这两个最单的cL生出来的。而却有很多类不直接支持把encoding输入Q这l我们带来诸多不ѝ很多程序难得用encoding了,直接用default的encodingQ这q我们UL带来了很多困难?<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码是Q?xc4e3 ,unicode?x4f60 <br />     0xc4e3的二q制Q?<br />           1100 Q?100 Q?110 Q?011 <br /> ׃只有两位我们按照两位的编码来排,但是我们发现q行不通,因ؓW7位不?因此Q返??" <br />     0x4f60的二q制Q?<br />               0100 Q?111 Q?110 Q?000 <br />         我们用utf-8补齐Q变成: <br />               1110 Q?100 Q?011 Q?101 Q?010 Q?000 <br />         e4--bd-- a0 <br />         于是q回Q?xe4,0xbd,0xa0?<br /> <br /> 3.string和byte[] <br /> string其实核心是char[],然而要把byte转化成stringQ必ȝq编码。string.length()其实是char数组的长度,如果使用不同的编码,很可能会错分Q造成散字和ؕ码?<br /> 例如Q?<br /> String encoding = “”; <br /> byte [] b={(byte)'u00c4',(byte)'u00e3'}; <br /> String str=new String(b,encoding);   <br /> 如果encoding=8859_1Q会有两个字Q但是encoding=gb2312只有一个字q个问题在处理分|l常发生 ?<br /> <br /> 4.Reader,Writer / InputStream,OutputStream <br /> Reader和Writer核心是charQInputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char?写InputStream/OutputStream?<br /> 例如Q?<br /> 文gtest.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"><</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>l果是什么??<br /> 如果encoding ="8859_1"Q结果是什么???两个字符Q表CZ认识?<br /> 反过来的例子自己做?<br /> <br /> 5.我们要对java的编译器有所了解Q?<br /> javac ?encoding <br /> 我们常常没有用到encodingq个参数。其实encodingq个参数对于跨^台的操作是很重要的。如果没有指定encodingQ则按照pȝ的默认encoding,gbq_上是gb2312Q英文^C是iso8859_1?<br /> java的编译器实际上是调用sun.tools.javac.main的类Q对文gq行~译Q这个类有compile函数中间有一个encoding的变?-encoding的参数其实直接传lencoding变量。编译器是Ҏq个变量来读取java文g的,然后把用utf-8形式~译成class文g?<br /> 例子代码Q?<br /> String str = "?; <br />     FileWriter writer = new FileWriter("text.txt"); <br />     write.write(str); <br />     writer.close(); <br /> <br /> 如果用gb2312~译Q你会找到e4 bd a0的字D?Q?<br /> 如果?859_1~译Q?00c4 00e3的二q制Q?<br /> 0000Q?000 Q?100Q?100 Q?000Q?000 Q?110Q?011 <br /> 因ؓ每个字符都大?位,因此?1位编码: <br /> 1100Q?001Q?000Q?100Q?100Q?011Q?010Q?011 <br /> c1-- 84-- c3--  a3 <br /> 你会扑ֈc1 84 c3 a3 ?<br /> <br /> 但是我们往往忽略掉这个参敎ͼ因此q样往往会有跨^台的问题Q?<br /> 样例代码在中文^C~译Q生成zhclass <br /> 样例代码在英文^C~译Q输出enclass <br />   (1).  zhclass在中文^C执行ok,但是在英文^C不行 <br />   (2).    enclass在英文^C执行ok,但是在中文^C不行 <br /> 原因Q?<br />   (1).    在中文^C~译后,其实str在运行态的char[]?x4f60, 在中文^Cq行Qfilewriter的缺省编码是gb2312,因此 chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中,于是0xc4,0xe3放进了文件?<br /> 但是如果是在英文q_下,chartobyteconverter的缺省值是8859_1, filewriter会自动调?859_1去{化str,但是他无法解释,因此他会输出"?" <br />   (2).    在英文^C~译后,其实str在运行态的char[]?x00c4 0x00e3, 在中文^Cq行Q中文无法识别,因此会出??Q?<br /> 在英文^CQ?x00c4-->0xc4,0x00e3->0xe3Q因?xc4,0xe3被放q了文g?<br /> <br /> 6.    其它原因Q?<%@ page contentType="text/html; charset=GBK" %> <br /> 讄览器的昄~码Q如果response的数据是utf8~码Q显C将是ؕ码,但是q和上q原因还不一栗?<br /> <br /> 7.    发生~码的地方: <br /> ?nbsp;   从数据库到javaE序 byte??〉char <br /> ?nbsp;   从javaE序到数据库 char??〉byte <br /> ?nbsp;   从文件到javaE序 byte??〉char <br /> ?nbsp;   从javaE序到文?char??〉byte <br /> ?nbsp;   从javaE序到页面显C?char??〉byte <br /> ?nbsp;   从页面form提交数据到javaE序byte??〉char <br /> ?nbsp;   从流到javaE序byte??〉char <br /> ?nbsp;   从javaE序到流char??〉byte <br /> <br /> 谢志钢的解决ҎQ?<br /> 我是使用配置qo器的Ҏ解决中文q的: <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"><</span><span style="color: #800000">web-app</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">filter</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">></span><span style="color: #000000">RequestFilter</span><span style="color: #0000ff"></</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">></span><span style="color: #000000">net.golden.uirs.util.RequestFilter</span><span style="color: #0000ff"></</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">init-param</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">param-name</span><span style="color: #0000ff">></span><span style="color: #000000">charset</span><span style="color: #0000ff"></</span><span style="color: #800000">param-name</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">param-value</span><span style="color: #0000ff">></span><span style="color: #000000">gb2312</span><span style="color: #0000ff"></</span><span style="color: #800000">param-value</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"></</span><span style="color: #800000">init-param</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"></</span><span style="color: #800000">filter</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">></span><span style="color: #000000">RequestFilter</span><span style="color: #0000ff"></</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">></span><span style="color: #000000">*.jsp</span><span style="color: #0000ff"></</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"></</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">></span><span style="color: #000000"> </span><span style="color: #0000ff"></</span><span style="color: #800000">web-app</span><span style="color: #0000ff">></span></div> </pre> </dd></dl><br /> <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: #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"> 看看是否h信息上报pȝ的权?/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">信息上报pȝ</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.tkk7.com/NewMoring/aggbug/278963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/NewMoring/" target="_blank">清晨</a> 2009-05-29 23:38 <a href="http://www.tkk7.com/NewMoring/articles/278963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 序列?2 《{帖?/title><link>http://www.tkk7.com/NewMoring/articles/278196.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Wed, 27 May 2009 06:18:00 GMT</pubDate><guid>http://www.tkk7.com/NewMoring/articles/278196.html</guid><wfw:comment>http://www.tkk7.com/NewMoring/comments/278196.html</wfw:comment><comments>http://www.tkk7.com/NewMoring/articles/278196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/NewMoring/comments/commentRss/278196.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/NewMoring/services/trackbacks/278196.html</trackback:ping><description><![CDATA[<table border="0" cellspacing="0" cellpadding="0" width="99%"> <tbody> <tr> <td> <p>目前|络上关于对象序列化的文章不,但是我发现详l叙q用法和原理的文章太。本人把自己l过l验ȝ和实际运用中的体会写成的学习W记贡献l大家。希望能为整个javaC֌的繁荣做一点事情?br /> <br />       序列化的q程是对象写入字节和从字节流中读取对象。将对象状态{换成字节之后,可以用java.io包中的各U字节流cd其保存到文g中,道到另 一U程中或通过|络q接对象数据发送到另一L。对象序列化功能非常单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网 l编E中q不是最Ȁ动h心的NQ但却相当重要,h许多实用意义?br /> <br /> <font color="#0000ff">一Q对象序列化可以实现分布式对象?br /> </font>      主要应用例如QRMI要利用对象序列化q行q程L上的服务Q就像在本地Zq行对象时一栗?/p> </td> </tr> <tr> <td colspan="2"> <p>二: <font color="#0000ff">java对象序列化不仅保留一个对象的数据Q?/font>而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节中Q可以保存在文g中或在网l连接上?递。利用对象序列化可以q行对象?#8220;深复?#8221;Q即复制对象本n及引用的对象本n。序列化一个对象可能得到整个对象序列?br /> <br />    从上面的叙述中,我们知道了对象序列化是java~程中的必备武器Q那么让我们从基开始,好好学习一下它的机制和用法?<br /> <br />      java 序列化比较简单,通常不需要编写保存和恢复对象状态的定制代码。实现java.io.Serializable接口的类对象可以转换成字节流或从字节恢 复,不需要在cM增加M代码。只有极数情况下才需要定制代码保存或恢复对象状态。这里要注意Q不是每个类都可序列化,有些cL不能序列化的Q例如涉?U程的类与特定JVM有非常复杂的关系?br /> 序列化机Ӟ</p> <p>     序列化分Z大部分:序列化和反序列化?序列化是q个q程的第一部分Q将数据分解成字节流Q以便存储在文g中或在网l上传输。反序列化就是打开字节ƈ重构对象。对象序列化不仅要将基本数据cd 转换成字节表C,有时q要恢复数据。恢复数据要求有恢复数据的对象实例。ObjectOutputStream中的序列化过E与字节连接,包括对象cd 和版本信息。反序列化时QJVM用头信息生成对象实例Q然后将对象字节中的数据复制到对象数据成员中。下面我们分两大部分来阐qͼ<br /> <br /> <font color="#0000ff">处理对象:</font><br /> Q序列化q程和反序列化过E)</p> <p>   java.io包有两个序列化对象的cRObjectOutputStream负责对象写入字节流QObjectInputStream从字节流重构对象?br />      我们先了解ObjectOutputStreamcd。ObjectOutputStreamcL展DataOutput接口?br /> writeObject ()Ҏ是最重要的方法,用于对象序列化。如果对象包含其他对象的引用Q则writeObject()Ҏ递归序列化这些对象。每?ObjectOutputStreaml护序列化的对象引用表,防止发送同一对象的多个拷贝。(q点很重要)׃writeObject()可以序列化整 l交叉引用的对象Q因此同一ObjectOutputStream实例可能不小心被h序列化同一对象。这Ӟq行反引用序列化Q而不是再ơ写入对象字??br /> <br /> 下面Q让我们从例子中来了解ObjectOutputStreamq个cd?br /> 1. // 序列?today's date C个文件中. <br /> 2.      FileOutputStream f = new FileOutputStream("tmp"); <br /> 3.      ObjectOutputStream s = new ObjectOutputStream(f); <br /> 4.      s.writeObject("Today"); <br /> 5.      s.writeObject(new Date()); <br /> 6.      s.flush(); </p> <p>    现在Q让我们来了解ObjectInputStreamq个cR它?ObjectOutputStream怼。它扩展DataInput接口。ObjectInputStream中的Ҏ镜像 DataInputStream中读取Java基本数据cd的公开Ҏ。readObject()Ҏ从字节流中反序列化对象。每ơ调?readObject()Ҏ都返回流中下一个Object。对象字节流q不传输cȝ字节码,而是包括cd及其{֐。readObject()收到对象 ӞJVM装入头中指定的类。如果找不到q个c,则readObject()抛出ClassNotFoundException,如果需要传输对象数据和 字节码,则可以用RMI框架。ObjectInputStream的其余方法用于定制反序列化过E?br /> <br /> 例子如下Q?br /> 1. //从文件中反序列化 string 对象?date 对象 <br /> 2.      FileInputStream in = new FileInputStream("tmp"); <br /> 3.      ObjectInputStream s = new ObjectInputStream(in); <br /> 4.      String today = (String)s.readObject(); <br /> 5.      Date date = (Date)s.readObject(); </p> <p><font color="#0000ff">定制序列化过E?</font></p> <p>       序列化通常可以自动完成Q但有时可能要对q个q程q行控制。java可以类声明为serializableQ但仍可手工控制声明为static或transient的数据成员?br /> 例子Q一个非常简单的序列化类?br /> 1. public class simpleSerializableClass implements Serializable{ <br /> 2.      String sToday="Today:"; <br /> 3.      transient Date dtToday=new Date(); <br /> 4. } </p> <p>       序列化时Q类的所有数据成员应可序列化除了声明为transient或static的成员。将变量声明?transient告诉JVM我们会负责将变元序列化。将数据成员声明为transient后,序列化过E就无法其加进对象字节中Q没有从 transient数据成员发送的数据。后面数据反序列化时Q要重徏数据成员Q因为它是类定义的一部分Q,但不包含M数据Q因个数据成员不向流中写 入Q何数据。记住,对象不序列化static或transient。我们的c要用writeObject()与readObject()Ҏ以处理这?数据成员。用writeObject()与readObject()ҎӞq要注意按写入的序dq些数据成员?br /> <br /> 关于如何使用定制序列化的部分代码如下Q?br /> <br /> 1. //重写writeObject()Ҏ以便处理transient的成员?<br /> 2. public void writeObject(ObjectOutputStream outputStream) throws IOException{ <br /> 3.      outputStream.defaultWriteObject();//使定制的writeObject()Ҏ可以 <br /> 4.                          利用自动序列化中内置的逻辑?<br /> 5.      outputStream.writeObject(oSocket.getInetAddress()); <br /> 6.      outputStream.writeInt(oSocket.getPort()); <br /> 7. } <br /> 8. //重写readObject()Ҏ以便接收transient的成员?<br /> 9. private void readObject(ObjectInputStream inputStream) throws IOException,ClassNotFoundException{ <br /> 10.      inputStream.defaultReadObject();//defaultReadObject()补充自动序列?<br /> 11.      InetAddress oAddress=(InetAddress)inputStream.readObject(); <br /> 12.      int iPort =inputStream.readInt(); <br /> 13.      oSocket = new Socket(oAddress,iPort); <br /> 14.      iID=getID(); <br /> 15.      dtToday =new Date(); <br /> 16. } </p> <p><font color="#0000ff">完全定制序列化过E?</font></p> <p>       如果一个类要完全负责自q序列化,则实?Externalizable接口而不是Serializable接口。Externalizable接口定义包括两个ҎwriteExternal ()与readExternal()。利用这些方法可以控制对象数据成员如何写入字节流.cd现ExternalizableӞ头写入对象流中,然后c?完全负责序列化和恢复数据成员Q除了头以外Q根本没有自动序列化。这里要注意了。声明类实现Externalizable接口会有重大的安全风险?writeExternal()与readExternal()Ҏ声明为publicQ恶意类可以用这些方法读取和写入对象数据。如果对象包含敏感信 息,则要格外心。这包括使用安全套接或加密整个字节流。到此ؓ臻I我们学习了序列化的基部分知识.</p> </td> </tr> </tbody> </table> <img src ="http://www.tkk7.com/NewMoring/aggbug/278196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/NewMoring/" target="_blank">清晨</a> 2009-05-27 14:18 <a href="http://www.tkk7.com/NewMoring/articles/278196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java Serializable c?序列?《{帖?/title><link>http://www.tkk7.com/NewMoring/articles/278195.html</link><dc:creator>清晨</dc:creator><author>清晨</author><pubDate>Wed, 27 May 2009 06:16:00 GMT</pubDate><guid>http://www.tkk7.com/NewMoring/articles/278195.html</guid><wfw:comment>http://www.tkk7.com/NewMoring/comments/278195.html</wfw:comment><comments>http://www.tkk7.com/NewMoring/articles/278195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/NewMoring/comments/commentRss/278195.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/NewMoring/services/trackbacks/278195.html</trackback:ping><description><![CDATA[<p>1.5 定义cȝ可序列化?br /> 可用两种不同的方式来定义cȝ可序列化域。类的可序列化域被缺省定义ؓ非瞬态和非静态域?通过?Serializable cM声明一个指定的?serialPersistentFieldsQ即可覆盖该~省倹{?该域的初始化必须?ObjectStreamField 对象的数l来完成Q该对象列出了可序列化域的名U和cd。该域的修饰W应?private、static ?final?br /> 例如Q以下声明将复制~省行ؓ?br /> class List implements Serializable {<br />     List next;<br />     private static final ObjectStreamField[] serialPersistentFields<br />                  = {new ObjectStreamField("next", List.class)};</p> <p>}<br /> ?serialPersistentFields 为某个类定义可序列化域后Q即无需再将可序列化域限制在当前 Serializable cȝ定义之内。利用第 1.7 节,"讉Kcȝ可序列化? 中描q的接口QSerializable cȝ writeObject ?readObject Ҏ可将该类的当前实现映到其可序列化域。因此,后箋版本中可以改?Serializable cȝ域,但前提是保持与版本兼容的 Serializable 域的映射?/p> <p>1.6 对类的可序列化域和数据存?br /> 对类的可序列化状态进行存档以使其?Serializable cȝ其它实现间可互操作,或者对cL变进行存档,q些都非常必要。对可序列化域进行存档可帮助用户最l确定该域是否应序列化?序列?javadoc 标记 @serial、@serialField ?@serialData 可提供对源代码中 Serializable cȝ序列化Ş式进行存档的Ҏ?/p> <p>对于~省的可序列化域Q@serial 标记应放?javadoc 注释中。语法如下:@serial field-description 其中可选项 field-description 描述域及其容许值的含义?field-description 可跨多行。当初始版本中增加一个域Ӟ@since 标记指出所d的版本。@serial ?field-description 提供针对序列化的文档。在序列化Ş式文档内Qfield-description 被d?javadoc 注释中?<br /> @serialField 标记用于?serialPersistentFields 数组?ObjectStreamField lgq行存档。每?ObjectStreamField lg都应使用其中的一个标记。语法如下:@serialField field-name field-type field-description <br /> @serialData 标记描述写入或读取数据的ơ序和类型。该标记描述 writeObject 所写入的可选数据或 Externalizable.writeExternal Ҏ所写入的所有数据的ơ序或类型。语法如下:@serialData data-description <br /> javadoc 应用E序识别序列?javadoc 标记qؓ每个 Serializable ?Externalizable cȝ成说明文字。有兌些标记用法的CZQ参见第 C.1 ?"java.io.File 可替代实现的CZ?</p> <p>当某个类被声明ؓ Serializable Ӟ即通过可序列化域及可选数据(按名U和cdQ定义了该对象的可序列化状态。可选数据只能用 Serializable cM?writeObject Ҏ昑ּ写入Q而其d则可通过 Serializable cd readObject Ҏq行。否则,序列化将跌无法d的可选数据?</p> <p>当一个类被声明ؓ Externalizable Ӟ通过c自w写入流的数据即定义了该cȝ序列化状态?该类必须指定序、类型及写入的每个数据的含义。同时还必须处理其自w的演变Q从而可d以前版本所写入的数据,或写入以前版本所能读取的数据。在存储和恢复数据时Q该cdM父类怸致。必L定流中父cL据的位置?/p> <p>cȝ设计者必ȝ保ؓcd储的信息对于持久性是合适的Q而且遵@为实现序列化的互操作性和演变而指定的序列化规则。第 5 ?#8220;可序列化对象的版本演?#8221;对类的演变进行了更详l的说明?</p> <p>1.10 Serializable 接口<br /> Serialization 对象生成,其中提供有关所存对象的 JavaTM cȝ信息。对于可序列化对象,即存在该类的不同(但兼容)版本的实玎ͼ也要保持_的信息以恢复q些对象。定?Serializable 接口可以标识实现可序列化协议的类Q?/p> <p><br /> package java.io;</p> <p>public interface Serializable {};</p> <p>Serializable cdd备如下功能:</p> <p>实现 java.io.Serializable 接口 <br /> 标识应序列化的域<br /> (使用 serialPersistentFields 成员以显式声明其可序列化Q或者用瞬态关键字来指C非序列域? <br /> 可访问其W一个非序列化父cȝ无参数构造函数?<br /> 该类可根据需要定义如下方法:</p> <p>writeObject ҎQ用于控制要保存哪些信息或将附加信息d到流?<br /> readObject ҎQ用于读取由相应 writeObject Ҏ写入的信息,或在对象恢复后更新其状?<br /> writeReplace ҎQ用于允许类指定写入的替换对象<br /> readResolve ҎQ用于允许类为刚从流中读取的对象指定替换对象<br /> ObjectOutputStream ?ObjectInputStream 支持所操作的可序列化类的演变(允许cd生改变以兼容早期版本的类Q。有兛_现兼容变化的机制的信息,参见W?5.5 ?#8220;兼容?JavaTM cd演变”?br /> --------------------------------------------------------------------------<br /> class ObjectYouWannaSave implements Serializable{<br />    int x; int y; <br />    SubObject so = new SubObject();<br />    ..........<br /> }</p> <p>class SubObject implements Serializable{<br />    String s = "abc"; //String is OK, because String is java.io.Serializable<br /> }</p> <p>public class Save{ // in Save.java<br />    public void main(String[] args) {<br />       ObjectYouWannaSave original = new ObjectYouWannaSave();<br />       original.x = -1; original.y = 100; .....<br />       <br />       ObjectOutputStream out = null;<br />       try{<br />         out = new ObjectOutputStream(new FileOutputStream(new File("c:/save.dat")));<br />         out.writeObject(original);<br />       }catch(Exceptione){<br />       }finally{<br />         try{out.close();}catch(Exception e){}<br />       }<br />    }<br /> }</p> <p>public class Read{ // in Read.java<br />    public void main(String[] args) {<br />       ObjectInputStream in = null;<br />       try{<br />         out = new ObjectInStream(new FileInStream(new File("c:/save.dat")));<br />         ObjectYouWannaSave o = (ObjectYouWannaSave)in.readObject();<br />         System.out.println("x="+o.x); <br />         System.out.println("subobject.string=" + o.so.s);<br />         ........<br />       }catch(Exceptione){<br />       }finally{<br />         try{in.close();}catch(Exception e){}<br />       }<br />    }<br /> }</p> <p>q是个最单的例子Q先q行Save,以后什么时候运行Read都可以(只要c:\save.dat文gq存在就可以了)<br /> --------------------------------------------------<br /> 对象的寿命通常随着生成该对象的E序l止而终止,有时候,可能需要将对象的状态保存下来,在需要的时?br /> 再将对象恢复Q我们把对象的这U记录自q态的以便来再生的能力,叫做对象的持l性(PERSISTENCEQ,<br /> 对象通过写出描述自己状态的数值来记录自己Q这个过E叫对象的串行化Serializable。串行化的主要Q务是?br /> 出对象实例变量的倹{如果变量是另一个对象的引用Q则引用的对象也要串行化Q这是个递归q程?br /> --------------------------------------------------------------------<br /> java.io.Serializable interface是一个较为特D的接口Q?br /> The serialization interface has no methods or fields and serves <br /> only to identify the semantics of being serializable<br /> 卻I它主要是一个用于通知JVM的标?/p> <p>class X implements java.io.Serializable{...}</p> <p>如果你要定制你自qserializable行ؓQ你应该在X中实C?个方法:<br />  private void writeObject(java.io.ObjectOutputStream out)<br />      throws IOException<br />  private void readObject(java.io.ObjectInputStream in)<br />      throws IOException, ClassNotFoundException;</p> <p>否则按~省的策略进行?/p> <p>׃上述2个方法是private的,所以在某些情况下,可以使用<br /> java.io.Serializable的子接口java.io.ExternalizableQ?br /> 在这个interface中有2个publicҎQ?/p> <p>public void writeExternal(ObjectOutput out)<br />                    throws IOException</p> <p>public void readExternal(ObjectInput in)<br />                   throws IOException,<br />                          ClassNotFoundException</p> <p><br /> ----------------------------------------------------------------------------<br /> Serializable是一个串行化接口Q它没有M的属性和ҎQ一个类实现了串行化接口Q就表明<br /> 该类h持久性,通过WriteObjcet可将其持久保存在盘Q在需要时Q可用ReadObject从磁盘中dQ次Ӟ对象的状态和存入似的相同。上面给出的列子比较单,可通过串行化保存一?br /> 链表对象Q它的每个节Ҏ据也会被保存?当然Q串行化接口q有其他用途,例如HTTP隧道{?br /> ?br /> -----------------------------------------------------------------------<br /> 对象序列化的持箋性要和永久对象分别开。序列化只能辑ֈ有线持箋?br /> 在同一个jvm上可以重构对象的内容Q达到持l?br /> ---------------------------------------------------------------------<br /> java序列化主要是用于两个斚wQ?br /> 一个是java的RMIQ远E方法调用-Remote method invocationQ,你可以用别人机器上的对象就像在你自q机器上用它一P通过序列化)Q另外,在用javabean时也需要用序列化Q序列化主要是使用在这两方面?br /> -------------------------------------------------------------<br /> 所谓序列化是把把对象以一个代码串的Ş式表C出来,<br /> q样可以保存到磁盘或则通过|络传输Q接受方可以在把代码串恢复成对象<br /> 具体的串形化Ҏ可以自己写,接收攑ְ可以Ҏ您串形的规则把对象恢复出?br /> --------------------------------------------------------------------<br /> 序列化是把一个对象的状态写入一个字节流的过E,它执行RMIQRMI允许一台机器上的JAVA对象调用不同机器上的JAVA对象ҎQ对象可以作为参数提供给那个q程ҎQ发送机序列化该对象q传送它Q接收机执行反序列化?<br /> 序列化和反序列化的关pd表可形成包含循环引用的顺序图表。这是整个序列化的M思想?<br /> 而Serializable接口属于支持序列化的一个接口,只有一个实现它的对象可以被序列化工具存储和回复QSerializable接口没有定义M成员Q只用来表示一个篏可以被序列化Q若该类可以序列化,那么它的所有子c都可以?<br /> 下面是关于序列化的一个实例: <br /> [b:a55efb5f91]E序名称QSerializationDemo.java <br /> E序主题Q实现对象的序列化和反序列化 <br /> E序说明Q该E序由实例化一个MyClasscȝ对象开始,该对象有三个实例变量Q类型分别ؓString、int、doubleQ是希望存储和恢复的信息。[/b:a55efb5f91] </p> <p>[code:1:a55efb5f91] </p> <p>import java.io.*; </p> <p>public class SerializationDemo{ <br />         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>E序q行l果Qobject1和object2的实例变量是一LQ输出如下:[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接口的对象{换ؓ字节序列Q这些字节序列可以被完全存储以备以后重新生成原来的对象?nbsp; </p> <p>serialization不但可以在本机做Q而且可以l由|络操作Q就是猫说的RMIQ。这个好处是很大?---因ؓ它自动屏蔽了操作pȝ的差异,字节序Q用Unix下的c开发过|络~程的h应该知道q个概念Q我容易在q上面犯错){。比如,在Windowq_生成一个对象ƈ序列化之Q然后通过|络传到一台Unix机器上,然后可以在这台Unix机器上正地重构q个对象?</p> <p><br /> Object serialization主要用来支持2U主要的Ҏ: <br /> 1。Java的RMI(remote method invocation).RMI允许象在本机上一h作远E机器上的对象。当发送消息给q程对象Ӟ需要用到serializaiton机制来发送参数和接收q回直?</p> <p>2。Java的JavaBeans.   Bean的状态信息通常是在设计旉|的。Bean的状态信息必被存v来,以便当程序运行时能恢复这些状态信息。这也需要serializaiton机制?</p> <p> </p> <p>二。持久化 <br /> 持久化应该是英文里的persistence.但是Java语言里现在只支持lightweight persistence,是轻量U持久化Q这是通过serialization机制来实现的?</p> <p>persistence是指一个对象的生命周期不由E序是否执行来决定,即是在E序l止时这个对象也存在。它把一个serializable的对象写到磁盘(本机或其他机器上的非RAM存储器)Qƈ在程序重新调用时再读取对象到通常的RAM存储器?</p> <p>Z么说Java的serialization机制实现的是lightweight persistence?因ؓ你必L式的序列化和反序列化E序里的对象Q而不是直接由一个关键词来定义一个对象是序列化的然后ql做相应的处理?nbsp; 如果以后的Java版本出现一个新的关键字来实现这U机Ӟ比如是persistence,如果我用 </p> <p>persistence  (String s="chinaunix") </p> <p>然后pȝ自动做上面程序里的那些处理,那么Java实Cpersistence. </p> <img src ="http://www.tkk7.com/NewMoring/aggbug/278195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/NewMoring/" target="_blank">清晨</a> 2009-05-27 14:16 <a href="http://www.tkk7.com/NewMoring/articles/278195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://888-28.com" target="_blank">Aһ</a>| <a href="http://lyaa17.com" target="_blank">һëƬѲ</a>| <a href="http://cc19123.com" target="_blank">ѴƬavֻƬ</a>| <a href="http://011107.com" target="_blank">޾Ʒ״</a>| <a href="http://18jko.com" target="_blank">޹Ʒa߹ۿ</a>| <a href="http://jte-sh.com" target="_blank">һ˿</a>| <a href="http://78avai.com" target="_blank">һ߹ۿվ</a>| <a href="http://666mou.com" target="_blank">պŷһ</a>| <a href="http://445848.com" target="_blank">ƷƬҹɫ</a>| <a href="http://youtobey.com" target="_blank">ŷձ߹ۿ</a>| <a href="http://23usxx.com" target="_blank">Ʒ456߲</a>| <a href="http://www-yhty.com" target="_blank">޹AVӰԺ</a>| <a href="http://074g8.com" target="_blank">޾Ʒ߾ƷƵ</a>| <a href="http://jldledu.com" target="_blank">AV㽶һ</a>| <a href="http://wushicn.com" target="_blank">ձ޸߹ۿ</a>| <a href="http://zs0451.com" target="_blank">AVɫɫWWW</a>| <a href="http://da666f.com" target="_blank">ɫַ</a>| <a href="http://schygfz.com" target="_blank">һaƬþëƬѿ </a>| <a href="http://xianliwang.com" target="_blank">˵www</a>| <a href="http://szgreater.com" target="_blank">˳ɫ7777߹ۿ</a>| <a href="http://changfafangzhi.com" target="_blank">޾ƷĻ</a>| <a href="http://yidazn.com" target="_blank">av뾫ƷϼӰӰԺ</a>| <a href="http://yijiazhiwei.com" target="_blank">AVƬɫ߹ۿ߳</a>| <a href="http://seosuanfa.com" target="_blank">޹Ʒþþþվ</a>| <a href="http://haichuanwangluo.com" target="_blank">91۲˽˳ӰԺ</a>| <a href="http://meyume.com" target="_blank">ĻĻɫ</a>| <a href="http://slotvip24.com" target="_blank">ר˿</a>| <a href="http://xianliwang.com" target="_blank">ŷƵѹ</a>| <a href="http://91packing.com" target="_blank">ƵƵ</a>| <a href="http://socgl.com" target="_blank">ŷ޾Ʒ99ëƬѸۿ</a>| <a href="http://mt181.com" target="_blank">ھƷ뿨123</a>| <a href="http://baocaoluoli.com" target="_blank">ѰƵ̫ˬ</a>| <a href="http://avqq222.com" target="_blank">һַ</a>| <a href="http://xcdys.com" target="_blank">Vһۿ</a>| <a href="http://yytengsheng.com" target="_blank">ɫƵۿ</a>| <a href="http://591se591se.com" target="_blank">츾AV</a>| <a href="http://kt4444.com" target="_blank">9ȾƷѹۿƵ</a>| <a href="http://sd-ll.com" target="_blank">**ʵëƬѹۿ</a>| <a href="http://znboxcdn304.com" target="_blank">18Ƶѹۿ</a>| <a href="http://72c5.com" target="_blank">ɫݺݰվ</a>| <a href="http://fzgjw.com" target="_blank">þþAVҰ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>