﻿<?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-alexprefect</title><link>http://www.blogjava.net/alexprefect/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 14:31:14 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 14:31:14 GMT</pubDate><ttl>60</ttl><item><title>使用Oracle 的 imp ,exp 命令实现数据的导入导出 </title><link>http://www.blogjava.net/alexprefect/archive/2011/10/10/360376.html</link><dc:creator>alexprefect</dc:creator><author>alexprefect</author><pubDate>Mon, 10 Oct 2011 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/alexprefect/archive/2011/10/10/360376.html</guid><wfw:comment>http://www.blogjava.net/alexprefect/comments/360376.html</wfw:comment><comments>http://www.blogjava.net/alexprefect/archive/2011/10/10/360376.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexprefect/comments/commentRss/360376.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexprefect/services/trackbacks/360376.html</trackback:ping><description><![CDATA[<div class="postText">
<div id="cnblogs_post_body"><font face="Verdana">
<p>本文对Oracle数据的导入导出 imp ,exp 两个命令进行了介绍, 并对其相应的参数进行了说明,然后通过一些示例进行演练,加深理解.<br />文章最后对运用这两个命令可能出现的问题(如权限不够,不同oracle版本)进行了探讨,并提出了相应的解决方案;<br />本文部分内容摘录自网络,感谢网友的经验总结;</p>
<p><br />一.说明</p>
<p>&nbsp;&nbsp; oracle 的exp/imp命令用于实现对数据库的导出/导入操作;<br />&nbsp;&nbsp; exp命令用于把数据从远程数据库服务器导出至本地,生成dmp文件;<br />&nbsp;&nbsp; imp命令用于把本地的数据库dmp文件从本地导入到远程的Oracle数据库中。</p>
<p>二.语法</p>
<p>可以通过在命令行输入 imp help=y 获取imp的语法信息:<br />=============================================================================<br />&nbsp;&nbsp;C:\Documents and Settings\auduser&gt;imp help=y</p>
<p>&nbsp;&nbsp;Import: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:21:57 2008</p>
<p>&nbsp;&nbsp;(c) Copyright 2001 Oracle Corporation.&nbsp; All rights reserved.</p>
<p>&nbsp;&nbsp;可以通过输入 IMP 命令和您的用户名/口令<br />&nbsp;&nbsp;后接用户名/口令的命令:</p>
<p>&nbsp;&nbsp;例程: IMP SCOTT/TIGER</p>
<p>&nbsp;&nbsp;或者, 可以通过输入 IMP 命令和各种参数来控制&#8220;导入&#8221;<br />&nbsp;&nbsp;按照不同参数。要指定参数，您可以使用关键字:</p>
<p>&nbsp;&nbsp;格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)<br />&nbsp;&nbsp;例程: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N<br />&nbsp;&nbsp;或 TABLES=(T1: P1,T1: P2)，如果 T1 是分区表</p>
<p>&nbsp;&nbsp;USERID 必须是命令行中的第一个参数。</p>
<p>&nbsp;&nbsp;关键字&nbsp; 说明（默认）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明（默认）<br />&nbsp;&nbsp;--------------------------------------------------------------------------<br />&nbsp;&nbsp;USERID&nbsp;&nbsp; 用户名/口令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入整个文件 (N)<br />&nbsp;&nbsp;BUFFER&nbsp;&nbsp; 数据缓冲区大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROMUSER&nbsp;&nbsp;&nbsp;&nbsp; 所有人用户名列表<br />&nbsp;&nbsp;FILE&nbsp;&nbsp;&nbsp;&nbsp; 输入文件 (EXPDAT.DMP)&nbsp;&nbsp;&nbsp; TOUSER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户名列表<br />&nbsp;&nbsp;SHOW&nbsp;&nbsp;&nbsp;&nbsp; 只列出文件内容 (N) TABLES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表名列表<br />&nbsp;&nbsp;IGNORE&nbsp;&nbsp; 忽略创建错误 (N)&nbsp;&nbsp;&nbsp; RECORDLENGTH&nbsp; IO 记录的长度<br />&nbsp;&nbsp;GRANTS&nbsp; 导入权限 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INCTYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 增量导入类型<br />&nbsp;&nbsp;INDEXES 导入索引 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMMIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 提交数组插入 (N)<br />&nbsp;&nbsp;ROWS&nbsp;&nbsp;&nbsp; 导入数据行 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数文件名<br />&nbsp;&nbsp;LOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 屏幕输出的日志文件&nbsp;&nbsp; CONSTRAINTS&nbsp; 导入限制 (Y)<br />&nbsp;&nbsp;DESTROY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 覆盖表空间数据文件 (N)<br />&nbsp;&nbsp;INDEXFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将表/索引信息写入指定的文件<br />&nbsp;&nbsp;SKIP_UNUSABLE_INDEXES&nbsp; 跳过不可用索引的维护 (N)<br />&nbsp;&nbsp;FEEDBACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每 x 行显示进度 (0)<br />&nbsp;&nbsp;TOID_NOVALIDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 跳过指定类型 ID 的验证<br />&nbsp;&nbsp;FILESIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个转储文件的最大大小<br />&nbsp;&nbsp;STATISTICS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 始终导入预计算的统计信息<br />&nbsp;&nbsp;RESUMABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遇到与空格有关的错误时挂起 (N)<br />&nbsp;&nbsp;RESUMABLE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来标识可恢复语句的文本字符串<br />&nbsp;&nbsp;RESUMABLE_TIMEOUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RESUMABLE 的等待时间<br />&nbsp;&nbsp;COMPILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译过程, 程序包和函数 (Y)</p>
<p>&nbsp;&nbsp;下列关键字仅用于可传输的表空间<br />&nbsp;&nbsp;TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)<br />&nbsp;&nbsp;TABLESPACES 将要传输到数据库的表空间<br />&nbsp;&nbsp;DATAFILES 将要传输到数据库的数据文件<br />&nbsp;&nbsp;TTS_OWNERS 拥有可传输表空间集中数据的用户</p>
<p>==============================================<br />同样可以通过输入 exp help=y 获取exp的语法信息</p>
<p>&nbsp;&nbsp;Microsoft Windows XP [版本 5.1.2600]<br />&nbsp;&nbsp;(C) 版权所有 1985-2001 Microsoft Corp.</p>
<p>&nbsp;&nbsp;C:\Documents and Settings\auduser&gt;exp help=y</p>
<p>&nbsp;&nbsp;Export: Release 9.0.1.1.1 - Production on 星期二 5月 20 18:26:34 2008</p>
<p>&nbsp;&nbsp;(c) Copyright 2001 Oracle Corporation.&nbsp; All rights reserved.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;通过输入 EXP 命令和用户名/口令，您可以<br />&nbsp;&nbsp;后接用户名/口令的命令:</p>
<p>&nbsp;&nbsp;例程: EXP SCOTT/TIGER</p>
<p>&nbsp;&nbsp;或者，您也可以通过输入跟有各种参数的 EXP 命令来控制&#8220;导出&#8221;<br />&nbsp;&nbsp;按照不同参数。要指定参数，您可以使用关键字:</p>
<p>&nbsp;&nbsp;格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)<br />&nbsp;&nbsp;例程: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)<br />&nbsp;&nbsp;或 TABLES=(T1: P1,T1: P2)，如果 T1 是分区表</p>
<p>&nbsp;&nbsp;USERID 必须是命令行中的第一个参数。</p>
<p>&nbsp;&nbsp;关键字&nbsp; 说明(默认)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明(默认)<br />&nbsp;&nbsp;--------------------------------------------------------------------------<br />&nbsp;&nbsp;USERID&nbsp;&nbsp; 用户名/口令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导出整个文件 (N)<br />&nbsp;&nbsp;BUFFER&nbsp;&nbsp; 数据缓冲区大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OWNER&nbsp;&nbsp;&nbsp;&nbsp; 所有者用户名列表<br />&nbsp;&nbsp;FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出文件 (EXPDAT.DMP)&nbsp; TABLES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表名称列表<br />&nbsp;&nbsp;COMPRESS&nbsp;&nbsp; 导入到一个区 (Y) RECORDLENGTH IO 记录的长度<br />&nbsp;&nbsp;GRANTS&nbsp; 导出权限 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INCTYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 增量导出类型<br />&nbsp;&nbsp;INDEXES&nbsp;&nbsp;&nbsp; 导出索引 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RECORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 跟踪增量导出 (Y)<br />&nbsp;&nbsp;DIRECT&nbsp;&nbsp;&nbsp;&nbsp; 直接路径 (N)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIGGERS&nbsp;&nbsp;&nbsp;&nbsp; 导出触发器 (Y)<br />&nbsp;&nbsp;LOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 屏幕输出的日志文件&nbsp; STATISTICS&nbsp;&nbsp; 分析对象 (ESTIMATE)<br />&nbsp;&nbsp;ROWS&nbsp;&nbsp;&nbsp; 导出数据行 (Y)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARFILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数文件名<br />&nbsp;&nbsp;CONSISTENT 交叉表一致性&nbsp;&nbsp;&nbsp; CONSTRAINTS&nbsp; 导出约束条件 (Y)</p>
<p>&nbsp;&nbsp;FEEDBACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每 x 行显示进度 (0)<br />&nbsp;&nbsp;FILESIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个转储文件的最大大小<br />&nbsp;&nbsp;FLASHBACK_SCN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用于回调会话快照的 SCN<br />&nbsp;&nbsp;FLASHBACK_TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来获得最接近于指定时间的 SCN 的时间<br />&nbsp;&nbsp;QUERY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来导出表的子集的选择子句<br />&nbsp;&nbsp;RESUMABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遇到与空格有关的错误时挂起 (N)<br />&nbsp;&nbsp;RESUMABLE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用来标识可恢复语句的文本字符串<br />&nbsp;&nbsp;RESUMABLE_TIMEOUT&nbsp;&nbsp;&nbsp; RESUMABLE 的等待时间<br />&nbsp;&nbsp;TTS_FULL_CHECK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对 TTS 执行完全或部分相关性检查<br />&nbsp;&nbsp;TABLESPACES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要导出的表空间列表<br />&nbsp;&nbsp;TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)<br />&nbsp;&nbsp;TEMPLATE 调用 iAS 模式导出的模板名称</p>
<p>三.使用示例</p>
<p>3.1 数据导出：</p>
<p>&nbsp;1 将数据库SampleDB完全导出,用户名system 密码manager 导出到E:\SampleDB.dmp中</p>
<p>&nbsp;&nbsp; exp system/manager@TestDB file=E:\sampleDB.dmp full=y </p>
<p>&nbsp;2 将数据库中system用户与sys用户的表导出</p>
<p>&nbsp;&nbsp; exp system/manager@TestDB file=E:\sampleDB.dmp&nbsp; owner=(system,sys)</p>
<p>&nbsp;3 将数据库中的表 TableA,TableB 导出</p>
<p>&nbsp;&nbsp;&nbsp; exp system/manager@TestDB&nbsp; file=E:\sampleDB.dmp&nbsp; tables=(TableA,TableB) </p>
<p>&nbsp;4 将数据库中的表tableA中的字段filed1 值为 "王五" 的数据导出</p>
<p>&nbsp;&nbsp; exp system/manager@TestDB&nbsp; file=E:\sampleDB.dmp&nbsp; tables=(tableA)&nbsp; query=' where filed1='王五'<br />&nbsp; <br />&nbsp;&nbsp; 如果想对dmp文件进行压缩,可以在上面命令后面 加上 compress=y 来实现。</p>
<p>3.2 数据的导入</p>
<p>&nbsp;1 将备份数据库文件中的数据导入指定的数据库SampleDB 中,如果 SampleDB 已存在该表,则不再导入;</p>
<p>&nbsp;&nbsp; imp system/manager@TEST&nbsp; file=E:\sampleDB.dmp&nbsp; full=y&nbsp; ignore=y<br />&nbsp; </p>
<p>&nbsp;2 将d:\daochu.dmp中的表table1 导入</p>
<p>&nbsp;imp system/manager@TEST&nbsp; file=E:\sampleDB.dmp&nbsp; tables=(table1) </p>
<p>3. 导入一个完整数据库</p>
<p>&nbsp;imp system/manager file=bible_db log=dible_db full=y ignore=y</p>
<p>4. 导入一个或一组指定用户所属的全部表、索引和其他对象</p>
<p>&nbsp;imp system/manager file=seapark log=seapark fromuser=seapark imp <br />&nbsp;system/manager file=seapark log=seapark fromuser=(seapark,amy,amyc,harold)</p>
<p>5. 将一个用户所属的数据导入另一个用户</p>
<p>&nbsp;imp system/manager file=tank log=tank fromuser=seapark touser=seapark_copy<br />&nbsp;imp system/manager file=tank log=tank fromuser=(seapark,amy)<br />&nbsp;touser=(seapark1, amy1)</p>
<p>6. 导入一个表</p>
<p>&nbsp;imp system/manager file=tank log=tank fromuser=seapark TABLES=(a,b)</p>
<p>7. 从多个文件导入</p>
<p>&nbsp;imp system/manager file=(paycheck_1,paycheck_2,paycheck_3,paycheck_4) <br />log=paycheck, filesize=1G full=y</p>
<p>8. 使用参数文件</p>
<p>&nbsp;imp system/manager parfile=bible_tables.par<br />bible_tables.par参数文件：<br />&nbsp;#Import the sample tables used for the Oracle8i Database Administrator's <br />Bible. fromuser=seapark touser=seapark_copy file=seapark log=seapark_import<br />参数文件示例见附录</p>
<p><br />9. 增量导入</p>
<p>&nbsp;imp system./manager inctype= RECTORE FULL=Y&nbsp; FILE=A</p>
<p>&nbsp;<br />不少情况下要先将表彻底删除，然后导入。<br />&nbsp;</p>
<p>&nbsp;</p>
<p>四.参数说明</p>
<p>4.1、8i EXP常用选项 <br />&nbsp;1、FULL，这个用于导出整个数据库，在ROWS=N一起使用时，可以导出整个数据库的结构。例如： <br />&nbsp;exp sys file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y <br />&nbsp;2、BUFFER和FEEDBACK，在导出比较多的数据时，我会考虑设置这两个参数。例如： <br />&nbsp;exp new file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT <br />&nbsp;3、FILL和LOG，这两个参数分别指定备份的DMP名称和LOG名称，包括文件名和目录，例子见上面。 <br />&nbsp;需要说明的是，EXP可以直接备份到磁带中，即使用FILE=/dev/rmt0(磁带设备名)，但是一般我们都不这么做，原因有二：一、这样做的速度会慢很多，二、现在一般都是使用磁带库的，不建议直接对磁带进行操作。至于没有使用磁带库的朋友可以考虑和UNIX的TAR结合使用。 <br />&nbsp;如果你真想使用EXP直接到磁带，你可以参考Metalink文章&#8220;EXPORTING TO TAPE ON UNIX SYSTEMS&#8221;（文档号：30428.1），该文中有详细解释。 <br />&nbsp;4、COMPRESS参数将在导出的同时合并碎块，尽量把数据压缩到initial的EXTENT里，默认是N，一般建议使用。DIRECT参数将告诉EXP直接读取数据，而不像传统的EXP那样，使用SELECT来读取表中的数据，这样就减少了SQL语句处理过程。一般也建议使用。不过有些情况下DIRECT参数是无法使用的。 <br />&nbsp;5、如何使用SYSDBA执行EXP/IMP？ <br />&nbsp;这是一个很现实的问题，有时候我们需要使用SYSDBA来执行EXP/IMP，如进行传输表空间的EXP/IMP，以及在9i下用SYS用户来执行EXP/IMP时，都需要使用SYSDBA才可。我们可以使用下面方式连入EXP/IMP： <br />&nbsp;exp "'sys/sys as sysdba'" file=1.dmp tables=gototop.t rows=n <br />&nbsp;6、QUERY参数后面跟的是where条件，值得注意的是，整个where子句需要使用""括起来，where子句的写法和SELECT中相同，如果是UNIX平台所有"和'都需要使用\u26469屏蔽它们的特殊含义： <br />&nbsp;exp gototop/gototop file=1.dmp log=1.log tables=cyx.t query="where c1=20 and c2=gototop" <br />&nbsp;如果是windows平台，则使用下面的格式： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exp c/c@ncn file=c.dmp log=c.log tables=t query="""where id=1 and name='gototop'""" <br />4.2、8i IMP常用选项 <br />&nbsp;1、FROMUSER和TOUSER，使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。 <br />&nbsp;2、IGNORE、GRANTS和INDEXES，其中IGNORE参数将忽略表的存在，继续导入，这个对于需要调整表的存储参数时很有用，我们可以先根据实际情况用合理的存储参数建好表，然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引，如果想使用新的存储参数重建索引，或者为了加快到入速度，我们可以考虑将INDEXES设为N，而GRANTS一般都是Y。 <br />&nbsp;另外一个EXP/IMP都有的参数是PARFILE，它是用来定义EXP/IMP的参数文件，也就是说，上面的参数都可以写在一个参数文件中，但我们一般很少使用。 <br />4.4、Oracle9i EXP功能描述 <br />&nbsp;Oracle9i EXP在原有的基础上新增了部分新的参数，按功能主要分为以下几个部分： <br />&nbsp;1、OBJECT_CONSISTENT - 用于设置EXP对象为只读以保持对象的一致性。默认是N。 <br />&nbsp;2、FLASHBACK_SCN和FLASHBACK_TIME - 用于支持FLASHBACK功能而新增。 <br />&nbsp;3、RESUMABLE、RESUMABLE_NAME和RESUMABLE_TIMEOUT - 用于支持RESUMABLE空间分配而新增。 <br />&nbsp;4、TTS_FULL_CHECK - 用于在传输表空间时使用依赖性检查。 <br />&nbsp;5、TEMPLATE - 用于支持iAS。 <br />&nbsp;6、TABLESPACES - 设置表空间导出模式。个人觉得对于一般用户而言，这个才是新增参数中最实用的一个，可以让用户在原来的FULL、OWNER、TABLES的基础上多了一种选择，使得EXP更加灵活。 </p>
<p>五、不同版本的EXP/IMP问题？ <br />&nbsp;一般来说，从低版本导入到高版本问题不大，麻烦的是将高版本的数据导入到低版本中，在Oracle9i之前，不同版本Oracle之间的EXP/IMP可以通过下面的方法来解决： <br />&nbsp;1、在高版本数据库上运行底版本的catexp.sql； <br />&nbsp;2、使用低版本的EXP来导出高版本的数据； <br />&nbsp;3、使用低版本的IMP将数据库导入到底版本数据库中； <br />&nbsp;4、在高版本数据库上重新运行高版本的catexp.sql脚本。 <br />&nbsp;但在9i中，上面的方法并不能解决问题。如果直接使用底版本EXP/IMP会出现如下错误： <br />&nbsp;EXP-00008: ORACLE error %lu encountered <br />&nbsp;ORA-00904: invalid column name <br />&nbsp;这已经是一个公布的BUG，需要等到Oracle10.0才能解决，BUG号为2261，你可以到METALINK上去查看有关此BUG的详细信息。 <br />&nbsp;BUG归BUG，我们的工作还是要做，在没有Oracle的支持之前，我们就自己解决。在Oracle9i中执行下面的SQL重建exu81rls视图即可。 <br />&nbsp;CREATE OR REPLACE view exu81rls&nbsp; <br />&nbsp;(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)&nbsp; <br />&nbsp;AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,&nbsp; <br />&nbsp;decode(bitand(r.stmt_type,1), 0,'', 'SELECT,')&nbsp; <br />&nbsp;|| decode(bitand(r.stmt_type,2), 0,'', 'INSERT,')&nbsp; <br />&nbsp;|| decode(bitand(r.stmt_type,4), 0,'', 'UPDATE,')&nbsp; <br />&nbsp;|| decode(bitand(r.stmt_type,8), 0,'', 'DELETE,'),&nbsp; <br />&nbsp;r.check_opt, r.enable_flag,&nbsp; <br />&nbsp;DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)&nbsp; <br />&nbsp;from user$ u, obj$ o, rls$ r&nbsp; <br />&nbsp;where u.user# = o.owner#&nbsp; <br />&nbsp;and r.obj# = o.obj#&nbsp; <br />&nbsp;and (uid = 0 or&nbsp; <br />&nbsp;uid = o.owner# or&nbsp; <br />&nbsp;exists ( select * from session_roles where role='SELECT_CATALOG_ROLE')&nbsp; <br />&nbsp;)&nbsp; <br />&nbsp;/&nbsp; <br />&nbsp;grant select on sys.exu81rls to public;&nbsp; <br />&nbsp;/&nbsp; </p>
<p>六、其他问题 </p>
<p>&nbsp;本文只讨论了Oracle8i和9i中的EXP/IMP的一些情况，对于之前的版本，在8.0.X中，除了QUERY参数不能用外，其它差别不大。针对没有QUERY的情况，我们可以先在数据库中使用查询条件建立临时中间表，然后使用EXP导出这个中间表即可。至于Oracle7因为目前使用的人较少，gototop不打算在此做详细解释了，如果读者朋友有需求，你可以参考Metalink文档：&#8220;Overview of Export and Import in Oracle7&#8221;（文档号：61949.1）。关于EXP/IMP的详细参数信息你可以通过EXP/IMP HELP=Y来获得。 <br />&nbsp;另外关于传输表空间的更多信息可以参考下面的Metelink文档，本文不再详述。 <br />&nbsp;[NOTE:77523.1] Transportable Tablespaces -- An Example to setup and use.&nbsp; <br />&nbsp;[NOTE:100698.1] Perform tablespace point-in-time recovery using Transportable Tablespace.&nbsp; <br />&nbsp;在进行并行EXP/IMP的时候，如果IMP过程建索引的话不建议同时运行5个以上的IMP，如果你想加快速度，可以在IMP的时候不建索引，这样只要内存允许，可以多跑几个，然后是SQL脚本创建需要的索引。&nbsp; </p>
<p><br />注意：<br />&nbsp;操作者要有足够的权限，权限不够它会提示。<br />&nbsp;数据库是否可以连上, 可以用tnsping TestDB&nbsp; 来获得数据库 TestDB 能否连上。</p>
<p>附录一：<br />&nbsp;给用户增加导入数据权限的操作<br />&nbsp;第一, 启动sql*puls<br />&nbsp;第二，以system/manager登陆<br />&nbsp;第三，create user 用户名 IDENTIFIED BY 密码 （如果已经创建过用户，这步可以省略）<br />&nbsp;第四，GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,<br />&nbsp;&nbsp; DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DBA,CONNECT,RESOURCE,CREATE SESSION&nbsp; TO 用户名字 <br />&nbsp;第五, 运行-cmd-进入dmp文件所在的目录, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imp userid=system/manager full=y file=*.dmp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者 imp userid=system/manager full=y file=filename.dmp</p>
<p>&nbsp; 附录二：<br />&nbsp;Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.<br />&nbsp; 先建立import9.par,<br />&nbsp; 然后，使用时命令如下：imp parfile=/filepath/import9.par<br />&nbsp; 例 import9.par 内容如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROMUSER=TGPMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TOUSER=TGPMS2&nbsp;&nbsp;&nbsp;&nbsp; （注：把表的拥有者由FROMUSER改为TOUSER，FROMUSER和TOUSER的用户可以不同）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWS=Y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEXES=Y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GRANTS=Y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONSTRAINTS=Y<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BUFFER=409600<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file==/backup/ctgpc_20030623.dmp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log==/backup/import_20030623.log<br />转载自：<a href="http://www.cnblogs.com/furenjun/archive/2008/05/20/oracleImpExp.html">http://www.cnblogs.com/furenjun/archive/2008/05/20/oracleImpExp.html</a></font></p></div></div><img src ="http://www.blogjava.net/alexprefect/aggbug/360376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexprefect/" target="_blank">alexprefect</a> 2011-10-10 13:13 <a href="http://www.blogjava.net/alexprefect/archive/2011/10/10/360376.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华为短信机接口开发注意事项</title><link>http://www.blogjava.net/alexprefect/archive/2011/08/09/356154.html</link><dc:creator>alexprefect</dc:creator><author>alexprefect</author><pubDate>Tue, 09 Aug 2011 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/alexprefect/archive/2011/08/09/356154.html</guid><wfw:comment>http://www.blogjava.net/alexprefect/comments/356154.html</wfw:comment><comments>http://www.blogjava.net/alexprefect/archive/2011/08/09/356154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexprefect/comments/commentRss/356154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexprefect/services/trackbacks/356154.html</trackback:ping><description><![CDATA[<div id="blog_content" class="blog_content">1、关于jar包： <br />&nbsp;&nbsp;&nbsp; jar包拿来后，想直接使用，如果是单独新建一个工程，用来测试收发短信，没有问题，但实际应用中，往往会有很多jar包需一起使用，这时，把jar包里面除com外的所有文件及文件夹都删掉，就不会有错误了。 <br />2、关于smsendsql.xml文件的放置位置： <br />&nbsp;&nbsp;&nbsp; 在网上查的，说是放到工程根目录下，没有人说在写程序时，用debug调试时放在什么地方，最终还好被找到了&#8212;&#8212;&#8220;关于配置文件（smsendsql.xml、log4j.properties）的默认存放路径，可以在现场的开发环境中打印以下代码获得：System.out.println(System.getProperty("user.dir")); &#8221;，写下这句，会在控制台显示要放置的路径的。 <br />3、关于数据库连接字符串： <br />&nbsp;&nbsp;&nbsp; 最终的servierip字符串应为:"jdbc:microsoft:sqlserver://"+"ip:端口号"+";DatabaseName="+sql数据库实例名，通过java反编译器，可以找到jar包里的定义。 <br /><br />&nbsp;&nbsp;&nbsp; 上述三点解决了的话，那编写收发短信的程序就容易了。祝你们开发愉快！ </div><img src ="http://www.blogjava.net/alexprefect/aggbug/356154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexprefect/" target="_blank">alexprefect</a> 2011-08-09 17:07 <a href="http://www.blogjava.net/alexprefect/archive/2011/08/09/356154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎么查看端口占用情况(转载)</title><link>http://www.blogjava.net/alexprefect/archive/2011/08/02/355587.html</link><dc:creator>alexprefect</dc:creator><author>alexprefect</author><pubDate>Tue, 02 Aug 2011 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/alexprefect/archive/2011/08/02/355587.html</guid><wfw:comment>http://www.blogjava.net/alexprefect/comments/355587.html</wfw:comment><comments>http://www.blogjava.net/alexprefect/archive/2011/08/02/355587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexprefect/comments/commentRss/355587.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexprefect/services/trackbacks/355587.html</trackback:ping><description><![CDATA[<h2><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/rabbit/archive/2008/03/12/185559.html"><font color="#009933">怎么查看端口占用情况?</font></a> </h2>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开始--运行--cmd 进入命令提示符 输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管理器中没有PID这一项,可以在任务管理器中选"查看"-"选择列"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经常，我们在启动应用的时候发现系统需要的端口被别的程序占用，如何知道谁占有了我们需要的端口，很多人都比较头疼，下面就介绍一种非常简单的方法，希望对大家有用</p>
<p>假如我们需要确定谁占用了我们的9050端口</p>
<p>1、Windows平台<br />在windows命令行窗口下执行：</p>
<div><pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: rgb(244,244,244); margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">C:\&gt;netstat -aon|findstr <span style="color: rgb(0,96,128)">"9050"</span><br /><br />TCP    127.0.0.1:9050         0.0.0.0:0              LISTENING       2016</pre></div>
<p><br />看到了吗，端口被进程号为2016的进程占用，继续执行下面命令：</p>
<div><pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: rgb(244,244,244); margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px">C:\&gt;tasklist|findstr <span style="color: rgb(0,96,128)">"2016"</span><br /><br />tor.exe                     2016 Console                 0     16,064 K</pre></div>
<p>很清楚吧，tor占用了你的端口。<br /><a href="http://www.blogjava.net/rabbit/archive/2008/03/12/185559.html">http://www.blogjava.net/rabbit/archive/2008/03/12/185559.html</a>（转载）</p><img src ="http://www.blogjava.net/alexprefect/aggbug/355587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexprefect/" target="_blank">alexprefect</a> 2011-08-02 14:03 <a href="http://www.blogjava.net/alexprefect/archive/2011/08/02/355587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle客户端绿色版,不再为WINDOWS系统版本发愁了！</title><link>http://www.blogjava.net/alexprefect/archive/2011/07/20/354728.html</link><dc:creator>alexprefect</dc:creator><author>alexprefect</author><pubDate>Wed, 20 Jul 2011 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/alexprefect/archive/2011/07/20/354728.html</guid><wfw:comment>http://www.blogjava.net/alexprefect/comments/354728.html</wfw:comment><comments>http://www.blogjava.net/alexprefect/archive/2011/07/20/354728.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexprefect/comments/commentRss/354728.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexprefect/services/trackbacks/354728.html</trackback:ping><description><![CDATA[<p align="left">&nbsp; 一般我们开发的话，都是用的oracle作为数据库的，开发工具我习惯用plsql，toad功能虽好，但我用不习惯。<br />&nbsp; plsql需要读取oracle客户端中的配置文件来连接数据库，所以我们不得i不装个oracle客户端，但是客户端不但庞大，而且如果你是用win7或别的系统的话，会遇到各种头疼的问题，好在oracle推出了绿色版来解决这个问题。<br />&nbsp;&nbsp; 下面我就来讲讲这绿色版怎么用的吧 <br />&nbsp;&nbsp; 第一步：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先需要下载一个oracle绿色版，官网就有，我下的是11G版本的。下载需要注册，自己注册个就好了，下载地址是：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.oracle.com/technetwork/topics/winsoft-085727.html">http://www.oracle.com/technetwork/topics/winsoft-085727.html</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下完了之后解压，解压完我的路径是&nbsp; D:\Program Files\instantclient_11_2<br /><br /><br />&nbsp;&nbsp;&nbsp;第二步：我们来配置下环境变量先：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size="4">&nbsp;1) 变量名：ORACLE_HOME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量值：D:\Program Files\instantclient_11_2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) 变量名：TNS_ADMIN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量值：D:\Program Files\instantclient_11_2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3) 变量名：NLS_LANG<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变量值：SIMPLIFIED CHINESE_CHINA.ZHS16GBK<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;4) 修改Path变量，在后面添加 D:\Program Files\instantclient_11_2<br /><font size="4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果不愿意手工增加，可以下载 SetOraEnv.rar 附件, 解压后执行其中的 setOraEnv.bat.<br />&nbsp;&nbsp;&nbsp;</font><br /></font><br />&nbsp;&nbsp;&nbsp;&nbsp; 然后进入instantclient_11_2文件夹，新建一个network文件夹，并在network文件夹下新建admin文件夹，在admin文件夹中新建名为tnsnames.ora文件，这个文件是用来配置连接远程数据库的登录信息的（客户端软件都会从这个相对路径下的文件中获取连接数据库的信息），内容如下：<br />databasename =<br />&nbsp;&nbsp;&nbsp; (DESCRIPTION =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = ip address)(PORT = 1521))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = database name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />&nbsp;&nbsp;&nbsp; )<br />例如我链接实验室数据库的对应文件内容是：<br />TCM =<br />&nbsp;&nbsp;&nbsp; (DESCRIPTION =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS_LIST =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (CONNECT_DATA =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SERVICE_NAME = test)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />&nbsp;&nbsp;&nbsp; )<br />然后安装PL/SQL Developer，过程是傻瓜式的。进入PL/SQL后（开始进入时会要求登录数据库，但是现在PL/SQL现在还找不到你的Oracle客户端，所以登录是不会成功的，但是可以进入软件），选择Tools-&gt;Preferences，在Oracle Home OCI Library两栏中分别填入Oracle客户端的路径和OCI文件的路径（oci.dll文件直接在instantclient_10_2文件夹下），所以我在这两个选项中填写的内容是&#8220;E:\OracleClient\instantclient_11_2&#8221;和&#8220;E:\OracleClient\instantclient_11_2\oci.dll&#8221;。这时再登录就可以登录成功了。如若还不行就重启一下PL/SQL。</p>
<p>绿色版的客户端可能会出现对于中文支持的问题，这主要是因为服务器端指定的字符集和客户端所默认的字符集是不相同的导致的，只要找到服务器端的字符集设置，然后将客户端的字符集设置与服务器端保持一致就好了。修改客户端字符集设置的方法有好几种，可以修改注册表，也可以用环境变量的方法解决。不过我这里介绍的客户端是绿色版的，只是解压到某一个路径而已，所以注册表的方法在这里不是很适用，所以我写了一个启动脚本，在启动PL/SQL之前，先建一个临时环境变量nls_lang，并给变量赋值，再启动软件。（我曾经做过实验，通过建立系统环境变量的方法在这里是行不通的，具体的原因我说不清楚&gt;&lt;）</p>
<p>我的脚本plsql.bat的内容如下：</p>
<p>set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK<br />cd "c:\Program Files\PLSQL Developer"<br />PLSQLDev.exe<br />其中第二行进入的路径是PL/SQL Developer安装到的路径。</p>
<p>我这里的实际情况是服务器端的字符集设置为SIMPLIFIED CHINESE_CHINA.ZHS16GBK，所以我将这个值赋给nls_lang。通过运行plsql.bat脚本就可以正常的访问服务器数据库了。<br /><br /><br /><br /></p>
<p align="left">//创建用户test，密码test<br />create user test identified by "test";<br />//<font color="#ff0000"><font face="宋体">为</font><span style="color: red" lang="EN-US"><font face="Times New Roman">test</font></span><span style="font-family: 宋体; color: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户创建系统特权并且可以用</span><span style="color: red" lang="EN-US"><font face="Times New Roman">test</font></span></font><span style="font-family: 宋体; color: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为别的用户授予权限</span><span style="color: red" lang="EN-US"><o:p></o:p></span><br />Grant execute any procedure to test with admin option&nbsp; </p><img src ="http://www.blogjava.net/alexprefect/aggbug/354728.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexprefect/" target="_blank">alexprefect</a> 2011-07-20 17:01 <a href="http://www.blogjava.net/alexprefect/archive/2011/07/20/354728.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>时间 字符转换</title><link>http://www.blogjava.net/alexprefect/archive/2011/07/14/354323.html</link><dc:creator>alexprefect</dc:creator><author>alexprefect</author><pubDate>Thu, 14 Jul 2011 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/alexprefect/archive/2011/07/14/354323.html</guid><wfw:comment>http://www.blogjava.net/alexprefect/comments/354323.html</wfw:comment><comments>http://www.blogjava.net/alexprefect/archive/2011/07/14/354323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexprefect/comments/commentRss/354323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexprefect/services/trackbacks/354323.html</trackback:ping><description><![CDATA[public Date parseDate(String str){<br />&nbsp;&nbsp;&nbsp; &nbsp; DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp; Date date = null;<br />&nbsp;&nbsp;&nbsp; &nbsp; try {<br />&nbsp;&nbsp;&nbsp;date = format1.parse(str);<br />&nbsp;&nbsp;} catch (ParseException e) {<br />&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return date;<br />&nbsp;&nbsp;&nbsp; &nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp; public Map&lt;String,Integer&gt; returnDate(String str){<br />&nbsp;&nbsp;&nbsp; &nbsp; Date d_date = null;<br />&nbsp;&nbsp; Map&lt;String,Integer&gt; map = new HashMap&lt;String,Integer&gt;();<br />&nbsp;&nbsp;&nbsp; d_date = parseDate(str);<br />&nbsp;&nbsp;&nbsp; Integer year = new Integer(String.format("%tY", d_date));&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; Integer month = new Integer(String.format("%tm", d_date));&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; Integer day = new Integer(String.format("%td", d_date));&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; Integer hourse = new Integer(String.format("%tH", d_date)); <br />&nbsp;&nbsp;&nbsp; Integer minute = new Integer(String.format("%tM", d_date)); <br />&nbsp;&nbsp;&nbsp; Integer second = new Integer(String.format("%tS", d_date)); <br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; map.put("year",year);<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; map.put("month",month);<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; map.put("day",day);<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; map.put("hourse",hourse);<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; map.put("minute",minute);<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; map.put("second",second);<br />&nbsp;&nbsp;&nbsp; &nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; return map;<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br /><img src ="http://www.blogjava.net/alexprefect/aggbug/354323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexprefect/" target="_blank">alexprefect</a> 2011-07-14 14:51 <a href="http://www.blogjava.net/alexprefect/archive/2011/07/14/354323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringUtil</title><link>http://www.blogjava.net/alexprefect/archive/2011/07/13/354251.html</link><dc:creator>alexprefect</dc:creator><author>alexprefect</author><pubDate>Wed, 13 Jul 2011 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/alexprefect/archive/2011/07/13/354251.html</guid><wfw:comment>http://www.blogjava.net/alexprefect/comments/354251.html</wfw:comment><comments>http://www.blogjava.net/alexprefect/archive/2011/07/13/354251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexprefect/comments/commentRss/354251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexprefect/services/trackbacks/354251.html</trackback:ping><description><![CDATA[<h3 class="title pre fs1"><font size="5"><font face="微软雅黑"><span class="tcnt">StringUtil</span><span class="bgc0 fc07 fw0 fs0"></span></font></font></h3>
<p style="line-height: 20px" class="tdep clearfix nbw-act fc06"><span class="pleft"><span class="blogsep">2008-07-23 08:46:22</span><span class="blogsep">|&nbsp;&nbsp;分类：</span> <a class="fc03 m2a" title="My Utils" href="http://sunjun041640.blog.163.com/blog/#m=0&amp;t=1&amp;c=fks_087066085094083071085095085095086083087065082094085065"><font color="#dd3535">My Utils</font></a> <span id="$_blogTagTitle" class="blogsep phide">|&nbsp;&nbsp;标签：</span><span id="$_blogTagInfo" class="fc03 phide"></span> </span><span class="pright fc07 ztag"><span class="blogsep">|</span><span id="$_fontswitch" class="zihao fc03" __1310534977590__="ev_8814422341"><font color="#dd3535">字号</font><span id="$_fontsTypes" class="zihaoshow  phide"><span class="zihaoc bdc0"><span class="stag" __1310534977590__="ev_7277524655" __tabkey__="true" index="0"></span><span class="fc04 stag" __1310534977590__="ev_8250718871" __tabkey__="true" index="1">大</span><span class="fc04 stag selected js-fcurrent fc05" __1310534977590__="ev_1910913817" __tabkey__="true" index="2">中</span><span class="fc04 stag" __1310534977590__="ev_9273148758" __tabkey__="true" index="3">小</span></span></span></span></span><span id="$_blog_subscribe" class="pright pnt fc03" __1310534977590__="ev_8037566313"><span class="iblock icn0 icn0-919">&nbsp;</span><a class="m2a">订阅</a></span> </p>
<div></div>
<div class="bct fc05 fc11 nbw-blog ztag js-fs2">
<p><font size="3">package com.sun.util;</font></p>
<p><font size="3">import java.io.File;<br />import java.io.UnsupportedEncodingException;<br />import java.net.URLDecoder;<br />import java.net.URLEncoder;<br />import java.security.MessageDigest;<br />import java.sql.Timestamp;<br />import java.text.NumberFormat;<br />import java.text.SimpleDateFormat;<br />import java.util.Date;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;</font></p>
<p><font size="3">/**<br />&nbsp;* 字符串操作通用类<br />&nbsp;* <br />&nbsp;* @author sunjun<br />&nbsp;* @version v5.0<br />&nbsp;*/<br />public class StringUtil {</font></p>
<p><font size="3">&nbsp;// 字符串常量枚举<br />&nbsp;public static enum REGEX_ENUM {<br />&nbsp;&nbsp;EMAIL("^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"), CHINESE_CHARACTER(<br />&nbsp;&nbsp;&nbsp;&nbsp;"[\\u4E00-\\u9FA5]+");<br />&nbsp;&nbsp;private String value;</font></p>
<p><font size="3">&nbsp;&nbsp;private REGEX_ENUM(String value) {<br />&nbsp;&nbsp;&nbsp;this.value = value;<br />&nbsp;&nbsp;}</font></p>
<p><font size="3">&nbsp;&nbsp;public String toString() {<br />&nbsp;&nbsp;&nbsp;return this.value;<br />&nbsp;&nbsp;}<br />&nbsp;};</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串str是否匹配正则表达式regex<br />&nbsp; * <br />&nbsp; * @param regex<br />&nbsp; * @param str<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static boolean matcherRegex(String regex, String str) {<br />&nbsp;&nbsp;Pattern pattern = Pattern.compile(regex);<br />&nbsp;&nbsp;Matcher matcher = pattern.matcher(str);<br />&nbsp;&nbsp;return matcher.matches();<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 是否为汉字<br />&nbsp; * <br />&nbsp; * @param ch<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static boolean isChineseCharacter(char ch) {<br />&nbsp;&nbsp;return matcherRegex(REGEX_ENUM.CHINESE_CHARACTER.toString(), String<br />&nbsp;&nbsp;&nbsp;&nbsp;.valueOf(ch));<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 按字节截取字符串<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要截取的字符串<br />&nbsp; * @param byteLength<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 长度<br />&nbsp; * @return 结果字符串<br />&nbsp; */<br />&nbsp;public static String subString(String str, int byteLength) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return "";<br />&nbsp;&nbsp;if (str.getBytes().length &lt;= byteLength)<br />&nbsp;&nbsp;&nbsp;return str;<br />&nbsp;&nbsp;if (str.length() &gt;= byteLength)<br />&nbsp;&nbsp;&nbsp;str = str.substring(0, byteLength);<br />&nbsp;&nbsp;int readLen = 0;<br />&nbsp;&nbsp;String c = null;<br />&nbsp;&nbsp;StringBuffer sb = new StringBuffer("");<br />&nbsp;&nbsp;for (int i = 0; i &lt; str.length(); i++) {<br />&nbsp;&nbsp;&nbsp;c = String.valueOf(str.charAt(i));<br />&nbsp;&nbsp;&nbsp;readLen += c.getBytes().length;<br />&nbsp;&nbsp;&nbsp;if (readLen &gt; byteLength)<br />&nbsp;&nbsp;&nbsp;&nbsp;return sb.toString();<br />&nbsp;&nbsp;&nbsp;sb.append(c);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return sb.toString();<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串长度是否在指定长度范围内(minLength&lt;=str.length&lt;=maxLength)<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @param minLength<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最小长度<br />&nbsp; * @param maxLength<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最大长度<br />&nbsp; * @return boolean 字符串长度在指定长度范围内返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean checkLength(String str, int minLength, int maxLength) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;int len = str.length();<br />&nbsp;&nbsp;if (minLength == 0)<br />&nbsp;&nbsp;&nbsp;return len &lt;= maxLength;<br />&nbsp;&nbsp;else if (maxLength == 0)<br />&nbsp;&nbsp;&nbsp;return len &gt;= minLength;<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;return (len &gt;= minLength &amp;&amp; len &lt;= maxLength);<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 按UTF-8编码来解码字符串<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要解码的字符串<br />&nbsp; * @return String 解码str后字符串<br />&nbsp; */<br />&nbsp;public static String decodeString(String str) {<br />&nbsp;&nbsp;return decodeString(str, "UTF-8");<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 按指定编码来解码字符串<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; * @param encoding<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String decodeString(String str, String encoding) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return "";<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;return URLDecoder.decode(str.trim(), encoding);<br />&nbsp;&nbsp;} catch (UnsupportedEncodingException e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return "";<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 按指定编码来解码字符串<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; * @param encoding<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String decodeURI(String str) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return "";<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;return new String(str.getBytes("ISO8859-1"), "UTF-8");<br />&nbsp;&nbsp;} catch (UnsupportedEncodingException e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return "";<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 按UTF-8编码来编码字符串<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要编码的字符串<br />&nbsp; * @return String 编码str后字符串<br />&nbsp; */<br />&nbsp;public static String encodeString(String str) {<br />&nbsp;&nbsp;return encodeString(str, "UTF-8");<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 按UTF-8编码来编码字符串<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要编码的字符串<br />&nbsp; * @return String 编码str后字符串<br />&nbsp; */<br />&nbsp;public static String encodeString(String str, String encoding) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return "";<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;return URLEncoder.encode(str.trim(), encoding);<br />&nbsp;&nbsp;} catch (UnsupportedEncodingException e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return "";<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 根据时间得到唯一字符串<br />&nbsp; * <br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String getOnlyString() {<br />&nbsp;&nbsp;return String.valueOf(System.currentTimeMillis());<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查对象obj是否为空<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return boolean str为空返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isBlank(Object obj) {<br />&nbsp;&nbsp;if (obj == null)<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;if (obj instanceof String &amp;&amp; obj.toString().trim().length() == 0)<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串str是否为整型<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return boolean str为整型返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isInteger(String str) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Integer.parseInt(str.trim());<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串str是否为长整型<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return boolean str为长整型返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isLong(String str) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Long.parseLong(str.trim());<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串str是否为布尔型<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return boolean str为布尔型返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isBoolean(String str) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Boolean.parseBoolean(str.trim());<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串str是否为double类型<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static boolean isDouble(String str) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Double.parseDouble(str.trim());<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串str是否为时间型<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return boolean str为时间型返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isDate(String str) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;java.sql.Date sqlDate = java.sql.Date.valueOf(str.trim());<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查对象数组strings的每个元素是否为空<br />&nbsp; * <br />&nbsp; * @param objs<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的对象数组<br />&nbsp; * @return boolean objs数组元素为空返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isBlanks(Object... objs) {<br />&nbsp;&nbsp;for (Object obj : objs) {<br />&nbsp;&nbsp;&nbsp;if (StringUtil.isBlank(obj))<br />&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串数组str是否为长整型数组<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return boolean str为长整型数组返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isLongs(String str[]) {<br />&nbsp;&nbsp;for (int i = 0; i &lt; str.length; i++) {<br />&nbsp;&nbsp;&nbsp;if (!isLong(str[i]))<br />&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return true;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串数组str是否为整型数组<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return boolean str为整型数组返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isIntegers(String str[]) {<br />&nbsp;&nbsp;for (int i = 0; i &lt; str.length; i++)<br />&nbsp;&nbsp;&nbsp;if (!isInteger(str[i]))<br />&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;return true;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串数组str是否为布尔型数组<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return boolean str为布尔型数组返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isBooleans(String str[]) {<br />&nbsp;&nbsp;for (int i = 0; i &lt; str.length; i++)<br />&nbsp;&nbsp;&nbsp;if (!isBoolean(str[i]))<br />&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;return true;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串str是否为时间<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return str为时间型返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isTimestamp(String str) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;java.sql.Date d = java.sql.Date.valueOf(str.trim());<br />&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;} catch (Exception ex) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 检查字符串str是否为(yyyy-MM-dd HH:mm:ss)模式的时间<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要检查的字符串<br />&nbsp; * @return str为时间型返回true，否则返回false<br />&nbsp; */<br />&nbsp;public static boolean isFullTimestamp(String str) {<br />&nbsp;&nbsp;if (isBlank(str))<br />&nbsp;&nbsp;&nbsp;return false;<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;SimpleDateFormat format = new SimpleDateFormat(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"yyyy-MM-dd HH:mm:ss");<br />&nbsp;&nbsp;&nbsp;Date date = format.parse(str.trim());<br />&nbsp;&nbsp;&nbsp;return date != null;<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 将字符数组转换为长整型数组<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符数组<br />&nbsp; * @return Long[] 长整型数组<br />&nbsp; */<br />&nbsp;public static Long[] stringsToLongs(String str[]) {<br />&nbsp;&nbsp;Long lon[] = new Long[str.length];<br />&nbsp;&nbsp;for (int i = 0; i &lt; lon.length; i++)<br />&nbsp;&nbsp;&nbsp;lon[i] = new Long(str[i]);<br />&nbsp;&nbsp;return lon;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 将字符数组转换为整型数组<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符数组<br />&nbsp; * @return Integer[] 整型数组<br />&nbsp; */<br />&nbsp;public static Integer[] stringsToIntegers(String str[]) {<br />&nbsp;&nbsp;Integer array[] = new Integer[str.length];<br />&nbsp;&nbsp;for (int i = 0; i &lt; array.length; i++)<br />&nbsp;&nbsp;&nbsp;array[i] = new Integer(str[i]);<br />&nbsp;&nbsp;return array;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 将字符数组转换为布尔型数组<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符数组<br />&nbsp; * @return Boolean[] 布尔型数组<br />&nbsp; */<br />&nbsp;public static Boolean[] stringsToBooleans(String str[]) {<br />&nbsp;&nbsp;Boolean array[] = new Boolean[str.length];<br />&nbsp;&nbsp;for (int i = 0; i &lt; array.length; i++)<br />&nbsp;&nbsp;&nbsp;array[i] = new Boolean(str[i]);<br />&nbsp;&nbsp;return array;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 将字符数组转换为浮点型数组<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符数组<br />&nbsp; * @return double[] 浮点型数组<br />&nbsp; */<br />&nbsp;public static double[] stringsToDoubles(String str[]) {<br />&nbsp;&nbsp;double array[] = new double[str.length];<br />&nbsp;&nbsp;for (int i = 0; i &lt; array.length; i++)<br />&nbsp;&nbsp;&nbsp;array[i] = Double.parseDouble(str[i]);<br />&nbsp;&nbsp;return array;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 根据指定时间和格式字符串得到时间格式字符串<br />&nbsp; * <br />&nbsp; * @param d<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时间<br />&nbsp; * @param pattern<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式字符串<br />&nbsp; * @return String 时间格式字符串<br />&nbsp; */<br />&nbsp;public static String formatDate(Date d, String pattern) {<br />&nbsp;&nbsp;if (isBlank(d))<br />&nbsp;&nbsp;&nbsp;return "";<br />&nbsp;&nbsp;SimpleDateFormat format = new SimpleDateFormat(<br />&nbsp;&nbsp;&nbsp;&nbsp;isBlank(pattern) ? "yyyy-MM-dd HH-mm-ss" : pattern);<br />&nbsp;&nbsp;return format.format(d);<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 根据时间字符串得到时间(yyyy-MM-dd)<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时间字符串<br />&nbsp; * @return Timestamp 时间<br />&nbsp; */<br />&nbsp;public static Timestamp getTimestamp(String str) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;Date d = java.sql.Date.valueOf(str.trim());<br />&nbsp;&nbsp;&nbsp;return new Timestamp(d.getTime());<br />&nbsp;&nbsp;} catch (Exception ex) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 根据时间字符串得到(yyyy-MM-dd HH-mm-ss)格式时间<br />&nbsp; * <br />&nbsp; * @param str<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时间字符串<br />&nbsp; * @return Timestamp 时间<br />&nbsp; */<br />&nbsp;public static Timestamp getFullTimestamp(String str) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;SimpleDateFormat format = new SimpleDateFormat(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"yyyy-MM-dd HH:mm:ss");<br />&nbsp;&nbsp;&nbsp;Date date = format.parse(str.trim());<br />&nbsp;&nbsp;&nbsp;return new Timestamp(date.getTime());<br />&nbsp;&nbsp;} catch (Exception ex) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 得到数字格式化后的字符串<br />&nbsp; * <br />&nbsp; * @param number<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number类型<br />&nbsp; * @param minFractionDigits<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小数最小位数<br />&nbsp; * @param maxFractionDigits<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小数最大位数<br />&nbsp; * @return String 格式化后的字符串<br />&nbsp; */<br />&nbsp;public static String formatNumber(Number number, int minFractionDigits,<br />&nbsp;&nbsp;&nbsp;int maxFractionDigits) {<br />&nbsp;&nbsp;NumberFormat format = NumberFormat.getInstance();<br />&nbsp;&nbsp;format.setMinimumFractionDigits(minFractionDigits);<br />&nbsp;&nbsp;format.setMaximumFractionDigits(maxFractionDigits);<br />&nbsp;&nbsp;return format.format(number);<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 字符串高亮&lt;br&gt;<br />&nbsp; * 解决了高亮前缀或高亮后缀在要高亮显示的字符串数组在存在时的问题，根据本算法可解决JS高亮显示时相同的问题<br />&nbsp; * <br />&nbsp; * @param text<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 内容<br />&nbsp; * @param replaceStrs<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要高亮显示的字符串数组<br />&nbsp; * @param beginStr<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 高亮前缀，如&lt;font color=red&gt;<br />&nbsp; * @param endStr<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 高亮后缀，如&lt;/font&gt;<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String heightLight(String text, String[] replaceStrs,<br />&nbsp;&nbsp;&nbsp;String beginStr, String endStr) {<br />&nbsp;&nbsp;if (text.length() == 0)<br />&nbsp;&nbsp;&nbsp;return text;<br />&nbsp;&nbsp;StringBuilder str = new StringBuilder();<br />&nbsp;&nbsp;for (int i = 0; i &lt; replaceStrs.length; i++) {<br />&nbsp;&nbsp;&nbsp;String replaceStr = replaceStrs[i];<br />&nbsp;&nbsp;&nbsp;int index = text.indexOf(replaceStr);<br />&nbsp;&nbsp;&nbsp;if (index &gt;= 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;String afterStr = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (index &gt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String beforeStr = text.substring(0, index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterStr = text.substring(index + replaceStr.length());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.append(heightLight(beforeStr, replaceStrs, beginStr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endStr));<br />&nbsp;&nbsp;&nbsp;&nbsp;} else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterStr = text.substring(replaceStr.length());<br />&nbsp;&nbsp;&nbsp;&nbsp;str.append(beginStr).append(replaceStr).append(endStr);<br />&nbsp;&nbsp;&nbsp;&nbsp;str<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(heightLight(afterStr, replaceStrs, beginStr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endStr));<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if (str.length() == 0)<br />&nbsp;&nbsp;&nbsp;return text;<br />&nbsp;&nbsp;return str.toString();<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 替换指定的字符串数组为一个字符串&lt;br&gt;<br />&nbsp; * 速度比String.replaceAll快3倍左右，比apache-common StringUtils.replace快2倍左右<br />&nbsp; * <br />&nbsp; * @param text<br />&nbsp; * @param replaceStrs<br />&nbsp; * @param newStr<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String replaceAll(String text, String[] replaceStrs,<br />&nbsp;&nbsp;&nbsp;String newStr) {<br />&nbsp;&nbsp;if (text.length() == 0)<br />&nbsp;&nbsp;&nbsp;return text;<br />&nbsp;&nbsp;StringBuilder str = new StringBuilder();<br />&nbsp;&nbsp;for (int i = 0; i &lt; replaceStrs.length; i++) {<br />&nbsp;&nbsp;&nbsp;String replaceStr = replaceStrs[i];<br />&nbsp;&nbsp;&nbsp;int index = text.indexOf(replaceStr);<br />&nbsp;&nbsp;&nbsp;if (index &gt;= 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;String afterStr = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (index &gt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String beforeStr = text.substring(0, index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterStr = text.substring(index + replaceStr.length());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str.append(replaceAll(beforeStr, replaceStrs, newStr));<br />&nbsp;&nbsp;&nbsp;&nbsp;} else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterStr = text.substring(replaceStr.length());<br />&nbsp;&nbsp;&nbsp;&nbsp;str.append(newStr);<br />&nbsp;&nbsp;&nbsp;&nbsp;str.append(replaceAll(afterStr, replaceStrs, newStr));<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if (str.length() == 0)<br />&nbsp;&nbsp;&nbsp;return text;<br />&nbsp;&nbsp;return str.toString();<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 替换指定的字符串为一个字符串&lt;br&gt;<br />&nbsp; * 速度比String.replaceAll快3倍左右，比apache-common StringUtils.replace快2倍左右<br />&nbsp; * <br />&nbsp; * @param text<br />&nbsp; * @param replaceStr<br />&nbsp; * @param newStr<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String replaceAll(String text, String replaceStr,<br />&nbsp;&nbsp;&nbsp;String newStr) {<br />&nbsp;&nbsp;if (text.length() == 0)<br />&nbsp;&nbsp;&nbsp;return text;<br />&nbsp;&nbsp;StringBuilder str = new StringBuilder();<br />&nbsp;&nbsp;int index = text.indexOf(replaceStr);<br />&nbsp;&nbsp;if (index &gt;= 0) {<br />&nbsp;&nbsp;&nbsp;String afterStr = null;<br />&nbsp;&nbsp;&nbsp;if (index &gt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;String beforeStr = text.substring(0, index);<br />&nbsp;&nbsp;&nbsp;&nbsp;afterStr = text.substring(index + replaceStr.length());<br />&nbsp;&nbsp;&nbsp;&nbsp;str.append(replaceAll(beforeStr, replaceStr, newStr));<br />&nbsp;&nbsp;&nbsp;} else<br />&nbsp;&nbsp;&nbsp;&nbsp;afterStr = text.substring(replaceStr.length());<br />&nbsp;&nbsp;&nbsp;str.append(newStr);<br />&nbsp;&nbsp;&nbsp;str.append(replaceAll(afterStr, replaceStr, newStr));<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if (str.length() == 0)<br />&nbsp;&nbsp;&nbsp;return text;<br />&nbsp;&nbsp;return str.toString();<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 替换指定的字符串数组为一个字符串数组&lt;br&gt;<br />&nbsp; * 速度比String.replaceAll快3倍左右，比apache-common StringUtils.replace快2倍左右<br />&nbsp; * <br />&nbsp; * @param text<br />&nbsp; * @param replaceStrs<br />&nbsp; * @param newStrs<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String replaceAllArray(String text, String[] replaceStrs,<br />&nbsp;&nbsp;&nbsp;String[] newStrs) {<br />&nbsp;&nbsp;if (text.length() == 0)<br />&nbsp;&nbsp;&nbsp;return text;<br />&nbsp;&nbsp;StringBuilder str = new StringBuilder();<br />&nbsp;&nbsp;for (int i = 0; i &lt; replaceStrs.length; i++) {<br />&nbsp;&nbsp;&nbsp;String replaceStr = replaceStrs[i];<br />&nbsp;&nbsp;&nbsp;int index = text.indexOf(replaceStr);<br />&nbsp;&nbsp;&nbsp;if (index &gt;= 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;String afterStr = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (index &gt; 0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String beforeStr = text.substring(0, index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterStr = text.substring(index + replaceStr.length());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(replaceAllArray(beforeStr, replaceStrs,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newStrs));<br />&nbsp;&nbsp;&nbsp;&nbsp;} else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterStr = text.substring(replaceStr.length());<br />&nbsp;&nbsp;&nbsp;&nbsp;str.append(newStrs[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;str.append(replaceAllArray(afterStr, replaceStrs, newStrs));<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if (str.length() == 0)<br />&nbsp;&nbsp;&nbsp;return text;<br />&nbsp;&nbsp;return str.toString();<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 解码HTML(将&amp;gt;,&amp;lt;,&amp;quot;,&amp;amp;转换成&gt;,&lt;,",&amp; )<br />&nbsp; * <br />&nbsp; * @param html<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String decodeHTML(String html) {<br />&nbsp;&nbsp;if (isBlank(html))<br />&nbsp;&nbsp;&nbsp;return "";<br />&nbsp;&nbsp;String[] replaceStr = { "&amp;amp;", "&amp;lt;", "&amp;gt;", "&amp;quot;" };<br />&nbsp;&nbsp;String[] newStr = { "&amp;", "&lt;", "&gt;", "\"" };<br />&nbsp;&nbsp;return replaceAllArray(html, replaceStr, newStr);<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * 编码HTML(将&gt;,&lt;,",&amp;<br />&nbsp; * 转换成&amp;gt;,&amp;lt;,&amp;quot;,&amp;amp;)(高效率，来自FreeMarker模板源码，比replaceAll速度快很多)<br />&nbsp; * <br />&nbsp; * @param html<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public static String encodeHTML(String html) {<br />&nbsp;&nbsp;if (isBlank(html))<br />&nbsp;&nbsp;&nbsp;return "";<br />&nbsp;&nbsp;int ln = html.length();<br />&nbsp;&nbsp;char c;<br />&nbsp;&nbsp;StringBuffer b;<br />&nbsp;&nbsp;for (int i = 0; i &lt; ln; i++) {<br />&nbsp;&nbsp;&nbsp;c = html.charAt(i);<br />&nbsp;&nbsp;&nbsp;if (c == '&lt;' || c == '&gt;' || c == '&amp;' || c == '"') {<br />&nbsp;&nbsp;&nbsp;&nbsp;b = new StringBuffer(html.substring(0, i));<br />&nbsp;&nbsp;&nbsp;&nbsp;switch (c) {<br />&nbsp;&nbsp;&nbsp;&nbsp;case '&lt;':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append("&amp;lt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case '&gt;':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append("&amp;gt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case '&amp;':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append("&amp;amp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case '"':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append("&amp;quot;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;int next = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;while (i &lt; ln) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c = html.charAt(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (c == '&lt;' || c == '&gt;' || c == '&amp;' || c == '"') {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append(html.substring(next, i));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch (c) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case '&lt;':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append("&amp;lt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case '&gt;':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append("&amp;gt;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case '&amp;':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append("&amp;amp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case '"':<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append("&amp;quot;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next = i + 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if (next &lt; ln)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.append(html.substring(next));<br />&nbsp;&nbsp;&nbsp;&nbsp;html = b.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return html;<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * MD5加密<br />&nbsp; * <br />&nbsp; * @param plainText<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要加密的字符串<br />&nbsp; * @return 加密后的字符串<br />&nbsp; */<br />&nbsp;public static String Md5(String plainText) {<br />&nbsp;&nbsp;StringBuffer buf = new StringBuffer("");<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;MessageDigest md = MessageDigest.getInstance("MD5");<br />&nbsp;&nbsp;&nbsp;md.update(plainText.getBytes());<br />&nbsp;&nbsp;&nbsp;byte b[] = md.digest();<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;for (int offset = 0; offset &lt; b.length; offset++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;i = b[offset];<br />&nbsp;&nbsp;&nbsp;&nbsp;if (i &lt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i += 256;<br />&nbsp;&nbsp;&nbsp;&nbsp;if (i &lt; 16)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append("0");<br />&nbsp;&nbsp;&nbsp;&nbsp;buf.append(Integer.toHexString(i));<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return buf.toString();<br />&nbsp;}</font></p>
<p><font size="3">&nbsp;/**<br />&nbsp; * MD5加密(32)<br />&nbsp; * <br />&nbsp; * @param plainText<br />&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要加密的字符串<br />&nbsp; * @return<br />&nbsp; */<br />&nbsp;public final static String MD5(String plainText) {<br />&nbsp;&nbsp;char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',<br />&nbsp;&nbsp;&nbsp;&nbsp;'a', 'b', 'c', 'd', 'e', 'f' };<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;byte[] strTemp = plainText.getBytes();<br />&nbsp;&nbsp;&nbsp;MessageDigest mdTemp = MessageDigest.getInstance("MD5");<br />&nbsp;&nbsp;&nbsp;mdTemp.update(strTemp);<br />&nbsp;&nbsp;&nbsp;byte[] md = mdTemp.digest();<br />&nbsp;&nbsp;&nbsp;int j = md.length;<br />&nbsp;&nbsp;&nbsp;char str[] = new char[j * 2];<br />&nbsp;&nbsp;&nbsp;int k = 0;<br />&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; j; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;byte byte0 = md[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;str[k++] = hexDigits[byte0 &gt;&gt;&gt; 4 &amp; 0xf];<br />&nbsp;&nbsp;&nbsp;&nbsp;str[k++] = hexDigits[byte0 &amp; 0xf];<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return new String(str);<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return "";<br />&nbsp;}</font><font size="3"><br />}</font></p></div><img src ="http://www.blogjava.net/alexprefect/aggbug/354251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexprefect/" target="_blank">alexprefect</a> 2011-07-13 13:33 <a href="http://www.blogjava.net/alexprefect/archive/2011/07/13/354251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型高并发高负载网站的系统架构【转载】 </title><link>http://www.blogjava.net/alexprefect/archive/2009/11/19/302917.html</link><dc:creator>alexprefect</dc:creator><author>alexprefect</author><pubDate>Thu, 19 Nov 2009 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/alexprefect/archive/2009/11/19/302917.html</guid><wfw:comment>http://www.blogjava.net/alexprefect/comments/302917.html</wfw:comment><comments>http://www.blogjava.net/alexprefect/archive/2009/11/19/302917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alexprefect/comments/commentRss/302917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alexprefect/services/trackbacks/302917.html</trackback:ping><description><![CDATA[<div>
<p><font face="Arial">我在Cernet做过拨号接入平台的搭建，而后在Yahoo3721负载搜索引擎前端平台开发，又在猫扑处理过大型社区猫扑大杂烩的架构升级等<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target="_self"><u><strong>工作</strong></u></a>，同时自己接触和开发过不少大中型网站的模块，因此在大型网站应对高负载和并发的解决方案上有一些积累和经验，可以和大家一起探讨一下。</font>
<p><br />
<font face="Arial">一个小型的网站，比如个人网站，可以使用最简单的<a onclick="javascript:tagshow(event, 'html');" href="javascript:;" target="_self"><u><strong>html</strong></u></a>静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的<a onclick="javascript:tagshow(event, '%BC%BC%CA%F5');" href="javascript:;" target="_self"><u><strong>技术</strong></u></a>经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target="_self"><u><strong>数据库</strong></u></a>、WebServer、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。</font></p>
<p><font face="Arial">大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。</font></p>
<p><font face="Arial">上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。</font></p>
<p><font face="Arial">1、HTML静态化<br />
其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的<a onclick="javascript:tagshow(event, '%B7%BD%B7%A8');" href="javascript:;" target="_self"><u><strong>方法</strong></u></a>其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。</font></p>
<p><font face="Arial">除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。</font></p>
<p><font face="Arial">同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。</font></p>
<p><font face="Arial">2、图片服务器分离<br />
大家知道，对于Web服务器来说，不管是<a onclick="javascript:tagshow(event, 'Apache');" href="javascript:;" target="_self"><u><strong>Apache</strong></u></a>、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗和执行效率。</font></p>
<p><font face="Arial">3、数据库集群和库表散列<br />
大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。</font></p>
<p><font face="Arial">在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的<a onclick="javascript:tagshow(event, 'MySQL');" href="javascript:;" target="_self"><u><strong>MySQL</strong></u></a>提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。</font></p>
<p><font face="Arial">上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。</font></p>
<p><font face="Arial">4、缓存<br />
缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。<br />
架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。<br />
网站程序开发方面的缓存，<a onclick="javascript:tagshow(event, 'Linux');" href="javascript:;" target="_self"><u><strong>Linux</strong></u></a>上提供的Memory Cache是常用的缓存接口，可以在web开发中使用，比如用<a onclick="javascript:tagshow(event, 'Java');" href="javascript:;" target="_self"><u><strong>Java</strong></u></a>开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，<a onclick="javascript:tagshow(event, 'PHP');" href="javascript:;" target="_self"><u><strong>PHP</strong></u></a>有Pear的Cache模块，Java就更多了，.net不是很熟悉，相信也肯定有。</font></p>
<p><font face="Arial">5、镜像<br />
镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。</font></p>
<p><font face="Arial">6、负载均衡<br />
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。<br />
负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。<br />
硬件四层交换<br />
第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。<br />
在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。</font></p>
<p><font face="Arial">软件四层交换<br />
大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。<br />
软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。</font></p>
<p><font face="Arial">一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。</font></p>
<p><font face="Arial">对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。</font></p>
</div>
<img src ="http://www.blogjava.net/alexprefect/aggbug/302917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alexprefect/" target="_blank">alexprefect</a> 2009-11-19 14:37 <a href="http://www.blogjava.net/alexprefect/archive/2009/11/19/302917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>