??xml version="1.0" encoding="utf-8" standalone="yes"?>
我们不禁问自己,Z么会(x)有那么多p|的YӞ软g开发我们到底还需要什么?
工具Q我们不乏伟大的工具QIDE我们有eclipse、intelliJ、VC++{等Q徏模我们有Rose、together、Visio{等Q配|管理我们Subversion、CVS、ClearCase{等Qbug理我们有ClearQuest、bugzilla{等Q文我们word、wps{,q有集成、测试甚至生成代码等{我们都有伟大的工具Q工h们不~。流E?瀑布模型、P代模型、UP、XP我们不缺程理的理论。知识?软g开发算是一知识型的工作,我们的开发h员一般都是本U硕士毕业,况且搜烦(ch)引擎如此发达的今天,知识Ҏ(gu)不是问题Q况且我们的软g开发需要多么高q知识?
优秀的理论支持、有能力的h员、先q的工具Q这些我们都具备Q我们所~的只是一UY件开发的理念Q缺Y件开发的情商。我们一开始学?fn)编E知识接触到的就是C语言和数据结构,慢慢的一些结构化的思想扎根于大脑Q其实在商业软g中数据结构、算法很涉?qing),我们所需要的仅仅是一U设计、开发的理念。比如用面向对象本来是一U简单的思想Q目的是Z降低软g的复杂性而出现的Q可是让熟?zhn)了结构化~程的hL反而觉得很难。一些好的实늻验我们也l常提到Q比如模块化、松散耦合、面向接口编E、类应只x本职工作{等开发设计理念以?qing)规范命名、详用的注释、清晰的l构{代码规范以?qing)每日构建、有效沟通、配|管理、bug理{一些管理理念,q些做v来都非常Ҏ(gu)Q关键是懒惰是h的本性,不知不觉中我们就?x)犯着大家都在重复的错误。如果在目开工之初就充分贯彻q些优秀的理念,在项目进行中无论旉多紧都持之以恒,q且目q行中不断的反思代码中的坏味道Q一l发现立即重构,怿我们的开发过E会(x)q入一个良性的循环中去Q我们的开发h员将?x)体会(x)到什么是快乐开发?/font>
JDOM因其z易用易懂的API而被q泛的用。JDOM常用的核心类?qing)它们间的关pd下图所C:(x)
Document代表了文对象,抽象cContent表示文中的内容元素Q各U内容组成了文档对象。常用的内容元素有xml元素Element、xml注释Comment、文本Text。下面以如下片段来说明各cȝ含义?/font>
<?xml version="1.0" encoding="UTF-8"?>
<customers>
<customer>
<name>徐辛?lt;/name>
<occupation>developer</occupation>
<!-- comment:following is contact info -->
<contact>
<email>sinpo.xu@hotmail.com</email>
<mobile>15029357227</mobile>
<fix-phone>02985457683</fix-phone>
</contact>
</customer>
</customers>
上述文用Document来抽象;customers为文的根元素(root element Q,Element即一个封闭v来的元素Qelement元素可以有子元素Q如<mobile>15029357227</mobile>是一个元素,?lt;contact>...</contact>也是一个元素,甚至<customers>...</customers>也是一个大元素Q?lt;!-- ... -->代表了xml中注释,注释在JDOM中用CommentcL抽象QText代表了xml中的文本|如元素属性的倹{元素的倹{注释的内容{,父元素的Text为子元素和值组成的Ԍ使用Textcd以方便的表示一些特D字W?如:(x)
Element element = new Element("name");
Text text = new Text("AAA.<、BBB/>.<CCC>");
element.addContent(text);
值得一提的是Element的方法addContent(Content content),因参数是抽象父类ContentQ所以可以添加Text、Element和Comment{,如果d的是Text则自动作为element的文本|如果是Element则作为element的子元素Q如果是Comment则作为element的注释,使用十分方便。元素的值如<name>徐辛?lt;/name>中的“徐辛?#8221;也是一个和元素q的Content对象QText对象Q,当用Element的getDescendants()Ҏ(gu)时将q回一个该元素所有后代的q代器,q些后代包括Element、Comment、Text{,如元?lt;contact>的后代包括email、mobile、fix-phone三个元素以及(qing)q三个元素的Text?个后代,如果计算后代时有父子嵌套则应注意Q父元素作ؓ(f)一个后代,其嵌套的子元素作为另一个后代?/font>
刚才提到核心c都包含在org.jdom包下Qjdomq包含了org.jdom.input和org.jdom.output两个包分别来处理xml内容的输入输出。当要读取xml资源时我们通常使用input包下的SAXBuildercM输入构建dom对象Q当资源加蝲后常用的做法是在内存中缓存,q样后箋的查找修改等操作非常快。文加载后内存的中各个元素是记录有各自的位|和关系的,即保持有上下文环境的。如果想要删除一D内容(Element Comment TextQ,只用调用该内容的detachҎ(gu)卛_Q这样元素即和文档脱dpMQ再Ҏ(gu)进行遍历或者持久化到磁盘上时游ȝ元素׃可见了。Jdom的输出类包括XMLOutputter、DOMOutputter、SAXOutputter。最常用的是XMLOutputterQ通过它可以将dom对象输出到指定的输出,q且可以指定所输出xml文g的格式,比如~进的样式等。DOMOutputter输出org.w3c.dom.Document对象Q用于JDOM对象同w3c dom对象转换QSAXOutputter可以注册回调函数来处理相应的sax事g?/font>
package sinpo.usagedemo; |
关于{待和休眠还有另一个区别就是当U程{待Ӟ该线E锁定的资源是释放掉的,q时其它U程是可以锁定这些资源的Q当U程被唤醒或者等待时限到时线E重新获取资源才能l运行;而当U程休眠时线E锁定的资源是不被释攄?/font>
q有一点就是要在对象lock上等待时是必d要获取lock的对象锁才能q行的,卛_要cM下面的逻辑
synchronizedQlock){ lock.wait()}
以下Z个简单的CZQ?/font>
package
sinpo.usagedemo;
|
q几天需要实C个底层基于UDP的协议,该协议底层用UDP传输但是h拥塞控制、超旉发、数据确认等功能又比TCP?QRUDPQReliable UDPQ。在实现协议底层的UDP服务时准备用Java的NIOQ在|上查资料都是以TCPZ讲的Q于是自qI了一下基于UDP的NIO?/font>
NIO的思\是基于多路选择的,即由原来的每个连接都׃个线E来{待消息Q改为每个连接都在选择器上注册Q由选择器来{待。当然NIO引入了很多新的概念,如ChannelQBuffer、Charset、Selector{,使得~程更简z、更面向对象化?/font>
下面贴出用NIO API攚w成UDPCZ代码Q注意其中用Charset来编码解码的q程Q当然Charsetq支持很多其他编码不仅局限于默认~码Q以?qing)Buffer的用?/font>
package
sinpo.usagedemo;
|
package
sinpo.usagedemo;
|
package sinpo.usagedemo; |