??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品黄色,97超碰人人在线,爱高潮www亚洲精品http://www.aygfsteel.com/wangxinsh55/category/9197.htmlzh-cnFri, 08 Apr 2011 08:49:05 GMTFri, 08 Apr 2011 08:49:05 GMT60讄mysql允许外部IPq接的解x?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2011/04/08/347870.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 08 Apr 2011 03:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2011/04/08/347870.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/347870.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2011/04/08/347870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/347870.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/347870.html</trackback:ping><description><![CDATA[<h4>讄mysql允许外部IPq接的解x?/h4> <div> <div> <wbr> <wbr> mysql默认情况下,只允许localhostq接Q如果需要外部IPq接到mysqlQ需要向mysql数据库里?#8220;user”表里d相关授权?/div> <div> <wbr> <wbr> 例如Q让newuser用户使用newpwd密码从IPQ?92.168.1.3L链接到mysql服务?nbsp;<wbr> <wbr><br />  <wbr> <wbr><br />  <wbr> <wbr> 具体步骤Q?br />  <wbr> <wbr> mysql>GRANT ALL PRIVILEGES ON *.* TO <a href="mailto:%27newuser%27@%27192.168.1.3%27">'newuser'@'192.168.1.3'</a> IDENTIFIED BY 'newpwd' WITH GRANT OPTION;<br />  <wbr> <wbr> mysql>flush privileges; <wbr> <wbr> <wbr><br />  <wbr> <wbr><br />  <wbr> <wbr> grant语法Q?br />  <wbr> <wbr> grant 权限名(所有的权限用allQ?on <wbr> <wbr> <wbr> 库名Q?全部Q?表名Q?全部Q?to <wbr> '要授权的用户?a href="mailto:%27@%27%%27%28%">'@'%'(%</a>表示所有的IPQ可以只些一个IPQ?identified by "密码"Q?/div> <div>w䆾查用user?Host, User和Password)3个范围列执行。服务器只有在user表记录的Host和User列匹配客LL名和用户名ƈ且提供了正确的密码时才接受连接?/div> <div>在user表Host值的指定ҎQ?/div> <div> <wbr> <wbr> <wbr> * Host值可以是L名或IPP?localhost'指出本地L?br />  <wbr> <wbr> <wbr> * 你可以在Host列g用通配W字W?#8220;%”?#8220;_”?br />  <wbr> <wbr> <wbr> * Host?%'匚wML名,IHost值等价于'%'。它们的含义与LIKE操作W的模式匚w操作相同。例如,'%'的Hostg所有主机名匚wQ?%.mysql.com'匚wmysql.com?/div> <div>的所有主机?/div> </div> <img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/347870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2011-04-08 11:42 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2011/04/08/347870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前端开?IE 中的常用调试工具[转]http://www.aygfsteel.com/wangxinsh55/archive/2009/03/02/257350.htmlSIMONESIMONEMon, 02 Mar 2009 07:47:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2009/03/02/257350.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/257350.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2009/03/02/257350.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/257350.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/257350.html一些前端开?IE 中的常用调试工具Q?/p>

Microsoft Script Debugger —?Companion.JS need to install this
Companion.JS —?Javascript debugger for IE , like Console API feature
IE Developer Toolbar —?Like Firebug (DOM/CSS etc)
Fiddler —?Web Debugging Proxy
HttpWatch —?HTTP viewer
Fiddler
一个很强大的http查看工?br /> http://www.fiddlertool.com/fiddler/

Httpwatch
数据分析工具,头消息接?发送的查看,POST数据查看.{等
http://www.httpwatch.com

IE Developer Toolsbar
IE下的FireBug.HTML及CSS调试工具
http://www.windowsmarketplace.com/details.aspx?itemid=2695980

Companion.JS
IE下的javascript调试工具.音?音?!音?!!
http://www.my-debugbar.com/wiki/CompanioNJS/HomePage

FireBug
强的没话说了已经….如果你不知道q是什?#8230;.那我更没话说?#8230;.
https://addons.mozilla.org/en-US/firefox/addon/1843

Web Developer
FireFox下的查看工具,可以查看JS,CSS{页面信?br /> https://addons.mozilla.org/en-US/firefox/addon/60

YSlow
why slow?面性能优化查看?ZFireBug
http://developer.yahoo.com/yslow

Javascript Debugger
FireFox下的javascript调试工具,比FireBug有更强大的调试功?
https://addons.mozilla.org/en-US/firefox/addon/216

Opera Developer Tools
Opera下的DOM,CSS查看工具,cMFireBug.
http://dev.opera.com/articles/view/opera-developer-tools/

webkit
Safari下的开发调试工?br /> http://nightly.webkit.org/

 



SIMONE 2009-03-02 15:47 发表评论
]]>
WebService大讲堂之Axis2 http://www.aygfsteel.com/nokiaguy/category/37087.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2009/02/13/254560.htmlSIMONESIMONEFri, 13 Feb 2009 07:34:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2009/02/13/254560.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/254560.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2009/02/13/254560.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/254560.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/254560.html
值得x



SIMONE 2009-02-13 15:34 发表评论
]]>
安装Loadrunner9的心?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2009/02/13/254525.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Fri, 13 Feb 2009 03:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2009/02/13/254525.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/254525.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2009/02/13/254525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/254525.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/254525.html</trackback:ping><description><![CDATA[在一ơ意外中lr8.1不能使用Vugen了,刚好下蝲了LR9.0<br /> 记得W一ơ安装LR9.0Ӟ破解文档q没有出来,当时安装也不,最l无~用?br /> q次不单单找C破解文档Q而且安装q程异常利。直接用默认安装后Q用LR8.0中的mlr5lprg.dll、lm70.dll覆盖LR9.0安装目录?#8220;bin”文g夹中的对应文件。即可开始用LR9.0了?br /> 呵呵Q因为卸载的lr8.1已经dq去用户限制的注册信息了Q?br /> golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI<br />       web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB<br /> q里lr9.0默认了那些注册信息?br /> q入一切正常?br /> <br /> <br /> 附:一份他人的破解文档参?br /> 打开LoadrunnerQ发C下几个dll可能和注册有养Imlr5lprg.dll、licensebundles.dll、lm50.dll、lm70.dll?br /> 最后确认mlr5lprg.dll、lm70.dll是关键dll?br /> 破解ҎcM与LR8.1<br /> a、用LR8.0中的mlr5lprg.dll、lm70.dll覆盖LR9.0安装目录?#8220;bin”文g夹中的对应文Ӟ<br /> b、然后用老的注册码就可以使用了;<br /> c、golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI<br />       web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB<br /> <br /> 可能会遇到的问题<br /> 在破解的q程中我q遇C个问题,是通过上述的方法注册时提示“License security violation……”Q无法注册?br /> 该问题可通过如下办法解决Q?br /> a、手动修Ҏ册表Q删除下面内容:<br /> [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2]<br /> <br /> [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2\History]<br /> "AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN"=""<br /> <br /> [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2\PermanentLicense]<br /> @="AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN"<br /> "last"="AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN"<br /> <br /> [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2\TemporaryLicense]<br /> @="AEBGEBFS-AKEKEKEKE-KAUCA"<br /> <br /> [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{87B3ADD4-21EB-11d5-93EF-00105AA0FD2D}]<br /> @="IControl"<br /> <br /> b、可使用|上的朋友提供的LR_delete_License.exe文g删除上述的注册表内容。由于这个程序是针对8.1的,可能会报错,但是不媄响用?br /> x<br /> 最后得感谢HP公司的大度,q没有对注册模块做大的修改,q可以让我们取y使用。最后请大家不要以此用于商业q作Q仅供个人学习参考,请大家支持正版Y件? <img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/254525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2009-02-13 11:27 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2009/02/13/254525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 2003操作pȝ25招加速方?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2007/06/05/122226.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Tue, 05 Jun 2007 11:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2007/06/05/122226.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/122226.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2007/06/05/122226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/122226.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/122226.html</trackback:ping><description><![CDATA[<p>微Y的Windown Server 2003管它是对应服务器的Q但仍然有不朋友蠢蠢欲动,Ʋ升之而后快。可是,安装之后你就会发现麻烦多多,q样功能没有Q那样功能打不开Q甚臌听歌Q玩游戏也成问题了?/p> <p>  其实QServer 2003在XP的基强化了安全性和E_性,不得不关闭了一些工作站pȝ。我们是把Win 2003当工作站用,当然要重新打开q些服务Q让它重h生啦。那些用不着的服务器功能Q也一q减肥去掉吧?/p> <p>  1、关闭服务器向导</p> <p>  装完win 2003Q你会发?#8220;理您的服务?#8221;出现Q把左下角的“d时不要显C?#8221;勾上。如果你在开机时找不刎ͼ可以q入控制面板-理工具-理你的服务器中扑ֈ</p> <p>  2、用户帐L?/p> <p>  2003使用服务器的ctrl+alt+deld方式Q没有Win XP的登录欢q,q是建立一个帐L录有个性化。在开?q行-输入“lusrmgr.msc”-本地用户和组。在用户中右键点d?#8220;新用?#8221;Q输入̎号信息ƈ建立账号?/p> <p>  接着把新建的账号d到管理员l,右键点击你新建的用户Q选择属?隶属?dAdd..-高-现在查找Q双ȝ理员Q得到Administrator相近的权限?/p> <p>  3、关闭事件跟t程?/p> <p>  服务器必不可的功能之一Q开?q行-输入“gpedit.msc”Q打开l策略编辑器Q在双的计机配置-理模板-pȝQ双?#8220;昄关闭事g跟踪E序”Q设|ؓq用,以后x画面和Win2000相同?/p> <p>  4、程序的动态分?/p> <p>  右键点击“我的电脑”图标Q进入属?高-性能-讄-高Q选择分配处理器和内存资源都选择?#8220;E序”使用?/p> <p>  5、关闭错误报?/p> <p>  右键点击“我的电脑”图标Q进入属?高-错误报告Q选择“用错误报告”Qƈ且去?#8220;但在发生严重错误旉知?#8221;的勾?/p> <p>  6、隐藏文?/p> <p>  Win2003默认是显C所有文件夹的,可以设法来隐?在资源管理器或我的电脑上Q选择工具-文g多w项-查看Q不昄隐藏文g和文件夹?/p> <p>  7、关闭Internet Explorer的增强安全配|?/p> <p>  q个新组件会把IE安全讄到最高,跟本没法q行正常的浏览行为,在它弹出的时_先选中“以后不要昄q个信息”Q当Ӟ最省事的方法是在控刉?-dE序--d或删除Windowslg中卸载增强安全配|?/p> <p>  然后Q找开IEQ在工具-internet选项-安全Q点击默认别,讄ZU即可?/p> <p>  8、安装Java虚拟?/p> <p>  自从Win XP开始,Java已经没有内置在系l中Q微软这招够毒啊Qؓ此,我们只好另外安装Q而且需要去掉高U安全才能安装?/p> <p>  9、开启硬件加?/p> <p>  桌面点击右键Q进入属?讄-高-疑难解答Q开启完全的g加速,q时会出现黑屏,然后回复正常?/p> <p>  10、开启DirectX加?/p> <p>  开?q行-输入dxdiag-昄Q把DirectDraw、Direct3D、AGPU理加速都启用。要注意的是Q负?D的DirectDraw和Direct3D有时不能q用Q只能开启其中一栗?/p> <p>  11、声韛_?/p> <p>  开?q行-输入dxdiag-声音Q把“声音的硬件加速?#8221;拉到“完全加?#8221;?/p> <p>  12、提高开/x速度</p> <p>  如果你的内存?68MB或以上,可以用虚拟内存QXP内核的内存管理已l相当优UQ而且虚拟内存(pagefile.sys)和休眠模?Hiberfil.sys)采用不同的文Ӟ可以避免Win9xpȝ用虚拟内存出现的无法正常待机和休眠。在我们的测试系l上Q开Z整天Q关Z仅用?U钟?/p> <p>  右键点击“我的电脑”图标Q进入属?高-性能-讄-高-虚拟内存-更改Q勾上无分页文gQ然后按讄q确定?/p> <p>  无论在什么时候,增加内存都是提高相对速度的最快方法,因此Q如果不是经常进行高U计、图像处理、DX9 3D游戏的朋友,升时尽可能先考虑内存定w?/p> <p>13、安装DirectX 9b</p> <p>  不仅可以加速多媒体应用Q而且能够减少被别人利用系l漏z攻ȝ机率?/p> <p>  14、安装防火墙</p> <p>  即Win2003的安全性高Q而且我们也经常升U系l补丁,但亦无法保证不被d。可是,Win2003需要特D的E序Q普通单Y件无法安装,必须使用服务器版的程序。推?Symantec Norton Antivirus企业版病毒防火墙+Personal Firewall 2003|络防火墙?<br> 15、提高系l性能 </p> <p>  右键点击“我的电脑”图标Q进入属?高-性能-讄Q调整ؓ最x能?</p> <p>  16、加速Q务栏 </p> <p>  除了?#8220;d栏保持在其它H口的前?#8221;其它全部LQ原因如? </p> <p>  自动隐藏d?避免找不CQ务栏Q而且占用pȝ </p> <p>  分组怼d栏按?E序q于集中Q很难找?</p> <p>  昄旉:有手表或手机无ȝ旉 </p> <p>  隐藏不活动图?不知道现在用了那些应用E序 </p> <p>  17、自定义l典开始菜?</p> <p>  只?#8220;昄q行”?#8220;在开始菜单中昄图?#8221;Q其它都是扩展Q务栏Q以及增加特效和功能的,紧记!功能少快 </p> <p>  18、提高显C速度 </p> <p>  右键点击桌面q入昄属性,把桌面墙U和屏幕保护都关掉,在外?效果中,把所有勾L?</p> <p>  19、资源管理器提?</p> <p>  在资源管理器或我的电脑上Q选择工具-文g多w项-常规Q选择“使用windows传统风格的文件夹”?</p> <p>  ?#8220;隐藏受保护的操作pȝ文g”?#8220;隐藏q文gcd的扩展名”之外所有的选项都去掉。特别是“C每个文g夹的视图讄”?#8220;鼠标指向文g夹和桌面Ҏ昄提示信息”?#8220;在文件夹提示中显C文件大信?#8221;q几关掉,L个性化讄?</p> <p>  W三是资源管理器的优化,查看中?#8220;列表”形式Q以最的图标和信息显C内宏V在工具栏菜单中Q把标准按钮和链接都LQ这些功能全部通过快捷键可以实玎ͼ多留无益?</p> <p>  20、关掉桌面图?</p> <p>  在桌面上按右键,选择排列图标Q去掉显C桌面图标的勾,x所有图标,节省大量资源?</p> <p>  21、IE的优?</p> <p>  IE的界面优化基本和资源理器相同,都是可能减功能条Q只留下地址栏。不q,在工?internet选项中就有许多好玩东西了?</p> <p>  常规-可以更改的主는I白,开启时无须载入M|页Q速度?</p> <p>  高-多媒体,L“启用自动囑փ大小调整”Q直接显C整q图像,减少IE的工作量?</p> <p>  览Q去?#8220;启用脱机目按计划同?#8221;Q在宽带包月如此行的今天,脱机q有什么用? </p> <p>  L“使用qx滚动”Q让左边的导航条Q按照正常的page up/down方式快速翻c?</p> <p>  L“下蝲完成后发出通知”Qdownload完就还通知什么,多此一举?</p> <p>  L“在地址栏中昄转到按钮”Q{到的|址我们都没多大用处?</p> <p>  L“自动查Internet Explorer更新”Q手动更新永q比自动更新要快Q而且无须让IEl常留意是否需要更新?</p> <p>  22、关掉自动更?</p> <p>  ?#8220;我的电脑”图标上按右键Q系l属?自动更新Q去?#8220;保持我的计算机最?#8221;。让我们L自己定时更新的好习惯Q可以让大家避免再受?#8220;冲击?#8221;之类的病毒袭凅R?</p> <p>  23、关闭远E协?</p> <p>  ?#8220;我的电脑”图标上按右键Q系l属?q程中,一般情况下把远E协助全部关掉,避免不必要的ȝ?</p> <p>  24、用耗电模式 </p> <p>  Z让电脑经常处于最佳状态,把所有的省电模式xQ在控制面板-甉|使用Ҏ中选择“演示”ҎQ从不关闭监视器、硬盘或q行pȝ待机?</p> <p>  25、键盘速度 </p> <p>  在控刉?键盘中,?#8220;重复延迟”?#8220;重复速度”都拉到右边,文字~辑的时候立卌功?br></p> <img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/122226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2007-06-05 19:56 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2007/06/05/122226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>xppȝ修复http://www.aygfsteel.com/wangxinsh55/archive/2007/05/11/116793.htmlSIMONESIMONEFri, 11 May 2007 08:55:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/05/11/116793.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/116793.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/05/11/116793.html#Feedback1http://www.aygfsteel.com/wangxinsh55/comments/commentRss/116793.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/116793.html?#8220;q行”中输入sfc /scannow卛_

SIMONE 2007-05-11 16:55 发表评论
]]>
J2me技术——跟我学制作Pak文g http://www.aygfsteel.com/wangxinsh55/archive/2007/02/13/99736.htmlSIMONESIMONETue, 13 Feb 2007 09:23:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/13/99736.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/99736.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/13/99736.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/99736.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/99736.html  
  ׃前些旉Q一些matrixer帔R关于j2me中用Pak文g的问题。本学艺不深Q但满怀热心的做了一番探索,现将制作Pak文g的看法和Ҏ公布出来Q大家多多提意见?br />  
  一、什么是Pak文gQ?br />  
  Pak文g是多个文件打包ؓ一个单独文Ӟ在这个文件中保存着多个文g的数据,当然q有一些描q文件结构的数据。所以将“Pak”作为文件的后缀是一U常规的用法Q大家可以自定义其它的文件后~?br />  
  二、ؓ什么用Pak文gQ?br />  
  ׃MIDP对发布安装的j2meE序大小q行了限Ӟ所以羃发布程序就意味着能够提供更多的程序或者内容(如图片、音乐)l用戗而通过研究发现zip/jar法对大文g的压~率高于对等量的多个文件的压羃率?br />  
  当然q有其它ҎQ这里简单做一下讨论比如用؜淆器ProGuard的?overloadaggressively”选项使jar文g~小Q但也会D一些错误,因ؓq种Ҏ生成jar中的classW合java byte code标准Q但是与java语法相悖Q严重的可能造成一些jre对Object的序列化错误?br />  
  所以用PakҎ程序中要用到的资源Q图片、音乐、文本)l合为单一文g是一个安全有效的Ҏ。而且对于一些商用程序,完全可以在pak文g中对文g数据q行加密Q很好的保护了作者和公司的权益。本人的sample中用了单的“加减法”加密,对于手机q类讑֤来讲是一个效率较高的选择?br />  
  三、Pak文g的结构:
  
  大家可以自己设计Pak文gl构Q本里只是抛砖引玉的作个sample。下面就是本计的Pak文gl构Q?br />  
  PAK File HeaderQPak文g的头?br />  
  * {֐Q?字节char数组 * 版本P32位float * 文gtable数量Q?2位整?* 密码行ؓQ?位字?* 密码Q?位字?* 文g唯一IDQ?0字节char数组 * 保留位:32位整?4字节)
  
  File TableQPak文g中包含文件的列表Q在一个Pak文g中一个被包含的文件对应一个File Table?br />  
  * 文g名:30字节char数组 * 文g大小Q?2位整?* 文g在pak文g中的位移Q?2位整?br />  
  Concatenated File DataQ按File Table的顺序连接在一L文g数据?br />  * 文g数据
  
  四、程序框Ӟ
  
  说明Q由于Pak文g的制作和使用分别要用两个java应用领域Qj2se和j2meQ所以本人将PakUtilcd作了2个版本(j2se和j2meQ?br />  
  E序框架如下Q?br />  1。PakHeaderc,定义了Pak文g头?br />  2。PakFileTablec,定义Pak文gtable?br />  3。PakUtilc(j2se版)Q具备两个功能:多个png囄合成一个Pak文gQƈ使用单的加减加密法对其进行加密;从Pak文g中取出png囄Q构造byte数组Q可以用来构造Image对象Q或者写为文件?br />  PakUtilc(j2me版)Q具备的功能Q从Pak文g中取出png囄Q构造byte数组Q可以用来构造Image对象Q?br />  
  五、PakHeader和PakFileTablec:
  
  PakHeader.javaQ?br />  package cn.org.matrix.gmatrix.gameLab.util.pak;/** * Pak文g_ * l构Q?*
  {֐Q?字节char数组 *  版本P32位float *
  文gtable数量Q?2位整?*
  密码行ؓQ?位字?*  密码Q?位字?*
  文g唯一IDQ?0字节char数组 *
  保留位:32位整?4字节) * @author cleverpig * */class PakHeader {
  //定义文g唯一ID长度
  public static final int UNIQUEID_LENGTH=10;
  //定义文g{֐长度
  public static final int SIGNATURE_LENGTH=6;
  //定义加法q算
  public static final int ADDITION_CIPHERACTION=0;
  //定义减法q算
  public static final int SUBTRACT_CIHOERACTION=1;
  //文g{֐
  private char[] signature=new char[SIGNATURE_LENGTH];
  //版本?br />  private float version=0f;
  //文gtable数量
  private long numFileTableEntries=0;
  //密码使用ҎQ在原数据上q行加法q是减法
  private byte cipherAction=ADDITION_CIPHERACTION;
  //密码?br />  private byte cipherValue=0x00;
  //唯一ID
  private char[] uniqueID=new char[UNIQUEID_LENGTH];
  //保留?字节
  private long reserved=0;
  public PakHeader(){
  }
  /**
  * 构造方?br />  * @param signature {֐
  * @param version 版本
  * @param numFileTableEntries 文gtable数量
  * @param cipherAction 密码使用Ҏ
  * @param cipherValue 密码?br />  * @param uniqueID 唯一ID
  * @param reserved 保留?字节
  */
  public PakHeader(char[] signature,float version,
  long numFileTableEntries,byte cipherAction,
  byte cipherValue,char[] uniqueID,long reserved){
  for(int i=0;i<SIGNATURE_LENGTH;this.signature[i]=signature[i],i++)
  ;
  this.version=version;
  this.cipherAction=cipherAction;
  this.numFileTableEntries=numFileTableEntries;
  this.cipherValue=cipherValue;
  for(int i=0;i<UNIQUEID_LENGTH;this.uniqueID[i]=uniqueID[i],i++);
  this.reserved=reserved;
  }        
  public byte getCipherValue() {
  return cipherValue;    
  }
  public void setCipherValue(byte cipherValue) {
  this.cipherValue = cipherValue;
  }
  public long getNumFileTableEntries() {
  return numFileTableEntries;
  }
  public void setNumFileTableEntries(long numFileTableEntries) {
  this.numFileTableEntries = numFileTableEntries;
  }
  public long getReserved() {
  return reserved;
  }
  public void setReserved(long reserved) {
  this.reserved = reserved;
  }
  public char[] getUniqueID() {
  return uniqueID;
  }
  public void setUniqueID(char[] uniqueID) {
  for(int i=0;i<UNIQUEID_LENGTH;this.uniqueID[i]=uniqueID[i],i++)
  ;    
  }    
  public float getVersion() {
  return version;
  }    
  public void setVersion(float version) {
  this.version = version;
  }
  public byte getCipherAction() {
  return cipherAction;
  }
  public void setCipherAction(byte cipherAction) {
  this.cipherAction = cipherAction;
  }
  public char[] getSignature() {
  return signature;
  }
  public void setSignature(char[] signature) {
  for(int i=0;i<SIGNATURE_LENGTH;this.signature[i] = signature[i],i++)
  ;    
  }
  /**
  * q回PakHeader的大?br />  * @return q回PakHeader的大?br />  */    
  public static int size(){
  return SIGNATURE_LENGTH+4+4+1+1+UNIQUEID_LENGTH+4;
  }
  public String toString(){
  String result="";
  result+="\t{֐:"+new String(this.signature).trim()
  +"\t版本?"+this.version
  +"\t文gtable数量:"+this.numFileTableEntries
  +"\t密码行ؓ:" +this.cipherAction
  +"\t密码:"+this.cipherValue            
  +"\t文g唯一ID:"+new String(this.uniqueID).trim()            +"\t保留?"+this.reserved;        
  return result;    
  }}
  
  PakFileTable.java
  package cn.org.matrix.gmatrix.gameLab.util.pak;/** * Pak文gtablec?* 文gtablel构Q?*
  文g名:30字节char数组 *
  文g大小Q?2位整?*
  文g在pak文g中的位移Q?2位整?* @author cleverpig * */class PakFileTable {
  public static final int FILENAME_LENGTH=30;
  //文g?br />  private char[] fileName=new char[FILENAME_LENGTH];
  //文g大小
  private long fileSize=0L;
  //文g在pak文g中的位移
  private long offSet=0L;
  public PakFileTable(){
  }
  /**
  * 构造方?br />  * @param fileName 文g?br />  * @param fileSize 文g大小
  * @param offSet 文g在Pak文g中的位移
  */
  public PakFileTable(char[] fileName,
  long fileSize,long offSet){
  for(int i=0;i<FILENAME_LENGTH;this.fileName[i]=fileName[i],i++)
  ;        this.fileSize=fileSize;
  this.offSet=offSet;
  }
  public char[] getFileName() {
  return fileName;
  }
  public void setFileName(char[] fileName) {
  for(int i=0;i<fileName.length;this.fileName[i]=fileName[i],i++)
  ;    
  }
  public long getFileSize() {
  return fileSize;
  }
  public void setFileSize(long fileSize) {
  this.fileSize = fileSize;
  }
  public long getOffSet() {
  return offSet;
  }
  public void setOffSet(long offSet) {
  this.offSet = offSet;
  }
  /**
  * q回文gTable的大?br />  * @return q回文gTable的大?br />  */    
  public static int size(){
  return FILENAME_LENGTH+4+4;
  }
  public String toString(){
  return "\t文g?"+new String(this.fileName).trim()
  +"\t文g大小:"+this.fileSize
  +"\t文g位移:"+this.offSet;
  }}
  
  六、PakUtilc(j2se版)Q?br />  
  PakUtil.java
  package cn.org.matrix.gmatrix.gameLab.util.pak;import java.io.*;
  import java.util.Vector;
  /** * Pak工具c?* 功能Q?br />  *1.多个png囄合成一个Pak文gQƈ使用单的加减加密法对其进行加密;
  * 2.从Pak文g中取出png囄Q构造byte数组Q可以用来构造Image对象Q或者写为文?* @author cleverpig * */public class PakUtil {
  public PakUtil(){
  }
  /**
  * q回文g长度
  * @param filePath 文g路径
  * @return 文g长度
  */
  private long getFileSize(String filePath){
  File file=new File(filePath);
  return file.length();
  }
  /**
  * q回文g?br />  * @param filePath 文g路径
  * @return 文g?br />  */
  
  private String getFileName(String filePath){
  File file=new File(filePath);
  return file.getName();
  }
  /**
  * 计算文g位移的v始点
  * @return 文g位移的v始点
  */
  private long workOutOffsetStart(PakHeader header){
  //计算出文件头+文gtable的长?br />  return PakHeader.size()+header.getNumFileTableEntries()*PakFileTable.size();
  }
  /**
  * 计算文g位移
  * @param fileIndex 文g序号
  * @param lastFileOffset 上一个文件位U?br />  * @return 文g在pak文g中的位移
  */
  private long workOutNextOffset(long sourceFileSize,long lastFileOffset){
  return lastFileOffset+sourceFileSize;    
  }
  /**
  * 生成文gtable
  * @param sourceFileName 源文件名
  * @param sourceFileSize 源文仉?br />  * @param currentFileOffset 当前文g位移
  * @return 生成的PakFileTable对象
  */    
  private PakFileTable generateFileTable(String sourceFileName,
  long sourceFileSize,long currentFileOffset){
  PakFileTable ft=new PakFileTable();
  ft.setFileName(sourceFileName.toCharArray());
  ft.setFileSize(sourceFileSize);
  ft.setOffSet(currentFileOffset);
  return ft;
  }
  /**
  * char字符数组写入到DataOutputStream?br />  * @param toWriteCharArray 被写入的char数组
  * @param dos DataOutputStream
  * @throws Exception
  */    
  private void writeCharArray(char[] toWriteCharArray,DataOutputStream dos) throws Exception{
  for(int i=0;i<toWriteCharArray.length;dos.writeChar(toWriteCharArray[i]),i++);
  }        
  /**
  * 使用文g头中的密码对数据q行加密
  * @param buff 被加密的数据
  * @param buffLength 数据的长?br />  * @param header 文g?br />  */
  private void encryptBuff(byte[] buff,int buffLength,PakHeader header){
  for(int i=0;i<buffLength;i++){
  switch(header.getCipherAction()){
  case PakHeader.ADDITION_CIPHERACTION:
  buff[i]+=header.getCipherValue();
  break;
  case PakHeader.SUBTRACT_CIHOERACTION:
  buff[i]-=header.getCipherValue();
  break;
  }
  }
  }
  /**
  * 使用文g头中的密码对数据q行解密
  * @param buff 被解密的数据
  * @param buffLength 数据的长?br />  * @param header 文g?br />  */
  private void decryptBuff(byte[] buff,int buffLength,PakHeader header){
  for(int i=0;i<buffLength;i++){
  switch(header.getCipherAction()){
  case PakHeader.ADDITION_CIPHERACTION:
  buff[i]-=header.getCipherValue();
  break;
  case PakHeader.SUBTRACT_CIHOERACTION:
  buff[i]+=header.getCipherValue();
  break;
  }
  }
  }
  /**
  * 制作Pak文g
  * @param sourceFilePath 源文件\径数l?br />  * @param destinateFilePath 目的文g路径QPak文gQ?br />  * @param cipherAction 密码行ؓ
  * @param cipherValue 密码
  * @throws Exception
  */
  public void makePakFile(String[] sourceFilePath,
  String destinateFilePath,PakHeader header) throws Exception{
  PakFileTable[] fileTable=new PakFileTable[sourceFilePath.length];
  //计算文g位移起始?br />  long fileOffset=workOutOffsetStart(header);
  //逐个建立文gtable
  for(int i=0;i<sourceFilePath.length;i++){
  String sourceFileName=getFileName(sourceFilePath[i]);
  long sourceFileSize=getFileSize(sourceFilePath[i]);
  PakFileTable ft=generateFileTable(sourceFileName,sourceFileSize,fileOffset);
  //计算下一个文件位U?br />  fileOffset=workOutNextOffset(sourceFileSize,fileOffset);
  fileTable[i]=ft;
  }
  //写入文g?br />  File wFile=new File(destinateFilePath);
  FileOutputStream fos=new FileOutputStream(wFile);
  DataOutputStream dos=new DataOutputStream(fos);
  writeCharArray(header.getSignature(),dos);
  dos.writeFloat(header.getVersion());
  dos.writeLong(header.getNumFileTableEntries());
  dos.writeByte(header.getCipherAction());
  dos.writeByte(header.getCipherValue());
  writeCharArray(header.getUniqueID(),dos);
  dos.writeLong(header.getReserved());
  //写入文gtable
  for(int i=0;i<fileTable.length;i++){
  writeCharArray(fileTable[i].getFileName(),dos);
  dos.writeLong(fileTable[i].getFileSize());
  dos.writeLong(fileTable[i].getOffSet());
  }
  //写入文g数据
  for(int i=0;i<fileTable.length;i++){
  File ftFile=new File(sourceFilePath[i]);
  FileInputStream ftFis=new FileInputStream(ftFile);
  DataInputStream ftDis=new DataInputStream(ftFis);
  byte[] buff=new byte[256];
  int readLength=0;
  while((readLength=ftDis.read(buff))!=-1){
  encryptBuff(buff,readLength,header);
  dos.write(buff,0,readLength);
  }
  ftDis.close();
  ftFis.close();
  }
  dos.close();
  }
  /**
  * 从DataInputStreamdchar数组     * @param dis DataInputStream
  * @param readLength d长度
  * @return char数组
  * @throws Exception
  */
  private char[] readCharArray(DataInputStream dis,int readLength) throws Exception{
  char[] readCharArray=new char[readLength];
  for(int i=0;i<readLength;i++){
  readCharArray[i]=dis.readChar();
  }
  return readCharArray;
  }
  /**
  * 从PAK文g中读取文件头
  * @param dis DataInputStream
  * @return PakHeader
  * @throws Exception
  */
  private PakHeader readHeader(DataInputStream dis) throws Exception{
  PakHeader header=new PakHeader();
  char[] signature=readCharArray(dis,PakHeader.SIGNATURE_LENGTH);
  header.setSignature(signature);
  header.setVersion(dis.readFloat());
  header.setNumFileTableEntries(dis.readLong());
  header.setCipherAction(dis.readByte());
  header.setCipherValue(dis.readByte());
  char[] uniqueID=readCharArray(dis,PakHeader.UNIQUEID_LENGTH);
  header.setUniqueID(uniqueID);
  header.setReserved(dis.readLong());
  return header;
  }
  /**
  * d所有的文gtable
  * @param dis DataInputStream
  * @param fileTableNumber 文g表L
  * @return 文gtable数组
  * @throws Exception
  */
  private PakFileTable[] readFileTable(DataInputStream dis,int fileTableNumber) throws Exception{
  PakFileTable[] fileTable=new PakFileTable[fileTableNumber];
  for(int i=0;i<fileTableNumber;i++){
  PakFileTable ft=new PakFileTable();
  ft.setFileName(readCharArray(dis,PakFileTable.FILENAME_LENGTH));
  ft.setFileSize(dis.readLong());
  ft.setOffSet(dis.readLong());
  fileTable[i]=ft;
  }        
  return fileTable;
  }
  /**
  * 从pak文gd文g到byte数组
  * @param dis DataInputStream
  * @param fileTable PakFileTable
  * @return byte数组
  * @throws Exception
  */
  private byte[] readFileFromPak(DataInputStream dis,PakHeader header,PakFileTable fileTable) throws Exception{
  dis.skip(fileTable.getOffSet()-workOutOffsetStart(header));
  //
  int fileLength=(int)fileTable.getFileSize();
  byte[] fileBuff=new byte[fileLength];
  int readLength=dis.read(fileBuff,0,fileLength);
  if (readLength<fileLength){
  System.out.println("d数据长度不正?);
  return null;
  }
  else{
  decryptBuff(fileBuff,readLength,header);
  return fileBuff;
  }
  }
  /**
  * buffer中的内容写入到文?br />  * @param fileBuff 保存文g内容的buffer
  * @param fileName 文g?br />  * @param extractDir 文g导出目录
  * @throws Exception
  */
  private void writeFileFromByteBuffer(byte[] fileBuff,String fileName,String extractDir) throws Exception{
  String extractFilePath=extractDir+fileName;
  File wFile=new File(extractFilePath);
  FileOutputStream fos=new FileOutputStream(wFile);
  DataOutputStream dos=new DataOutputStream(fos);
  dos.write(fileBuff);
  dos.close();
  fos.close();
  }
  /**
  * 从pak文g中取出指定的文g到byte数组Q如果需要的话可以将byte数组写ؓ文g
  * @param pakFilePath pak文g路径
  * @param extractFileName pak文g中将要被取出的文件名
  * @param writeFile 是否需要将byte数组写ؓ文g
  * @param extractDir 如果需要的话可以将byte数组写ؓ文gQextractDir为取出数据被写的目录文g
  * @return byte数组
  * @throws Exception
  */
  public byte[] extractFileFromPak(String pakFilePath,
  String extractFileName,boolean writeFile,String extractDir) throws Exception{
  File rFile=new File(pakFilePath);
  FileInputStream fis=new FileInputStream(rFile);
  DataInputStream dis=new DataInputStream(fis);
  PakHeader header=readHeader(dis);
  PakFileTable[] fileTable=readFileTable(dis,(int)header.getNumFileTableEntries());
  boolean find=false;        int fileIndex=0;
  for(int i=0;i<fileTable.length;i++){
  String fileName=new String(fileTable[i].getFileName()).trim();
  if (fileName.equals(extractFileName)){
  find=true;
  fileIndex=i;
  break;
  }
  }
  if (find==false){
  System.out.println("没有扑ֈ指定的文?);
  return null;        
  }      
  else{
  byte[] buff=readFileFromPak(dis,header,fileTable[fileIndex]);
  if (writeFile){
  writeFileFromByteBuffer(buff,extractFileName,extractDir);
  }            
  else{
  dis.close();
  fis.close();
  }
  return buff;
  }
  }
  /**
  * 从pak文g中取出指定的Pak文g的信?br />  * @param pakFilePath pak文g路径
  * @return 装蝲文g头和文gtable数组的Vector
  * @throws Exception
  */
  public Vector showPakFileInfo(String pakFilePath) throws Exception{
  File rFile=new File(pakFilePath);
  FileInputStream fis=new FileInputStream(rFile);
  DataInputStream dis=new DataInputStream(fis);
  PakHeader header=readHeader(dis);
  PakFileTable[] fileTable=readFileTable(dis,(int)header.getNumFileTableEntries());        Vector result=new Vector();
  result.add(header);
  result.add(fileTable);
  return result;
  }
  public static void main(String[] argv) throws Exception{
  PakUtil pu=new PakUtil();
  //构造文件头
  char[] signature=new char[PakHeader.SIGNATURE_LENGTH];
  signature=new String("012345").toCharArray();
  char[] uniqueID=new char[PakHeader.UNIQUEID_LENGTH];
  uniqueID=new String("0123456789").toCharArray();
  PakHeader header=new PakHeader();
  header.setSignature(signature);
  header.setNumFileTableEntries(3);
  header.setCipherAction((byte)PakHeader.ADDITION_CIPHERACTION);
  header.setCipherValue((byte)0x0f);
  header.setUniqueID(uniqueID);
  header.setVersion(1.0f);
  header.setReserved(0L);
  String[] filePathArray={"F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\apple.png",
  "F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\cushaw.png",
  "F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\flash.png"};
  String extractFilePath="F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\test.pak";
  //制作Pak文g
  System.out.println("制作Pak文g...");
  pu.makePakFile(filePathArray,extractFilePath,header);
  System.out.println("制作Pak文g完成");
  //从Pak文g中取出所有的囄文g
  Vector pakInfo=pu.showPakFileInfo(extractFilePath);
  header=(PakHeader)pakInfo.elementAt(0);
  System.out.println("Pak文g信息:");
  System.out.println("文g?");
  System.out.println(header);
  PakFileTable[] fileTable=(PakFileTable[])pakInfo.elementAt(1);
  for(int i=0;i<fileTable.length;i++){
  System.out.println("文gtable["+i+"]:");
  System.out.println(fileTable[i]);
  }
  String restoreDir="F:\\eclipse3.1RC3\\workspace\\gmatrixProject_j2se\\testFiles\\extract\\";
  String restoreFileName=null;
  byte[] fileBuff=null;
  for(int i=0;i<fileTable.length;i++){
  restoreFileName=new String(fileTable[i].getFileName()).trim();
  System.out.println("从Pak文g中取?+restoreFileName+"文g...");
  fileBuff=pu.extractFileFromPak(extractFilePath,restoreFileName,true,restoreDir);
  System.out.println("从Pak文g中取?+restoreFileName+"文g保存?+restoreDir+"目录");
  }
  }}
  
  七、PakUtilc(j2me版)Q?br />  
  PakUtil.java
  package cn.org.matrix.gmatrix.gameLab.util.pak;
  import java.io.*;
  import java.util.Vector;
  /** * Pak工具c?* 功能Q?* 从Pak文g中取出png囄Q构造byte数组Q可以用来构造Image对象Q?* @author cleverpig * */public class PakUtil {
  public PakUtil(){
  }
  /**
  * 计算文g位移的v始点
  * @return 文g位移的v始点
  */
  private long workOutOffsetStart(PakHeader header){
  //计算出文件头+文gtable的长?br />  return PakHeader.size()+header.getNumFileTableEntries()*PakFileTable.size();
  }
  /**
  * 从DataInputStreamdchar数组
  * @param dis DataInputStream
  * @param readLength d长度
  * @return char数组
  * @throws Exception
  */
  private char[] readCharArray(DataInputStream dis,int readLength) throws Exception{
  char[] readCharArray=new char[readLength];
  for(int i=0;i<readLength;i++){
  readCharArray[i]=dis.readChar();
  }
  return readCharArray;
  }
  /**
  * 从PAK文g中读取文件头
  * @param dis DataInputStream
  * @return PakHeader
  * @throws Exception
  */
  private PakHeader readHeader(DataInputStream dis) throws Exception{
  PakHeader header=new PakHeader();
  char[] signature=readCharArray(dis,PakHeader.SIGNATURE_LENGTH);
  header.setSignature(signature);
  header.setVersion(dis.readFloat());
  header.setNumFileTableEntries(dis.readLong());
  header.setCipherAction(dis.readByte());
  header.setCipherValue(dis.readByte());
  char[] uniqueID=readCharArray(dis,PakHeader.UNIQUEID_LENGTH);
  header.setUniqueID(uniqueID);
  header.setReserved(dis.readLong());
  return header;
  }
  /**
  * d所有的文gtable
  * @param dis DataInputStream
  * @param fileTableNumber 文g表L
  * @return 文gtable数组
  * @throws Exception
  */
  private PakFileTable[] readFileTable(DataInputStream dis,int fileTableNumber) throws Exception{
  PakFileTable[] fileTable=new PakFileTable[fileTableNumber];
  for(int i=0;i<fileTableNumber;i++){
  PakFileTable ft=new PakFileTable();
  ft.setFileName(readCharArray(dis,PakFileTable.FILENAME_LENGTH));
  ft.setFileSize(dis.readLong());
  ft.setOffSet(dis.readLong());
  fileTable[i]=ft;
  }
  return fileTable;
  }
  /**
  * 从pak文gd文g到byte数组
  * @param dis DataInputStream
  * @param fileTable PakFileTable
  * @return byte数组
  * @throws Exception
  */    
  private byte[] readFileFromPak(DataInputStream dis,PakHeader header,PakFileTable fileTable) throws Exception{
  dis.skip(fileTable.getOffSet()-workOutOffsetStart(header));
  //
  int fileLength=(int)fileTable.getFileSize();
  byte[] fileBuff=new byte[fileLength];
  int readLength=dis.read(fileBuff,0,fileLength);
  if (readLength<fileLength){
  System.out.println("d数据长度不正?);
  return null;
  }
  else{
  decryptBuff(fileBuff,readLength,header);
  }        
  return fileBuff;
  }
  /**
  * 使用文g头中的密码对数据q行解密
  * @param buff 被解密的数据
  * @param buffLength 数据的长?br />  * @param header 文g?br />  */
  private void decryptBuff(byte[] buff,int buffLength,PakHeader header){
  for(int i=0;i<buffLength;i++){
  switch(header.getCipherAction()){
  case PakHeader.ADDITION_CIPHERACTION:
  buff[i]-=header.getCipherValue();
  break;
  case PakHeader.SUBTRACT_CIHOERACTION:
  buff[i]+=header.getCipherValue();
  break;
  }
  }
  }
  /**
  * 从pak文g中取出指定的文g到byte数组
  * @param pakResourceURL pak文g的资源\?br />  * @param extractResourceName pak文g中将要被取出的文件名
  * @return byte数组    
  * @throws Exception
  */    
  public byte[] extractResourceFromPak(String pakResourceURL
  ,String extractResourceName) throws Exception{
  InputStream is=this.getClass().getResourceAsStream(pakResourceURL);
  DataInputStream dis=new DataInputStream(is);
  PakHeader header=readHeader(dis);//
  System.out.println("文g?");//
  System.out.println(header);
  PakFileTable[] fileTable=readFileTable(dis,(int)header.getNumFileTableEntries());//
  for(int i=0;i<fileTable.length;i++){//
  System.out.println("文gtable["+i+"]:");//
  System.out.println(fileTable[i]);//
  }
  boolean find=false;
  int fileIndex=0;
  for(int i=0;i<fileTable.length;i++){
  String fileName=new String(fileTable[i].getFileName()).trim();
  if (fileName.equals(extractResourceName)){
  find=true;
  fileIndex=i;
  break;
  }
  }
  if (find==false){
  System.out.println("没有扑ֈ指定的文?);
  return null;
  }
  else{
  byte[] buff=readFileFromPak(dis,header,fileTable[fileIndex]);
  return buff;
  }
  }
  /**
  * 从pak文g中取出指定的Pak文g的信?br />  * @param pakResourcePath pak文g资源路径
  * @return 装蝲文g头和文gtable数组的Vector
  * @throws Exception
  */
  public Vector showPakFileInfo(String pakResourcePath) throws Exception{
  InputStream is=this.getClass().getResourceAsStream(pakResourcePath);
  DataInputStream dis=new DataInputStream(is);
  PakHeader header=readHeader(dis);
  PakFileTable[] fileTable=readFileTable(dis,(int)header.getNumFileTableEntries());
  Vector result=new Vector();
  result.addElement(header);
  result.addElement(fileTable);
  return result;
  }
  public static void main(String[] argv) throws Exception{
  PakUtil pu=new PakUtil();
  String extractResourcePath="/test.pak";
  //从Pak文g中取出所有的囄文g
  Vector pakInfo=pu.showPakFileInfo(extractResourcePath);
  PakHeader header=(PakHeader)pakInfo.elementAt(0);
  System.out.println("Pak文g信息:");
  System.out.println("文g?");
  System.out.println(header);
  PakFileTable[] fileTable=(PakFileTable[])pakInfo.elementAt(1);
  for(int i=0;i<fileTable.length;i++){
  System.out.println("文gtable["+i+"]:");
  System.out.println(fileTable[i]);
  }
  String restoreFileName=null;       
  byte[] fileBuff=null;
  for(int i=0;i<fileTable.length;i++){
  restoreFileName=new String(fileTable[i].getFileName()).trim();
  System.out.println("从Pak文g中取?+restoreFileName+"文g数据...");
  fileBuff=pu.extractResourceFromPak(extractResourcePath,restoreFileName);
  System.out.println("从Pak文g中取?+restoreFileName+"文g数据完成");
  }   
   }}
  
  八、源代码使用介:
  
  Pakq程Qj2se版的PakUtiltestFiles目录中的三个png文gPak成ؓtest.pak文g?br />  UnPakq程Qj2se版的PakUtiltestFiles目录中test.pak文g释放到testFiles\extract目录下;j2me版的PakUtil从res目录中的test.pak文gd出其中所包含?个png文g数据q装入到byte数据Q用来构造Image对象Q大家请q行PakUtilTestMIDlet.java便可看到输出的信息?img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/99736.html" width = "1" height = "1" />

SIMONE 2007-02-13 17:23 发表评论
]]>
Motorola手机应用E序设计入门http://www.aygfsteel.com/wangxinsh55/archive/2007/02/01/97170.htmlSIMONESIMONEThu, 01 Feb 2007 03:32:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/01/97170.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/97170.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2007/02/01/97170.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/97170.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/97170.html前言

  本文内容的所有操作皆在Windows 200操作pȝ上经q测试。如果您在不同的q_上验证本文内容,例如Windows 98或是Windows MeQ则我们无法保证会有相同的结果?

  ?

  不知从什q时候开始,我们H然感觉到周围的人各各拥有一只手机。利用手Z别h沟通成了我们生zȝ一部䆾。北Ƨ某些先q国家的人民可以利用手机购买自动售货机所出售的商?他们也可以在从事行动商务(m-commence) 交易时利用手机做ZU认证工兗在日本Q行动电话的许多附加功能更是q轻人文化的一部分。即来临的3GQ无U宽频的梦带给了h们对无线通讯未来的期待?

  然后Q有些厂商开始行销它们自己生的PDAQ好象没有一台PDA在手Q就不像CZ的。各式各LPDA充斥市面Q畅销的与不畅销的,让hD撩ؕ。这时生了一个大问题--要我们同时携带手机和PDA是一件很ȝ的事?q它们都还轻薄短。如果可以把手机和PDA合而ؓ一岂不是更方便? 于是听到消费者心声的厂商Q开始有推出手机和PDA合而ؓ一的品,从NOKIA 9000、Motorola A6188(太极)Q到最q要推出的Ericsson R380、NOKIA 9210Q都是手ZPDAl合的例子,虽然因ؓ售h的关p,但是q些产品仍然是许多h梦寐以求的高阶品?

  管有了PDA与手机结合的产品出现Q我们仍然觉得有所不Q我惛_家一定发CQ就是应用程序的不Q虽然手机和PDA l合了,可是q些产品上的PDA功能看v来似乎是ȝ。我们可以Q意在PalmOS、Windows CE、EPOC{PDA上用C/C++或是Java~写q些q_上的应用E序Q但是却从未有过Z我们写好的E序下蝲到这些手Z执行(即有些手机的PDA也是使用EPOCQ如Ericsson R380)?

  怿厂商也听到我们这些喜Ƣ到处写E序的工E师的心CQ所以从2000q年底开始,卛_陆陆l箋有许多支持Java的手机即推出,当然Q这些厂商也提供了在手机上开发程序的SDKQ我们终于可以在手机上面写些程序自׃!q是以前{了很久的美梦?

  手机q_的多h与复杂性,和PDA比较h可以说是有过之而无不及Q于是大家就可以知道 - ?又是Javaz上用场的时候了。我们都知道在浏览器上执行的JavaE序叫做AppletQ在PalmOS上执行的JavaE序叫做SpotletQ然而在手机上执行的应用E序我们U做MIDletQ相信对大家来说都是一个陌生的名词Q这也就是本文章所要介l的主角?

  支持Java的手机大厂目前已知有NOKIA (预计?001q年初推Zƾ支持Java的手机NOKIA 9210)、Motorola(会先在支持integrated Digital enhanced network(iDen)|络的手Z支持JavaQ然后再推出支持Java的GSM手机Q该公司的手机大致会?002q前全部支持Java)以及NTT DoCoMo(在明年W二季度左右推出支持Java的手??

  虽然q些大公叔R准备支持JavaQ不q在军_~写本文Ӟ只有Motorola其SDK开放于|站上供E序开发者下载测试,所以本文内定w是根据Motorola J2ME SDK所~写。又׃q些手机市面上无法取得,所以我们的E序都是在SDK内附的模拟器中执行,怿最后这些手Z市时Q我们所~写的MIDlet应该会很Ҏq成功地在Motorola的手Z执行才对?br />
  如何取得Motorola J2ME SDK

  我们要做的第一件事情当然还是要先取得SDK|?L接到https://commerce.motorola.com/idenonline/ideveloper/下蝲Motorola J2ME SDK Drop 7。如果您不是iDEN? Developer的会员,请先在网l上注册(免费)。注册成功之后,Motorola会将密码寄到您的email信箱之中Q然后用该密码d|页上的My Development Center。进入之后选择|页上头的TOOLS & RESOURCES以进入可下蝲的开发工L|页Q请选择Motorola J2ME SDK Components Developer EditionQ?Drop 7.0下方的下载超q结以下载SDKQ整个SDK的大约? MB左右?

  h意下载前的Download Page for Motorola J2ME? SDK安装说明Q里头会告诉你安装密码,请先行记下。稍后当您在您的电脑上安装Motorola J2ME SDK的时候,会询问您安装密码Q所以请务必C该密码?br />
  Motorola J2ME SDK的安?

  安装需?br />
  Ҏ官方需求,安装Motorola J2ME SDK的基本配备ؓ:

   Pentium 100 MHz微处理器
   64 MB RAM
   Windows NT WorkStation 4.0配合Service Pack 3 / Win98
   (本文是在Windows 2000 Professional中文版上试)
   U? MB的硬盘空?br />   Java 2 SDK 1.2.2
   (本文使用Java 2 SDK 1.3.0_01作测?

  安装Motorola J2ME SDK

  要安装新版Motorola J2ME SDK之前Q请先确认您已经旧版的Motorola J2ME SDK完全删除。您可以由控制台里头?「新?删除E序」的功能删除旧版Motorola J2ME SDK。之后再旧版Motorola J2ME SDK安装所在\径清除即可?br />
  解开您从Motorola|站上下载的ZIP文gQ您会看C个名为Motorola_SDK.exe的文Ӟ双击此文件即可开始安装动作。请注意Q在安装时系l会要求您输入密码,误入之前所U录的安装密码即可?

  Motorola J2ME SDK目录l构

  当您成功地安装Motorola J2ME SDK之后Q其目录l构如下?




  MIDletE序l构

  在手Z执行的程序我们统UMIDletQ其E序l构很简单,与大家熟悉的Appletl构有异曲同工之妙?br />
  每一个MIDletE序都必ȝ承自javax.microedition.midlet.MIDletcdQƈ实做三个函式Q它们分别是:

protected void startApp()
protected void pauseApp()
protected void destroyApp(Boolean unconditional)

  而一个MIDletE序的v始与l束之流E我们以下图来表C?



  ~写q编译MIDlet

  请先到您的Motorola J2ME SDK安装目录下的demo\midlets目录底下新徏一个名为HelloMIDlet.java的文Ӟ其内容ؓ:

HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet
{
HelloMIDlet()
{
}

protected void startApp() throws MIDletStateChangeException
{
}

protected void pauseApp()
{
}

protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}

  在demo\midlets目录之中您会看到一个名为compileAll.bat的批处理文gQ前面有提到Q这个批处理文g除了可以帮助您编译所有内附范例程序之外,q可以简化您自己所~写的MIDlet之编译流E?br />请在命o列视H输? compileAll HelloMIDlet.java 如果成功~译Q屏q上输出的结果如下图所C?



  从屏q上的输出,您可以发玎ͼ要让MIDlet可以在手Z执行Q大体上q是要经q两个动?与Spotlet怼)Q分别是~译(compiling)以及预先审核(Preverifying)?br />
  从这个简短的MIDlet制作程里头Q相信大家可以发玎ͼ比vUa用Sun的CLDC~写能在KVM上执行的Spotlet要简单上许多。原因是compileAll.batq个批处理文件帮我们做掉大部分dirty work?br />那ُQ如果您写好的程序ƈ非放在demo\midlets目录之中Q是否就无法~译? 从compileAll.bat里头Q我们可以发现它帮我们完成上qC工作的指o。如果我们写好的E序攑֜demo\midlets目录以外的地方,您可以执行下面的指oQ您仍然可以成功地制作MIDlet:
(我们假设您的Motorola J2ME SDK安装在D:\MotoSDK目录之中Qƈ您自行~写的HelloMIDlet.java|于d:\jdk1.3.0_01\my目录之中。同时我们假设您在d:\jdk1.3.0_01\my目录底下执行下面指o?
~译:

javac -O -bootclasspath d:\MotoSDK\lib HelloMIDlet.java

  注意: -bootclasspath指向cd数库的所在位|?

  预先审核:

d:\MotoSDK\bin\preverifier -classpath d:\MotoSDK\lib;. -d . HelloMIDlet

  注意:

  1 . -classpath指向cd数库的所在位|,也要指向我们所~写的MIDlet所在的位置?br />
  2 .–d指向您希望预先编译类文g产生之后所攄的\?如果?."表示本目录,会覆盖掉原先未经q预先编译的cL件。如果您没有指定Q则预设gؓ".\output"目录?

  当然Q如果您嫌自己手动操作很ȝQ您可以compileAll.bat复制到其它目录之中,q更改其~译指o与预先审核指令之中和cd数库有关的相兌定即可?br />
  提到compileAll.batQ顺便向各位读者说明一下,在前面有提到QcompileAll.bat可以帮助您编译所有位于demo\midlets目录下的范例E序Q您只要在命列列下直接输? compileAll卛_。compileAll.bat会自动当您编译的package有以下几?

com.mot.j2me.midlets.bounce
com.mot.j2me.midlets.imagetests
com.mot.j2me.midlets.paddleball
com.mot.j2me.midlets.scribble
com.mot.j2me.midlets.tests
com.mot.j2me.midlets.tutorials

  如果您希望compileAll.bat自动帮您~译其它package底下的程序,h开启compileAll.batQ修改其COMPILECLASS环境变数的设定即可?br />
  修改q执行MIDlet

  写好E序之后Q大家最希望的事情当然就是让它在手机上执行,不过׃目前大家无法取得Motorolaq些支持Java的手机,所以我们只能在Motorola J2ME SDK内附的模拟器上执行我们写好的MIDlet。相信手机正式推出时Q应该可以顺利地在手Z执行。底下笔者将告诉您如何用Motorola J2ME SDK内附的模拟器来测试您所~写的MIDlet?br />
  在这之前Q由于之前我们所~写的范例程序只是简单的MIDletI壳Q我们必让它能够在模拟器上昄Z些信息才可以Q因此请修改上一个程序范例,使它的内容如?

HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet
{
private Display firstDisplay ;
private Form firstForm ;
HelloMIDlet()
{
firstDisplay = Display.getDisplay(this) ;
firstForm = new Form("Hello MIDlet") ;
StringItem firstStrItem = new StringItem("Hello","MIDlet") ;
firstForm.append(firstStrItem) ;
}

protected void startApp() throws MIDletStateChangeException
{
firstDisplay.setCurrent(firstForm) ;
}

protected void pauseApp()
{
}

protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}

  请将此文件放|在\demo\midlets目录下。编译完成之后,请将目录切换到scripts子目录之中,您会在此目录里发C些写好的批处理文件。请在该目录下执行这些批处理文g指o以启动模拟器。执行的指o与执行结果如下所C?

  指o: runEmul HelloMIDlet

  输出l果
  指o: runMotoi1000 HelloMIDlet

  输出l果
  指o: runMotoiDEN HelloMIDlet

  输出l果
  指o: runStarTac HelloMIDlet

  输出l果

 指o: runMyDevice HelloMIDlet
 输出l果:
  Error loading property file: C:/properties/mydevice.props (pȝ找不到指定的路径?会出现错误信息是因ؓ您没有指定属于是用者自订的手机外观的缘故,后面会教您如何讑֮用户自订的手机外观?


  如果我们写好的E序攑֜demo\midlets目录以外的地方,您可以执行下面的指oQ仍然可以成功地启动模拟器ƈ执行MIDlet:

  (我们假设您的Motorola J2ME SDK安装在D:\MotoSDK目录之中Qƈ您自行~写的HelloMIDlet.java|于d:\jdk1.3.0_01\my目录之中。同时我们假设您在d:\jdk1.3.0_01\my目录底下执行下面指o?

  执行一般模拟器

java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator

-classpath.;d:\MotoSDK\lib javax.microedition.midlet.AppManager HelloMIDlet

-JSA 1 1

 h?

  W一?classpath讑֮Q?classpath与\径名UC间有I格?br />
  W二?classpath讑֮Q?classpath与\径名UC间没有空根{?

  执行模拟器ƈ套用i1000手机外观

java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator

-classpath.;d:\MotoSDK\lib
-deviceFile resources\Motorolai1000.props
javax.microedition.midlet.AppManager

HelloMIDlet
-JSA 1 1
h?
 W一?classpath讑֮Q?classpath与\径名UC间有I格?br /> W二?classpath讑֮Q?classpath与\径名UC间没有空根{?

  执行模拟器ƈ套用iDEN手机外观

java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator

-classpath.;d:\MotoSDK\lib
-deviceFile resources\MotorolaiDENPlatform.props
javax.microedition.midlet.AppManager

HelloMIDlet
-JSA 1 1
h?
 W一?classpath讑֮Q?classpath与\径名UC间有I格?br /> W二?classpath讑֮Q?classpath与\径名UC间没有空根{?

  执行模拟器ƈ套用StarTac手机外观

java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator

-classpath.;d:\MotoSDK\lib
-deviceFile resources\StarTac.props
javax.microedition.midlet.AppManager

HelloMIDlet
-JSA 1 1
h?
 W一?classpath讑֮Q?classpath与\径名UC间有I格?br /> W二?classpath讑֮Q?classpath与\径名UC间没有空根{?

  执行模拟器ƈ套用用户自订手机外观

java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator

-classpath.;d:\MotoSDK\lib
-deviceFile <您的props文g所在的l对路径>javax.microedition.midlet.AppManager

HelloMIDlet
-JSA 1 1
h?
 W一?classpath讑֮Q?classpath与\径名UC间有I格?br /> W二?classpath讑֮Q?classpath与\径名UC间没有空根{?br /> 如果您将您的props文g攑֜d:\MotoSDK\bin的resources目录之下Q则上述指o只要ҎQ?deviceFile resources\<您的props文g?gt;

  注意Q当您您直接使用上述指o启动模拟器,如果出现底下错误信息:

  Error loading property file: resources/defaultdevice.props (pȝ找不到指定的路径?
q是因ؓ您没有将d:\MotoSDK\bin目录下的resources子目录复制到d:\JDK1.3.0_01\my目录之下的缘故?br />
  对MIDletq行调试

  ~写PalmOS上的SpotletӞ我们可以利用System.out.println()函式帮我们印Z些讯息以帮助调试Q那q在手机上的MIDlet? 原则上,我们q是可以利用System.out.println()函式做一些输出。当模拟器执行时Q就会在命o列上输出一些讯息?br />
  另外Q在PalmOS上,有KVMutil.prc可以帮助我们U录E序所输出的讯息。那手机上呢? 因ؓ没有实际的机器可以测试,因此q个问题到现在还不得而知Q相信Motorola到时候会有完善的解决Ҏ?
在Motorola J2ME SDK内附的说明文件之中,概略地提C调试的问题,里头提到Q往后如果我们要q行Z调试(on-device debugging)的话Q必要满几个条g:

  机器本n要具备调试相兛_能,q与KDWP(Kvm Debug Wire Protocol)兼容。因试时Q调试工具需要利用KDWP和机器上交谈以取得调试信息?

  刉厂商本w要提供下蝲MIDlet到手Z以进行调试的Ҏ?

  提供对MIDlet调试的工P必须支持手机在利用KDWP调试时所使用的传输接?例如串行口或UDP)?
嗯,看v来能够进行调试,MIDletE序的编写应该是很方便的事情了?br />
  Motorola J2ME SDK对中文的支持

  怿看过RUN!PC 11月号的文章「利用Java ~写PalmOS应用E序基础」的读者,在编写PalmOS上的Spotlet时一定会遇到中文无法正常昄的问题。中文的问题分成两个部分Q一个是在用h口上的中文问题,一个是在命令列输出(利用System.out.println()函式所做的输出)上的中文问题Q请大家做个实验,前面我们所~写的程序改如下:

HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class HelloMIDlet extends MIDlet
{
private Display firstDisplay ;
private Form firstForm ;
HelloMIDlet()
{
firstDisplay = Display.getDisplay(this) ;
firstForm = new Form("哈罗!MIDlet") ;
StringItem firstStrItem = new StringItem("哈罗","c_d列特") ;
firstForm.append(firstStrItem) ;
System.out.println("MIDlet启动") ;
}

protected void startApp() throws MIDletStateChangeException
{
firstDisplay.setCurrent(firstForm) ;
}

protected void pauseApp()
{
}

protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}

  本MIDlet~译q经q预w审怹后,我们开启模拟器来执行此MIDletQ底下ؓ执行l果:
  
用户接口输出:命o列输?
我们从结果发玎ͼ预设的编译指令会让用h口正常输Z文,而命令列无法输出正确的中文?
  
  接着请将compileAll.bat之中原本的指?br />
javac -O -bootclasspath ..\..\lib %COMPILECLASS%

  修改?br />
javac –encoding ISO8859_1 -O -bootclasspath ..\..\lib %COMPILECLASS%

  之后Q重新编译此MIDlet执行l果:

用户接口输出: 命o列输?
我们从结果发玎ͼ预设的编译指令会让用h口无法正常输Z文,而命令列却可以输出正的中文?/td>

  q个l果与PalmOS上所做的中文试l果有所不同?br />
  当您~写SpotletӞ如果您用javac 。。。指令时Q您会发现模拟器上的用户接口输出是ؕ码,可是命o列上的输出却可以正常输出中文。但是如果您使用的是javac -encoding ISO8859_1 。。。指令,则CLDC内附模拟器上的用h口输出或是命令列上的输出全部都变成ؕ码,无法正常输出中文(q个部分是因为CLDC内附模拟器实做的问题Q造成与实际机器的l果有差??br />
  MQ如果之前您所~写的Spotlet无法在装有中文系l的实际机器或POSE上正常输Z文,h也如法炮Ӟ在编译指令中加入-encoding ISO8859_1Q就可以在实际机器或POSE上看到正常的中文字了?br />
  会生此问题的主因,主要是因为编译好的JavacL?byte code)之中Q所有的文字~码都采用UTF8。D例来_当您在程序码里用?启动"q两个中文字Ӟ

   "?q个字的Big5~码为B1D2?br />
   "?q个字的Big5~码为B0CA?br />
  我们会用javac xxxx.java来编译原始码以生类文g。其实这行指令,在繁体中文的Windows环境底下Q相当于javac -encoding "Big5" xxxx.java。也是_当编译器d到Big5~码范围的中文字Ӟ会自动将此Big5码经q「Big5؈ Unicode 对照表」将Big5转ؓUnicodeQ也是?l过查表之后Q?br />
   “v”这个字的Unicode~码?55F?br />
   “动”这个字的Unicode~码?272?br />
  然后再利用UTF8~码此Unicode转ؓUTF8Q储存在cL件之中,因此Q如果您用UltraEdit之类的文字编辑器查看cL件时Q您会看刎ͼ

   "?q个字的UTF8~码为E5959F?br />
   "?q个字的UTF8~码为E58B95?br />
  接着Q当我们在程序执行时如果要将中文输出Q则JVM会负责读qUTF8码,然后其转回UnicodeQ最后依据您所使用的系l环境预讄~码转回Big5Q再输出臛_q上?br />
  可是l过试l果QKVMg只有做到把UTF8读进来,转换回Unicode之后q接输Z。少了{回Big5的步骤,因此Q操作系l把Unicode当作Big5来处理,自然找不到该码所对应的中文字了,也因此输出的是一?????? 的符受这也是我们在PalmOS上即使装了中文系l,也无法正常显CZ文的~故?br />
  OKQ既然知道KVM只帮我们做了一半的工作Q那事情好办了Q我们只要让UTF8转回之后Q仍然保有Big5的编码方式即可,于是我们使用指ojavac -encoding ISO8859_1 xxxx.javaQ请~译器不要将E序码中中文Big5~码的两个byte视ؓ一?因ؓ视ؓ一体就会引发查询Big5 ؈ Unicode对照表的工作)Q只要将中文当作是普通的西欧字母字集卛_Q因此,当我们用了上述指oQ您会发现类文g之中的中文变成,

   "?q个字的UTF8~码为C2B1 C392?br />
   "?q个字的UTF8~码为C2B0 C38A?br />
  大家可以发现~译器把B1、D2、B0、CA个别当作一个码来处理。于是,当KVMd此编码时Q就会将他们转回B1D2以及B0CAQ然后KVM直接输出Q就可以正常C用中文了?br />
  最后ȝ整个问题Q就W者的推断QCLDC内附的模拟器再没有用javac –encoding ISO8859_1 xxxx.java指o之前Q会在用h口命o列输Zؕ码,q才是正常的l果Q?而Motorola J2ME SDK内附模拟器的用户接口中文之所以没问题Q很可能只是因ؓ模拟器操作的差异。因此根据KVM的输出结果来看,很可能在实际的手ZQ我们都必须加上-encoding ISO8859_1选项才能正确输出中文?

  在此特别感谢静宜大学资管pȝ唐恺?kailung.tang@msa.hinet.net)同学。因为笔者于他经q热烈的讨论之后Q我们才能对J2ME的中文问题有更深入的认识

  支持Motorola J2ME SDK的开发工?

  在编写本文的时候,支持MIDlet开发的集成开发环?IDE)只有Motorola J2ME SDK附带文g之中所提到的CodeWarrior而已。相信其它厂商,如BorlandQ应该也会很快地利用其品JBuilder的OpenTools API来支持MIDlet的开发才对,更何况Borland JBuilder目前已经有Spotlet的解x案了?br />
  因ؓW者无法拿到CodeWarrior作测试,所以无法在此提供大家相关信息,怿如果有机会的话,会另外以专文向大家介l如何利用CodeWarrior~写MIDlet?br />
  Motorola J2ME SDK附带文g在附录的部分有对利用CodeWarrior开发MIDlet做简单的介绍Q相信对初学者来_已经相当_了?br />
  Motorola J2ME SDK内含的辅助开发工?/b>

  在Motorola J2ME SDK之中内含三项辅助开发工P可以便利我们的程序开发工作,它们分别?

  J2ME模拟?J2ME Emulator)

  让您可以在您的PC上模拟Motorola来会支持J2ME的手|。如此一来就可以在PC上直接测试写好的E序?

  Bytecode验证?Bytecode Verifier)

  此验证器用来验证cL?classfile)之中的bytecode不会对存储器做非法的存取。ƈ认载入虚拟机器的类文g所做的所有动作皆W合Java虚拟机器规格(Java Virtual Machine Specification)?

  配置~辑?Configuration Editor)

  让您能够建立或修改device profile?

  在Motorola J2ME SDK内附的文件之中对q三个工h详细的说明,W者在此就不再赘述了?br />

  附录:范例E序

  Motorola J2ME SDK之中内附许多有趣的范例,它们位于demo/midlets/目录底下。有兴趣l箋_进的读者可以由q些范例学到更多有关MIDlet的深入技巧,׃q些范例的执行画面过大,所以在本文之中将他们省略Q请读者们自行参考说明文件?br />
  q些范例E序?

Bounce
com.mot.j2me.midlets.bounce.Bounce
PaddleBall
com.mot.j2me.midlets.paddleball.PaddleBall
Scribble
com.mot.j2me.midlets.scribble.Scribble
FontDemo
com.mot.j2me.midlets.tutorials.FontDemo
GraphicsDemo
com.mot.j2me.midlets.tutorials.GraphicsDemo
RecordStoreDemo
com.mot.j2me.midlets.tutorials.RecordStoreDemo
UDP Tutorial Application
com.mot.j2me.midlets.tutorials.UDPReceive
AlertTest
com.mot.j2me.midlets.tests.AlertTest
ChoiceGroupTest
com.mot.j2me.midlets.tests.ChoiceGroupTest
DateFieldTest
com.mot.j2me.midlets.tests.DateFieldTest
FormTest
com.mot.j2me.midlets.tests.FormTest
GaugeTest
com.mot.j2me.midlets.tests.GaugeTest
KeyEventsTest
com.mot.j2me.midlets.tests.KeyEventsTest
TextBoxTest
com.mot.j2me.midlets.tests.TextBoxTest
TextFieldTest
com.mot.j2me.midlets.tests.TextFieldTest
TickerTest
com.mot.j2me.midlets.tests.TickerTest

  |络资源

  ◎网?br />
  Motorola官方|站 http://www.motorola.com/java/

  Metrowerks(CodeWarrior) http://www.Metrowerks.com

SIMONE 2007-02-01 11:32 发表评论
]]>
几个不错的电子图书下载网?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2006/11/08/79841.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Wed, 08 Nov 2006 06:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2006/11/08/79841.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/79841.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2006/11/08/79841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/79841.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/79841.html</trackback:ping><description><![CDATA[ <a >http://www.ibook8.com</a> <br /> <br /> <a >http://soft.cnpoint.com/</a> <br /> <br /> <a >http://book.devworld.cn</a> <br /> <br /> <a >http://www.ddup.com.cn/</a> <br /> <br /> <p>国内真正免费的书c下载网站:<br />Q其中包含优UIT站点Q?br />好东西大家分?!!</p> <p> <a > <font color="#666666">http://www.vvsoft.net/vvbksd/index.asp</font> </a> </p> <p> <a > <font color="#666666">http://download.chinaitlab.com/sort/2_1.htm</font> </a> </p> <p> <a > <font color="#666666">http://book.httpcn.com/</font> </a> </p> <p> <a > <font color="#666666">http://www.chinesebook.com.cn/bjbookfair/index.asp</font> </a> </p> <p> <a > <font color="#666666">http://www.eshunet.com/</font> </a> </p> <p> <a > <font color="#666666">http://www.manyi100.com/</font> </a> </p> <p> <a > <font color="#666666">http://www.52ebook.com/</font> </a> </p> <p> <a > <font color="#666666">http://www.pcbookcn.com/</font> </a> </p> <p> <a > <font color="#666666">http://www.itebook.net/download.asp</font> </a> </p> <p> <a > <font color="#666666">http://www.ebookcn.net</font> </a> </p> <p> <a > <font color="#666666">http://www.chinaz.com/DownLoad/L/8_Lastuptime_Desc_1.asp</font> </a> </p> <p> <a > <font color="#666666">http://soft.winzheng.com/SoftList/Catalog_11_SoftTime_Desc_1.htm</font> </a> </p> <p> <a > <font color="#666666">http://www.gd00.com/SoftList/Catalog_7_SoftTime_Desc_1.html</font> </a> </p> <p> <a > <font color="#666666">http://soft.0zones.com/SoftList/Catalog_10_SoftTime_Desc_1.html</font> </a> <br /> <br /> <br />非常好的C++教程|站<br /><a >http://www.longtengwang.com/Soft/yiyong/VC/Index.html</a></p> <img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/79841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2006-11-08 14:09 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2006/11/08/79841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个较好的数据库分页q程 http://www.aygfsteel.com/wangxinsh55/archive/2006/05/26/48279.htmlSIMONESIMONEFri, 26 May 2006 03:02:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2006/05/26/48279.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/48279.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2006/05/26/48279.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/48279.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/48279.html一 oracle
CREATE OR REPLACE PROCEDURE page(
    p_num integer,
    p_size integer,
    condition clob,
    table_name varchar,
    p_rowset out sys_refcursor)
AS
BEGIN
OPEN p_rowset FOR
    'SELECT *
        FROM (
            SELECT ROWNUM r, t1.*
                FROM (
                    SELECT '|| table_name || '.* FROM '|| table_name || ' ' 
                      || condition || 'ORDER BY happentime desc) t1
               WHERE ROWNUM <= ' || p_size*p_num || ' ) t2
        WHERE t2.r > ' || p_size*(p_num-1);
END PAGE;

二 mssql
CREATE PROCEDURE page
    @p_num int,
    @p_size int,
    @condition text,
    @table_name nvarchar(100),
    @current_page_size int
AS
if @p_num = 1
   execute('SELECT TOP '+ @p_size +' * FROM '+ @table_name + ' '+ @condition +' ORDER BY happentime DESC')
else
   if @current_page_size != @p_size
      execute('SELECT * FROM(
                    SELECT TOP '+ @current_page_size +' * FROM '+ @table_name + ' '+ @condition +' ORDER BY happentime
              ) as t ORDER BY happentime DESC')
   else
      begin
      declare @tmp int
      set @tmp = @p_size * @p_num
      execute('SELECT * FROM(
                    SELECT TOP '+ @p_size +' * FROM(
                         SELECT TOP '+ @tmp +' * FROM '+ @table_name + ' '+ @condition +' ORDER BY happentime DESC
                    ) AS t1 ORDER BY happentime
              ) as t2 ORDER BY happentime DESC')
      end
GO

三 sybase
CREATE PROCEDURE page
    @p_num int,
    @p_size int,
    @condition  nvarchar(3000),
    @table_name nvarchar(100),
    @current_p_size int
AS
DECLARE @str_p_size varchar(20),
        @str_tmp varchar(20),
        @str_current_p_size varchar(20),
     @i_rowcount int 
begin
 select @str_tmp=cast(@p_size * @p_num as varchar(20))
 select @str_p_size=cast(@p_size as varchar(20))
 select @str_current_p_size=cast(@current_p_size as varchar(20))
 
 if @p_num = 1
  begin
   set @i_rowcount=@p_size*@p_num
   set rowcount @i_rowcount
   execute('SELECT  * FROM '+ @table_name + ' '+ @condition +' ORDER BY happentime DESC')
  end
 else
  if @current_p_size != @p_size
   begin
    set rowcount @current_p_size
    execute('SELECT  * INTO #temp FROM '+ @table_name + ' '+ @condition +' ORDER BY happentime 
             SELECT * FROM #temp ORDER BY happentime DESC')
   end
  else
   begin
    set @i_rowcount=@p_size*@p_num
    set rowcount @i_rowcount
    execute('SELECT  * INTO #temp1 FROM '+ @table_name + ' ' + @condition +' ORDER BY happentime DESC
       SELECT TOP '+ @str_p_size + ' * INTO #temp2 FROM #temp1 ORDER BY happentime
       SELECT * FROM #temp2 ORDER BY happentime DESC')
   end
end

SIMONE 2006-05-26 11:02 发表评论
]]>
HTTP协议基础http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38293.htmlSIMONESIMONEThu, 30 Mar 2006 09:39:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38293.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/38293.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38293.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/38293.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/38293.htmlHTTPQHyperTextTransferProtocolQ是文本传输协议的~写Q它用于传送WWW方式的数据,关于HTTP协议的详l内容请参考RFC2616。HTTP协议采用了请?响应模型。客L向服务器发送一个请求,h头包含请求的Ҏ、URI、协议版本、以及包含请求修饰符、客户信息和内容的类gMIME的消息结构。服务器以一个状态行作ؓ响应Q相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内宏V?/p>

通常HTTP消息包括客户机向服务器的h消息和服务器向客h的响应消息。这两种cd的消息由一个v始行Q一个或者多个头域,一个只是头域结束的I和可选的消息体组成。HTTP的头域包括通用_h_响应头和实体头四个部分。每个头域由一个域名,冒号Q?Q和域g部分l成。域名是大小写无关的Q域值前可以dM数量的空格符Q头域可以被扩展为多行,在每行开始处Q用至一个空格或制表W?/p>

通用头域

通用头域包含h和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展Q如果存在不支持的通用头域Q一般将会作为实体头域处理。下面简单介l几个在UPnP消息中用的通用头域?/p>

Cache-Control头域

Cache-Control指定h和响应遵循的~存机制。在h消息或响应消息中讄Cache-Controlq不会修改另一个消息处理过E中的缓存处理过E。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cachedQ响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

Public指示响应可被M~存区缓存?br />Private指示对于单个用户的整个或部分响应消息Q不能被׃n~存处理。这允许服务器仅仅描q当用户的部分响应消息,此响应消息对于其他用Lh无效?br />no-cache指示h或响应消息不能缓?br />no-store用于防止重要的信息被无意的发布。在h消息中发送将使得h和响应消息都不用缓存?br />max-age指示客户机可以接收生存期不大于指定时_以秒为单位)的响应?br />min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应?br />max-stale指示客户机可以接收超时期间的响应消息。如果指定max-stale消息的|那么客户机可以接收超时期指定g内的响应消息?/p>

Date头域

Date头域表示消息发送的旉Q时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表CZ界标准时Q换成本地旉Q需要知道用h在的时区?/p>

Pragma头域

Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同?/p>

h消息

h消息的第一行ؓ下面的格式:
MethodSPRequest-URISPHTTP-VersionCRLFMethod表示对于Request-URI完成的方法,q个字段是大写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GETҎ取回由Request-URI标识的信息。HEADҎ也是取回由Request-URI标识的信息,只是可以在响应时Q不q回消息体。POSTҎ可以h服务器接收包含在h中的实体信息Q可以用于提交表单,向新ȝ、BBS、邮件群l和数据库发送消息?/p>

SP表示I格。Request-URI遵@URI格式Q在此字Dؓ星号Q?Q时Q说明请求ƈ不用于某个特定的资源地址Q而是用于服务器本w。HTTP-Version表示支持的HTTP版本Q例如ؓHTTP/1.1。CRLF表示换行回RW。请求头域允许客L向服务器传递关于请求或者关于客h的附加信息。请求头域可能包含下列字DAccept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对h头域的扩展要求通讯双方都支持,如果存在不支持的h头域Q一般将会作为实体头域处理?/p>

典型的请求消息:


GEThttp://class/download.microtool.de:80/somedata.exe
Host:download.microtool.de
Accept:*/*
Pragma:no-cache
Cache-Control:no-cache
Referer:http://class/download.microtool.de/
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-

上例W一行表CHTTP客户端(可能是浏览器、下载程序)通过GETҎ获得指定URL下的文g。棕色的部分表示h头域的信息,l色的部分表C通用头部分?/p>

Host头域

Host头域指定h资源的IntenetL和端口号Q必表C求url的原始服务器或网关的位置。HTTP/1.1h必须包含L头域Q否则系l会?00状态码q回?/p>

Referer头域

Referer头域允许客户端指定请求uri的源资源地址Q这可以允许服务器生成回退链表Q可用来登陆、优化cache{。他也允许废除的或错误的q接׃l护的目的被q踪。如果请求的uri没有自己的uri地址QReferer不能被发送。如果指定的是部分uri地址Q则此地址应该是一个相对地址?/p>

Range头域

Range头域可以h实体的一个或者多个子范围。例如,

表示?00个字节:bytes=0-499
表示W二?00字节Qbytes=500-999
表示最?00个字节:bytes=-500
表示500字节以后的范_bytes=500-
W一个和最后一个字节:bytes=0-0,-1
同时指定几个范围Qbytes=500-600,601-999

但是服务器可以忽略此h_如果无条件GET包含Rangeh_响应会以状态码206QPartialContentQ返回而不是以200QOKQ?/p>

User-Agent头域

User-Agent头域的内容包含发求的用户信息?/p>

响应消息

响应消息的第一行ؓ下面的格式:

HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF
HTTP-Version表示支持的HTTP版本Q例如ؓHTTP/1.1。Status-Code是一个三个数字的l果代码。Reason-PhraselStatus-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别QReason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的cdQ后两个数字没有分类的作用。第一个数字可能取5个不同的|

1xx:信息响应c,表示接收到请求ƈ且l处?br />2xx:处理成功响应c,表示动作被成功接收、理解和接受
3xx:重定向响应类Qؓ了完成指定的动作Q必L受进一步处?br />4xx:客户端错误,客户h包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正执行一个正的h

响应头域允许服务器传递不能放在状态行的附加信息,q些域主要描q服务器的信息和Request-URIq一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域Q一般将会作为实体头域处理?/p>

典型的响应消息:


HTTP/1.0200OK
Date:Mon,31Dec200104:25:57GMT
Server:Apache/1.3.14(Unix)
Content-type:text/html
Last-modified:Tue,17Apr200106:46:28GMT
Etag:"a030f020ac7c01:1e9f"
Content-length:39725426
Content-range:bytes554554-40279979/40279980
上例W一行表CHTTP服务端响应一个GETҎ。棕色的部分表示响应头域的信息,l色的部分表C通用头部分,U色的部分表C实体头域的信息?/p>

Location响应?/p>

Location响应头用于重定向接收者到一个新URI地址?/p>

Server响应?/p>

Server响应头包含处理请求的原始服务器的软g信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序?/p>

实体

h消息和响应消息都可以包含实体信息Q实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头Q但是这些域可能无法未接受方识别。实体可以是一个经q编码的字节,它的~码方式由Content-Encoding或Content-Type定义Q它的长度由Content-Length或Content-Range定义?/p>

Content-Type实体?/p>

Content-Type实体头用于向接收ҎC实体的介质cdQ指定HEADҎ送到接收方的实体介质cdQ或GETҎ发送的h介质cdContent-Range实体?/p>

Content-Range实体头用于指定整个实体中的一部分的插入位|,他也指示了整个实体的长度。在服务器向客户q回一个部分响应,它必Lq响应覆盖的范围和整个实体长度。一般格式:

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
例如Q传送头500个字节次字段的Ş式:Content-Range:bytes0-499/1234如果一个http消息包含此节Q例如,对范围请求的响应或对一pd范围的重叠请求)QContent-Range表示传送的范围QContent-Length表示实际传送的字节数?/p>

Last-modified实体?/p>

Last-modified实体头指定服务器上保存内容的最后修订时间?/p>

 



SIMONE 2006-03-30 17:39 发表评论
]]>
HTTP 1.1支持的状态代?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38258.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 30 Mar 2006 07:00:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38258.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/38258.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/38258.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/38258.html</trackback:ping><description><![CDATA[100 Continue 初始的请求已l接受,客户应当l箋发送请求的其余部分<br />101 Switching Protocols 服务器将遵从客户的请求{换到另外一U协?br />200 OK 一切正常,对GET和POSTh的应{文档跟在后面?br />201 Created 服务器已l创Z文档QLocation头给Z它的URL。?br />202 Accepted 已经接受hQ但处理未完成。?br />203 Non-Authoritative Information 文档已经正常地返回,但一些应{头可能不正,因ؓ使用的是文档的拷贝?br />204 No Content 没有新文档,览器应该l显C原来的文档。如果用户定期地h面Q而Servlet可以定用户文档_斎ͼq个状态代码是很有用的<br />205 Reset Content 没有新的内容Q但览器应该重|它所昄的内宏V用来强制浏览器清除表单输入内容<br />206 Partial Content 客户发送了一个带有Range头的GEThQ服务器完成了它<br />300 Multiple Choices 客户h的文档可以在多个位置扑ֈQ这些位|已l在q回的文档内列出。如果服务器要提Z先选择Q则应该在Location应答头指明。?br />301 Moved Permanently 客户h的文档在其他地方Q新的URL在Location头中l出Q浏览器应该自动地访问新的URL。?br />302 Found cM?01Q但新的URL应该被视Z时性的替代Q而不是永久性的。?br />303 See Other cM?01/302Q不同之处在于,如果原来的请求是POSTQLocation头指定的重定向目标文档应该通过GET提取<br />304 Not Modified 客户端有~冲的文档ƈ发出了一个条件性的hQ一般是提供If-Modified-Since头表C客户只x指定日期更新的文档)。服务器告诉客户Q原来缓冲的文档q可以l用。?br />305 Use Proxy 客户h的文档应该通过Location头所指明的代理服务器提取<br />307 Temporary Redirect ?02QFoundQ相同。许多浏览器会错误地响应302应答q行重定向,即原来的请求是POSTQ即使它实际上只能在POSTh的应{是303时才能重定向。由于这个原因,HTTP 1.1新增?07Q以便更加清除地区分几个状态代码:当出?03应答Ӟ览器可以跟随重定向的GET和POSThQ如果是307应答Q则览器只能跟随对GETh的重定向。?br />400 Bad Request h出现语法错误。?br />401 Unauthorized 客户试图未经授权讉K受密码保护的面。应{中会包含一个WWW-Authenticate_览器据此显C用户名?密码对话框,然后在填写合适的Authorization头后再次发出h。?br />403 Forbidden 资源不可用?br />404 Not Found 无法扑ֈ指定位置的资?br />405 Method Not Allowed hҎQGET、POST、HEAD、DELETE、PUT、TRACE{)Ҏ定的资源不适用?br />406 Not Acceptable 指定的资源已l找刎ͼ但它的MIMEcd和客户在Accpet头中所指定的不兼容<br />407 Proxy Authentication Required cM?01Q表C客户必dl过代理服务器的授权?br />408 Request Timeout 在服务器许可的等待时间内Q客户一直没有发ZQ何请求。客户可以在以后重复同一h。?br />409 Conflict 通常和PUTh有关。由于请求和资源的当前状态相冲突Q因此请求不能成功?br />410 Gone 所h的文档已l不再可用,而且服务器不知道应该重定向到哪一个地址。它?04的不同在于,q回407表示文档怹地离开了指定的位置Q?04表示׃未知的原因文档不可用。?br />411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。?br />412 Precondition Failed h头中指定的一些前提条件失?br />413 Request Entity Too Large 目标文档的大超q服务器当前愿意处理的大。如果服务器认ؓ自己能够E后再处理该hQ则应该提供一个Retry-After夾b?br />414 Request URI Too Long URI太长 <br />416 Requested Range Not Satisfiable 服务器不能满_户在h中指定的Range?br />500 Internal Server Error 服务器遇C意料不到的情况,不能完成客户的请?br />501 Not Implemented 服务器不支持实现h所需要的功能。例如,客户发出了一个服务器不支持的PUTh <br />502 Bad Gateway 服务器作为网x者代理时Qؓ了完成请求访问下一个服务器Q但该服务器q回了非法的应答 <br />503 Service Unavailable 服务器由于维护或者负载过重未能应{。例如,Servlet可能在数据库q接池已满的情况下返?03。服务器q回503时可以提供一个Retry-After夾b?br />504 Gateway Timeout ׃Z理或|关的服务器使用Q表CZ能及时地从远E服务器获得应答 <br />505 HTTP Version Not Supported 服务器不支持h中所指明的HTTP版本<br /><img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/38258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2006-03-30 15:00 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用正则表达?/title><link>http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38231.html</link><dc:creator>SIMONE</dc:creator><author>SIMONE</author><pubDate>Thu, 30 Mar 2006 04:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38231.html</guid><wfw:comment>http://www.aygfsteel.com/wangxinsh55/comments/38231.html</wfw:comment><comments>http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wangxinsh55/comments/commentRss/38231.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wangxinsh55/services/trackbacks/38231.html</trackback:ping><description><![CDATA[ <span style="COLOR: #000000">"^\\d+$"  //非负整数Q正整数 + 0Q?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^[0-9]*[1-9][0-9]*$"  //正整敊W?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^((-\\d+)|(0+))$"  //非正整数Q负整数 + 0Q?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^-[0-9]*[1-9][0-9]*$"  //负整敊W?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^-?\\d+$"    //整数 <br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^\\d+(\\.\\d+)?$"  //非负点敎ͼ正QҎ + 0Q?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正QҎ <br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正点敎ͼ负QҎ + 0Q?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负QҎ <br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^(-?\\d+)(\\.\\d+)?$"  //点敊W?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^[A-Za-z]+$"  //?6个英文字母组成的字符串?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^[A-Z]+$"  //?6个英文字母的大写l成的字W串 <br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^[a-z]+$"  //?6个英文字母的写l成的字W串 <br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串?br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^\\w+$"  //由数字?6个英文字母或者下划线l成的字W串 <br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址 <br /><img src="http://josson.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />"^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //url</span> <br /> <br /> <br /> <p>匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]<br />评注Q匹配中文还真是个头疼的事,有了q个表达式就好办?/p> <p>匚w双字节字W?包括汉字在内)Q[^\x00-\xff]<br />评注Q可以用来计字W串的长度(一个双字节字符长度?QASCII字符?Q?/p> <p>匚wI白行的正则表达式:\n\s*\r<br />评注Q可以用来删除空白行</p> <p>匚wHTML标记的正则表辑ּQ?lt; (\S*?)[^>]*>.*?|< .*? /><br />评注Q网上流传的版本太糟p,上面q个也仅仅能匚w部分Q对于复杂的嵌套标记依旧无能为力</p> <p>匚w首尾I白字符的正则表辑ּQ^\s*|\s*$<br />评注Q可以用来删除行首行I白字符(包括I格、制表符、换늬{等)Q非常有用的表达?/p> <p>匚wEmail地址的正则表辑ּQ\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />评注Q表单验证时很实?/p> <p>匚w|址URL的正则表辑ּQ[a-zA-z]+://[^\s]*<br />评注Q网上流传的版本功能很有限,上面q个基本可以满需?/p> <p>匚w帐号是否合法(字母开_允许5-16字节Q允许字母数字下划线)Q^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />评注Q表单验证时很实?/p> <p>匚w国内电话LQ\d{3}-\d{8}|\d{4}-\d{7}<br />评注Q匹配Ş式如 0511-4405222 ?021-87888822</p> <p>匚w腾讯QQP[1-9][0-9]{4,}<br />评注Q腾讯QQ号从10000开?/p> <p>匚w中国邮政~码Q[1-9]\d{5}(?!\d)<br />评注Q中国邮政编码ؓ6位数?/p> <p>匚ww䆾证:\d{15}|\d{18}<br />评注Q中国的w䆾证ؓ15位或18?/p> <p>匚wip地址Q\d+\.\d+\.\d+\.\d+<br />评注Q提取ip地址时有?/p> <p>匚w特定数字Q?br />^[1-9]\d*$    //匚w正整?br />^-[1-9]\d*$   //匚w负整?br />^-?[1-9]\d*$   //匚w整数<br />^[1-9]\d*|0$  //匚w非负整数Q正整数 + 0Q?br />^-[1-9]\d*|0$   //匚w非正整数Q负整数 + 0Q?br />^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匚w正QҎ<br />^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匚w负QҎ<br />^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匚w点?br />^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匚w非负点敎ͼ正QҎ + 0Q?br />^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匚w非正点敎ͼ负QҎ + 0Q?br />评注Q处理大量数据时有用Q具体应用时注意修正</p> <p>匚w特定字符Ԍ<br />^[A-Za-z]+$  //匚w?6个英文字母组成的字符?br />^[A-Z]+$  //匚w?6个英文字母的大写l成的字W串<br />^[a-z]+$  //匚w?6个英文字母的写l成的字W串<br />^[A-Za-z0-9]+$  //匚w由数字和26个英文字母组成的字符?br />^\w+$  //匚w由数字?6个英文字母或者下划线l成的字W串<br />评注Q最基本也是最常用的一些表辑ּ</p> <img src ="http://www.aygfsteel.com/wangxinsh55/aggbug/38231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wangxinsh55/" target="_blank">SIMONE</a> 2006-03-30 12:52 <a href="http://www.aygfsteel.com/wangxinsh55/archive/2006/03/30/38231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ǭ</a>| <a href="http://" target="_blank">γ</a>| <a href="http://" target="_blank">¬</a>| <a href="http://" target="_blank">ϲ</a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">綫</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ǿ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ĵʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ѿ</a>| <a href="http://" target="_blank">ޭ</a>| <a href="http://" target="_blank">կ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֶ</a>| <a href="http://" target="_blank">Ī</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͺ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϴ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">޽</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></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>