﻿<?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-似水流年-文章分类-Java</title><link>http://www.blogjava.net/huhu/category/1640.html</link><description>Huhu'Blog</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 07:48:42 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 07:48:42 GMT</pubDate><ttl>60</ttl><item><title>log4j使用示例（转载）</title><link>http://www.blogjava.net/huhu/articles/39568.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Thu, 06 Apr 2006 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/39568.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/39568.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/39568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/39568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/39568.html</trackback:ping><description><![CDATA[
		<div class="overflow" id="text">log4j使用示例<br />--by blues(zhaochaohua@sina.com)<br />PART 1 介绍<br />log4j的好处在于：<br />1.通过修改配置文件，就可以决定log信息输出到何处(console,文件,...),是否输出。<br />这样，在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(...)等)。<br />2.使用log4j，需要整个系统有一个统一的log机制，有利于系统的规划。<br /><br />log4j的使用本身很简单。但合理地规划一个系统的统一log机制需要周全的考虑。<br /><br />其他关于log4j的信息参看log4j自带的文档。<br /><br />PART II 配置文件详细解释<br />先看一个配置文件的例子:<br />1.配置文件的例子<br /><pre class="overflow">log4j.rootLogger=DEBUG<br />#将DAO层log记录到DAOLog,allLog中<br />log4j.logger.DAO=DEBUG,A2,A4<br />#将逻辑层log记录到BusinessLog,allLog中<br />log4j.logger.Businesslog=DEBUG,A3,A4<br />#A1--打印到屏幕上<br />log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n<br />#A2--打印到文件DAOLog中--专门为DAO层服务<br />log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.A2.file=DAOLog<br />log4j.appender.A2.DatePattern='.'yyyy-MM-dd<br />log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<br /><br />#A3--打印到文件BusinessLog中--专门记录逻辑处理层服务log信息<br />log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.A3.file=BusinessLog<br />log4j.appender.A3.DatePattern='.'yyyy-MM-dd<br />log4j.appender.A3.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<br /><br />#A4--打印到文件alllog中--记录所有log信息<br />log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.A4.file=alllog<br />log4j.appender.A4.DatePattern='.'yyyy-MM-dd<br />log4j.appender.A4.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n</pre><br /><br />2.Appender的使用<br />一个Appender代表log信息要写向的一个地方。log4j可使用的Appender有很多类型,这里只考虑3种:ConsoleAppender,FileAppender,DailyRollFileAppender<br />2.1 ConsoleAppender<br />如果使用ConsoleAppender，那么log信息将写到Console。就是直接把信息打印到System.out上了。<br />2.2 FileAppender<br />使用FileAppender，那么log信息将写到指定的文件中。这应该是比较经常使用到的情况。<br />相应地，在配置文件中应该指定log输出的文件名。如下配置指定了log文件名为demo.txt<br />log4j.appender.A2.File=demo.txt<br />注意将A2替换为具体配置中Appender的别名。<br />2.3 DailyRollingAppender<br />使用FileAppender可以将log信息输出到文件中，但是如果文件太大了读起来就不方便了。这时就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息输出到按照日期来区分的文件中。如下配置文件就会每天产生一个log文件，每个log文件只记录当天的log信息：<br /><br /><pre class="overflow">log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.A2.file=demo<br />log4j.appender.A2.DatePattern='.'yyyy-MM-dd<br />log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A2.layout.ConversionPattern=%m%n</pre><br /><br />3.Layout的配置<br />Layout指定了log信息输出的样式。<br />详细信息请查看PatternLayout的javadoc。<br />例子1：显示日期和log信息<br /><pre class="overflow">log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n</pre>打印的信息是：<br />2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc<br /><br />例子2：显示日期，log发生地方和log信息<br /><pre class="overflow">log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n<br />2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409) "#" SELECT * FROM Role WHERE 1=1 order by createDate desc </pre><br /><br />例子3：显示log级别,时间,调用方法,log信息<br /><pre class="overflow">log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n<br />log信息:<br />[DEBUG] 2002-11-12 12:00:57,376 method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)<br />SELECT * FROM Role WHERE 1=1 order by createDate desc </pre><br /><br />PART 3 log4j的使用<br />log4j使用步骤有3个：<br />3.1.根据配置文件初始化log4j<br />配置文件如PART 2所叙述。现在讲的是如何在程序中配置log4j。<br />log4j可以使用3中配置器来初始化：BasicConfigurator,DOMConfigurator,PropertyConfigurator<br />这里用的是PropertyConfigurator。使用PropertyConfigurator适用于所有的系统。<br />如下的语句<br />PropertyConfigurator.configure("log4j.properties");<br />就以log4j.properties为配置文件初始化好了log4j环境。<br />注意一点：这个语句只需要在系统启动的时候执行一次。例如:在unet webOA项目中可以这么用:<br />在ActionServlet的init()方法中调用一次。<br /><pre class="overflow">public class ActionServlet extends HttpServlet{<br />...<br />/**<br />* Initialize global variables<br />*/<br />public void init() throws ServletException {<br />// 初始化Action资源<br />try{<br />initLog4j();<br />...<br />}catch(IOException e){<br />throw new ServletException("Load ActionRes is Error");<br />}<br />}<br />...<br />protected void initLog4j(){<br />PropertyConfigurator.configure("log4j.properties");<br />}<br />...<br />}//end class ActionServlet</pre><br />3.2 在需要使用log4j的地方获取Logger实例<br />如下是RoleDAO类中的使用例子:<br />static Logger log = Logger.getLogger("DAO");<br />注意这里使用"DAO"标识符，那么对应的在配置文件中对应的配置信息如下：<br /><br />#定义DAO Logger<br />log4j.logger.DAO=DEBUG,A2<br />#设置Appender A2的属性<br /><pre class="overflow">log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.A2.file=demo<br />log4j.appender.A2.DatePattern='.'yyyy-MM-dd<br />log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n<br /><br />public class RoleDAO extends BaseDBObject<br />{<br />...<br />static Logger log = Logger.getLogger("DAO");<br />...<br />public BeanCollection selectAll() throws SQLException<br />{<br />StringBuffer sql = new StringBuffer(SQLBUF_LEN);<br />sql.append("SELECT * FROM " + tableName + " order by roldId");<br />//System.out.println(sql.toString());<br />log.debug(sql);<br />...<br />}<br />...<br />}</pre><br />3.3 使用Logger对象的debug,info,fatal...方法<br />log.debug("it is the debug info");<br /><br />附件1：log4j的一个bug<br />当这样使用时，DailyRollingFileAppender不能正确使用：<br /><pre class="overflow">public Class RoleDAO(){<br /><br />static Logger log = Logger.getLogger("DAO");<br /><br />//在每一次new RoleDAO对象的时候都执行一次configure()操作<br />public RoleDAO(TransactionManager transMgr) throws SQLException<br />{<br />...<br />PropertyConfigurator.configure("log4j.properties");<br />...<br />}<br /><br />public void select(){<br />...<br />//使用log4j进行log记录<br />log.debug("...");<br />...<br />}<br />}</pre>怎么解决:<br />在系统启动时执行一次PropertyConfigurator.configure("log4j.properties");<br />之后就不再执行。 <br /><br /></div>
		<a name="avote">
				<div class="vote">
				</div>
		</a> <a name="areview"><script src="/j/validator.js"></script><script src="/j/base64.js"></script><script src="/j/cookie.js"></script><script><![CDATA[
function submitForm() {
	var username = document.forms[0].username;
	if (len(username.value) < 4) {
		alert("用户名必须填写，并且大小 3 个字符！");
		username.focus();
		return false;
	}
	
	var content = document.forms[0].content;
	if (len(content.value) < 11) {
		alert("内容长度应该大于 10 个字符！");
		content.focus();
		return false;
	}
	return true;
}
]]&gt;</script><div id="review"><h4></h4></div></a><font size="2"></font> log4j 配置及初始化方法指引（转）<br /><br />写JAVA程序,一般用log4j来写log.<br />以下给出一些指引,以方便使用.<br /><br />1. 不需要显式编码去初始化 log4j,只要你的配置文件放在 CLASSPATH的目录下就可以了.<br />2.用common log而不要直接用log4j的 Logger logger = XXX, 例子如下:<br />在类 ThisIsMyClass 的代码中:<br />private static Log log = LogFactory.getLog(ThisIsMyClass.class);<br /><br />log4j 就会自动用步骤1所述方法初始化.<br /><br />用ThisIsMyClass.class作为参数去取得一个Log对象,<br />好处就是可以更灵活地在 log4j 配置文件中配置相应的 appender 和 logger <br /><h5><a name="#7801"></a>                 </h5><h5><a name="#7118"></a> </h5><h5> </h5><h5><a name="#3849"></a><br /> </h5><h5><a name="#3499"></a> </h5><img src ="http://www.blogjava.net/huhu/aggbug/39568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2006-04-06 13:32 <a href="http://www.blogjava.net/huhu/articles/39568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BeanUtils简读本（转载）</title><link>http://www.blogjava.net/huhu/articles/39224.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 04 Apr 2006 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/39224.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/39224.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/39224.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/39224.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/39224.html</trackback:ping><description><![CDATA[一、简介：<br /><br />BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道，一个JavaBean通常包含了大量的属性，很多情况下，对JavaBean的处理导致大量get/set代码堆积，增加了代码长度和阅读代码的难度。<br /><br />二、用法：<br /><br />BeanUtils是这个包里比较常用的一个工具类，这里只介绍它的copyProperties()方法。该方法定义如下：<br /><pre class="overflow"><br />public static void copyProperties(java.lang.Object dest,java.lang.Object orig)<br />  throws java.lang.IllegalAccessException,<br />         java.lang.reflect.InvocationTargetException<br /></pre><br /><br />如果你有两个具有很多相同属性的JavaBean，一个很常见的情况就是Struts里的PO对象（持久对象）和对应的ActionForm，例如 Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象，传统的方式是使用类似下面的语句对属性逐个赋值：<br /><pre class="overflow"><br />//得到TeacherForm<br />TeacherForm teacherForm=(TeacherForm)form;<br />//构造Teacher对象<br />Teacher teacher=new Teacher();<br />//赋值<br />teacher.setName(teacherForm.getName());<br />teacher.setAge(teacherForm.getAge());<br />teacher.setGender(teacherForm.getGender());<br />teacher.setMajor(teacherForm.getMajor());<br />teacher.setDepartment(teacherForm.getDepartment());<br /><br />//持久化Teacher对象到数据库<br />HibernateDAO=;<br />HibernateDAO.save(teacher);<br /><br />而使用BeanUtils后，代码就大大改观了，如下所示：<br />//得到TeacherForm<br />TeacherForm teacherForm=(TeacherForm)form;<br />//构造Teacher对象<br />Teacher teacher=new Teacher();<br />//赋值<br />BeanUtils.copyProperties(teacher,teacherForm);<br />//持久化Teacher对象到数据库<br />HibernateDAO=;<br />HibernateDAO.save(teacher);<br /></pre><br /><br />如果Teacher和TeacherForm间存在名称不相同的属性，则BeanUtils不对这些属性进行处理，需要程序员手动处理。例如 Teacher包含modifyDate（该属性记录最后修改日期，不需要用户在界面中输入）属性而TeacherForm无此属性，那么在上面代码的 copyProperties()后还要加上一句：<br /><pre class="overflow"><br />teacher.setModifyDate(new Date());<br /></pre><br /><br />怎么样，很方便吧！除BeanUtils外还有一个名为PropertyUtils的工具类，它也提供copyProperties()方法，作用与BeanUtils的同名方法十分相似，主要的区别在于后者提供类型转换功能，即发现两个JavaBean的同名属性为不同类型时，在支持的数据类型范围内进行转换，而前者不支持这个功能，但是速度会更快一些。BeanUtils支持的转换类型如下：<br /><pre class="overflow"><br />    * java.lang.BigDecimal<br />    * java.lang.BigInteger<br />    * boolean and java.lang.Boolean<br />    * byte and java.lang.Byte<br />    * char and java.lang.Character<br />    * java.lang.Class<br />    * double and java.lang.Double<br />    * float and java.lang.Float<br />    * int and java.lang.Integer<br />    * long and java.lang.Long<br />    * short and java.lang.Short<br />    * java.lang.String<br />    * java.sql.Date<br />    * java.sql.Time<br />    * java.sql.Timestamp <br /></pre><br /><br />这里要注意一点，java.util.Date是不被支持的，而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性，且希望被转换的时候，一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。<br /><br />三、优缺点：<br /><br />Apache Jakarta Commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是BeanUtils。我将说明如何使用BeanUtils将local实体bean转换为对应的value 对象：<br /><br /><pre class="overflow"><br />BeanUtils.copyProperties(aValue, aLocal)<br /></pre><br /><br />上面的代码从aLocal对象复制属性到aValue对象。它相当简单！它不管local（或对应的value）对象有多少个属性，只管进行复制。我们假设local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了！太强大了！太有用了！<br /><br />现在，还有一个坏消息：使用BeanUtils的成本惊人地昂贵！我做了一个简单的测试，BeanUtils所花费的时间要超过取数据、将其复制到对应的 value对象（通过手动调用get和set方法），以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力！ <!-- the post be hidden --><img src ="http://www.blogjava.net/huhu/aggbug/39224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2006-04-04 17:44 <a href="http://www.blogjava.net/huhu/articles/39224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]从0到J2EE -- Java 学习历程</title><link>http://www.blogjava.net/huhu/articles/32693.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Mon, 27 Feb 2006 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/32693.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/32693.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/32693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/32693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/32693.html</trackback:ping><description><![CDATA[最近论坛上看到好几个朋友都在问，如何学习&nbsp;Java的问题，”我已经学习了J2SE,怎么样才能转向J2EE?”,&nbsp;“我看完了Thinking&nbsp;in&nbsp;Java,&nbsp;可以学习J2EE了么?”.于是就有了写这篇文章的想法，希望能帮助初学者少走一些弯路。也算是对自己几年来学习Java的一个总结吧.<BR><BR>&nbsp;&nbsp;在开始之前有必要再讨论一下J2ME,&nbsp;J2SE,&nbsp;J2EE这些概念。<B>J2SE</B>,&nbsp;The&nbsp;Micro&nbsp;Edition&nbsp;of&nbsp;the&nbsp;Java&nbsp;2&nbsp;Platform.&nbsp;主要用于嵌入式Java,如手机，PDA等等。<B>J2SE</B>,&nbsp;Java&nbsp;2&nbsp;Platform,&nbsp;Standard&nbsp;Edition,&nbsp;我们通常所说的JDK(Java&nbsp;Development&nbsp;Kit)包含在此，是J2EE的基础。<B>J2EE</B>,&nbsp;Java&nbsp;2&nbsp;Platform,&nbsp;Enterprise&nbsp;Edition&nbsp;,&nbsp;就是所谓的企业级Java.&nbsp;这些只是从API级别上的划分，实际上Sun给J2EE的定义是：开发基于组件的多层的企业级应用的规范。也就是为各种不同的技术定义一个Java的规范，使这些不同的技术结合起来，在Java平台上构建强壮的企业级应用。从这一点来看，J2EE这个概念应该是涵盖J2ME,&nbsp;J2SE的。比如一个典型的J2EE应用，网上商店，&nbsp;它支持web&nbsp;方式下订单，也支持手机下订单。显然必须用到J2SE,J2ME.&nbsp;所以也就不存在所谓的从J2SE转向J2EE的问题了，只是后者包含的范围更广而已。<BR><BR>来看看Sun给出的J2EE&nbsp;相关技术主要分为几大块。<BR>1.&nbsp;<B>Web&nbsp;Service技术</B><BR>-&nbsp;&nbsp;Java&nbsp;API&nbsp;for&nbsp;XML&nbsp;Processing&nbsp;(JAXP)&nbsp;<BR>-&nbsp;&nbsp;Java&nbsp;API&nbsp;for&nbsp;XML&nbsp;Registries&nbsp;(JAXR)&nbsp;<BR>-&nbsp;&nbsp;Java&nbsp;API&nbsp;for&nbsp;XML-based&nbsp;RPC&nbsp;(JAX-RPC)&nbsp;<BR>-&nbsp;&nbsp;&nbsp;&nbsp;SOAP&nbsp;with&nbsp;Attachments&nbsp;API&nbsp;for&nbsp;Java&nbsp;(SAAJ)<BR><BR>2.&nbsp;<B>组件模型技术（Component&nbsp;Model&nbsp;Technologies）</B><BR>-&nbsp;&nbsp;Java&nbsp;Servlet&nbsp;<BR>-&nbsp;&nbsp;JavaServer&nbsp;Pages&nbsp;<BR>-&nbsp;&nbsp;JavaServer&nbsp;Faces&nbsp;<BR>-&nbsp;&nbsp;Enterprise&nbsp;JavaBeans&nbsp;<BR>-&nbsp;&nbsp;Java&nbsp;Message&nbsp;Service&nbsp;<BR>-&nbsp;&nbsp;&nbsp;&nbsp;J2EE&nbsp;Connector&nbsp;Architecture<BR><BR>3&nbsp;.<B>管理技术(Management&nbsp;Technologies)</B><BR>-&nbsp;&nbsp;J2EE&nbsp;Deployment&nbsp;Specification&nbsp;<BR>-&nbsp;&nbsp;J2EE&nbsp;Management&nbsp;Specification&nbsp;<BR>-&nbsp;&nbsp;J2EE&nbsp;Client&nbsp;Provisioning&nbsp;<BR>-&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Authorization&nbsp;Contract&nbsp;for&nbsp;Containers<BR><BR>4.<B>其他相关技术(Other&nbsp;J2EE&nbsp;Technologies)</B><BR>-&nbsp;&nbsp;JDBC&nbsp;<BR>-&nbsp;&nbsp;Java&nbsp;Data&nbsp;Objects&nbsp;(JDO)&nbsp;<BR>-&nbsp;&nbsp;CORBA&nbsp;(Java&nbsp;IDL&nbsp;and&nbsp;Java&nbsp;RMI-IIOP)&nbsp;<BR>-&nbsp;&nbsp;JavaMail&nbsp;<BR>-&nbsp;&nbsp;Transactions<BR>&nbsp;&nbsp;&nbsp;如此之多的技术难免使初学者无所适从，望而却步。即使是一位经验丰富的J2EE&nbsp;开发者，又有几个人敢说J2EE相关的技术我都熟练掌握了。不过作为一名普通J2EE应用程序的开发者来说，我们只需要重点学习其中的一部分技术就可以了，对于其他部分只要做到心中有数，哪天需要用到了知道跑哪里去找到资料就行了。以我个人的观点，下面这些技术是一般J2EE应用开发人员所必须熟练掌握的。Java&nbsp;Server&nbsp;Page,&nbsp;Java&nbsp;Servlet,&nbsp;Enterprise&nbsp;JavaBean,&nbsp;JDBC,&nbsp;Transactions.&nbsp;&nbsp;还有JAXP等XML相关技术，Java&nbsp;Message&nbsp;Service,&nbsp;Java&nbsp;Mail,&nbsp;JDO等等是最好应该掌握的。其他Management&nbsp;Technologies，Connector&nbsp;Architecture等等主要是给容器提供商中间件提供商参考的，应用开发者不需要怎么关心,等用到了再去学习也不迟.<BR><BR>语言学习篇<BR>&nbsp;&nbsp;首先是J2SE基础.学习一门新技术,无外乎阅读和实践了.&nbsp;而一本好的参考书对于初学者来说显得格外重要.&nbsp;现在市面上的&nbsp;Java书籍可以说是铺天盖地,&nbsp;质量也是良莠不齐,&nbsp;令初学者无所适从.&nbsp;所以还是先推荐几本书籍吧.&nbsp;目前对于&nbsp;Java基础知识,大家一般都比较推荐两本书,&nbsp;&lt;&lt;Thinking&nbsp;In&nbsp;Java&gt;&gt;&nbsp;和&nbsp;&lt;&lt;&nbsp;Core&nbsp;Java(TM)&nbsp;2,&nbsp;Volume&nbsp;I?Fundamentals&nbsp;&gt;&gt;.&nbsp;&nbsp;第一本书不必多说了,&nbsp;Bruce&nbsp;Eckel&nbsp;的大作,&nbsp;Jolt获奖书籍.&nbsp;内容比较全面,&nbsp;基本涵盖了java语言的方方面面.&nbsp;这本书提供了相当丰富的例子,&nbsp;非常有利于对学习内容的了解.&nbsp;另外书中第一部分对于OO基本书籍的介绍,&nbsp;我觉得对于刚接触ＯＯ的人来说帮助会很大.&nbsp;而且此书是Open&nbsp;Source的,&nbsp;可以从作者网上下载<A href="http://www.mindview.net/Books/TIJ/">http://www.mindview.net/Books/TIJ/</A>而对于习惯于读中文版的学习者来说,&nbsp;侯捷翻译的中文版是不错的选择.&nbsp;&nbsp;要说这本说的缺点可能就是对于初学者来说厚了一点,&nbsp;这也是一些人并不推荐此书作为初学者学习用书的原因吧.&nbsp;后面一本&lt;&lt;Core&nbsp;Java(TM)&nbsp;2,&nbsp;Volume&nbsp;I?Fundamentals&gt;&gt;,&nbsp;目前已经是第七版了,&nbsp;单从它出版的次数来看也可以看出此书受欢迎的程度,&nbsp;这本书特点也是讲述比较全面系统,&nbsp;基本上一路啃下来的话Java语言基础应该算过关了.&nbsp;缺点也是太厚了,&nbsp;有点像参考手册,&nbsp;前面部分花了不少篇幅讲&nbsp;&nbsp;Swing和Applet,可能对初学者不是很有用.&nbsp;&nbsp;还有一些像&lt;&lt;&nbsp;Java&nbsp;in&nbsp;a&nbsp;nutshell&gt;&gt;也是比较不错的基础书籍.<BR>学习了基本的语言基础,别忘了最重要也是最有用的资料还是JDK文档.&nbsp;从你学习java的第一天开始JDK文档应该是常备手头了.&nbsp;如果你碰到问题首先想到的是到论坛上去提问而不是查阅Jdk文档,&nbsp;那先别继续往下学习了,学会查JDK文档先.&nbsp;不夸张的说在我们的初学者论坛中60%的问题是光查一下JDK文档就能解决问题的.&nbsp;最新JDK&nbsp;Documentation下载地址<A href="http://java.sun.com/j2se/1.4.2/download.html">http://java.sun.com/j2se/1.4.2/download.html</A>(目前最新版是J2SE5&nbsp;<A href="http://java.sun.com/j2se/1.5.0/download.jsp">http://java.sun.com/j2se/1.5.0/download.jsp</A>)不能光说不练,&nbsp;同一下载页面把JDK给下载回来.&nbsp;安装完后有一点我想提一下,&nbsp;安装路径下有一个src.zip(有些jdk版本是src.jar),&nbsp;好东西啊---JDK源代码,&nbsp;老是有人在论坛上问哪里有JDK源代码下载,&nbsp;你说东西就放在你家里还到处找.&nbsp;有了这个有些问题就需要在论坛上跟人家争来争去了,翻开源代码瞧一下什么疑问都没有了.&nbsp;几个最重要的命令行工具是<BR>javac&nbsp;&nbsp;:&nbsp;编译源文件到class文件<BR>java:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行class<BR>jar&nbsp;:&nbsp;打包工具.<BR>Javadoc&nbsp;:&nbsp;&nbsp;生成java&nbsp;doc的工具.<BR>对于初学java的人来说,&nbsp;我不推荐使用IDE而&nbsp;直接用文本编辑器,&nbsp;然后用命令行编译运行.&nbsp;这样有利于理解CLASSPATH,&nbsp;PATH这些最基本概念.&nbsp;CLASSPATH是初学者比较容易感觉迷惑的地方.现在的&nbsp;IDE太聪明了,&nbsp;给个名字就给你自动生成java&nbsp;source&nbsp;code,&nbsp;自动编译.&nbsp;可能你运行完了你的第一个Hello&nbsp;World&nbsp;程序,&nbsp;还不知道java&nbsp;和&nbsp;javac是用来做什么的.&nbsp;至于实际的项目开发,&nbsp;一款合适的IDE还是十分重要的,&nbsp;我们稍后再对java&nbsp;开发工具做一些介绍.&nbsp;<BR><BR><BR>J2EE&nbsp;基础和Java语言进阶<BR><BR>&nbsp;&nbsp;&nbsp;学习完语言基础,&nbsp;就可以比较自然地转入J2EE实际技术的学习了.&nbsp;J2EE实在是比较庞杂,&nbsp;而EJB,&nbsp;Servlet&nbsp;,&nbsp;这些核心技术是作为每一个J2EE开发人员所需要掌握的.&nbsp;关于servlet,&nbsp;&nbsp;我比较推荐&lt;&lt;Core&nbsp;Servlet&nbsp;and&nbsp;JSP&nbsp;2Edition&gt;&gt;和&lt;&lt;More&nbsp;Servlets&nbsp;and&nbsp;Java&nbsp;Server&nbsp;Pages&gt;&gt;,&nbsp;第一本是Sun推荐的Servlet教材.&nbsp;第二本是当年Amazon最畅销Java书籍,&nbsp;五星级书籍.&nbsp;这本书机械工业出版社有中文版叫&lt;&lt;Servlet&nbsp;与JSP权威指南&gt;&gt;,感觉翻译得还可以,&nbsp;第二版好像还没有看到有中文版.&nbsp;两本书都全面系统地介绍了JSP和Sevlet知识,&nbsp;从web服务器配置,&nbsp;JSP,&nbsp;Servlet基本编程,&nbsp;标记库(Tag&nbsp;Lib),&nbsp;过滤器,&nbsp;事件框架都有很好地描述.&nbsp;提供地例子也比较实用.&nbsp;对于EJB学习,&nbsp;比较著名有两本书,&nbsp;&lt;&lt;&nbsp;Enterprise&nbsp;JavaBeans,&nbsp;3nd&nbsp;Edition&gt;&gt;&nbsp;和&lt;&lt;&nbsp;Mastering&nbsp;Enterprise&nbsp;Java&nbsp;Beans&nbsp;Third&nbsp;Edition&gt;&gt;,&nbsp;两位作者Richard&nbsp;Monson,&nbsp;Ed&nbsp;Roman都是属于业界重量级人物.而Richard&nbsp;Monson本身就是EJB规范专家组成员.对我来说,&nbsp;两本书难分优劣,&nbsp;第二本书有个好处就是可以免费下载<A href="http://www.theserverside.com/books/wiley/masteringEJB/index.tss">http://www.theserverside.com/books/wiley/masteringEJB/index.tss</A>.<BR>还是那句话,不能光说不练,&nbsp;不过J2EE&nbsp;的练习做起来有一点麻烦,&nbsp;应用服务器是不可少的,&nbsp;最好还得准备个轻量级的数据库.&nbsp;下面简单介绍一下这些工具.&nbsp;<BR>web服务器(Servlet&nbsp;Container)方面有.<BR>Tomcat.&nbsp;&nbsp;&nbsp;<A href="http://jakarta.apache.org/tomcat/">http://jakarta.apache.org/tomcat/</A><BR>Jetty:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A href="http://jetty.mortbay.org/jetty/">http://jetty.mortbay.org/jetty/</A><BR>应用服务器常用的有,<BR>Jboss:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A href="http://www.jboss.org/products/index">http://www.jboss.org/products/index</A><BR>Weblogic:&nbsp;&nbsp;&nbsp;<A href="http://www.bea.com/framework.jsp?CNT=index.htm&amp;FP=/content/products/server">http://www.bea.com/framework.jsp?CNT=index.htm&amp;FP=/content/products/server</A><BR>WebSphere:&nbsp;<A href="http://www-128.ibm.com/developerworks/downloads/ws/was/?S_TACT=105AGX28&amp;S_CMP=DLMAIN">http://www-128.ibm.com/developerworks/downloads/ws/was/?S_TACT=105AGX28&amp;S_CMP=DLMAIN</A>.<BR>Tomcat,&nbsp;Jetty,&nbsp;Jboss都是Open&nbsp;Source.&nbsp;Weblogic&nbsp;和&nbsp;WebSphere是J2EE服务器中的老大级人物,&nbsp;价格也不菲.&nbsp;不过对于开发者有免费的试用版下载.<BR>如果单单只是学习Servlet,&nbsp;推荐使用Tomcat,&nbsp;它是Sun官方指定的Servlet,&nbsp;JSP规范的参考实现..&nbsp;对初学者最重要的是它使用比较简单,&nbsp;自带文档比较齐全,&nbsp;使用者众多,&nbsp;有什么问题容易在论坛上面得到帮助.&nbsp;如果学习EJB的话,&nbsp;推荐使用Jboss,&nbsp;不仅仅是因为它是Open&nbsp;Source的,主要是配置比较简单,&nbsp;使用方便.&nbsp;比如说对于连接数据库,&nbsp;对于常用的MySQL,&nbsp;Oracle&nbsp;,&nbsp;MS&nbsp;SQL等等都提供了Sample&nbsp;Config文件,&nbsp;直接拿过来做些小改动扔到Deploy目录下就可以用&nbsp;DataSource了,&nbsp;部署J2EE应用也简单,&nbsp;把整个&nbsp;.ear或者.war扔到deploy下就可以了.&nbsp;唯一不方便的地方是从&nbsp;Jboss3.0开始,&nbsp;它的文档开始收费了.&nbsp;但是对于一些基本的配置,&nbsp;在网上还是非常容易找到的,&nbsp;毕竟它太流行了.&nbsp;至于&nbsp;Weblogic,&nbsp;也比较容易使用,&nbsp;不过比起Jboss来个头大了很多,&nbsp;通过强大的管理界面使得一些常用的配置工作变得十分简单.&nbsp;&nbsp;和Jboss比起来它的文档就太多了,&nbsp;简直是有点罗里八嗦,&nbsp;比如要部署一个.ear文件,&nbsp;一般我们也就是直接扔到domain下的applications目录下就会自动deploy了,&nbsp;但是要看它的文档可是长篇大论,&nbsp;容易吓着初学者,&nbsp;以为这又是什么高深的学问.&nbsp;至于WebSphere,&nbsp;个人不推荐初学者使用,&nbsp;相比前俩个Server比较难使,&nbsp;而且狂吃内存.不过在企业级市场这个家伙表现不俗,&nbsp;毕竟是出生于IBM这样的豪门.&nbsp;<BR>数据库方面,&nbsp;目前常见的主要有PostgreSQL,&nbsp;MySQL,&nbsp;Oracle,&nbsp;MS&nbsp;SQL,&nbsp;DB2等等.前面两个是开源数据库,&nbsp;后面几个基本上垄断着大部分的数据库市场.&nbsp;对于初学者用来做做EJB,&nbsp;JDBC的练习,&nbsp;我推荐MySQL,&nbsp;理由还是很简单,&nbsp;开源软件不要钱,&nbsp;个头小使用方面,&nbsp;用户众多文档齐全.&nbsp;下载地址<A href="http://www.mysql.com/products/mysql/">http://www.mysql.com/products/mysql/</A>.&nbsp;&nbsp;PostgreSQL也可以考虑,&nbsp;不过国内使用者远不如MySQL多,&nbsp;所以要在论坛上问起问题来就少方便一些了,&nbsp;下载地址<A href="http://www.pervasive-postgres.com/downloads/">http://www.pervasive-postgres.com/downloads/</A>.&nbsp;至于后面那些比较重量级的数据库,&nbsp;为了做做练习而言就不用考虑了,&nbsp;咱也花不起这个钱啊.<BR><BR>学习完J2EE&nbsp;的这些具体技术,&nbsp;这个时候进行基本的&nbsp;J2EE&nbsp;开发应该是不成问题了.&nbsp;此时应该考虑提高自己的代码质量了.&nbsp;这里我强烈推荐Martin&nbsp;Fowler的&lt;&lt;Refactoring:&nbsp;Improving&nbsp;the&nbsp;Design&nbsp;of&nbsp;Existing&nbsp;Code&nbsp;&gt;&gt;,&nbsp;这本书不是一本非常实际的书,&nbsp;作者完全是手把手地教你如何提高代码质量,&nbsp;从具体地代码中告诉你什么是代码的Bad&nbsp;Smell,&nbsp;如何去掉这些Bad&nbsp;Smell.&nbsp;不少书评是这么说的,&nbsp;这本书对于初级,中级的读者帮助是立杆见影的.至少&nbsp;就我接触到的几个学习编程不久的程序员,&nbsp;编码质量在短期内都有很大提高.&nbsp;当然重构(Refactoring)这一概念并不只针对Java语言的,&nbsp;它对所有OO语言都是适用的.&nbsp;重构的概念是如此深入人心,以至于今天几乎所有流行的&nbsp;IDE工具都有对重构的支持.&nbsp;这里我还想再推荐一本&lt;&lt;Effective&nbsp;Java&gt;&gt;&nbsp;.&nbsp;从C++&nbsp;过来的程序员都知道&lt;&lt;Effective&nbsp;C++&gt;&gt;在C++领域的地位,&nbsp;至今还流传着这样的趣话,&nbsp;C++程序员分为两种,&nbsp;一种是读过&lt;&lt;Effective&nbsp;C++&gt;&gt;的,&nbsp;另一种是没有读过C++的.&nbsp;虽然这本&lt;&lt;Effective&nbsp;Java&gt;&gt;在Java领域的影响也许没有那么大,&nbsp;但对于Java程序员绝对有相当的指导价值.&nbsp;作者是Sun公司的Joshua&nbsp;Bloch,&nbsp;&nbsp;java&nbsp;Collection&nbsp;framework&nbsp;的设计者.&nbsp;作者站在JDK设计者的角度向你介绍他的Best&nbsp;Practice,&nbsp;应该这样做而不应该那样做,&nbsp;对于JDK中某些API设计的缺陷他也毫不袒护的指出.&nbsp;Java语言之父James&nbsp;Gosling为此书写的前言是这么说的”&nbsp;I&nbsp;sure&nbsp;wish&nbsp;I&nbsp;had&nbsp;had&nbsp;this&nbsp;book&nbsp;ten&nbsp;years&nbsp;ago.&nbsp;Some&nbsp;might&nbsp;think&nbsp;that&nbsp;I&nbsp;don't&nbsp;need&nbsp;any&nbsp;Java&nbsp;books,&nbsp;but&nbsp;I&nbsp;need&nbsp;this&nbsp;one”.&nbsp;这本书会让你觉得原来你对Java还是有很多东西不了解的.&nbsp;举个例子来说,&nbsp;对象的equals方法,&nbsp;我们认为它很简单,&nbsp;也许你每天都在为你新写的Class重载这个方法,&nbsp;但是你在重载的时候注意过“自反”,&nbsp;“对称”,&nbsp;“传递”这些必须要考虑的因素,&nbsp;你是否同时还小心谨慎的重载了hashcode这个方法?&nbsp;如果没有,&nbsp;建议你要读一下这本书.&nbsp;读完这本书,你会觉得离Java的距离更近了.&nbsp;上面两本书都出过中文版,&nbsp;后面一本&lt;&lt;Effective&nbsp;Java&gt;&gt;还有两个版本的中文版,&nbsp;第一次翻译的比较差一点,&nbsp;后来机械工业出版社&nbsp;又委托潘爱民先生重新翻译了一遍.同一本书在同一个出版社连续被翻译了两次也说明国内出版界对这本书还是比较重视的.&nbsp;&nbsp;<BR>这个阶段,&nbsp;在看书的同时,&nbsp;可以结合着学习一些优秀的开源项目的源代码.&nbsp;这些开源项目的代码风格,&nbsp;注释都是值得借鉴的.&nbsp;实在太懒也别忘了手头上还有个Jdk的源代码.&nbsp;其实也不用刻意去找源代码,&nbsp;在实际的J2EE项目开发中,&nbsp;基本上都会用到一些优秀的开源项目.&nbsp;&nbsp;Framework可能会用到Spring,&nbsp;Struts,&nbsp;Log机制基本上都会JarkartaCommons&nbsp;Log或者Log4j,&nbsp;&nbsp;单元测试会大多会用Junit,&nbsp;结合项目阅读一下其中的一些源代码,&nbsp;既可以提高自己又对项目会有所帮助,&nbsp;说不定因此而得到PM的赏识呢.&nbsp;一举两得,&nbsp;何乐而不为呢.&nbsp;呵呵,&nbsp;有点扯远了.&nbsp;过了初学者阶段,该学会如何找到适合自己的Java书籍了.&nbsp;历经数十载,&nbsp;今天的Java技术已经变的如此之庞杂,&nbsp;我相信即使穷净一个人毕生之精力也不可能把Java所有的相关技术都学通,&nbsp;何况新技术还在层出不穷地推出,&nbsp;3年之前谁会知道Struts会成为Web框架事实上的工业标准.&nbsp;2年之前谁会知道Hibernate会在今天独领风骚.&nbsp;&nbsp;既然已经不能指望一次性把java技术的方方面面都学个通,&nbsp;在实际中也只能是需要什么技术再学习什么技术了.&nbsp;而能否选择一本好的参考书籍带来的就是事半功倍和事倍工半&nbsp;的效果.&nbsp;所以我觉得花点时间放在选择书籍上面还是很值得的,&nbsp;否则你在后面只会花更多的时间.&nbsp;下面我谈谈自己选择书籍的一些经验,&nbsp;不一定正确.&nbsp;首先看作者,&nbsp;像上面提到的那些书的作者,&nbsp;都是业界鼎鼎大名的,&nbsp;选择他们的书一般错不了.&nbsp;大家看的书多了,&nbsp;自己胸中自然也会有一个list,&nbsp;哪些作者是信得过的.二看出版社,&nbsp;计算机书籍方面,&nbsp;&nbsp;Oreilly,&nbsp;Addison-Wesley都是公认比较好的出版社.&nbsp;对于目前比较流行的Java技术,&nbsp;Oreilly的&lt;&lt;XXXX&nbsp;&nbsp;in&nbsp;&nbsp;Action&gt;&gt;系列是不错的选择.&nbsp;另外我还会去看看Amazon网站(<A href="http://www.amazon.com/">http://www.amazon.com/</A>)的书评,&nbsp;一般小于3星级的书我都不会考虑.&nbsp;还有一个好去处theserverside,<A href="http://www.theserverside.com/">http://www.theserverside.com/</A>的书评,&nbsp;这里的书评比较有趣,往往都有很激烈的争论,&nbsp;里面经常会看到一些名人在发言.我要向所有Java&nbsp;学习者推荐,&nbsp;如果我的收藏夹里面只能存放两个网站,我会选择java.sun&nbsp;和theserverside.&nbsp;在这里你可以了解最新的Java动态,&nbsp;可以学习第一手的Java资料,&nbsp;可以看到Java高手们(里面不乏业界大腕)激烈辩论.&nbsp;<BR>到此阶段,&nbsp;Java&nbsp;Developer的基本功底应该算是打好了吧,往后就是不断学习喽.&nbsp;结束这一段之前,最后再介绍一本书Oreilly&nbsp;的&lt;&lt;Java&nbsp;Threads,&nbsp;Second&nbsp;Edition&nbsp;&gt;&gt;,&nbsp;因为我觉得多线程编程属于&nbsp;Java基本功,&nbsp;每一个想学好Java的人都应该好好掌握.&nbsp;<BR><BR><BR><BR>提高篇<BR>在这个阶段应该从软件架构,&nbsp;Framework层次上来学习了.&nbsp;作为面向对象的圣经&lt;&lt;Design&nbsp;Patterns&gt;&gt;,&nbsp;这本书是不得不推荐的.&nbsp;不用再多说了,&nbsp;这本在面向对象领域地位完全是属于教父级别的.&nbsp;&nbsp;不管你学习的是什么OO语言,&nbsp;不管你现在是用.Net还是J2EE开发,&nbsp;这本书都是你进阶之路上的必读之书.&nbsp;而&lt;&lt;Core&nbsp;J2EE&nbsp;Patterns&gt;&gt;则专门针对于J2EE来讨论设计模式,&nbsp;书中Sun&nbsp;Java&nbsp;Center的资深设计师描述了J2EE关键技术的模式.&nbsp;最佳实践,设计策略和经过验证的解决方案.&nbsp;对于每一个希望成为J2EE&nbsp;架构师或者设计师,&nbsp;这本书值得一读.&nbsp;学习设计模式的时候,建议是结合实际的源代码来看,&nbsp;比如看看Junit源代码,&nbsp;你可以看到很多设计模式优雅的实现,&nbsp;作者之一Erich&nbsp;Gamma本身&nbsp;就是&lt;&lt;Design&nbsp;Patterns&gt;&gt;的作者.&nbsp;至于J2EE的设计模式,&nbsp;Sun还开辟了专门的空间<A href="http://java.sun.com/blueprints/patterns/">http://java.sun.com/blueprints/patterns/</A>,&nbsp;&nbsp;里面有对常用模式的讨论又提供了详细的源代码样例.&nbsp;正如Grady&nbsp;Booch所说,&nbsp;模式对于普遍问题提供了通用的解决方案,&nbsp;利用模式就等于拥有一个强大的专家队伍.&nbsp;&nbsp;如果你还没有学习,&nbsp;现在就开始吧.&nbsp;此外对于面向对象方法论,&nbsp;极限编程的思想也应该有所了解<A href="http://www.extremeprogramming.org/">http://www.extremeprogramming.org/</A>&nbsp;.&nbsp;对于J2EE项目的具体实施,&nbsp;Rod&nbsp;Johnson的&lt;&lt;Expert&nbsp;One-on-One&nbsp;J2EE&nbsp;Design&nbsp;and&nbsp;Development&nbsp;(Programmer&nbsp;to&nbsp;Programmer)&gt;&gt;也很有价值,&nbsp;该书以作者丰富的实战经验向我们展示如何用尽可能简单的解决方案构建J2EE&nbsp;应用,&nbsp;书中作者第一次提出这样的观点,&nbsp;很多时候,&nbsp;J2EE应用完全没有必要用到EJB,&nbsp;对于言必称EJB的广大J2EE开发者来说,&nbsp;怎么说也有点惊世咳俗的味道.&nbsp;当然,&nbsp;作为Servlet和JDO两个专家组的成员,&nbsp;这可不是作者信口胡驺的.&nbsp;今天风靡Java世界的Spring&nbsp;框架最初便是源于此书,&nbsp;而IOC,&nbsp;AOP等概念更是被时下的java开发者挂在嘴边.&nbsp;最后,&nbsp;作为对Java的深入学习,&nbsp;Java技术的各个Specification也有必要一读.&nbsp;暂时就写到这里吧.&nbsp;<BR><img src ="http://www.blogjava.net/huhu/aggbug/32693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2006-02-27 16:57 <a href="http://www.blogjava.net/huhu/articles/32693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>变态级JAVA程序员面试32问(附答案) </title><link>http://www.blogjava.net/huhu/articles/29808.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Feb 2006 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/29808.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/29808.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/29808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/29808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/29808.html</trackback:ping><description><![CDATA[<TABLE class=content cellSpacing=0 cellPadding=2 width="95%" border=0>
<TBODY>
<TR>
<TD align=middle><FONT size=5><SPAN class=p19><B>变态级JAVA程序员面试32问(附答案)</B> </SPAN><BR></FONT>作者: itzealot 发表日期: 2006-01-08 11:35 文章属性: 原创 <A class=content title=http://zealot.blog.ccidnet.com/blog/ccid/do_showone/tid_18016.html onclick="clipboardData.setData('Text','http://zealot.blog.ccidnet.com/blog/ccid/do_showone/tid_18016.html'); alert('复制链接成功，请推荐好友！');" href="javascript:">复制链接</A> </TD></TR>
<TR>
<TD>
<DIV class=content style="TABLE-LAYOUT: fixed; WORD-WRAP: break-word"><BR><BR><SPAN class=content>
<P>第一，谈谈final, finally, finalize的区别。 <BR>　　<BR>　　第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)?<BR>　　<BR>　　第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。<BR>　　<BR>　　第四，&amp;和&amp;&amp;的区别。<BR>　　<BR>　　第五，HashMap和Hashtable的区别。<BR>　　<BR>　　第六，Collection 和 Collections的区别。<BR>　　<BR>　　第七，什么时候用assert。<BR>　　<BR>　　第八，GC是什么? 为什么要有GC? <BR>　　<BR>　　第九，String s = new String("xyz");创建了几个String Object?<BR>　　<BR>　　第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?<BR>　　<BR>　　第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?<BR>　　<BR>　　第十二，sleep() 和 wait() 有什么区别?<BR>　　<BR>　　第十三，Java有没有goto?<BR>　　<BR>　　第十四，数组有没有length()这个方法? String有没有length()这个方法?<BR>　　<BR>　　第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?<BR>　　<BR>　　第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?<BR>　　<BR>　　第十七，给我一个你最常见到的runtime exception。<BR>　　<BR>　　第十八，error和exception有什么区别?<BR>　　<BR>　　第十九，List, Set, Map是否继承自Collection接口?<BR>　　<BR>　　第二十，abstract class和interface有什么区别?<BR>　　<BR>　　第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?<BR>　　<BR>　　第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?<BR>　　<BR>　　第二十三，启动一个线程是用run()还是start()?<BR>　　<BR>　　第二十四，构造器Constructor是否可被override?<BR>　　<BR>　　第二十五，是否可以继承String类?<BR>　　<BR>　　第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?<BR>　　<BR>　　第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?<BR>　　<BR>　　第二十八，编程题: 用最有效率的方法算出2乘以8等於几?<BR>　　<BR>　　第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?<BR>　　<BR>　　第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递?<BR>　　<BR>　　第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?<BR>　　<BR>　　第三十二，编程题: 写一个Singleton出来。</P>
<P></P>
<P>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</P>
<P>以下是答案：</P>
<P>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</P>
<P>第一，谈谈final, finally, finalize的区别。<BR>　　final—修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载<BR>　　finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常，那么相匹配的 catch 子句就会执行，然后控制就会进入 finally 块（如果有的话）。<BR>　　finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的，因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。<BR>　　<BR>　　第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)?<BR>　　匿名的内部类是没有名字的内部类。不能extends(继承) 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。<BR>　　<BR>　　第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。<BR>　　Nested Class （一般是C++的说法），Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&amp;page=1<BR>　　注： 静态内部类（Inner Class）意味着1创建一个static内部类的对象，不需要一个外部类对象，2不能从一个static内部类的一个对象访问一个外部类对象<BR>　　Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现 </P>
<P>　　HashMap允许将null作为一个entry的key或者value，而Hashtable不允许 </P>
<P>　　还有就是，HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。 </P>
<P>　　最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在 <BR>多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap <BR>就必须为之提供外同步。<BR>　　第四，&amp;和&amp;&amp;的区别。<BR>　　&amp;是位运算符。&amp;&amp;是布尔逻辑运算符。<BR>　　<BR>　　第五，HashMap和Hashtable的区别。<BR>　　都属于Map接口的类，实现了将惟一键映射到特定的值上。<BR>　　HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 <BR>　　Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。<BR>　　Hashtable继承自Dictionary类，而HashMap是Java1.2引进的Map interface的一个实现 </P>
<P>　　还有就是，HashMap把Hashtable的contains方法去掉了，改成containsvalue和containsKey。因为contains方法容易让人引起误解。 </P>
<P>　　最大的不同是，Hashtable的方法是Synchronize的，而HashMap不是，在 <BR>多个线程访问Hashtable时，不需要自己为它的方法实现同步，而HashMap <BR>就必须为之提供外同步。 </P>
<P>　　第六，Collection 和 Collections的区别。<BR>　　Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。<BR>　　Collection是个java.util下的接口，它是各种集合结构的父接口.<BR>　　第七，什么时候用assert。<BR>　　断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 Asserti<I>onError</I>。它用于调试目的： <BR>　　assert(a &gt; 0); // throws an Asserti<I>onError</I> if a &lt;= 0 <BR>　　断言可以有两种形式： <BR>　　assert Expression1 ; <BR>　　assert Expression1 : Expression2 ; <BR>　　Expression1 应该总是产生一个布尔值。 <BR>　　Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。<BR>　　断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记： <BR>　　javac -source 1.4 Test.java<BR>　　要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。 <BR>　　要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。 <BR>　　要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 <BR>　　可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。 <BR>　　<BR>　　<BR>　　第八，GC是什么? 为什么要有GC? (基础)。<BR>　　GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一： <BR>　　System.gc()<BR>　　Runtime.getRuntime().gc()<BR>　　<BR>　　第九，String s = new String("xyz");创建了几个String Object?<BR>　　两个对象，一个是“xyx”,一个是指向“xyx”的引用对象s。<BR>　　<BR>　　第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少?<BR>　　Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11;<BR>　　<BR>　　第十一，short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?<BR>　　short s1 = 1; s1 = s1 + 1;有错，s1是short型，s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。<BR>　　<BR>　　第十二，sleep() 和 wait() 有什么区别? 搞线程的最爱<BR>　　sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后，线程不一定立即恢复执行。这是因为在那个时刻，其它线程可能正在运行而且没有被调度为放弃执行，除非(a)“醒来”的线程具有更高的优先级<BR>　　(b)正在运行的线程因为其它原因而阻塞。<BR>　　wait()是线程交互时，如果线程对一个同步对象x 发出一个wait()调用，该线程会暂停执行，被调对象进入等待状态，直到被唤醒或等待时间到。<BR>　　第十三，Java有没有goto?<BR>　　Goto—java中的保留字，现在没有在java中使用。<BR>　　<BR>　　第十四，数组有没有length()这个方法? String有没有length()这个方法？<BR>　　数组没有length()这个方法，有length的属性。<BR>　　String有有length()这个方法。<BR>　　<BR>　　第十五，Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?<BR>　　方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现，重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数，我们说该方法被重写 (Overriding)。子类的对象使用这个方法时，将调用子类中的定义，对它而言，父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法，它们或有不同的参数个数或有不同的参数类型，则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。<BR>　　<BR>　　第十六，Set里的元素是不能重复的，那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?<BR>　　Set里的元素是不能重复的，那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。<BR>　　equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖，为的是当两个分离的对象的内容和类型相配的话，返回真值。<BR>　　<BR>　　第十七，给我一个你最常见到的runtime exception。<BR>　　ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, <BR>　　ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException<BR>　　<BR>　　第十八，error和exception有什么区别?<BR>　　error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。<BR>　　exception 表示一种设计或实现问题。也就是说，它表示如果程序运行正常，从不会发生的情况。<BR>　　第十九，List, Set, Map是否继承自Collection接口?<BR>　　List，Set是<BR>　　<BR>　　Map不是<BR>　　<BR>　　第二十，abstract class和interface有什么区别?<BR>　　声明方法的存在而不去实现它的类被叫做抽象类（abstract class），它用于要创建一个体现某些基本行为的类，并为该类声明方法，但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量，其类型是一个抽象类，并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现，否则它们也是抽象类为。取而代之，在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。<BR>　　接口（interface）是抽象类的变体。在接口中，所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的，没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似，除了该实现类不能从接口定义中继承行为。当类实现特殊接口时，它定义（即将程序体给予）所有这种接口的方法。然后，它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类，它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换，instanceof 运算符可以用来决定某对象的类是否实现了接口。<BR>　　<BR>　　第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized?<BR>　　都不能<BR>　　<BR>　　第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?<BR>　　接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。<BR>　　<BR>　　第二十三，启动一个线程是用run()还是start()?<BR>　　启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。<BR>　　第二十四，构造器Constructor是否可被override?<BR>　　构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。<BR>　　<BR>　　第二十五，是否可以继承String类?<BR>　　String类是final类故不可以继承。<BR>　　<BR>　　第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法?<BR>　　不能，一个对象的一个synchronized方法只能由一个线程访问。<BR>　　<BR>　　第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后?<BR>　　会执行，在return前执行。<BR>　　<BR>　　<BR>　　第二十八，编程题: 用最有效率的方法算出2乘以8等於几?<BR>　　有C背景的程序员特别喜欢问这种问题。<BR>　　<BR>　　2 &lt;&lt; 3<BR>　　<BR>　　第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对?<BR>　　不对，有相同的hash code。<BR>　　<BR>　　第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? <BR>　　是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。<BR>　　<BR>　　<BR>　　第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上?<BR>　　switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。<BR>　　第三十二，编程题: 写一个Singleton出来。<BR>　　Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。<BR>　　一般Singleton模式通常有几种种形式:<BR>　　第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。<BR>　　public class Singleton {<BR>　　private Singleton(){}<BR>　　//在自己内部定义自己一个实例，是不是很奇怪？<BR>　　//注意这是private 只供内部调用<BR>　　private static Singleton instance = new Singleton();<BR>　　//这里提供了一个供外部访问本class的静态方法，可以直接访问 <BR>　　public static Singleton getInstance() {<BR>　　return instance; <BR>　　} <BR>　　} <BR>　　第二种形式: <BR>　　public class Singleton { <BR>　　private static Singleton instance = null;<BR>　　public static synchronized Singleton getInstance() {<BR>　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次 <BR>　　//使用时生成实例，提高了效率！<BR>　　if (instance==null)<BR>　　instance＝new Singleton();<BR>　　return instance; } <BR>　　} <BR>　　其他形式:<BR>　　定义一个类，它的构造函数为private的，所有方法为static的。<BR>　　一般认为第一种形式要更加安全</P></SPAN></DIV></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/huhu/aggbug/29808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2006-02-07 14:51 <a href="http://www.blogjava.net/huhu/articles/29808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些开源项目</title><link>http://www.blogjava.net/huhu/articles/13705.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Thu, 22 Sep 2005 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/13705.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/13705.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/13705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/13705.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/13705.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 名称 资料 概况 OFBiz http://ofbizchina.com:8080/ http://www.ofbiz.org/ https://ofbiz.dev.java.net/ OFBiz是一个非常著名的开源项目，提供了创建基于...&nbsp;&nbsp;<a href='http://www.blogjava.net/huhu/articles/13705.html'>阅读全文</a><img src ="http://www.blogjava.net/huhu/aggbug/13705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-09-22 09:08 <a href="http://www.blogjava.net/huhu/articles/13705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在J2EE项目开发中使用到的一些自己写的基本函数</title><link>http://www.blogjava.net/huhu/articles/11637.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Wed, 31 Aug 2005 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/11637.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/11637.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/11637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/11637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/11637.html</trackback:ping><description><![CDATA[在J2EE项目开发中使用到的一些自己写的基本函数<BR><BR>package jing.tools;<BR><BR>import java.util.*;<BR>import java.text.*; //日期处理用到的包<BR>import java.util.regex.*;<BR>import java.lang.*;<BR><BR>/**<BR>* &lt;p&gt;Title: 常用基础函数&lt;/p&gt;<BR>* &lt;p&gt;Description: 以下全部是静态函数&lt;/p&gt;<BR>* &lt;p&gt;Copyright: Copyright (c) 2005&lt;/p&gt;<BR>* &lt;p&gt;Company: 静靖工作室&lt;/p&gt;<BR>* “@deprecated Method 方法名 is deprecated” 在方法的注释里加上此注释，表示此方法以后版本不再被支持。<BR>* 文件注释只能写在import后,类定义前才能在javadoc中出现文件的注释<BR>* @author 欧朝敬 QQ:35712069<BR>* @version 1.0<BR>*/<BR>public class BaseFunction {<BR>&nbsp;&nbsp;&nbsp; public BaseFunction() {<BR><BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 拼合一维数组为字符串。<BR>&nbsp;&nbsp;&nbsp;&nbsp; * &lt;B&gt;拆分字串按指定字符分解到一维数组使用String类的split(String regex)&lt;/B&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param param String[] 数组<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param spilt String 字符串之单的分离符<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static String arrayToString(String[] param, String spilt) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String rentunstring;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer tempstr = new StringBuffer();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len = param.length;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; len - 1; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempstr.append(param<I>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempstr.append(spilt);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tempstr.append(param[len - 1]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rentunstring = tempstr.toString();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return rentunstring;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 产生在start和end之间的num个随机整数，返回值存在HashMap中。<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 示例<BR>&nbsp;&nbsp;&nbsp;&nbsp; * HashMap hm=BaseFunction.random(1,100,5);<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Set set=hm.keySet();<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Iterator it=set.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp; * while(it.hasNext()){<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(hm.get(it.next()));<BR>&nbsp;&nbsp;&nbsp;&nbsp; * }<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param start int 起始点<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param end int 结束点<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param num int 生成个数<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return HashMap<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static HashMap random(int start, int end, int num) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashMap hashMap = new HashMap();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; num; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double sru = Math.random() * end;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tag = Math.round((float) sru);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tag &lt; start) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i--;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hashMap.put(new Integer(i), new Integer(tag));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return hashMap;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 获取当前时间，返回时间格式(如果调用参数为true时返回yyyy-MM-dd HH:mm:ss<BR>&nbsp;&nbsp;&nbsp;&nbsp; * ，否则为false时返回yyyy-MM-DD不带日期格式)<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param time boolean<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static String getNowTime(boolean time) throws java.lang.Exception {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date now = new Date();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String format = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //yyyy-MM-dd HH:mm:ss:S 年月日时分秒毫杪<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (time) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format = "yyyy-MM-dd HH:mm:ss";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format = "yyyy-MM-dd";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleDateFormat sdf = new SimpleDateFormat(format);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String nowtime = sdf.format(now);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return nowtime;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 将HashMap内容转入数组，<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 示例<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; HashMap hashMap = new HashMap();<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; hashMap.put("ka", "bb");<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; hashMap.put("kb", "cc");<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; hashMap.put("jk", "fdsaf");<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; hashMap.put("ak", "kkkkk");<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; Object[] obj = BaseFunction.hashMapToArray(hashMap);<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; obj.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(obj<I>);<BR>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param param HashMap<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return Object[]<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static Object[] hashMapToArray(HashMap param) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int size = param.size();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (param == null || param.size() == 0) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] obj = new Object[size];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set set = param.keySet();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator ite = set.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; ite.hasNext(); i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj<I> = param.get(ite.next());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return obj;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 日期转字符串<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 示例：dateToString(stringToDate("2005-5-2 0:0:10"));<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param date Date<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 返回字符串格式为“yyyy年MM月dd日 HH时mm分ss秒”或“yyyy年MM月dd日”<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 根据输入的日期是否含有时间来确定输出格式<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static String dateToString(Date date) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Locale.CHINA);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calendar.clear();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calendar.setTimeInMillis(date.getTime());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String format = "";<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (calendar.get(Calendar.MILLISECOND) == 0 &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calendar.get(Calendar.SECOND) == 0 &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calendar.get(Calendar.SECOND) == calendar.get(Calendar.MINUTE) &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; calendar.get(Calendar.MINUTE) == calendar.get(Calendar.HOUR)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format = "yyyy'年'MM'月'dd'日'";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format = "yyyy'年'MM'月'dd'日' HH'时'mm'分'ss'秒'";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format = "yyyy'年'MM'月'dd'日' HH'时'mm'分'ss'秒'";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String return_string = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleDateFormat sdf = new SimpleDateFormat(format);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //yyyy-MM-dd HH:mm:ss:S 年月日时分秒毫杪<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return_string = sdf.format(date);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return return_string;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 字符串转日期<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 示例:stringToDate("2005-5-2 0:0:10");<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param str String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 输入字符串日期可用三种格式<BR>&nbsp;&nbsp;&nbsp;&nbsp; * yyyy-MM-dd HH:mm:ss完整式<BR>&nbsp;&nbsp;&nbsp;&nbsp; * yyyy-MM-dd HH:mm不含秒<BR>&nbsp;&nbsp;&nbsp;&nbsp; * yyyy-MM-dd只有日期不含时间<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return Date<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static Date stringToDate(String str) throws Exception {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date return_date = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String format = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (str.length() &gt; 13) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format = "yyyy-MM-dd HH:mm:ss";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (str.length() &gt; 10) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format = "yyyy-MM-dd HH:mm";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; format = "yyyy-MM-dd";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleDateFormat sdf = new SimpleDateFormat(format);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return_date = sdf.parse(str);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ParseException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "输入字符串的格式出错(格式为yyyy-MM-dd/yyyy-MM-dd HH:mm/yyyy-MM-dd HH:mm:ss)：" +<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.getMessage());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return return_date;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 连续产生指定个数的字符串<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param str String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param count int<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static String continuousMakeString(String str, int count) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; count; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(str);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (sb.toString());<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 将字符串开头的所有空格替换成指定的字符<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 在JSP中经常用到把字符串开头的n个空格替换成n个&amp;nbsp;字符<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 就可以使用此函数调用示例<BR>&nbsp;&nbsp;&nbsp;&nbsp; * replaceStartsWithSpace("&nbsp; 中国&nbsp; 湖南&nbsp; 长沙","&amp;nbsp;");结果为“&amp;nbsp;&amp;nbsp;中国&nbsp; 湖南&nbsp; 长沙”<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param str String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param sub String<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return String<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static String replaceStartsWithSpace(String str, String sub) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String returnStr = "";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String regEx = "\\S"; //非空格字符<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pattern pattern = Pattern.compile(regEx);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Matcher matcher = pattern.matcher(str);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; matcher.find();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int start = matcher.start(); //非空格开始的位置<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; start; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnStr = returnStr + sub;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnStr = returnStr + str.substring(start);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return returnStr;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 查找指定的元素是否存在于元素数组中<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 使用Object支持各种对象数组<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 示例<BR>&nbsp;&nbsp;&nbsp;&nbsp; * String[] des = {"ada", "ss", "dd","aa"};<BR>&nbsp;&nbsp;&nbsp;&nbsp; * System.out.println(BaseFunction.contains(str, "adfab"));<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param objArray Object[]<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param value Object<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return int 如果查到则返回第一次在数组中出现的下标值，查不到则返回值为-1<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static int contains(Object[] objArray, Object value) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; objArray.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (objArray<I>.equals(value)) { //查到则返回下标<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j = i;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return j;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 字符串数组中是否包含指定的字符串。<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param strings 字符串数组<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param string 字符串<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param caseSensitive 是否大小写敏感(true区分大小写,false不区分大小写)<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return 包含时返回true，否则返回false<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @since&nbsp; 0.4<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static boolean contains(String[] strings, String string,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean caseSensitive) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; strings.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (caseSensitive == true) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strings<I>.equals(string)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strings<I>.equalsIgnoreCase(string)) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 数组拷贝,建议使用System.arraycopy()速度更快,把source数据内容拷贝到destination中<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 使用Object则支持多种对象数组<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 示例<BR>&nbsp;&nbsp;&nbsp;&nbsp; * String[] des = {"ada", "ss", "dd","aa"};<BR>&nbsp;&nbsp;&nbsp;&nbsp; * String[] src = new String[8];<BR>&nbsp;&nbsp;&nbsp;&nbsp; * BaseFunction.copy(des, src);<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param source Object[]<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param destination Object[]<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static void copy(Object[] source, Object[] destination) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (destination == null || source == null) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new java.lang.NullPointerException("数组没有初始化！");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (destination.length &lt; source.length) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new java.lang.ArrayIndexOutOfBoundsException("两数组长度不相等!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; source.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination<I> = source<I>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 去除数组中的重复元素，调用示例<BR>&nbsp;&nbsp;&nbsp;&nbsp; * String[] src = {"dafdfad", "asdfasdf", "dafdfad", "adfasdf", "dafdfad","dafdfad"};<BR>&nbsp;&nbsp;&nbsp;&nbsp; * Object[] test =BaseFunction.wipeOffRepeat(src);<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param objArray Object[]<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return Object[]<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static Object[] wipeOffRepeat(Object[] objArray) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] obj = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList list = new ArrayList();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; objArray.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(objArray<I>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //去除list中的重复对象<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashSet h = new HashSet(list);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.clear();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.addAll(h);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj = list.toArray();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return obj;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 四舍五入<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param param double 要进行四舍五入的值<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param num int 保留的小数位数<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @return double<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static double round(double param, int num) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NumberFormat nf = NumberFormat.getNumberInstance();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nf.setMaximumFractionDigits(num);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double returndouble = Double.parseDouble(nf.format(param));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return returndouble;<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; /**<BR>&nbsp;&nbsp;&nbsp;&nbsp; * 主函数做测试用<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @param args String[]<BR>&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<BR>&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(BaseFunction.dateToString(stringToDate(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "2005-5-2 0:0:10")));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(BaseFunction.getTime(true));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(BaseFunction.continuousMakeString(" ", 10));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(BaseFunction.replaceStartsSpace(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " fadsfas&nbsp;&nbsp; dfsd", "&amp;nbsp;"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashMap hm=BaseFunction.random(1,100,5);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set set=hm.keySet();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it=set.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(hm.get(it.next()));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //System.out.println(BaseFunction.replaceStartsWithSpace("&nbsp; 中国&nbsp; 湖南&nbsp; 长沙","&amp;nbsp;"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(BaseFunction.round(0.25689,2));<BR>&nbsp;&nbsp;&nbsp; }<BR>}<BR></I></I></I></I></I></I></I></I></I><img src ="http://www.blogjava.net/huhu/aggbug/11637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-08-31 14:05 <a href="http://www.blogjava.net/huhu/articles/11637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何迅速成为Java高手</title><link>http://www.blogjava.net/huhu/articles/7811.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Sat, 16 Jul 2005 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/7811.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/7811.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/7811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/7811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/7811.html</trackback:ping><description><![CDATA[<DIV align=center><B>
<H1>如何迅速成为Java高手</H1></B></DIV>
<DIV class=gray_text12 align=center>类型：转载 作者：zsq 日期：2004-12-28 09:33:00</DIV><BR>
<DIV align=center></DIV><BR>
<HR align=center width="100%" color=#000011 SIZE=1>
<BR><SPAN style="FONT-SIZE: 14px; COLOR: #333333; LINE-HEIGHT: 180%"><SPAN id=ol_stat title=googlemob210210></SPAN>
<TABLE height=92 width=230 align=right border=0 valign="top">
<TBODY>
<TR>
<TD align=middle height=210><SPAN id=soft_doc_ad_1></SPAN>
<SCRIPT>doc_ad_array['soft_doc_ad_1']="<object classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=210 height=210 align=middle><param name=SRC value=http://pic.zol.com.cn/2005/guanghua210210.swf></object>";</SCRIPT>
</TD></TR>
<TR>
<TD align=middle height=37><FONT color=#ff0000></FONT></TD></TR></TBODY></TABLE>
<P>&nbsp;&nbsp;&nbsp; 很多网友问我学习Java有没有什么捷径,我说“无他，唯手熟尔”。但是我却很愿意将自己学习的一些经验写出来，以便后来者少走弯路,帮助别人是最大的快乐嘛！ <BR><BR>　　要想学好Java，首先要知道Java的大致分类。我们知道，自从Sun推出Java以来，就力图使之无所不包，所以Java发展到现在，按应用来分主要分为三大块：J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版，主要用于桌面应用软件的编程；J2ME主要应用于嵌入是系统开发，如手机和PDA的编程；J2EE是Java2的企业版，主要用于分布式的网络程序的开发，如电子商务网站和ERP系统。J2SE开发桌面应用软件比起VC,VB,DEPHI这些传统开发语言来说，优势好象并不明显。J2ME对于初学者来说，好象又有点深奥，而且一般开发者很难有开发环境。所以现在应用最广泛又最好学的就是J2EE了。J2EE又包括许多组件，如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。 <BR><BR>　　那么又该如何学习J2EE呢？当然Java语法得先看一看的，I/O包，Util包，Lang包你都熟悉了吗？然后再从JSP学起。如果你学过HTML，那么事情要好办的多，如果没有，那你快去补一补HTML基础吧。其实JSP中的Java语法也不多，它更象一个脚本语言，有点象ASP。然后你就该学一学Servlet了。Servlet就是服务器端小程序，他负责生成发送给客户端的HTML文件。JSP在执行时，也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet，这也是SUN推出JSP的本意，可是Servlet用来控制流程跳转还是挺方便的，也令程序更清晰。接下来你应该学习一下Javabean了，可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了，这种方式跟ASP又有什么区别呢？还好，SUN提供了Javabean可以把你的JSP中的Java代码封装起来，便于调用也便于重用。接着就是EJB了，EJB就是Enterprise JavaBean,看名字好象它是Javabean，可是它和Javabean还是有区别的。它是一个体系结构，你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件（也就是我们常听到的Weblogic,Websphere这些J2EE服务器）完成了，所以我们要做的程序代码量很少，大部分工作都在设计和配置中间件上。至于JDBC，就不用我多说了，你如果用java编过存取数据库的程序，就应该很熟悉。还有，如果你要用Java编发送电子邮件的程序，你就得看看Javamail了。 <BR><BR>　　好了，对Java和J2EE有了一些基本概念之后，你就应该编一些程序了，千万不要纸上谈兵哦。最好找一些有实例且带光盘的书来看，这样看到好的程序就可以直接Ctrl+C再Ctrl+V，也不用劳您老大架再亲自把它 再输一遍吧，再说直接复制还不用怕出错，何乐而不为呢！还有就是要经常上一些好的Java编程文章，有好的文章要Cut下来，有问题尽管问，只要问题不是太傻，一般高手都会回答你的。</P>
<P>&nbsp;下面介绍几个好的Java方面的编程网站： <BR><BR>　　CSDN论坛 http://www.csdn.net/ 中国最有名的技术论坛，《程序员》杂志就是他们出版的，你可以在上面提出问题，马上就有人回答你，如果你觉得好，你可以给那人加分； <BR><BR>　　Java研究组织http://www.javaresearch.org/ 上面有很多原创文章，高手还是挺多的； <BR><BR>　　Java开发者 http://www.chinajavaworld.com/ 那里Java资料比较全； <BR><BR>　　java.com.cn http://www.java.com.cn/ 看这域名就知道有多牛，注册用户快接近一万了，同时在线人数也在一千左右，人气很旺的； <BR><BR>　　IBM的开发者网络http://www-900.ibm.com/developerWorks/cn/java/index.shtml IBM永远的蓝色巨人； <BR><BR>　　那么我书也看了，程序也做了，别人问我的问题我都能解决了，是不是就成为高手了呢？当然没那么简单，这只是万里长征走完了第一步。不信？那你出去接一个项目，你知道怎么下手吗，你知道怎么设计吗，你知道怎么组织人员进行开发吗？你现在脑子里除了一些散乱的代码之外，可能再没有别的东西了吧！你现在最缺的是实际的工作经验，而不是书本上那些凭空想出来的程序。所以你快去找一份Java的编程工作来做吧（如果是在校学生可以去做兼职啊），在实践中提高自己，那才是最快的。不过你得祈祷在公司里碰到一个高手，而且他还愿意不厌其烦地教你，这样好象有点难哦！ <BR><BR>　　还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手，他们设计合理，考虑周到，再加上有广大的程序员参与，代码的价值自然是字字珠叽，铿锵有力（对不起，偶最近《金装四大才子》看多了）。学Java必读的两个开源程序就是Jive和Pet Store.。Jive是国外一个非常著名的BBS程序，完全开放源码。论坛的设计采用了很多先进的技术，如Cache、用户认证、Filter、XML等，而且论坛完全屏蔽了对数据库的访问，可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序，这是我们平时编程时容易忽略的一部份（中国程序员一般只注重编程的技术含量，却完全不考虑用户的感受，这就是我们与国外软件的差距所在）。Jive的资料在很多网站上都有，大家可以找来研究一下。相信你读完代码后，会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码，同时有licence限制。不过幸好还有中国一流的Java程序员关注它，外国人不开源了，中国人就不能开源吗？这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文，增加了一些实用功能，如贴图，用户头像和用户资料查询等，而且有一个开发团队在不断升级。你可以访问banq的网站http://www.jdon.com/ 去下载，或到同济技术论坛的服务器上ftp://nro.shtdu.edu.cn去下，安装上有什么问题，可以到论坛上去提问。Pet Store.（宠物店）是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序，应该很具有权威性，想学J2EE和EJB的朋友不要错过了。 <BR><BR>　　你一定会高兴地说，哈哈，原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理，号称Java很简单，只要三个月就可以学会。其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水，你现在只是学到了Java的骨架，却还没有学到Java的精髓。接下来你得研究设计模式了。设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想，它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧，让你能够真正掌握接口或抽象类的应用，从而在原来的Java语言基础上跃进一步，更重要的是，设计模式反复向你强调一个宗旨：要让你的程序尽可能的可重用。关于设计模式的资料，还是向大家推荐banq的网站http://www.jdon.com/ ，他把GOF的23种模式以通俗易懂的方式诠释出来，纯Java描述，真是经典中的经典。有时间再研究一下MVC结构（把Model-View-Control分离开的设计思想）吧，现在很流行的Structs就是它的一种实现方式，不过Structs用起来实在是很繁，我们只要学习其精髓即可，我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring(重整)和极限XP编程，相信你又会上一个台阶。 <BR><BR>　　做完这些，你不如整理一下你的Java代码，把那些经典的程序和常见的应用整理出来，再精心打造一番，提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧，你可以去承接一些项目做了，一开始可能有些困难，可是你有技术积累，又考虑周全，接下项目来可以迅速作完，相信大家以后都会来找你的，所以Money就哗啦啦的来了。。。。。。 <BR><BR>　　当然你也可以参加一些开源项目，一方面可以提高自己，另一方面也是为中国软件事业做贡献嘛！开发者在互联网上用CVS合作开发，用QQ,MSN,E-mail讨论联系，天南海北的程序员分散在各地却同时开发同一个软件，是不是很有意思呢？</P>
<P>下面介绍两个好的开源项目网站： <BR><BR>　　湖北省软件公共开发平台http://gro.clinux.org/ <BR><BR>　　共创联盟http://cosoft.org.cn/ <BR><BR>　　哇，好高兴哦，我终于成为高手了！非也，非也。古人云：“识时务者为俊杰”。你知道计算机界现在的发展形势吗？你知道微软的.NET蓝图和SUN ONE计划之间的明争暗斗吗?你知道计算机技术将向何处发展吗?其实从各大计算机厂商最近的动作,都可以看出来“Web服务将是下一代互联网应用的制高点”，而微软的.NET蓝图和SUN ONE计划的斗争焦点，也就是Web服务。Web服务就是一个崭新的分布式计算模型，它是一系列标准的综合（XML,SOAP,UDDI,WSDL和WSFL等）。它使得不同语言编写的软件能够轻易的集成起来，使网络资源和Web站点变成一种服务而不是混乱的垃圾场。不远的将来，我们就可以在家里点击一下鼠标，就可以完成出门旅游的全部准备工作，包括定飞机票，定旅游线路，定好房间等。请注意，这所有的一切都是Web站点间自动完成的，再也不用象现在一样，表面上是电子商务，实际上很多环节都是人工操作。也许你会觉得这是天方夜谈，不过就近的说，你也很有可能承接一个项目，要集成两个企业的ERP系统。很有可能上游企业的系统是用Dephi编的，而下游企业的系统是用Java编的。你说你是Java高手，大家都看者你怎么做呢。所以啊，你还得学习新技术，如Web服务，而且你Dephi也要懂一点吧（Dephi6现在已经提供Web服务的控件了）。 你编的Java系统，可能要和.NET集成，所以你.NET要懂一点吧？到最后，你可能发现你已经成为Java高手了，但很多时间却在搞别的技术。太极张三丰里说，最厉害的招式就是没有招式，可能就是这个道理吧！ <BR><BR>　　因为刚刚兴起，所以网上Web服务的资料不是很多，我还是给大家推荐几个网站吧： <BR><BR>　　中国UDDI技术联盟http://www.uddi-china.org/ <BR><BR>　　CSDN的柴晓路专栏http://www.csdn.net/develop/author/ColumnAuthor/fennivel/ （注：柴晓路也是互联网上一个有名的人物，他发表过很多关于Web服务的文章，还出了一书，应该称的上是中国Web服务技术的先行者） <BR><BR>　　IBM的开发者网络的XML&amp;Web Service专栏: <BR><BR>　　http://www-900.ibm.com/developerWorks/cn/xml/index.shtml?csdn IBM可是Web服务的力推者 <BR><BR>　　呜…你费劲千心万苦，总算成为Java高手了，怎叫人不由喜极而泣呢！是啊，真不容易，真不简单，真叫人感动啊！那么打个电话告诉我吧，什么？我的电话号码是多少？昏到，你打电话问不就知道了吗，真是的…… </P></SPAN><img src ="http://www.blogjava.net/huhu/aggbug/7811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-07-16 10:42 <a href="http://www.blogjava.net/huhu/articles/7811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dom4j 编码问题彻底解决</title><link>http://www.blogjava.net/huhu/articles/6607.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Thu, 23 Jun 2005 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/6607.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/6607.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/6607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/6607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/6607.html</trackback:ping><description><![CDATA[这几天开始学习dom4j，在网上找了篇文章就开干了，上手非常的快，但是发现了个问题就是无法以UTF-8保存xml文件，保存后再次读出的时候会报“Invalid byte 2 of 2-byte UTF-8 sequence.”这样一个错误，检查发现由dom4j生成的这个文件，在使用可正确处理XML编码的任何的编辑器中中文成乱码，从记事本查看并不会出现乱码会正确显示中文。让我很是头痛。试着使用GBK、gb2312编码来生成的xml文件却可以正常的被解析。因此怀疑的dom4j没有对utf-8编码进行处理。便开始查看dom4j的原代码。终于发现的问题所在，是自己程序的问题。<BR>在dom4j的范例和网上流行的《DOM4J 使用简介》这篇教程中新建一个xml文档的代码都类似如下<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_39_566_Open_Image onclick="this.style.display='none'; Codehighlighter1_39_566_Open_Text.style.display='none'; Codehighlighter1_39_566_Closed_Image.style.display='inline'; Codehighlighter1_39_566_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_39_566_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_566_Closed_Text.style.display='none'; Codehighlighter1_39_566_Open_Image.style.display='inline'; Codehighlighter1_39_566_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;createXML(String&nbsp;fileName)&nbsp;</SPAN><SPAN id=Codehighlighter1_39_566_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_39_566_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Document&nbsp;doc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;org.dom4j.DocumentHelper.createDocument();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Element&nbsp;root&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;doc.addElement(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">book</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>root.addAttribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">name</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">我的图书</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Element&nbsp;childTmp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>childTmp&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;root.addElement(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">price</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>childTmp.setText(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">21.22</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Element&nbsp;writer&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;root.addElement(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">author</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>writer.setText(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">李四</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>writer.addAttribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ID</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">001</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_375_513_Open_Image onclick="this.style.display='none'; Codehighlighter1_375_513_Open_Text.style.display='none'; Codehighlighter1_375_513_Closed_Image.style.display='inline'; Codehighlighter1_375_513_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_375_513_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_375_513_Closed_Text.style.display='none'; Codehighlighter1_375_513_Open_Image.style.display='inline'; Codehighlighter1_375_513_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_375_513_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_375_513_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>org.dom4j.io.XMLWriter&nbsp;xmlWriter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;org.dom4j.io.XMLWriter(<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileWriter(fileName));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>xmlWriter.write(doc);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>xmlWriter.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_536_563_Open_Image onclick="this.style.display='none'; Codehighlighter1_536_563_Open_Text.style.display='none'; Codehighlighter1_536_563_Closed_Image.style.display='inline'; Codehighlighter1_536_563_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_536_563_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_536_563_Closed_Text.style.display='none'; Codehighlighter1_536_563_Open_Image.style.display='inline'; Codehighlighter1_536_563_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</SPAN><SPAN id=Codehighlighter1_536_563_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_536_563_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>在上面的代码中输出使用的是FileWriter对象进行文件的输出。这就是不能正确进行文件编码的原因所在，java中由Writer类继承下来的子类没有提供编码格式处理，所以dom4j也就无法对输出的文件进行正确的格式处理。这时候所保存的文件会以系统的默认编码对文件进行保存，在中文版的window下java的默认的编码为GBK，也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的，所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析，而以UTF-8格式生成的文件不能被xml解析器所解析的原因。<BR>好了现在我们找到了原因所在了，我们来找解决办法吧。首先我们看看dom4j是如何实现编码处理的<BR><BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_71_273_Open_Image onclick="this.style.display='none'; Codehighlighter1_71_273_Open_Text.style.display='none'; Codehighlighter1_71_273_Closed_Image.style.display='inline'; Codehighlighter1_71_273_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_71_273_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_273_Closed_Text.style.display='none'; Codehighlighter1_71_273_Open_Image.style.display='inline'; Codehighlighter1_71_273_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLWriter(OutputStream&nbsp;</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">)&nbsp;throws&nbsp;UnsupportedEncodingException&nbsp;</SPAN><SPAN id=Codehighlighter1_71_273_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_71_273_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">System.out.println("In&nbsp;OutputStream");</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.format&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DEFAULT_FORMAT;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.writer&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;createWriter(</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">,&nbsp;format.getEncoding());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.autoFlush&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>namespaceStack.push(Namespace.NO_NAMESPACE);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_370_577_Open_Image onclick="this.style.display='none'; Codehighlighter1_370_577_Open_Text.style.display='none'; Codehighlighter1_370_577_Closed_Image.style.display='inline'; Codehighlighter1_370_577_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_370_577_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_370_577_Closed_Text.style.display='none'; Codehighlighter1_370_577_Open_Image.style.display='inline'; Codehighlighter1_370_577_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;XMLWriter(OutputStream&nbsp;</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">,&nbsp;OutputFormat&nbsp;format)&nbsp;throws&nbsp;UnsupportedEncodingException&nbsp;</SPAN><SPAN id=Codehighlighter1_370_577_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_370_577_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">System.out.println("In&nbsp;OutputStream,OutputFormat");</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.format&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;format;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.writer&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;createWriter(</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">,&nbsp;format.getEncoding());<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">.autoFlush&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">true</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>namespaceStack.push(Namespace.NO_NAMESPACE);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_583_643_Open_Image onclick="this.style.display='none'; Codehighlighter1_583_643_Open_Text.style.display='none'; Codehighlighter1_583_643_Closed_Image.style.display='inline'; Codehighlighter1_583_643_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_583_643_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_583_643_Closed_Text.style.display='none'; Codehighlighter1_583_643_Open_Image.style.display='inline'; Codehighlighter1_583_643_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_583_643_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</SPAN><SPAN id=Codehighlighter1_583_643_Open_Text><SPAN style="COLOR: #008000">/*</SPAN><SPAN style="COLOR: #008000">*<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;Get&nbsp;an&nbsp;OutputStreamWriter,&nbsp;use&nbsp;preferred&nbsp;encoding.<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #008000">*/</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><BR><IMG id=Codehighlighter1_753_835_Open_Image onclick="this.style.display='none'; Codehighlighter1_753_835_Open_Text.style.display='none'; Codehighlighter1_753_835_Closed_Image.style.display='inline'; Codehighlighter1_753_835_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_753_835_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_753_835_Closed_Text.style.display='none'; Codehighlighter1_753_835_Open_Image.style.display='inline'; Codehighlighter1_753_835_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;Writer&nbsp;createWriter(OutputStream&nbsp;outStream,&nbsp;String&nbsp;encoding)&nbsp;throws&nbsp;UnsupportedEncodingException&nbsp;</SPAN><SPAN id=Codehighlighter1_753_835_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_753_835_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;BufferedWriter(<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;OutputStreamWriter(&nbsp;outStream,&nbsp;encoding&nbsp;)<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>由上面的代码我们可以看出dom4j对编码并没有进行什么很复杂的处理，完全通过java本身的功能来完成。所以我们在使用dom4j的来生成我们的XML文件时不应该直接为在构建XMLWriter时，不应该直接为其赋一个Writer对象，而应该通过一个OutputStream的子类对象来构建。也就是说在我们上面的代码中，不应该用FileWriter对象来构建xml文档，而应该使用FileOutputStream对象来构建所以将代码修改入下：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG id=Codehighlighter1_39_583_Open_Image onclick="this.style.display='none'; Codehighlighter1_39_583_Open_Text.style.display='none'; Codehighlighter1_39_583_Closed_Image.style.display='inline'; Codehighlighter1_39_583_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_39_583_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_583_Closed_Text.style.display='none'; Codehighlighter1_39_583_Open_Image.style.display='inline'; Codehighlighter1_39_583_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align=top><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;createXML(String&nbsp;fileName)&nbsp;</SPAN><SPAN id=Codehighlighter1_39_583_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_39_583_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Document&nbsp;doc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;org.dom4j.DocumentHelper.createDocument();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Element&nbsp;root&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;doc.addElement(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">book</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>root.addAttribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">name</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">我的图书</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Element&nbsp;childTmp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>childTmp&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;root.addElement(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">price</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>childTmp.setText(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">21.22</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>Element&nbsp;writer&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;root.addElement(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">author</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>writer.setText(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">李四</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>writer.addAttribute(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ID</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">001</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_375_530_Open_Image onclick="this.style.display='none'; Codehighlighter1_375_530_Open_Text.style.display='none'; Codehighlighter1_375_530_Closed_Image.style.display='inline'; Codehighlighter1_375_530_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_375_530_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_375_530_Closed_Text.style.display='none'; Codehighlighter1_375_530_Open_Image.style.display='inline'; Codehighlighter1_375_530_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_375_530_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_375_530_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">注意这里的修改</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>org.dom4j.io.XMLWriter&nbsp;xmlWriter&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;org.dom4j.io.XMLWriter(<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;FileOutputStream(fileName));<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>xmlWriter.write(doc);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>xmlWriter.close();<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG id=Codehighlighter1_553_580_Open_Image onclick="this.style.display='none'; Codehighlighter1_553_580_Open_Text.style.display='none'; Codehighlighter1_553_580_Closed_Image.style.display='inline'; Codehighlighter1_553_580_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_553_580_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_553_580_Closed_Text.style.display='none'; Codehighlighter1_553_580_Open_Image.style.display='inline'; Codehighlighter1_553_580_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</SPAN><SPAN id=Codehighlighter1_553_580_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.blogjava.net/images/dot.gif"></SPAN><SPAN id=Codehighlighter1_553_580_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top>System.</SPAN><SPAN style="COLOR: #0000ff">out</SPAN><SPAN style="COLOR: #000000">.println(e);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV><BR>至此DOM4J的问题编码问题算是告一段落，希望对此文章对其他朋友有用。<BR><img src ="http://www.blogjava.net/huhu/aggbug/6607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-23 17:50 <a href="http://www.blogjava.net/huhu/articles/6607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java程序获取绝对路径</title><link>http://www.blogjava.net/huhu/articles/5688.html</link><dc:creator>似水流年</dc:creator><author>似水流年</author><pubDate>Tue, 07 Jun 2005 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/huhu/articles/5688.html</guid><wfw:comment>http://www.blogjava.net/huhu/comments/5688.html</wfw:comment><comments>http://www.blogjava.net/huhu/articles/5688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huhu/comments/commentRss/5688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huhu/services/trackbacks/5688.html</trackback:ping><description><![CDATA[前一段做个程序，遇到了这样一个问题，想利用相对路径删掉一个文件(实际存在的),老是删不掉. 真是急人呀，最后让我费了好大力气才算把它解决掉，问题不防跟大家说说，万一遇到这样的问题，就不用再费劲了！ 
<P>&nbsp;&nbsp;&nbsp; 情况是这样的：我的Tomcat装在了c盘，而我的虚拟目录设在了E:/work下， 我在E:/work/test/image下有个图片，test.gif 我想通过程序删掉它，但他的绝对路径不确定(为了考虑到程序以后的移植,绝对路径是不确定的)。 </P>
<P>&nbsp;&nbsp;&nbsp; 假设del.jsp文件在e:/work/test 下，用下面的程序好像可以删掉：</P>
<P>&lt;!--原始的del.jsp源文件--&gt; <BR>&lt;%@ page contentType="text/html; charset=GBK" errorPage="" %&gt; <BR>&lt;%request.setCharacterEncoding("GBK");%&gt; <BR>&lt;%@ page language="java" import="java.sql.*" import="java.util.*" import ="java.text.*" import="java.io.*"%&gt; <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=GBK"&gt; <BR>&lt;title&gt;删除成功页面&lt;/title&gt; <BR>&lt;/head&gt; <BR>&lt;body&gt; <BR>File f=new File("/image/",test.gif); <BR>boolean a=f.delete(); <BR>out.print("a="+a); <BR>&lt;/body&gt; <BR>&lt;/html&gt; </P>
<P>&nbsp;&nbsp;&nbsp; 但事实上不行，你会发现a=false; </P>
<P>&nbsp;&nbsp;&nbsp; 这就需要获取其绝对路径， 我们用java程序来做一个专门来获取绝对路径的javaBean(path_test.java)就可以了。 </P>
<P>path_test.java的代码如下： <BR>package pathtest; <BR>import java.io.*; <BR>import javax.servlet.*; <BR>import javax.servlet.jsp.PageContext;//导入PageContext类，不要忘了 <BR>public class path_test <BR>{ </P>
<P>protected ServletContext m_application; <BR>private boolean m_denyPhysicalPath; <BR>public path_test() <BR>{ </P>
<P>} <BR>public final void initialize(PageContext pageContext) <BR>throws ServletException <BR>{ <BR>m_application = pageContext.getServletContext(); </P>
<P>} </P>
<P>public String getPhysicalPath(String filePathName, int option) <BR>throws IOException <BR>{ <BR>String path = new String(); <BR>String fileName = new String(); <BR>String fileSeparator = new String(); <BR>boolean isPhysical = false; <BR>fileSeparator=System.getProperty("file.separator"); <BR>if(filePathName == null) <BR>throw new IllegalArgumentException("There is no specified destination file (1140)."); <BR>if(filePathName.equals("")) <BR>throw new IllegalArgumentException("There is no specified destination file (1140)."); <BR>if(filePathName.lastIndexOf("\\") &gt;= 0) <BR>{ <BR>path = filePathName.substring(0, filePathName.lastIndexOf("\\")); <BR>fileName = filePathName.substring(filePathName.lastIndexOf("\\") + 1); <BR>} <BR>if(filePathName.lastIndexOf("/") &gt;= 0) <BR>{ <BR>path = filePathName.substring(0, filePathName.lastIndexOf("/")); <BR>fileName = filePathName.substring(filePathName.lastIndexOf("/") + 1); <BR>} <BR>path = path.length() != 0 ? path : "/"; <BR>java.io.File physicalPath = new java.io.File(path); <BR>if(physicalPath.exists()) <BR>isPhysical = true; <BR>if(option == 0) <BR>{ <BR>if(isVirtual(path)) <BR>{ <BR>path = m_application.getRealPath(path); <BR>if(path.endsWith(fileSeparator)) <BR>path = path + fileName; <BR>else <BR>path = String.valueOf((new StringBuffer(String.valueOf(path))).append(fileSeparator).append(fileName)); <BR>return path; <BR>} <BR>if(isPhysical) <BR>{ <BR>if(m_denyPhysicalPath) <BR>throw new IllegalArgumentException("Physical path is denied (1125)."); <BR>else <BR>return filePathName; <BR>} else <BR>{ <BR>throw new IllegalArgumentException("This path does not exist (1135)."); <BR>} <BR>} <BR>if(option == 1) <BR>{ <BR>if(isVirtual(path)) <BR>{ <BR>path = m_application.getRealPath(path); <BR>if(path.endsWith(fileSeparator)) <BR>path = path + fileName; <BR>else <BR>path = String.valueOf((new StringBuffer(String.valueOf(path))).append(fileSeparator).append(fileName)); <BR>return path; <BR>} <BR>if(isPhysical) <BR>throw new IllegalArgumentException("The path is not a virtual path."); <BR>else <BR>throw new IllegalArgumentException("This path does not exist (1135)."); <BR>} <BR>if(option == 2) <BR>{ <BR>if(isPhysical) <BR>if(m_denyPhysicalPath) <BR>throw new IllegalArgumentException("Physical path is denied (1125)."); <BR>else <BR>return filePathName; <BR>if(isVirtual(path)) <BR>throw new IllegalArgumentException("The path is not a physical path."); <BR>else <BR>throw new IllegalArgumentException("This path does not exist (1135)."); <BR>} </P>
<P>else <BR>{ <BR>return null; <BR>} </P>
<P>} <BR>private boolean isVirtual(String pathName) //判断是否是虚拟路径 <BR>{ <BR>if(m_application.getRealPath(pathName) != null) <BR>{ <BR>java.io.File virtualFile = new java.io.File(m_application.getRealPath(pathName)); <BR>return virtualFile.exists(); <BR>} </P>
<P>else <BR>{ <BR>return false; <BR>} <BR>} </P>
<P>}</P>
<P>&nbsp;&nbsp;&nbsp; 对path_test.java编译后，得到包pathtest,里面有path_test.class类， </P>
<P>&nbsp;&nbsp;&nbsp; 把整个包放到虚拟目录的classes下，然后再把del.jsp文件改成如下程序，一切都OK了！</P>
<P>&lt;!--改后的del.jsp的源文件--&gt; <BR>&lt;%@ page contentType="text/html; charset=GBK" errorPage="" %&gt; <BR>&lt;%request.setCharacterEncoding("GBK");%&gt; <BR>&lt;%@ page language="java" import="java.sql.*" import="java.util.*" import ="java.text.*" import="java.io.*"%&gt; <BR>&lt;html&gt; <BR>&lt;head&gt; <BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=GBK"&gt; <BR>&lt;title&gt;删除成功页面&lt;/title&gt; <BR>&lt;/head&gt; <BR>&lt;body&gt; <BR>&lt;jsp:useBean id="pathtest" scope="page" class="pathtest.path_test" /&gt; <BR>pathtest.initialize(pageContext);//初始化 <BR>String dir1=pathtest.getPhysicalPath("/test/image/",0);//传参数 <BR>out.print(dir1);//输出的是绝对路径 <BR>File file=new File(dir1,"test.gif");//生成文件对象 <BR>boolean a=file.delete(); <BR>out.print("a="+a); <BR>&lt;/body"&gt; <BR>&lt;/html&gt; </P>
<P>&nbsp;&nbsp;&nbsp; 此时a=true;表示删除成功！ </P>
<P>&nbsp;&nbsp;&nbsp; 到此为止，问题全部搞定。 <BR></P><img src ="http://www.blogjava.net/huhu/aggbug/5688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huhu/" target="_blank">似水流年</a> 2005-06-07 16:19 <a href="http://www.blogjava.net/huhu/articles/5688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>