﻿<?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-byterat-随笔分类-Java</title><link>http://www.blogjava.net/byterat/category/16469.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 11 Jan 2008 13:06:38 GMT</lastBuildDate><pubDate>Fri, 11 Jan 2008 13:06:38 GMT</pubDate><ttl>60</ttl><item><title>java对应javascript的escape,unescape函数</title><link>http://www.blogjava.net/byterat/archive/2008/01/11/174681.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Fri, 11 Jan 2008 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2008/01/11/174681.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/174681.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2008/01/11/174681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/174681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/174681.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><span style="font-family: Courier">/**<br />
&nbsp;* 加码解码工具<br />
&nbsp;* @author lwm<br />
&nbsp;*<br />
&nbsp;*/</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">public class Encode {<br />
&nbsp;<br />
&nbsp;/*<br />
&nbsp; * 对应javascript的escape()函数, 加码后的串可直接使用javascript的unescape()进行解码<br />
&nbsp; */<br />
&nbsp;public static String escape(String src) {<br />
&nbsp;&nbsp;int i;<br />
&nbsp;&nbsp;char j;<br />
&nbsp;&nbsp;StringBuffer tmp = new StringBuffer();<br />
&nbsp;&nbsp;tmp.ensureCapacity(src.length() * 6);<br />
&nbsp;&nbsp;for (i = 0; i &lt; src.length(); i++) {<br />
&nbsp;&nbsp;&nbsp;j = src.charAt(i);<br />
&nbsp;&nbsp;&nbsp;if (Character.isDigit(j) || Character.isLowerCase(j)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| Character.isUpperCase(j))<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(j);<br />
&nbsp;&nbsp;&nbsp;else if (j &lt; 256) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp.append("%");<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (j &lt; 16)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.append("0");<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(Integer.toString(j, 16));<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp.append("%u");<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(Integer.toString(j, 16));<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return tmp.toString();<br />
&nbsp;}</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">&nbsp;/*<br />
&nbsp; * 对应javascript的unescape()函数, 可对javascript的escape()进行解码<br />
&nbsp; */<br />
&nbsp;public static String unescape(String src) {<br />
&nbsp;&nbsp;StringBuffer tmp = new StringBuffer();<br />
&nbsp;&nbsp;tmp.ensureCapacity(src.length());<br />
&nbsp;&nbsp;int lastPos = 0, pos = 0;<br />
&nbsp;&nbsp;char ch;<br />
&nbsp;&nbsp;while (lastPos &lt; src.length()) {<br />
&nbsp;&nbsp;&nbsp;pos = src.indexOf("%", lastPos);<br />
&nbsp;&nbsp;&nbsp;if (pos == lastPos) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (src.charAt(pos + 1) == 'u') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = (char) Integer.parseInt(src<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.substring(pos + 2, pos + 6), 16);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(ch);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastPos = pos + 6;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = (char) Integer.parseInt(src<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.substring(pos + 1, pos + 3), 16);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(ch);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastPos = pos + 3;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (pos == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(src.substring(lastPos));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastPos = src.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(src.substring(lastPos, pos));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastPos = pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return tmp.toString();<br />
&nbsp;}</span></span></p>
<p><span style="font-size: 10pt"><span style="font-family: Courier">}</span></span></p>
<img src ="http://www.blogjava.net/byterat/aggbug/174681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2008-01-11 17:08 <a href="http://www.blogjava.net/byterat/archive/2008/01/11/174681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些Java的知识点!</title><link>http://www.blogjava.net/byterat/archive/2007/12/19/168658.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 19 Dec 2007 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/12/19/168658.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/168658.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/12/19/168658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/168658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/168658.html</trackback:ping><description><![CDATA[1. jvm内部分为主工作区和线程工作区。主工作区是实例的所有线程共有，线程工作区是实例的每个线程专有的工作区，其中包括一些主工作区的一些实例字段数据的拷贝。<br />
<br />
2. 服务器一般都有线程池，线程资源是可以重复利用的。你2000个用户在线，不见得能又200个用户同时（或者说并发）访问。再说，只要对象不是太大，我宁愿用200个拷贝，也不想让用户在这个200个任务的队列里等待。<br />
<br />
3. 两个DB之间的复制数据，每个DB各自使用自己的Sequane来生成id。复制数据时，如果DB中的外键是由DB维护的，则不会产生id冲突，如果外键是由外部程序维护的，则可能会产生错误！ <br />
<br />
4. 对于非static的类的数据成员来说,在该类产生的实例中都有一份,并且相互独立(修改后并不影响其他实例), 但static的数据成员则变成了每个类只有一份,即在该类产生的所有实例共享这一个数据成员, 该数据成员的改变会影响到其他的实例. 而static的方法则是让你不用创建对象及能调用这个方法. <br />
<br />
5. ThreadLocal的作用就是将经常要用到的对象的引用放到属于线程自己的一个存储空间中，在该线程的执行过程中，可以通过类的静态的ThreadLocal来方便的获取到这个对象，而不用通过参数的形式传来传去。
<img src ="http://www.blogjava.net/byterat/aggbug/168658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-12-19 14:54 <a href="http://www.blogjava.net/byterat/archive/2007/12/19/168658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个使用算法比较各种语言性能的网站！</title><link>http://www.blogjava.net/byterat/archive/2007/12/13/167535.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Thu, 13 Dec 2007 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/12/13/167535.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/167535.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/12/13/167535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/167535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/167535.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; font-family: Arial">在一个老外的Blog上看到了<a style="font-family: " href="http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&amp;lang=all">这个网站</a>，发现原来是一个以C语言为基准的性能比较网站！<br style="font-family: " />
<br style="font-family: " />
Java还算不错，Ruby就不怎么样了， 在脚本语言中居然排在了最后！ <br style="font-family: " />
<br style="font-family: " />
看来，解析性的语言玩起来是简单方便了，可是却是以损失性能为代价的！</span>
<img src ="http://www.blogjava.net/byterat/aggbug/167535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-12-13 16:34 <a href="http://www.blogjava.net/byterat/archive/2007/12/13/167535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个用来测试httpServer类型服务的工具－－AB</title><link>http://www.blogjava.net/byterat/archive/2007/10/23/155295.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Tue, 23 Oct 2007 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/10/23/155295.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/155295.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/10/23/155295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/155295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/155295.html</trackback:ping><description><![CDATA[网址：http://httpd.apache.org/docs/2.0/programs/ab.html
<img src ="http://www.blogjava.net/byterat/aggbug/155295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-10-23 14:53 <a href="http://www.blogjava.net/byterat/archive/2007/10/23/155295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的java.nio.Buffer缓冲区基础</title><link>http://www.blogjava.net/byterat/archive/2007/08/01/133757.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 01 Aug 2007 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/08/01/133757.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/133757.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/08/01/133757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/133757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/133757.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">缓冲区基础</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">抽象类Buffer是java.nio包支持缓冲区的基础。 Buffer 的工作方式就象内存中用于读写基本数据类型的 RandomAccessFile 。象 RandomAccessFile 一样，使用 Buffer ，所执行的下一个操作（读／写）在当前某个位置发生。执行读／写操作中的任一个都会改变那个位置，所以在写操作之后进行读操作不会读到刚才所写的内容，而会读到刚才所写内容之后的数据。 Buffer 提供了四个指示方法，用于访问线性结构（从最高值到最低值）： </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">capacity() ：表明缓冲区的容量大小, 一旦确定了大小, 将不能再改变;<br>limit() ：告诉您到目前为止已经往缓冲区填了多少字节，或者让您用 :limit(int newLimit) 来改变这个限制 <br>position() ：告诉您当前的位置，以执行下一个读／写操作 <br>mark() ：为了稍后用 reset() 进行重新设置而记住某个位置 <br>flip() ：交换限制指针和位置指针，然后将位置置为 0，并废弃已经做的mark标记<br><br>缓冲区的基本操作是读 get() 和写 put() ；然而，这些方法在子类中都是针对每种数据类型的特定方法。为了说明这一情况，让我们研究一个简单示例，该示例演示了从同一个缓冲区读和写一个字符。在清单 1 中， flip() 方法交换限制和位置，然后将位置置为 0，并废弃标记，让您读刚才所写的数据： </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><br>清单 1. 读／写示例<br>import java.nio.*;<br>...<br>CharBuffer buff = ...;<br>buff.put('A');<br>buff.flip();<br>char c = buff.get();<br>System.out.println("An A: " + c);<br>&nbsp;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><br>现在让我们研究一些具体的 Buffer 子类。 </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">&nbsp;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">缓冲区类型</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">Merlin 具有 7 种特定的 Buffer 类型，每种类型对应着一个基本数据类型（不包括 boolean）： </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">ByteBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存放任何除boolean类型外的其他基本类型<br>CharBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存放char<br>DoubleBuffer&nbsp;&nbsp;&nbsp;&nbsp; //存放double<br>FloatBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存放float<br>IntBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //存放int<br>LongBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存放long<br>ShortBuffer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存放short<br><br>在本文后面，我将讨论第 8 种类型 MappedByteBuffer ，它用于内存映射文件。如果您必须使用的类型不是这些基本类型，则可以先从 ByteBuffer 获得字节类型，然后将其转换成 Object 或其它任何类型。 <br><br><br>创建缓冲区<br>一共有两种类型的缓冲区，直接缓冲区和非直接缓冲区。<br><br>在创建缓冲区时，可以要求创建直接缓冲区，创建直接缓冲区的成本要比创建间接缓冲区高，但这可以使运行时环境直接在该缓冲区上进行较快的本机 I/O 操作。因为创建直接缓冲区所增加的成本，所以直接缓冲区只用于长生存期的缓冲区，而不用于短生存期、一次性且用完就丢弃的缓冲区。而且，只能在 ByteBuffer 这个级别上创建直接缓冲区，如果希望使用其它类型，则必须将 Buffer 转换成更具体的类型。<br><br>判断一个缓冲区是否是直接缓冲区，可以调用isDirect()方法。<br><br>有三种方式来获取一个缓冲区的对象：<br>a. 调用allocate()或者allocateDirect()方法直接分配，其中allocateDirect()返回的是直接缓冲区。<br>b.&nbsp;包装一个数组，如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[] b = new byte[1024];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer bb = ByteBuffer.wrap(b);<br>c.&nbsp;内存映射，即调用FileChannel的map()方法。<br><br>缓冲区基本属性<br>这几个属性是每个缓冲区都有的并且是常用的操作。<br>a.&nbsp;容量(capacity),缓冲区大小<br>b.&nbsp;限制(limit),第一个不应被读取或写入的字节的索引，总是小于容量。<br>c.&nbsp;位置(position)，下一个被读取或写入的字节的索引，总是小于限制。<br>d.&nbsp;clear()方法：设置limit为capacity，position为0。<br>e.&nbsp;filp()方法：设置limit为当前position，然后设置position为0。<br>f.&nbsp;rewind()方法：保持limit不变，设置position为0。<br><br>缓冲区数据操作<br>操作包括了读取和写入数据两种。<br>读取数据使用get()及其系列方法，除boolean外，每一种类型包括了对应的get()方法，如getInt(),getChar()等，get()方法用来读取字节，支持相对和绝对索引两种方式。<br>写入数据使用put()及其系列方法，和get()方法是对应的。<br><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>package&nbsp;nio;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>import&nbsp;java.io.FileInputStream;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>import&nbsp;java.io.FileOutputStream;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>import&nbsp;java.nio.ByteBuffer;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>import&nbsp;java.nio.channels.FileChannel;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>public&nbsp;class&nbsp;BufferDemo&nbsp;...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=_231_1096_Closed_Image onclick="this.style.display='none'; document.getElementById('_231_1096_Closed_Text').style.display='none'; document.getElementById('_231_1096_Open_Image').style.display='inline'; document.getElementById('_231_1096_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//分配一个非直接缓冲区<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer&nbsp;bb&nbsp;=&nbsp;ByteBuffer.allocate(100);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//向缓冲区写入0到100的字节制<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;100;&nbsp;i++)...{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;b&nbsp;=&nbsp;(byte)&nbsp;(Math.random()&nbsp;*&nbsp;100);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb.put(b);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("写入文件前的缓冲区数据");<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb.flip();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(bb.hasRemaining())<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bb.get()&nbsp;+&nbsp;"&nbsp;");<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取一个关联到文件buffer.txt的信道<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileChannel&nbsp;fc&nbsp;=&nbsp;new&nbsp;FileOutputStream("buffer.txt").getChannel();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将缓冲区数据写到文件中<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb.flip();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc.write(bb);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//防止缓存<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc.force(true);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭信道<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc.close();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb&nbsp;=&nbsp;null;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc&nbsp;=&nbsp;null;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下面从文件中读取数据<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc&nbsp;=&nbsp;new&nbsp;FileInputStream("buffer.txt").getChannel();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer&nbsp;bb2&nbsp;=&nbsp;ByteBuffer.allocate((int)&nbsp;fc.size());<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc.read(bb2);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("从文件读取的缓冲区数据");<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb2.flip();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(bb2.hasRemaining())<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bb2.get()&nbsp;+&nbsp;"&nbsp;");<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc.close();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bb2&nbsp;=&nbsp;null;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fc&nbsp;=&nbsp;null;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}<br><br>内存映射文件</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">第 8 种 Buffer 类型 MappedByteBuffer 只是一种特殊的 ByteBuffer 。 MappedByteBuffer 将文件所在区域直接映射到内存。通常，该区域包含整个文件，但也可以只映射部分文件。所以，必须指定要映射文件的哪部分。而且，与其它 Buffer 对象一样，这里没有构造函数；必须让 java.nio.channels.FileChannel 的 map() 方法来获取 MappedByteBuffer 。此外，无需过多涉及通道就可以用 getChannel() 方法从 FileInputStream 或 FileOutputStream 获取 FileChannel 。通过从命令行传入文件名来读取文本文件的内容，清单 4 显示了 MappedByteBuffer ： </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><br>清单 4. 读取内存映射文本文件<br>import java.io.*;<br>import java.nio.*;<br>import java.nio.channels.*;<br>import java.nio.charset.*;<br>public class ReadFileBuff {<br>&nbsp; public static void main(String args[]) throws IOException {<br>&nbsp;&nbsp;&nbsp;&nbsp; if (args.length != 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filename = args[0];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileInputStream fis = new FileInputStream(filename);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileChannel channel = fis.getChannel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int length = (int)channel.size();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MappedByteBuffer byteBuffer =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; channel.map(FileChannel.MapMode.READ_ONLY, 0, length);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Charset charset = Charset.forName("ISO-8859-1");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CharsetDecoder decoder = charset.newDecoder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CharBuffer charBuffer = decoder.decode(byteBuffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0, n=charBuffer.length(); i&lt;n; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(charBuffer.get());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br>}<br></p>
<img src ="http://www.blogjava.net/byterat/aggbug/133757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-08-01 11:13 <a href="http://www.blogjava.net/byterat/archive/2007/08/01/133757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的位移操作</title><link>http://www.blogjava.net/byterat/archive/2007/08/01/133746.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 01 Aug 2007 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/08/01/133746.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/133746.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/08/01/133746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/133746.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/133746.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">
<ol>
    <li>左移操作: x &lt;&lt; n<br>x可以是byte, short, char, int, long基本类型, n(位移量)只能是int型<br><br>编译器的执行步骤:<br>1) 如果x是byte, short, char类型, 则将x提升为int;<br>2) 如果x是byte, short, char, int类型, 则n被重新赋值(过程是:取n的补码的低5位再转成十进制的int值,相当对n取32模: n=n%32);<br>&nbsp;&nbsp; 如果x是long型, 则n被重新赋值(过程是:取n的补码的低6位再转成十进制的int值,相当对n取64模: n=n%64);<br>&nbsp;&nbsp;&nbsp;(因为int类型为4个字节,即32位,移动32位将没有任何意义.对于long则是模64)<br>3) 对x左移n个位数, 整个表达式产生一个新值(x的值不变);</li>
    <li>&lt;&lt;是左移符号,列x&lt;&lt;1,就是x的内容左移一位(x的内容并不改变)</li>
    <li>&gt;&gt;是带符号位的右移符号,x&gt;&gt;1就是x的内容右移一位,如果开头是1则补1,是0责补0,(x的内容并不改变).</li>
    <li>&gt;&gt;&gt;是不带符号位的右移,x&gt;&gt;&gt;1就是x的内容右移一位,开头补0(x的内容并不改变)</li>
</ol>
</span>
<img src ="http://www.blogjava.net/byterat/aggbug/133746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-08-01 10:12 <a href="http://www.blogjava.net/byterat/archive/2007/08/01/133746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java程序中的多线程(转)</title><link>http://www.blogjava.net/byterat/archive/2007/07/30/133239.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Mon, 30 Jul 2007 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/07/30/133239.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/133239.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/07/30/133239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/133239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/133239.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">原文地址 http://www.programbbs.com/doc/2433.htm</span>
<div id=art width="100%">
<div>为什么会排队等待？ </div>
<div><br>下面的这个简单的 Java 程序完成四项不相关的任务。这样的程序有单个控制线程，控制在这四个任务之间线性地移动。此外，因为所需的资源 — 打印机、磁盘、数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间，所以每项任务都包含明显的等待时间。因此，程序在访问数据库之前必须等待打印机完成打印文件的任务，等等。如果您正在等待程序的完成，则这是对计算资源和您的时间的一种拙劣使用。改进此程序的一种方法是使它成为多线程的。</div>
<div>&nbsp;</div>
<div>四项不相关的任务</div>
<div>&nbsp;</div>
<table borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p><code>class myclass {<br>&nbsp;&nbsp;&nbsp;&nbsp;static public void main(String args[]) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_a_file();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manipulate_another_file();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;access_database();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw_picture_on_screen();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>在本例中，每项任务在开始之前必须等待前一项任务完成，即使所涉及的任务毫不相关也是这样。但是，在现实生活中，我们经常使用多线程模型。我们在处理某些任务的同时也可以让孩子、配偶和父母完成别的任务。例如，我在写信的同时可能打发我的儿子去邮局买邮票。用软件术语来说，这称为多个控制（或执行）线程。</p>
<p>可以用两种不同的方法来获得多个控制线程：</p>
<p>多个进程<br>在大多数操作系统中都可以创建多个进程。当一个程序启动时，它可以为即将开始的每项任务创建一个进程，并允许它们同时运行。当一个程序因等待网络访问或用户输入而被阻塞时，另一个程序还可以运行，这样就增加了资源利用率。但是，按照这种方式创建每个进程要付出一定的代价：设置一个进程要占用相当一部分处理器时间和内存资源。而且，大多数操作系统不允许进程访问其他进程的内存空间。因此，进程间的通信很不方便，并且也不会将它自己提供给容易的编程模型。 </p>
<p><br>线程<br>线程也称为轻型进程 (LWP)。因为线程只能在单个进程的作用域内活动，所以创建线程比创建进程要廉价得多。这样，因为线程允许协作和数据交换，并且在计算资源方面非常廉价，所以线程比进程更可取。线程需要操作系统的支持，因此不是所有的机器都提供线程。Java 编程语言，作为相当新的一种语言，已将线程支持与语言本身合为一体，这样就对线程提供了强健的支持。 </p>
<p><br>使用 Java 编程语言实现线程 <br>Java 编程语言使多线程如此简单有效，以致于某些程序员说它实际上是自然的。尽管在 Java 中使用线程比在其他语言中要容易得多，仍然有一些概念需要掌握。要记住的一件重要的事情是 main() 函数也是一个线程，并可用来做有用的工作。程序员只有在需要多个线程时才需要创建新的线程。</p>
<p>Thread 类 <br>Thread 类是一个具体的类，即不是抽象类，该类封装了线程的行为。要创建一个线程，程序员必须创建一个从 Thread 类导出的新类。程序员必须覆盖 Thread 的 run() 函数来完成有用的工作。用户并不直接调用此函数；而是必须调用 Thread 的 start() 函数，该函数再调用 run()。下面的代码说明了它的用法：</p>
<p>创建两个新线程</p>
<table borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p><code>import java.util.*;<br><br>class TimePrinter extends Thread {<br>&nbsp;&nbsp;&nbsp;&nbsp;int pauseTime;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;String name;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public TimePrinter(int x, String n) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pauseTime = x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name = n;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public void run() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(name + ":"<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;+ new Date(System.currentTimeMillis()));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(pauseTime);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br>&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;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;static public void main(String args[]) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tp1.start();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tp2.start();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>在本例中，我们可以看到一个简单的程序，它按两个不同的时间间隔（1 秒和 3 秒）在屏幕上显示当前时间。这是通过创建两个新线程来完成的，包括 main() 共三个线程。但是，因为有时要作为线程运行的类可能已经是某个类层次的一部分，所以就不能再按这种机制创建线程。虽然在同一个类中可以实现任意数量的接口，但 Java 编程语言只允许一个类有一个父类。同时，某些程序员避免从 Thread 类导出，因为它强加了类层次。对于这种情况，就要 runnable 接口。</p>
<p>Runnable 接口 <br>此接口只有一个函数，run()，此函数必须由实现了此接口的类实现。但是，就运行这个类而论，其语义与前一个示例稍有不同。我们可以用 runnable 接口改写前一个示例。（不同的部分用黑体表示。）</p>
<p>创建两个新线程而不强加类层次</p>
<table borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p><code>import java.util.*;<br><br>class TimePrinter implements Runnable {<br>&nbsp;&nbsp;&nbsp;&nbsp;int pauseTime;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;String name;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public TimePrinter(int x, String n) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pauseTime = x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name = n;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public void run() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(name + ":"<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;+ new Date(System.currentTimeMillis()));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(pauseTime);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br>&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;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;static public void main(String args[]) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread t1 = new Thread(new TimePrinter(1000, "Fast Guy"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t1.start();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread t2 = new Thread(new TimePrinter(3000, "Slow Guy"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2.start();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>请注意，当使用 runnable 接口时，您不能直接创建所需类的对象并运行它；必须从 Thread 类的一个实例内部运行它。许多程序员更喜欢 runnable 接口，因为从 Thread 类继承会强加类层次。</p>
<p>synchronized 关键字 <br>到目前为止，我们看到的示例都只是以非常简单的方式来利用线程。只有最小的数据流，而且不会出现两个线程访问同一个对象的情况。但是，在大多数有用的程序中，线程之间通常有信息流。试考虑一个金融应用程序，它有一个 Account 对象，如下例中所示：</p>
<p>一个银行中的多项活动</p>
<table borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p><code>public class Account {<br>&nbsp;&nbsp;&nbsp;&nbsp;String holderName;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;float amount;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public Account(String name, float amt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;holderName = name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount = amt;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public void deposit(float amt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount += amt;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public void withdraw(float amt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount -= amt;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public float checkBalance() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return amount;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>在此代码样例中潜伏着一个错误。如果此类用于单线程应用程序，不会有任何问题。但是，在多线程应用程序的情况中，不同的线程就有可能同时访问同一个 Account 对象，比如说一个联合帐户的所有者在不同的 ATM 上同时进行访问。在这种情况下，存入和支出就可能以这样的方式发生：一个事务被另一个事务覆盖。这种情况将是灾难性的。但是，Java 编程语言提供了一种简单的机制来防止发生这种覆盖。每个对象在运行时都有一个关联的锁。这个锁可通过为方法添加关键字 synchronized 来获得。这样，修订过的 Account 对象（如下所示）将不会遭受像数据损坏这样的错误：</p>
<p>对一个银行中的多项活动进行同步处理</p>
<table borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p><code>public class Account {<br>&nbsp;&nbsp;&nbsp;&nbsp;String holderName;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;float amount;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public Account(String name, float amt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;holderName = name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount = amt;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public synchronized void deposit(float amt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount += amt;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public synchronized void withdraw(float amt) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount -= amt;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public float checkBalance() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return amount;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>deposit() 和 withdraw() 函数都需要这个锁来进行操作，所以当一个函数运行时，另一个函数就被阻塞。请注意，checkBalance() 未作更改，它严格是一个读函数。因为 checkBalance() 未作同步处理，所以任何其他方法都不会阻塞它，它也不会阻塞任何其他方法，不管那些方法是否进行了同步处理。</p>
<p>Java 编程语言中的高级多线程支持</p>
<p>线程组 <br>线程是被个别创建的，但可以将它们归类到线程组中，以便于调试和监视。只能在创建线程的同时将它与一个线程组相关联。在使用大量线程的程序中，使用线程组组织线程可能很有帮助。可以将它们看作是计算机上的目录和文件结构。</p>
<p>线程间发信 <br>当线程在继续执行前需要等待一个条件时，仅有 synchronized 关键字是不够的。虽然 synchronized 关键字阻止并发更新一个对象，但它没有实现线程间发信。Object 类为此提供了三个函数：wait()、notify() 和 notifyAll()。以全球气候预测程序为例。这些程序通过将地球分为许多单元，在每个循环中，每个单元的计算都是隔离进行的，直到这些值趋于稳定，然后相邻单元之间就会交换一些数据。所以，从本质上讲，在每个循环中各个线程都必须等待所有线程完成各自的任务以后才能进入下一个循环。这个模型称为屏蔽同步，下例说明了这个模型：</p>
<p>屏蔽同步</p>
<table borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p><code>public class BSync {<br>&nbsp;&nbsp;&nbsp;&nbsp;int totalThreads;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;int currentThreads;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public BSync(int x) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalThreads = x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentThreads = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public synchronized void waitForAll() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentThreads++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (currentThreads &lt; totalThreads) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentThreads = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notifyAll();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>当对一个线程调用 wait() 时，该线程就被有效阻塞，只到另一个线程对同一个对象调用 notify() 或 notifyAll() 为止。因此，在前一个示例中，不同的线程在完成它们的工作以后将调用 waitForAll() 函数，最后一个线程将触发 notifyAll() 函数，该函数将释放所有的线程。第三个函数 notify() 只通知一个正在等待的线程，当对每次只能由一个线程使用的资源进行访问限制时，这个函数很有用。但是，不可能预知哪个线程会获得这个通知，因为这取决于 Java 虚拟机 (JVM) 调度算法。</p>
<p>将 CPU 让给另一个线程 <br>当线程放弃某个稀有的资源（如数据库连接或网络端口）时，它可能调用 yield() 函数临时降低自己的优先级，以便某个其他线程能够运行。</p>
<p>守护线程 <br>有两类线程：用户线程和守护线程。用户线程是那些完成有用工作的线程。守护线程是那些仅提供辅助功能的线程。Thread 类提供了 setDaemon() 函数。Java 程序将运行到所有用户线程终止，然后它将破坏所有的守护线程。在 Java 虚拟机 (JVM) 中，即使在 main 结束以后，如果另一个用户线程仍在运行，则程序仍然可以继续运行。</p>
<p>避免不提倡使用的方法 <br>不提倡使用的方法是为支持向后兼容性而保留的那些方法，它们在以后的版本中可能出现，也可能不出现。Java 多线程支持在版本 1.1 和版本 1.2 中做了重大修订，stop()、suspend() 和 resume() 函数已不提倡使用。这些函数在 JVM 中可能引入微妙的错误。虽然函数名可能听起来很诱人，但请抵制诱惑不要使用它们。 </p>
<p>调试线程化的程序 <br>在线程化的程序中，可能发生的某些常见而讨厌的情况是死锁、活锁、内存损坏和资源耗尽。</p>
<p>死锁 <br>死锁可能是多线程程序最常见的问题。当一个线程需要一个资源而另一个线程持有该资源的锁时，就会发生死锁。这种情况通常很难检测。但是，解决方案却相当好：在所有的线程中按相同的次序获取所有资源锁。例如，如果有四个资源 —A、B、C 和 D — 并且一个线程可能要获取四个资源中任何一个资源的锁，则请确保在获取对 B 的锁之前首先获取对 A 的锁，依此类推。如果&#8220;线程 1&#8221;希望获取对 B 和 C 的锁，而&#8220;线程 2&#8221;获取了 A、C 和 D 的锁，则这一技术可能导致阻塞，但它永远不会在这四个锁上造成死锁。</p>
<p>活锁 <br>当一个线程忙于接受新任务以致它永远没有机会完成任何任务时，就会发生活锁。这个线程最终将超出缓冲区并导致程序崩溃。试想一个秘书需要录入一封信，但她一直在忙于接电话，所以这封信永远不会被录入。</p>
<p>内存损坏 <br>如果明智地使用 synchronized 关键字，则完全可以避免内存错误这种气死人的问题。</p>
<p>资源耗尽 <br>某些系统资源是有限的，如文件描述符。多线程程序可能耗尽资源，因为每个线程都可能希望有一个这样的资源。如果线程数相当大，或者某个资源的侯选线程数远远超过了可用的资源数，则最好使用资源池。一个最好的示例是数据库连接池。只要线程需要使用一个数据库连接，它就从池中取出一个，使用以后再将它返回池中。资源池也称为资源库。</p>
<p>调试大量的线程 <br>有时一个程序因为有大量的线程在运行而极难调试。在这种情况下，下面的这个类可能会派上用场：</p>
<table borderColor=#999999 cellSpacing=0 cellPadding=0 width="95%" bgColor=#f1f1f1 border=1>
    <tbody>
        <tr>
            <td>
            <p><code>public class Probe extends Thread {<br>&nbsp;&nbsp;&nbsp;&nbsp;public Probe() {<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public void run() {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread[] x = new Thread[100];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.enumerate(x);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 100; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread t = x[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (t == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(t.getName() + "\t" + t.getPriority()<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;+ "\t" + t.isAlive() + "\t" + t.isDaemon());<br>&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;}<br>}</code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>限制线程优先级和调度 <br>Java 线程模型涉及可以动态更改的线程优先级。本质上，线程的优先级是从 1 到 10 之间的一个数字，数字越大表明任务越紧急。JVM 标准首先调用优先级较高的线程，然后才调用优先级较低的线程。但是，该标准对具有相同优先级的线程的处理是随机的。如何处理这些线程取决于基层的操作系统策略。在某些情况下，优先级相同的线程分时运行；在另一些情况下，线程将一直运行到结束。请记住，Java 支持 10 个优先级，基层操作系统支持的优先级可能要少得多，这样会造成一些混乱。因此，只能将优先级作为一种很粗略的工具使用。最后的控制可以通过明智地使用 yield() 函数来完成。通常情况下，请不要依靠线程优先级来控制线程的状态。</p>
<p>小结 <br>本文说明了在 Java 程序中如何使用线程。像是否应该使用线程这样的更重要的问题在很大程序上取决于手头的应用程序。决定是否在应用程序中使用多线程的一种方法是，估计可以并行运行的代码量。并记住以下几点：</p>
<p>使用多线程不会增加 CPU 的能力。但是如果使用 JVM 的本地线程实现，则不同的线程可以在不同的处理器上同时运行（在多 CPU 的机器中），从而使多 CPU 机器得到充分利用。 <br>如果应用程序是计算密集型的，并受 CPU 功能的制约，则只有多 CPU 机器能够从更多的线程中受益。 <br>当应用程序必须等待缓慢的资源（如网络连接或数据库连接）时，或者当应用程序是非交互式的时，多线程通常是有利的。 <br>基于 Internet 的软件有必要是多线程的；否则，用户将感觉应用程序反映迟钝。例如，当开发要支持大量客户机的服务器时，多线程可以使编程较为容易。在这种情况下，每个线程可以为不同的客户或客户组服务，从而缩短了响应时间。</p>
<p>某些程序员可能在 C 和其他语言中使用过线程，在那些语言中对线程没有语言支持。这些程序员可能通常都被搞得对线程失去了信心。</p>
</div>
<img src ="http://www.blogjava.net/byterat/aggbug/133239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-07-30 09:36 <a href="http://www.blogjava.net/byterat/archive/2007/07/30/133239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dom4j  从文件中装载XML  之 性能比较 ！</title><link>http://www.blogjava.net/byterat/archive/2007/05/19/118483.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Fri, 18 May 2007 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/05/19/118483.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/118483.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/05/19/118483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/118483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/118483.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">众所周知， Java在从XML文件中装载内容到内存过程中，不论用何种方式，IO操作的开销都无可避免。本文尝试比较dom4j中的XPP3和SAX两种方式装载XML文件的性能，以便将IO操作的开销降到最小！</span><br><br>package gz.lwm;<br><br>import java.io.File;<br>import org.apache.log4j.Logger;<br>import org.dom4j.Document;<br>import org.dom4j.DocumentHelper;<br>import org.dom4j.io.SAXReader;<br>import org.dom4j.io.XPP3Reader;<br><br>public class TestDom4j { <br>&nbsp;private static final Logger log = Logger.getLogger(TestDom4j.class);<br>&nbsp;private static long bt;&nbsp; <br>&nbsp;<br>&nbsp;public static void main(String[] args) {<br>&nbsp;&nbsp;<span style="COLOR: #ff0000">Document doc = DocumentHelper.createDocument();</span>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;//先运行getXmlSAX()<br>&nbsp;&nbsp;bt = System.currentTimeMillis();<br>&nbsp;&nbsp;String strXml = getXmlSAX("xml/test.xml");<br>&nbsp;&nbsp;if(log.isDebugEnabled()){<br>&nbsp;&nbsp;&nbsp;log.debug("\ngetXmlSAX() use time: " + (System.currentTimeMillis() - bt) + " millis\n");<br>&nbsp;&nbsp;}</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">&nbsp;&nbsp;//再运行getXmlXPP3()<br>&nbsp;&nbsp;bt = System.currentTimeMillis();<br>&nbsp;&nbsp;String s1 =getXmlXPP3("xml/test.xml");<br>&nbsp;&nbsp;if(log.isDebugEnabled()){<br>&nbsp;&nbsp;&nbsp;log.debug("\ngetXmlXPP3() use time: " + (System.currentTimeMillis() - bt) + " millis\n");<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;<br>&nbsp;public static String getXmlSAX(String xmlFile){<br>&nbsp;&nbsp;String result = "";<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();<br>&nbsp;&nbsp;&nbsp;Document document = reader.read(new File(xmlFile));<br>&nbsp;&nbsp;&nbsp;result = document.asXML();<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return result;<br>&nbsp;}<br>&nbsp;<br>&nbsp;public static String getXmlXPP3(String xmlFile){<br>&nbsp;&nbsp;String result = "";<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;XPP3Reader reader = new XPP3Reader();<br>&nbsp;&nbsp;&nbsp;Document document = reader.read(new File(xmlFile));<br>&nbsp;&nbsp;&nbsp;result = document.asXML();<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return result;<br>&nbsp;}</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><br>&nbsp;<br>}<br><br><font color=#ff0000><span style="COLOR: #000000">有没有这一句"<font color=#ff0000>Document doc = DocumentHelper.createDocument()</font>",对性能的影响很大,特别是对大xml文件(尽管并没有使用doc)</span></font><br><br>另外， getXmlXSAX()和getXmlXPP3()运行的先后次序对性能的影响也很大！<br><br>测试：<br>&nbsp;&nbsp;&nbsp; 在我的机器上，对一个100k左右的XML文件进行多次测试后的均值结果为：<br><br>&nbsp;&nbsp;&nbsp; getXmlXPP3() use time: 265 millis<br>&nbsp;&nbsp;&nbsp;&nbsp;...<br>&nbsp;&nbsp;&nbsp; getXmlXSAX() use time: 359 millis<br>&nbsp;&nbsp;&nbsp;&nbsp;...<br><br>结论：<br>&nbsp;&nbsp;&nbsp; 通过比较，在读取XML文件上，XPP3略为优于SAX！<br><br><br>注意：<br><br>要运行例子，classpath需包含：<br>dom4j-1.6.1.jar<br>jaxen-1.1-beta-10.jar<br>log4j-1.2.9.jar<br>pull-parser-2.1.10.jar<br>xpp3-1.1.4c.jar<br><br><br>参考：<br>dom4j :&nbsp; <a href="http://www.dom4j.org/">http://www.dom4j.org/</a><br>XPP&nbsp;&nbsp;&nbsp;:&nbsp; <a href="http://www.extreme.indiana.edu/xgws/xsoap/xpp/">http://www.extreme.indiana.edu/xgws/xsoap/xpp/</a><br></p>
<img src ="http://www.blogjava.net/byterat/aggbug/118483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-05-19 00:39 <a href="http://www.blogjava.net/byterat/archive/2007/05/19/118483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dom4j 两种创建XML Document方法中命名空间的差异!</title><link>http://www.blogjava.net/byterat/archive/2007/05/17/118172.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Thu, 17 May 2007 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/05/17/118172.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/118172.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/05/17/118172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/118172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/118172.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">&nbsp;&nbsp; Namespace namespace ...<br><br>&nbsp;&nbsp; //第一种方法<br>&nbsp;&nbsp;&nbsp;Document doc = DocumentHelper.createDocument();<br>&nbsp;&nbsp;&nbsp;Element root = doc.addElement("Root", namespace.getURI());<br>&nbsp;&nbsp;&nbsp;Element eResultMessage = root.addElement("ResultMessage");<br><br>&nbsp;&nbsp; 结果为:<br>&nbsp;&nbsp; &lt;Root xmlns="<a href='http://aaaaaa"><resultmessage>...</resultmessage></root'><span style="FONT-SIZE: 10pt">http://aaaaaa"&gt;&lt;ResultMessage&gt;...&lt;/ResultMessage&gt;&lt;/Root</span></a><span style="FONT-SIZE: 10pt">&gt;<br><br><br><br>&nbsp;&nbsp; //第二种方法<br>&nbsp;&nbsp;&nbsp;Document doc = DocumentHelper.createDocument();<br>&nbsp;&nbsp;&nbsp;Element root = doc.addElement(("Root");<br>&nbsp;&nbsp;&nbsp;root.add(namespace);<br>&nbsp;&nbsp; Element eResultMessage = root.addElement("ResultMessage");<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; 结果为:<br>&nbsp;&nbsp; &lt;Root xmlns="</span><a href='http://aaaaaa"><resultmessage/'>http://aaaaaa"&gt;&lt;ResultMessage</a> <strong style="COLOR: red">xmlns=""</strong>&gt;...&lt;/ResultMessage&gt;&lt;/Root&gt;</p>
<img src ="http://www.blogjava.net/byterat/aggbug/118172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-05-17 21:08 <a href="http://www.blogjava.net/byterat/archive/2007/05/17/118172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java正则表达式语法</title><link>http://www.blogjava.net/byterat/archive/2007/05/17/118014.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Thu, 17 May 2007 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/05/17/118014.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/118014.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/05/17/118014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/118014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/118014.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">正则表达式语法&nbsp; <br>&nbsp;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">正则表达式是一种文本模式，包括普通字符（例如，a 到 z 之间的字母）和特殊字符（称为&#8220;元字符&#8221;）。模式描述在搜索文本时要匹配的一个或多个字符串。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">正则表达式示例<br>&nbsp;<br>表达式&nbsp; 匹配&nbsp; <br>/^\s*$/<br>&nbsp;匹配空行。<br>&nbsp;<br>/\d{2}-\d{5}/<br>&nbsp;验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。<br>&nbsp;<br>/&lt;\s*(\S+)(\s[^&gt;]*)?&gt;[\s\S]*&lt;\s*\/\1\s*&gt;/<br>&nbsp;匹配 HTML 标记。<br>&nbsp;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为：</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">&nbsp;<br>字符&nbsp; 说明&nbsp; <br>\<br>&nbsp;将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如，&#8220;n&#8221;匹配字符&#8220;n&#8221;。&#8220;\n&#8221;匹配换行符。序列&#8220;\\&#8221;匹配&#8220;\&#8221;，&#8220;\(&#8221;匹配&#8220;(&#8221;。<br>&nbsp;<br>^<br>&nbsp;匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性，^ 还会与&#8220;\n&#8221;或&#8220;\r&#8221;之后的位置匹配。<br>&nbsp;<br>$<br>&nbsp;匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性，$ 还会与&#8220;\n&#8221;或&#8220;\r&#8221;之前的位置匹配。<br>&nbsp;<br>*<br>&nbsp;零次或多次匹配前面的字符或子表达式。例如，zo* 匹配&#8220;z&#8221;和&#8220;zoo&#8221;。* 等效于 {0,}。<br>&nbsp;<br>+<br>&nbsp;一次或多次匹配前面的字符或子表达式。例如，&#8220;zo+&#8221;与&#8220;zo&#8221;和&#8220;zoo&#8221;匹配，但与&#8220;z&#8221;不匹配。+ 等效于 {1,}。<br>&nbsp;<br>?<br>&nbsp;零次或一次匹配前面的字符或子表达式。例如，&#8220;do(es)?&#8221;匹配&#8220;do&#8221;或&#8220;does&#8221;中的&#8220;do&#8221;。? 等效于 {0,1}。<br>&nbsp;<br>{n}<br>&nbsp;n 是非负整数。正好匹配 n 次。例如，&#8220;o{2}&#8221;与&#8220;Bob&#8221;中的&#8220;o&#8221;不匹配，但与&#8220;food&#8221;中的两个&#8220;o&#8221;匹配。<br>&nbsp;<br>{n,}<br>&nbsp;n 是非负整数。至少匹配 n 次。例如，&#8220;o{2,}&#8221;不匹配&#8220;Bob&#8221;中的&#8220;o&#8221;，而匹配&#8220;foooood&#8221;中的所有 o。&#8220;o{1,}&#8221;等效于&#8220;o+&#8221;。&#8220;o{0,}&#8221;等效于&#8220;o*&#8221;。<br>&nbsp;<br>{n,m}<br>&nbsp;M 和 n 是非负整数，其中 n &lt;= m。匹配至少 n 次，至多 m 次。例如，&#8220;o{1,3}&#8221;匹配&#8220;fooooood&#8221;中的头三个 o。'o{0,1}' 等效于 'o?'。注意：您不能将空格插入逗号和数字之间。<br>&nbsp;<br>?<br>&nbsp;当此字符紧随任何其他限定符（*、+、?、{n}、{n,}、{n,m}）之后时，匹配模式是&#8220;非贪心的&#8221;。&#8220;非贪心的&#8221;模式匹配搜索到的、尽可能短的字符串，而默认的&#8220;贪心的&#8221;模式匹配搜索到的、尽可能长的字符串。例如，在字符串&#8220;oooo&#8221;中，&#8220;o+?&#8221;只匹配单个&#8220;o&#8221;，而&#8220;o+&#8221;匹配所有&#8220;o&#8221;。<br>&nbsp;<br>.<br>&nbsp;匹配除&#8220;\n&#8221;之外的任何单个字符。若要匹配包括&#8220;\n&#8221;在内的任意字符，请使用诸如&#8220;[\s\S]&#8221;之类的模式。<br>&nbsp;<br>(pattern)<br>&nbsp;匹配 pattern 并捕获该匹配的子表达式。可以使用 $0&#8230;$9 属性从结果&#8220;匹配&#8221;集合中检索捕获的匹配。若要匹配括号字符 ( )，请使用&#8220;\(&#8221;或者&#8220;\)&#8221;。<br>&nbsp;<br>(?:pattern)<br>&nbsp;匹配 pattern 但不捕获该匹配的子表达式，即它是一个非捕获匹配，不存储供以后使用的匹配。这对于用&#8220;or&#8221;字符 (|) 组合模式部件的情况很有用。例如，'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。<br>&nbsp;<br>(?=pattern)<br>&nbsp;执行正向预测先行搜索的子表达式，该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配，即不能捕获供以后使用的匹配。例如，'Windows (?=95|98|NT|2000)' 匹配&#8220;Windows 2000&#8221;中的&#8220;Windows&#8221;，但不匹配&#8220;Windows 3.1&#8221;中的&#8220;Windows&#8221;。预测先行不占用字符，即发生匹配后，下一匹配的搜索紧随上一匹配之后，而不是在组成预测先行的字符后。<br>&nbsp;<br>(?!pattern)<br>&nbsp;执行反向预测先行搜索的子表达式，该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配，即不能捕获供以后使用的匹配。例如，'Windows (?!95|98|NT|2000)' 匹配&#8220;Windows 3.1&#8221;中的 &#8220;Windows&#8221;，但不匹配&#8220;Windows 2000&#8221;中的&#8220;Windows&#8221;。预测先行不占用字符，即发生匹配后，下一匹配的搜索紧随上一匹配之后，而不是在组成预测先行的字符后。<br>&nbsp;<br>x|y<br>&nbsp;匹配 x 或 y。例如，'z|food' 匹配&#8220;z&#8221;或&#8220;food&#8221;。'(z|f)ood' 匹配&#8220;zood&#8221;或&#8220;food&#8221;。 <br>&nbsp;<br>[xyz]<br>&nbsp;字符集。匹配包含的任一字符。例如，&#8220;[abc]&#8221;匹配&#8220;plain&#8221;中的&#8220;a&#8221;。 <br>&nbsp;<br>[^xyz]<br>&nbsp;反向字符集。匹配未包含的任何字符。例如，&#8220;[^abc]&#8221;匹配&#8220;plain&#8221;中的&#8220;p&#8221;。 <br>&nbsp;<br>[a-z]<br>&nbsp;字符范围。匹配指定范围内的任何字符。例如，&#8220;[a-z]&#8221;匹配&#8220;a&#8221;到&#8220;z&#8221;范围内的任何小写字母。 <br>&nbsp;<br>[^a-z]<br>&nbsp;反向范围字符。匹配不在指定的范围内的任何字符。例如，&#8220;[^a-z]&#8221;匹配任何不在&#8220;a&#8221;到&#8220;z&#8221;范围内的任何字符。 <br>&nbsp;<br>\b<br>&nbsp;匹配一个字边界，即字与空格间的位置。例如，&#8220;er\b&#8221;匹配&#8220;never&#8221;中的&#8220;er&#8221;，但不匹配&#8220;verb&#8221;中的&#8220;er&#8221;。 <br>&nbsp;<br>\B<br>&nbsp;非字边界匹配。&#8220;er\B&#8221;匹配&#8220;verb&#8221;中的&#8220;er&#8221;，但不匹配&#8220;never&#8221;中的&#8220;er&#8221;。 <br>&nbsp;<br>\cx<br>&nbsp;匹配 x 指示的控制字符。例如，\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样，则假定 c 就是&#8220;c&#8221;字符本身。 <br>&nbsp;<br>\d<br>&nbsp;数字字符匹配。等效于 [0-9]。 <br>&nbsp;<br>\D<br>&nbsp;非数字字符匹配。等效于 [^0-9]。 <br>&nbsp;<br>\f<br>&nbsp;换页符匹配。等效于 \x0c 和 \cL。<br>&nbsp;<br>\n<br>&nbsp;换行符匹配。等效于 \x0a 和 \cJ。<br>&nbsp;<br>\r<br>&nbsp;匹配一个回车符。等效于 \x0d 和 \cM。<br>&nbsp;<br>\s<br>&nbsp;匹配任何空白字符，包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。<br>&nbsp;<br>\S<br>&nbsp;匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。 <br>&nbsp;<br>\t<br>&nbsp;制表符匹配。与 \x09 和 \cI 等效。<br>&nbsp;<br>\v<br>&nbsp;垂直制表符匹配。与 \x0b 和 \cK 等效。<br>&nbsp;<br>\w<br>&nbsp;匹配任何字类字符，包括下划线。与&#8220;[A-Za-z0-9_]&#8221;等效。 <br>&nbsp;<br>\W<br>&nbsp;与任何非单词字符匹配。与&#8220;[^A-Za-z0-9_]&#8221;等效。 <br>&nbsp;<br>\xn<br>&nbsp;匹配 n，此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如，&#8220;\x41&#8221;匹配&#8220;A&#8221;。&#8220;\x041&#8221;与&#8220;\x04&#8221;&amp;&#8220;1&#8221;等效。允许在正则表达式中使用 ASCII 代码。<br>&nbsp;<br>\num<br>&nbsp;匹配 num，此处的 num 是一个正整数。到捕获匹配的反向引用。例如，&#8220;(.)\1&#8221;匹配两个连续的相同字符。 <br>&nbsp;<br>\n<br>&nbsp;标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式，那么 n 是反向引用。否则，如果 n 是八进制数 (0-7)，那么 n 是八进制转义码。<br>&nbsp;<br>\nm<br>&nbsp;标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式，那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获，则 n 是反向引用，后面跟有字符 m。如果两种前面的情况都不存在，则 \nm 匹配八进制值 nm，其中 n 和 m 是八进制数字 (0-7)。<br>&nbsp;<br>\nml<br>&nbsp;当 n 是八进制数 (0-3)，m 和 l 是八进制数 (0-7) 时，匹配八进制转义码 nml。<br>&nbsp;<br>\un<br>&nbsp;匹配 n，其中 n 是以四位十六进制数表示的 Unicode 字符。例如，\u00A9 匹配版权符号 (?)。<br>&nbsp;<br></p>
<img src ="http://www.blogjava.net/byterat/aggbug/118014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-05-17 10:48 <a href="http://www.blogjava.net/byterat/archive/2007/05/17/118014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOM 的使用</title><link>http://www.blogjava.net/byterat/archive/2007/05/17/117987.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Thu, 17 May 2007 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/05/17/117987.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/117987.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/05/17/117987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/117987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/117987.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">package com.sunrise.ocs.webservice.unicom.test;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">import java.io.File;<br>import java.io.StringReader;<br>import java.io.StringWriter;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">import javax.xml.parsers.DocumentBuilder;<br>import javax.xml.parsers.DocumentBuilderFactory;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">import org.w3c.dom.Document;<br>import org.w3c.dom.Element;<br>import org.w3c.dom.Node;<br>import org.xml.sax.InputSource;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">import com.sun.org.apache.xml.internal.serialize.OutputFormat;<br>import com.sun.org.apache.xml.internal.serialize.XMLSerializer;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier">public class TestDom {<br>&nbsp;<br>&nbsp;//将xml串转换为document<br>&nbsp;public static Document xml2Document(String xml) {<br>&nbsp;&nbsp;Document doc = null;<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();<br>&nbsp;&nbsp;&nbsp;doc = builder.parse(new InputSource(new StringReader(xml)));<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return doc;<br>&nbsp;}<br>&nbsp;<br>&nbsp;//将xml文件串转换为document<br>&nbsp;public static Document xmlFile2Document(String xmlFile) {<br>&nbsp;&nbsp;Document doc = null;<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();<br>&nbsp;&nbsp;&nbsp;doc = builder.parse(new File(xmlFile));<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return doc;<br>&nbsp;}<br>&nbsp;<br>&nbsp;//删除命名空间: xmlns="..."<br>&nbsp;public static String delNamespace(String xml) {<br>&nbsp;&nbsp;String result = xml;<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;Document doc = xml2Document(xml);<br>&nbsp;&nbsp;&nbsp;Element root = doc.getDocumentElement();<br>&nbsp;&nbsp;&nbsp;root.removeAttribute("xmlns");<br>&nbsp;&nbsp;&nbsp;result = asXml(doc);<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return result;<br>&nbsp;}<br>&nbsp;<br>&nbsp;//将doc转换为xml串<br>&nbsp;public static String asXml(Document doc) {<br>&nbsp;&nbsp;String strxml = "";<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;OutputFormat format = new OutputFormat(doc);<br>&nbsp;&nbsp;&nbsp;// format.setEncoding("UTF-8");<br>&nbsp;&nbsp;&nbsp;StringWriter stringOut = new StringWriter();<br>&nbsp;&nbsp;&nbsp;XMLSerializer serial = new XMLSerializer(stringOut, format);<br>&nbsp;&nbsp;&nbsp;serial.asDOMSerializer();<br>&nbsp;&nbsp;&nbsp;serial.serialize(doc.getDocumentElement());<br>&nbsp;&nbsp;&nbsp;strxml = stringOut.toString();<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return strxml;<br>&nbsp;}<br>&nbsp;<br>&nbsp;//将node转换为xml串<br>&nbsp;public static String asXml(Node node, Document doc) {<br>&nbsp;&nbsp;String strxml = "";<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;OutputFormat format = new OutputFormat(doc);<br>&nbsp;&nbsp;&nbsp;// format.setEncoding("UTF-8");<br>&nbsp;&nbsp;&nbsp;StringWriter stringOut = new StringWriter();<br>&nbsp;&nbsp;&nbsp;XMLSerializer serial = new XMLSerializer(stringOut, format);<br>&nbsp;&nbsp;&nbsp;serial.asDOMSerializer();<br>&nbsp;&nbsp;&nbsp;serial.serialize((Element)node);<br>&nbsp;&nbsp;&nbsp;strxml = stringOut.toString();<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return strxml;<br>&nbsp;}<br>}<br></p>
<img src ="http://www.blogjava.net/byterat/aggbug/117987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-05-17 10:10 <a href="http://www.blogjava.net/byterat/archive/2007/05/17/117987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdbcTemplate学习笔记!</title><link>http://www.blogjava.net/byterat/archive/2007/04/11/109978.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 11 Apr 2007 10:48:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/04/11/109978.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/109978.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/04/11/109978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/109978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/109978.html</trackback:ping><description><![CDATA[<table width="100%">
    <tbody>
        <tr>
            <td style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">1、使用JdbcTemplate的execute()方法执行SQL语句 <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java style="WIDTH: 822px; HEIGHT: 37px" name=code rows=1 cols=100>jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");</textarea></div>
            <script>render_code();</script><br>2、如果是UPDATE或INSERT,可以用update()方法。 <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java style="WIDTH: 822px; HEIGHT: 98px" name=code rows=1 cols=100>jdbcTemplate.update("INSERT INTO USER VALUES('"
            + user.getId() + "', '"
            + user.getName() + "', '"
            + user.getSex() + "', '"
            + user.getAge() + "')");
            </textarea></div>
            <script>render_code();</script><br>3、带参数的更新 <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java style="WIDTH: 822px; HEIGHT: 36px" name=code rows=1 cols=100>jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});</textarea></div>
            <script>render_code();</script><br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java style="WIDTH: 822px; HEIGHT: 42px" name=code rows=1 cols=100>jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});
            </textarea></div>
            <script>render_code();</script><br>4、使用JdbcTemplate进行查询时，使用queryForXXX()等方法 <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java style="WIDTH: 822px; HEIGHT: 39px" name=code rows=1 cols=100>int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");</textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java style="WIDTH: 822px; HEIGHT: 50px" name=code rows=1 cols=100>String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class);</textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java style="WIDTH: 822px; HEIGHT: 31px" name=code rows=1 cols=100>List rows = jdbcTemplate.queryForList("SELECT * FROM USER");</textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java style="WIDTH: 822px; HEIGHT: 155px" name=code rows=1 cols=100>List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
            Iterator it = rows.iterator();
            while(it.hasNext()) {
            Map userMap = (Map) it.next();
            System.out.print(userMap.get("user_id") + "\t");
            System.out.print(userMap.get("name") + "\t");
            System.out.print(userMap.get("sex") + "\t");
            System.out.println(userMap.get("age") + "\t");
            }
            </textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">JdbcTemplate将我们使用的JDBC的流程封装起来，包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作，XXXTemplate等类别都是基于这种方式的实现。 <br>除了大量使用Template Method来封装一些底层的操作细节，spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能，使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。</p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">JDBC的PreparedStatement <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100>final String id = user.getId();
            final String name = user.getName();
            final String sex = user.getSex() + "";
            final int age = user.getAge();
            jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
            new PreparedStatementSetter() {
            public void setValues(PreparedStatement ps) throws SQLException {
            ps.setString(1, id);
            ps.setString(2, name);
            ps.setString(3, sex);
            ps.setInt(4, age);
            }
            });
            </textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100>final User user = new User();
            jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",
            new Object[] {id},
            new RowCallbackHandler() {
            public void processRow(ResultSet rs) throws SQLException {
            user.setId(rs.getString("user_id"));
            user.setName(rs.getString("name"));
            user.setSex(rs.getString("sex").charAt(0));
            user.setAge(rs.getInt("age"));
            }
            });
            </textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100>class UserRowMapper implements RowMapper {
            public Object mapRow(ResultSet rs, int index) throws SQLException {
            User user = new User();
            user.setId(rs.getString("user_id"));
            user.setName(rs.getString("name"));
            user.setSex(rs.getString("sex").charAt(0));
            user.setAge(rs.getInt("age"));
            return user;
            }
            }
            public List findAllByRowMapperResultReader() {
            String sql = "SELECT * FROM USER";
            return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
            }
            </textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">在getUser(id)里面使用UserRowMapper <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100>public User getUser(final String id) throws DataAccessException {
            String sql = "SELECT * FROM USER WHERE user_id=?";
            final Object[] params = new Object[] { id };
            List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));
            return (User) list.get(0);
            }
            </textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">网上收集 <br>org.springframework.jdbc.core.PreparedStatementCreator 返回预编译SQL 不能于Object[]一起用 <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100> public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
            return con.prepareStatement(sql);
            }
            </textarea></div>
            <script>render_code();</script><br>1.增删改 <br>org.springframework.jdbc.core.JdbcTemplate 类(必须指定数据源dataSource) <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100> template.update("insert into web_person values(?,?,?)",Object[]);
            </textarea></div>
            <script>render_code();</script><br>或 <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100> template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名内部类 只能访问外部最终局部变量
            public void setValues(PreparedStatement ps) throws SQLException {
            ps.setInt(index++,3);
            });
            </textarea></div>
            <script>render_code();</script><br>org.springframework.jdbc.core.PreparedStatementSetter 接口 处理预编译SQL <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100> public void setValues(PreparedStatement ps) throws SQLException {
            ps.setInt(index++,3);
            }
            </textarea></div>
            <script>render_code();</script><br>2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler) <br>org.springframework.jdbc.core.RowMapper 记录映射接口 处理结果集 <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100> public Object mapRow(ResultSet rs, int arg1) throws SQLException {   int表当前行数
            person.setId(rs.getInt("id"));
            }
            List template.query("select * from web_person where id=?",Object[],RowMapper);
            </textarea></div>
            <script>render_code();</script><br>org.springframework.jdbc.core.RowCallbackHandler 记录回调管理器接口 处理结果集 <br>
            <div class=code_title style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">代码</div>
            <div class=code_div style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"><textarea class=java name=code rows=15 cols=100> template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){
            public void processRow(ResultSet rs) throws SQLException {
            person.setId(rs.getInt("id"));
            });
            </textarea></div>
            <script>render_code();</script>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            <p style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman"></p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/byterat/aggbug/109978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-04-11 18:48 <a href="http://www.blogjava.net/byterat/archive/2007/04/11/109978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)制作可执行的JAR文件包及jar命令详解!</title><link>http://www.blogjava.net/byterat/archive/2007/04/11/109970.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 11 Apr 2007 10:19:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/04/11/109970.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/109970.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/04/11/109970.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/109970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/109970.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Courier"><strong style="FONT-FAMILY: Times New Roman">制作可执行的JAR文件包及jar命令详解<br></strong><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">常常在网上看到有人询问：如何把&nbsp;java&nbsp;程序编译成&nbsp;.exe&nbsp;文件。通常回答只有两种，一种是制作一个可执行的&nbsp;JAR&nbsp;文件包，然后就可以像.chm&nbsp;文档一样双击运行了；而另一种是使用&nbsp;JET&nbsp;来进行&nbsp;编译。但是&nbsp;JET&nbsp;是要用钱买的，而且据说&nbsp;JET&nbsp;也不是能把所有的&nbsp;Java&nbsp;程序都编译成执行文件，性能也要打些折扣。所以，使用制作可执行&nbsp;JAR&nbsp;文件包的方法就是最佳选择了，何况它还能保持&nbsp;Java&nbsp;的跨平台特性。&nbsp; <br><br>下面就来看看什么是&nbsp;JAR&nbsp;文件包吧：&nbsp; <br><br>1.&nbsp;JAR&nbsp;文件包&nbsp; <br><br>JAR&nbsp;文件就是&nbsp;Java&nbsp;Archive&nbsp;File，顾名思意，它的应用是与&nbsp;Java&nbsp;息息相关的，是&nbsp;Java&nbsp;的一种文档格式。JAR&nbsp;文件非常类似&nbsp;ZIP&nbsp;文件——准确的说，它就是&nbsp;ZIP&nbsp;文件，所以叫它文件包。JAR&nbsp;文件与&nbsp;ZIP&nbsp;文件唯一的区别就是在&nbsp;JAR&nbsp;文件的内容中，包含了一个&nbsp;META-INF/MANIFEST.MF&nbsp;文件，这个文件是在生成&nbsp;JAR&nbsp;文件的时候自动创建的。举个例子，如果我们具有如下目录结构的一些文件：&nbsp; <br><br>　　==&nbsp; <br><br>　　`--&nbsp;test&nbsp; <br><br>　　　&nbsp;`--&nbsp;Test.class&nbsp; <br><br>把它压缩成&nbsp;ZIP&nbsp;文件&nbsp;test.zip，则这个&nbsp;ZIP&nbsp;文件的内部目录结构为：&nbsp; <br><br>　　test.zip&nbsp; <br><br>　　`--&nbsp;test&nbsp; <br><br>　　　&nbsp;`--&nbsp;Test.class&nbsp; <br><br>如果我们使用&nbsp;JDK&nbsp;的&nbsp;jar&nbsp;命令把它打成&nbsp;JAR&nbsp;文件包&nbsp;test.jar，则这个&nbsp;JAR&nbsp;文件的内部目录结构为：&nbsp; <br><br>　　test.jar&nbsp; <br><br>　　|--&nbsp;META-INF&nbsp; <br><br>　　|　&nbsp;`--&nbsp;MANIFEST.MF&nbsp; <br><br>　　`--&nbsp;test&nbsp; <br><br>　　　　`--Test.class&nbsp; <br><br>2.&nbsp;创建可执行的&nbsp;JAR&nbsp;文件包&nbsp; <br><br>制作一个可执行的&nbsp;JAR&nbsp;文件包来发布你的程序是&nbsp;JAR&nbsp;文件包最典型的用法。&nbsp; <br><br>Java&nbsp;程序是由若干个&nbsp;.class&nbsp;文件组成的。这些&nbsp;.class&nbsp;文件必须根据它们所属的包不同而分级分目录存放；运行前需要把所有用到的包的根目录指定给&nbsp;CLASSPATH&nbsp;环境变量或者&nbsp;java&nbsp;命令的&nbsp;-cp&nbsp;参数；运行时还要到控制台下去使用&nbsp;java&nbsp;命令来运行，如果需要直接双击运行必须写&nbsp;Windows&nbsp;的批处理文件&nbsp;(.bat)&nbsp;或者&nbsp;Linux&nbsp;的&nbsp;Shell&nbsp;程序。因此，许多人说，Java&nbsp;是一种方便开发者苦了用户的程序设计语言。&nbsp; <br><br>其实不然，如果开发者能够制作一个可执行的&nbsp;JAR&nbsp;文件包交给用户，那么用户使用起来就方便了。在&nbsp;Windows&nbsp;下安装&nbsp;JRE&nbsp;(Java&nbsp;Runtime&nbsp;Environment)&nbsp;的时候，安装文件会将&nbsp;.jar&nbsp;文件映射给&nbsp;javaw.exe&nbsp;打开。那么，对于一个可执行的&nbsp;JAR&nbsp;文件包，用户只需要双击它就可以运行程序了，和阅读&nbsp;.chm&nbsp;文档一样方便&nbsp;(.chm&nbsp;文档默认是由&nbsp;hh.exe&nbsp;打开的)。那么，现在的关键，就是如何来创建这个可执行的&nbsp;JAR&nbsp;文件包。&nbsp; <br><br>创建可执行的&nbsp;JAR&nbsp;文件包，需要使用带&nbsp;cvfm&nbsp;参数的&nbsp;jar&nbsp;命令，同样以上述&nbsp;test&nbsp;目录为例，命令如下：&nbsp; <br><br>jar&nbsp;cvfm&nbsp;test.jar&nbsp;manifest.mf&nbsp;test&nbsp; <br><br>这里&nbsp;test.jar&nbsp;和&nbsp;manifest.mf&nbsp;两个文件，分别是对应的参数&nbsp;f&nbsp;和&nbsp;m，其重头戏在&nbsp;manifest.mf。因为要创建可执行的&nbsp;JAR&nbsp;文件包，光靠指定一个&nbsp;manifest.mf&nbsp;文件是不够的，因为&nbsp;MANIFEST&nbsp;是&nbsp;JAR&nbsp;文件包的特征，可执行的&nbsp;JAR&nbsp;文件包和不可执行的&nbsp;JAR&nbsp;文件包都包含&nbsp;MANIFEST。关键在于可执行&nbsp;JAR&nbsp;文件包的&nbsp;MANIFEST，其内容包含了&nbsp;Main-Class&nbsp;一项。这在&nbsp;MANIFEST&nbsp;中书写格式如下：&nbsp; <br><br>Main-Class:&nbsp;可执行主类全名(包含包名)&nbsp; <br><br>例如，假设上例中的&nbsp;Test.class&nbsp;是属于&nbsp;test&nbsp;包的，而且是可执行的类&nbsp;(定义了&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[])&nbsp;方法)，那么这个&nbsp;manifest.mf&nbsp;可以编辑如下：&nbsp; <br><br>Main-Class:&nbsp;test.Test&nbsp;&lt;回车&gt;;&nbsp; <br><br>这个&nbsp;manifest.mf&nbsp;可以放在任何位置，也可以是其它的文件名，只需要有&nbsp;Main-Class:&nbsp;test.Test&nbsp;一行，且该行以一个回车符结束即可。创建了&nbsp;manifest.mf&nbsp;文件之后，我们的目录结构变为：&nbsp; <br><br>　　==&nbsp; <br><br>　　|--&nbsp;test&nbsp; <br><br>　　|　&nbsp;`--&nbsp;Test.class&nbsp; <br><br>　　`--&nbsp;manifest.mf&nbsp; <br><br>这时候，需要到&nbsp;test&nbsp;目录的上级目录中去使用&nbsp;jar&nbsp;命令来创建&nbsp;JAR&nbsp;文件包。也就是在目录树中使用&#8220;==&#8221;表示的那个目录中，使用如下命令：&nbsp; <br><br>jar&nbsp;cvfm&nbsp;test.jar&nbsp;manifest.mf&nbsp;test&nbsp; <br><br>之后在&#8220;==&#8221;目录中创建了&nbsp;test.jar，这个&nbsp;test.jar&nbsp;就是执行的&nbsp;JAR&nbsp;文件包。运行时只需要使用&nbsp;java&nbsp;-jar&nbsp;test.jar&nbsp;命令即可。&nbsp; <br><br>需要注意的是，创建的&nbsp;JAR&nbsp;文件包中需要包含完整的、与&nbsp;Java&nbsp;程序的包结构对应的目录结构，就像上例一样。而&nbsp;Main-Class&nbsp;指定的类，也必须是完整的、包含包路径的类名，如上例的&nbsp;test.Test；而且在没有打成&nbsp;JAR&nbsp;文件包之前可以使用&nbsp;java&nbsp;&lt;类名&gt;;&nbsp;来运行这个类，即在上例中&nbsp;java&nbsp;test.Test&nbsp;是可以正确运行的&nbsp;(当然要在&nbsp;CLASSPATH&nbsp;正确的情况下)。&nbsp; <br><br>3.&nbsp;jar&nbsp;命令详解&nbsp; <br><br>jar&nbsp;是随&nbsp;JDK&nbsp;安装的，在&nbsp;JDK&nbsp;安装目录下的&nbsp;bin&nbsp;目录中，Windows&nbsp;下文件名为&nbsp;jar.exe，Linux&nbsp;下文件名为&nbsp;jar。它的运行需要用到&nbsp;JDK&nbsp;安装目录下&nbsp;lib&nbsp;目录中的&nbsp;tools.jar&nbsp;文件。不过我们除了安装&nbsp;JDK&nbsp;什么也不需要做，因为&nbsp;SUN&nbsp;已经帮我们做好了。我们甚至不需要将&nbsp;tools.jar&nbsp;放到&nbsp;CLASSPATH&nbsp;中。&nbsp; <br><br>使用不带任何的&nbsp;jar&nbsp;命令我们可以看到&nbsp;jar&nbsp;命令的用法如下：&nbsp; <br><br>jar&nbsp;{ctxu}[vfm0M]&nbsp;[jar-文件]&nbsp;[manifest-文件]&nbsp;[-C&nbsp;目录]&nbsp;文件名&nbsp;...&nbsp; <br><br>其中&nbsp;{ctxu}&nbsp;是&nbsp;jar&nbsp;命令的子命令，每次&nbsp;jar&nbsp;命令只能包含&nbsp;ctxu&nbsp;中的一个，它们分别表示：&nbsp; <br><br>-c　创建新的&nbsp;JAR&nbsp;文件包&nbsp; <br><br>-t　列出&nbsp;JAR&nbsp;文件包的内容列表&nbsp; <br><br>-x　展开&nbsp;JAR&nbsp;文件包的指定文件或者所有文件&nbsp; <br><br>-u　更新已存在的&nbsp;JAR&nbsp;文件包&nbsp;(添加文件到&nbsp;JAR&nbsp;文件包中)&nbsp; <br><br>[vfm0M]&nbsp;中的选项可以任选，也可以不选，它们是&nbsp;jar&nbsp;命令的选项参数&nbsp; <br><br>-v　生成详细报告并打印到标准输出&nbsp; <br><br>-f　指定&nbsp;JAR&nbsp;文件名，通常这个参数是必须的&nbsp; <br><br>-m　指定需要包含的&nbsp;MANIFEST&nbsp;清单文件&nbsp; <br><br>-0　只存储，不压缩，这样产生的&nbsp;JAR&nbsp;文件包会比不用该参数产生的体积大，但速度更快&nbsp; <br><br>-M　不产生所有项的清单（MANIFEST〕文件，此参数会忽略&nbsp;-m&nbsp;参数&nbsp; <br><br>[jar-文件]&nbsp;即需要生成、查看、更新或者解开的&nbsp;JAR&nbsp;文件包，它是&nbsp;-f&nbsp;参数的附属参数&nbsp; <br><br>[manifest-文件]&nbsp;即&nbsp;MANIFEST&nbsp;清单文件，它是&nbsp;-m&nbsp;参数的附属参数&nbsp; <br><br>[-C&nbsp;目录]&nbsp;表示转到指定目录下去执行这个&nbsp;jar&nbsp;命令的操作。它相当于先使用&nbsp;cd&nbsp;命令转该目录下再执行不带&nbsp;-C&nbsp;参数的&nbsp;jar&nbsp;命令，它只能在创建和更新&nbsp;JAR&nbsp;文件包的时候可用。　　&nbsp; <br><br>文件名&nbsp;...&nbsp;指定一个文件/目录列表，这些文件/目录就是要添加到&nbsp;JAR&nbsp;文件包中的文件/目录。如果指定了目录，那么&nbsp;jar&nbsp;命令打包的时候会自动把该目录中的所有文件和子目录打入包中。&nbsp; <br><br>下面举一些例子来说明&nbsp;jar&nbsp;命令的用法：&nbsp; <br><br>1)&nbsp;jar&nbsp;cf&nbsp;test.jar&nbsp;test&nbsp; <br><br>该命令没有执行过程的显示，执行结果是在当前目录生成了&nbsp;test.jar&nbsp;文件。如果当前目录已经存在&nbsp;test.jar，那么该文件将被覆盖。&nbsp; <br><br>2)&nbsp;jar&nbsp;cvf&nbsp;test.jar&nbsp;test&nbsp; <br><br>该命令与上例中的结果相同，但是由于&nbsp;v&nbsp;参数的作用，显示出了打包过程，如下：&nbsp; <br><br>标明清单(manifest)&nbsp; <br><br>增加：test/(读入=&nbsp;0)&nbsp;(写出=&nbsp;0)(存储了&nbsp;0%)&nbsp; <br><br>增加：test/Test.class(读入=&nbsp;7)&nbsp;(写出=&nbsp;6)(压缩了&nbsp;14%)&nbsp; <br><br>3)&nbsp;jar&nbsp;cvfM&nbsp;test.jar&nbsp;test&nbsp; <br><br>该命令与&nbsp;2)&nbsp;结果类似，但在生成的&nbsp;test.jar&nbsp;中没有包含&nbsp;META-INF/MANIFEST&nbsp;文件，打包过程的信息也略有差别：&nbsp; <br><br>增加：test/(读入=&nbsp;0)&nbsp;(写出=&nbsp;0)(存储了&nbsp;0%)&nbsp; <br><br>增加：test/Test.class(读入=&nbsp;7)&nbsp;(写出=&nbsp;6)(压缩了&nbsp;14%)&nbsp; <br><br>4)&nbsp;jar&nbsp;cvfm&nbsp;test.jar&nbsp;manifest.mf&nbsp;test&nbsp; <br><br>运行结果与&nbsp;2)&nbsp;相似，显示信息也相同，只是生成&nbsp;JAR&nbsp;包中的&nbsp;META-INF/MANIFEST&nbsp;内容不同，是包含了&nbsp;manifest.mf&nbsp;的内容&nbsp; <br><br>5)&nbsp;jar&nbsp;tf&nbsp;test.jar&nbsp; <br><br>在&nbsp;test.jar&nbsp;已经存在的情况下，可以查看&nbsp;test.jar&nbsp;中的内容，如对于&nbsp;2)&nbsp;和&nbsp;3)&nbsp;生成的&nbsp;test.jar&nbsp;分别应该此命令，结果如下；&nbsp; <br><br>对于&nbsp;2)&nbsp; <br><br>META-INF/&nbsp; <br><br>META-INF/MANIFEST.MF&nbsp; <br><br>test/&nbsp; <br><br>test/Test.class&nbsp; <br><br>对于&nbsp;3)&nbsp; <br><br>test/&nbsp; <br><br>test/Test.class&nbsp; <br><br>6)&nbsp;jar&nbsp;tvf&nbsp;test.jar&nbsp; <br><br>除显示&nbsp;5)&nbsp;中显示的内容外，还包括包内文件的详细信息，如：&nbsp; <br><br>0&nbsp;Wed&nbsp;Jun&nbsp;19&nbsp;15:39:06&nbsp;GMT&nbsp;2002&nbsp;META-INF/&nbsp; <br><br>86&nbsp;Wed&nbsp;Jun&nbsp;19&nbsp;15:39:06&nbsp;GMT&nbsp;2002&nbsp;META-INF/MANIFEST.MF&nbsp; <br><br>0&nbsp;Wed&nbsp;Jun&nbsp;19&nbsp;15:33:04&nbsp;GMT&nbsp;2002&nbsp;test/&nbsp; <br><br>7&nbsp;Wed&nbsp;Jun&nbsp;19&nbsp;15:33:04&nbsp;GMT&nbsp;2002&nbsp;test/Test.class&nbsp; <br><br>7)&nbsp;jar&nbsp;xf&nbsp;test.jar&nbsp; <br><br>解开&nbsp;test.jar&nbsp;到当前目录，不显示任何信息，对于&nbsp;2)&nbsp;生成的&nbsp;test.jar，解开后的目录结构如下：&nbsp; <br><br>　　==&nbsp; <br><br>　　|--&nbsp;META-INF&nbsp; <br><br>　　|　&nbsp;`--&nbsp;MANIFEST&nbsp; <br><br>　　`--&nbsp;test&nbsp; <br><br>　　　　`--Test.class&nbsp; <br><br>8)&nbsp;jar&nbsp;xvf&nbsp;test.jar&nbsp; <br><br>运行结果与&nbsp;7)&nbsp;相同，对于解压过程有详细信息显示，如：&nbsp; <br><br>创建：META-INF/&nbsp; <br><br>展开：META-INF/MANIFEST.MF&nbsp; <br><br>创建：test/&nbsp; <br><br>展开：test/Test.class&nbsp; <br><br>9)&nbsp;jar&nbsp;uf&nbsp;test.jar&nbsp;manifest.mf&nbsp; <br><br>在&nbsp;test.jar&nbsp;中添加了文件&nbsp;manifest.mf，此使用&nbsp;jar&nbsp;tf&nbsp;来查看&nbsp;test.jar&nbsp;可以发现&nbsp;test.jar&nbsp;中比原来多了一个&nbsp;manifest。这里顺便提一下，如果使用&nbsp;-m&nbsp;参数并指定&nbsp;manifest.mf&nbsp;文件，那么&nbsp;manifest.mf&nbsp;是作为清单文件&nbsp;MANIFEST&nbsp;来使用的，它的内容会被添加到&nbsp;MANIFEST&nbsp;中；但是，如果作为一般文件添加到&nbsp;JAR&nbsp;文件包中，它跟一般文件无异。&nbsp; <br><br>10)&nbsp;jar&nbsp;uvf&nbsp;test.jar&nbsp;manifest.mf&nbsp; <br><br>与&nbsp;9)&nbsp;结果相同，同时有详细信息显示，如：&nbsp; <br><br>增加：manifest.mf(读入=&nbsp;17)&nbsp;(写出=&nbsp;19)(压缩了&nbsp;-11%)&nbsp; <br><br>4.&nbsp;关于&nbsp;JAR&nbsp;文件包的一些技巧&nbsp; <br><br>1)&nbsp;使用&nbsp;unzip&nbsp;来解压&nbsp;JAR&nbsp;文件&nbsp; <br><br>在介绍&nbsp;JAR&nbsp;文件的时候就已经说过了，JAR&nbsp;文件实际上就是&nbsp;ZIP&nbsp;文件，所以可以使用常见的一些解压&nbsp;ZIP&nbsp;文件的工具来解压&nbsp;JAR&nbsp;文件，如&nbsp;Windows&nbsp;下的&nbsp;WinZip、WinRAR&nbsp;等和&nbsp;Linux&nbsp;下的&nbsp;unzip&nbsp;等。使用&nbsp;WinZip&nbsp;和&nbsp;WinRAR&nbsp;等来解压是因为它们解压比较直观，方便。而使用&nbsp;unzip，则是因为它解压时可以使用&nbsp;-d&nbsp;参数指定目标目录。&nbsp; <br><br>在解压一个&nbsp;JAR&nbsp;文件的时候是不能使用&nbsp;jar&nbsp;的&nbsp;-C&nbsp;参数来指定解压的目标的，因为&nbsp;-C&nbsp;参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具&nbsp;JAR&nbsp;文件拷贝到目标目录下，再进行解压，比较麻烦。如果使用&nbsp;unzip，就不需要这么麻烦了，只需要指定一个&nbsp;-d&nbsp;参数即可。如：&nbsp; <br><br>unzip&nbsp;test.jar&nbsp;-d&nbsp;dest/&nbsp; <br><br>2)&nbsp;使用&nbsp;WinZip&nbsp;或者&nbsp;WinRAR&nbsp;等工具创建&nbsp;JAR&nbsp;文件&nbsp; <br><br>上面提到&nbsp;JAR&nbsp;文件就是包含了&nbsp;META-INF/MANIFEST&nbsp;的&nbsp;ZIP&nbsp;文件，所以，只需要使用&nbsp;WinZip、WinRAR&nbsp;等工具创建所需要&nbsp;ZIP&nbsp;压缩包，再往这个&nbsp;ZIP&nbsp;压缩包中添加一个包含&nbsp;MANIFEST&nbsp;文件的&nbsp;META-INF&nbsp;目录即可。对于使用&nbsp;jar&nbsp;命令的&nbsp;-m&nbsp;参数指定清单文件的情况，只需要将这个&nbsp;MANIFEST&nbsp;按需要修改即可。&nbsp; <br><br>3)&nbsp;使用&nbsp;jar&nbsp;命令创建&nbsp;ZIP&nbsp;文件&nbsp; <br><br>有些&nbsp;Linux&nbsp;下提供了&nbsp;unzip&nbsp;命令，但没有&nbsp;zip&nbsp;命令，所以需要可以对&nbsp;ZIP&nbsp;文件进行解压，即不能创建&nbsp;ZIP&nbsp;文件。如要创建一个&nbsp;ZIP&nbsp;文件，使用带&nbsp;-M&nbsp;参数的&nbsp;jar&nbsp;命令即可，因为&nbsp;-M&nbsp;参数表示制作&nbsp;JAR&nbsp;包的时候不添加&nbsp;MANIFEST&nbsp;清单，那么只需要在指定目标&nbsp;JAR&nbsp;文件的地方将&nbsp;.jar&nbsp;扩展名改为&nbsp;.zip&nbsp;扩展名，创建的就是一个不折不扣的&nbsp;ZIP&nbsp;文件了，如将上一节的第&nbsp;3)&nbsp;个例子略作改动：&nbsp; <br><br>jar&nbsp;cvfM&nbsp;test.zip&nbsp;test<br></span></span>
<img src ="http://www.blogjava.net/byterat/aggbug/109970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-04-11 18:19 <a href="http://www.blogjava.net/byterat/archive/2007/04/11/109970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java与路径!</title><link>http://www.blogjava.net/byterat/archive/2007/04/04/108473.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 04 Apr 2007 08:49:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/04/04/108473.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/108473.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/04/04/108473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/108473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/108473.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.File;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_40_789_Open_Image onclick="this.style.display='none'; Codehighlighter1_40_789_Open_Text.style.display='none'; Codehighlighter1_40_789_Closed_Image.style.display='inline'; Codehighlighter1_40_789_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_40_789_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_40_789_Closed_Text.style.display='none'; Codehighlighter1_40_789_Open_Image.style.display='inline'; Codehighlighter1_40_789_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;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Test&nbsp;</span><span id=Codehighlighter1_40_789_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_40_789_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_82_787_Open_Image onclick="this.style.display='none'; Codehighlighter1_82_787_Open_Text.style.display='none'; Codehighlighter1_82_787_Closed_Image.style.display='inline'; Codehighlighter1_82_787_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_82_787_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_82_787_Closed_Text.style.display='none'; Codehighlighter1_82_787_Open_Image.style.display='inline'; Codehighlighter1_82_787_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id=Codehighlighter1_82_787_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_82_787_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">Thread.currentThread().getContextClassLoader().getResource(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">2:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">Test.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.getClassLoader().getResource(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">3:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">ClassLoader.getSystemResource(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">4:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">Test.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.getResource(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">5:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">Test.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.getResource(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Class文件所在路径&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">6:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #0000ff"><font color=#000000>new File("").getAbsolutePath()</font></span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">7:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">System.getProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">user.dir</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ClassLoader.getSystemResource(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">).getPath();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s.substring(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s.substring(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">).substring(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;s.lastIndexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/classes</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/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<img src ="http://www.blogjava.net/byterat/aggbug/108473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-04-04 16:49 <a href="http://www.blogjava.net/byterat/archive/2007/04/04/108473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dom4j 直接往Element中加入符合格式的xml串!</title><link>http://www.blogjava.net/byterat/archive/2007/03/27/106692.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Tue, 27 Mar 2007 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/03/27/106692.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/106692.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/03/27/106692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/106692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/106692.html</trackback:ping><description><![CDATA[
		<font face="Courier New">
				<font size="2">
						<strong>dom4j 直接往Element中加入符合格式的xml串!</strong>
						<br />
						<br />下面的代码直接往root元素插入符合格式的xml串:<br /><br /><font style="BACKGROUND-COLOR: #ffffff" color="#0000ff">String strXml = "&lt;aaa&gt;&lt;bbb&gt;&lt;/bbb&gt;&lt;ccc&gt;&lt;/ccc&gt;&lt;/aaa&gt;";<br />Document doc = DocumentHelper.createDocument();<br />Element  root = doc.getRootElement();<br />root.add(DocumentHelper.parseText(strXml).getRootElement());</font></font>
		</font>
<img src ="http://www.blogjava.net/byterat/aggbug/106692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-03-27 16:20 <a href="http://www.blogjava.net/byterat/archive/2007/03/27/106692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java返回执行时间的方法</title><link>http://www.blogjava.net/byterat/archive/2007/03/27/106674.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Tue, 27 Mar 2007 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/03/27/106674.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/106674.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/03/27/106674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/106674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/106674.html</trackback:ping><description><![CDATA[ public long <font color="red">algo()</font>{<br />    int a = 0;<br />    String b = null;<br />    long st = System.currentTimeMillis();<br />    for (int i = 0; i &lt; 2000000; i++){<br />      b = Integer.toString(a);<br />    }<br />    long et = System.currentTimeMillis();<br />    return (et - st);<br />  }<img src ="http://www.blogjava.net/byterat/aggbug/106674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-03-27 15:11 <a href="http://www.blogjava.net/byterat/archive/2007/03/27/106674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)玩转 XPath 和缺省命名空间（Default Namespaces）</title><link>http://www.blogjava.net/byterat/archive/2007/03/21/105172.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 21 Mar 2007 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2007/03/21/105172.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/105172.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2007/03/21/105172.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/105172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/105172.html</trackback:ping><description><![CDATA[
		<p>
				<strong>玩转 XPath 和缺省命名空间（Default Namespaces）</strong>
				<br />
				<br />
				<font face="Courier New" size="2">原文出自:http://www.edankert.com/defaultnamespaces.html<br />翻译文出自:http://wakan.blog.51cto.com/blog/59583/7220</font>
				<br />
				<br />
				<br />
				<font face="Courier New" size="2">诸如“为什么用 XPath 的表达式进行查询，却没有返回所期望的结果？”的问题通常都与命名空间（NameSpace）有关，而且绝大多数是与缺省命名空间（Default Namespace）有关。本文试图解释这个问题并针对三种流行的 XPath 实现给出解决方法：Jaxen、JAXP XPPathFactory 以及 XSLT。<br />内容列表<br />问题描述 <br />“前缀－命名空间”映射 <br />Jaxen 和 Dom4J <br />Jaxen 和 XOM <br />Jaxen 和 JDOM <br />JAXP XPathFactory <br />XSLT <br />结束语 <br />资源 </font>
		</p>
		<p>
				<br />
				<font face="Courier New" size="2">问题描述<br />看下述 XML: <br />&lt;catalog&gt;<br />  &lt;cd&gt;<br />    &lt;artist&gt;Sufjan Stevens&lt;/artist&gt; <br />    &lt;title&gt;Illinois&lt;/title&gt; <br />    &lt;src&gt;http://www.sufjan.com/&lt;/src&gt; <br />  &lt;/cd&gt; <br />  &lt;cd&gt; <br />    &lt;artist&gt;Stoat&lt;/artist&gt; <br />    &lt;title&gt;Future come and get me&lt;/title&gt;<br />    &lt;src&gt;http://www.stoatmusic.com/&lt;/src&gt; <br />  &lt;/cd&gt; <br />  &lt;cd&gt; <br />    &lt;artist&gt;The White Stripes&lt;/artist&gt; <br />    &lt;title&gt;Get behind me satan&lt;/title&gt; <br />    &lt;src&gt;http://www.whitestripes.com/&lt;/src&gt; <br />  &lt;/cd&gt; <br />&lt;/catalog&gt; </font>
		</p>
		<p>
				<font face="Courier New" size="2">    你可以使用“//cd”来得到没有在任何命名空间中定义的“cd”节点。  </font>
		</p>
		<p>
				<br />
				<font face="Courier New" size="2">    现在让我们来改造这个 XML，让它的所有元素都属于 'http://www.edankert.com/examples/' 命名空间中。<br /> <br />    为了避免在每个不同的元素前都要加个前缀，我们在根元素上定义通常所说的缺省命名空间。改造后的 XML 如下： <br /> <br />&lt;catalog xmlns="</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">"&gt;<br />  &lt;cd&gt; <br />    &lt;artist&gt;Sufjan Stevens&lt;/artist&gt; <br />    &lt;title&gt;Illinois&lt;/title&gt; <br />    &lt;src&gt;http://www.sufjan.com/&lt;/src&gt; <br />  &lt;/cd&gt; <br />  &lt;cd&gt; <br />    &lt;artist&gt;Stoat&lt;/artist&gt; <br />    &lt;title&gt;Future come and get me&lt;/title&gt; <br />    &lt;src&gt;http://www.stoatmusic.com/&lt;/src&gt; <br />  &lt;/cd&gt; <br />  &lt;cd&gt; <br />    &lt;artist&gt;The White Stripes&lt;/artist&gt; <br />    &lt;title&gt;Get behind me satan&lt;/title&gt; <br />    &lt;src&gt;http://www.whitestripes.com/&lt;/src&gt; <br />  &lt;/cd&gt; <br />&lt;/catalog&gt; </font>
		</p>
		<p>
				<font face="Courier New" size="2">    当我们使用与上文相同的 XPath “//cd”，将得不到任何元素。这是因为指定的 XPath 返回的是所有不属于任何命名空间的“cd”节点，而本例中，所有的“cd”元素都属于缺省的命名空间“http://www.edankert.com/examples/”。 </font>
		</p>
		<p>
				<br />
				<font face="Courier New" size="2">“前缀－命名空间”映射<br />    为了取出命名空间“http://www.edankert.com/examples/”中的所有“cd”元素，我们需要对 XPath 表达式做一些额外的工作。 <br /> <br />    为了解决这个问题，XPath 规范允许我们使用 QName 来指定元素或者属性。QName 可以是元素的直接名称（形如“element”），或者包含一个前缀（形如“pre:element”）。这个前缀需要映射到一个命名空间的 URI 上。例如，如果把“pre”前缀映射到“http://www.edankert.com/test”上，则通过“pre:element”可以查找出属于命名空间“http://www.edankert.com/test”的所有 “element”元素。<br /> <br />    在本例中，我们把“edx”映射到“'http://www.edankert.com/examples/”命名空间上。通过 XPath“//edx:cd”就可以查找出属于“'http://www.edankert.com/examples/”命名空间的所有“cd”元素。  <br /> <br />    XPath 处理器允许设置“前缀－命名空间”的映射，但是，如何去映射，却要依赖于具体的实现。下文举例说明 Jaxen (JDOM/dom4j/XOM)、JAXP 以及 XSLT 中是如何进行“前缀－命名空间”的映射的。</font>
		</p>
		<p>
				<font face="Courier New" size="2">Jaxen 和 Dom4J<br />    下述代码从文件系统读入一个 XML 文件到 org.dom4j.Document 对象中，并且在 Document 中查找属于“http://www.edankert.com/examples/”命名空间的所有“cd”元素。<br /> <br />try {<br />  SAXReader reader = new SAXReader();<br />  Document document = reader.read( "file:catalog.xml");<br />  <br />  HashMap map = new HashMap();<br />  map.put( "edx", "</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">");<br />  <br />  XPath xpath = new Dom4jXPath( "//edx:cd");<br />  xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />  <br />  List nodes = xpath.selectNodes( document);<br />  <br />  ...<br />  <br />} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( DocumentException e) {<br />  // the document is not well-formed.<br />  ...<br />}<br />    第一步，创建一个 SAXReader，用来从文件系统中读取“catalog.xml”并创建一个特定于 Dom4j 的 Document 对象。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">    第二步，对于所有 Jaxen 实现都一样，就是创建一个 HashMap 对象，用于保存“前缀－命名空间的 URI”的映射。<br /> <br />    为了能通过 Dom4j 使用 Jaxen 的 XPath 功能，需要创建一个与 Dom4j 相关的 XPath 对象：Dom4jXPath。创建方法是把 XPath 的表达式（即“//edx:cd”）传给 Dom4jXPath 的构造方法。<br /> <br />    现在，我们已经创建了 XPath 对象，接下来可以把“前缀－命名空间”的映射表传递给 XPath 引擎：把这个 HashMap 映射表用 SimpleNamespaceContext 包装起来。SimpleNamespaceContext 是 Jaxen 的 NamespaceContext 接口的默认实现类。 <br /> <br />    最后一步就是调用 XPath 对象的 selectNodes() 方法进行查找。并把完整的 Dom4j  Document 对象作为参数传递进去。实际上，Document 中的任何结点都可以作为参数。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">Jaxen 和 XOM<br />    XOM 是基于简单的 Java DOM APIs 之上的最新工具，它的设计初衷是提供简单和易学易用的接口。 <br /> <br />try {<br />  Builder builder = new Builder();<br />  Document document = builder.build( "file:catalog.xml");<br />  <br />  HashMap map = new HashMap();<br />  map.put( "edx", "</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">");<br />  <br />  XPath xpath = new XOMXPath( "//edx:cd");<br />  xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />  <br />  List nodes = xpath.selectNodes( document);<br />  <br />  ...<br />  <br />} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( IOException e) {<br />  // An error occurred opening the document<br />  ...<br />} catch ( ParsingException e) {<br />  // An error occurred parsing the document<br />  ...<br />}</font>
		</p>
		<p>
				<font face="Courier New" size="2"> <br />    我们需要创建一个 Builder 对象，从文件系统中读取“catalog.xml”文件，并创建出与 XOM 相关的 Document 对象。 <br /> <br />    下一步创建出包含了“前缀－命名空间”映射关系的 HashMap 对象。 <br /> <br />    我们需要创建一个特定于 XOM 的 XPath 对象：XOMXPath。创建方法是把 XPath 表达式传递给构造方法，然后就可以通过 XOM 使用 Jaxen 的 XPath 功能了。 <br /> <br />    创建完 XPath 对象后，同样，我们把“前缀－命名空间”的映射表用 SimpleNamespaceContext 对象封装后，传递给 XPath 引擎。 <br /> <br />    最后调用 XPath 对象的“selectNodes()”方法进行查找，把 XOM Document 对象作为本方法的参数。 <br />Jaxen 和 JDOM<br />    JDOM 是第一个提供简单的 XML 访问 API 的工具。 <br /> <br />try {<br />  SAXBuilder builder = new SAXBuilder();<br />  Document document = builder.build( "file:catalog.xml");<br />  <br />  HashMap map = new HashMap();<br />  map.put( "edx", "</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">");<br />  <br />  XPath xpath = new JDOMXPath( "//edx:cd");<br />  xpath.setNamespaceContext( new SimpleNamespaceContext( map));<br />  <br />  List nodes = xpath.selectNodes( document);<br />  <br />  ...<br />  <br />} catch ( JaxenException e) { // An error occurred parsing or executing the XPath ... } catch ( IOException e) {<br />  // An error occurred opening the document<br />  ...<br />} catch ( JDOMException e) {<br />  // An error occurred parsing the document<br />  ...<br />}</font>
		</p>
		<p>
				<font face="Courier New" size="2"> <br />    首先，通过 SAXBuilder 创建了一个特定于 JDom 的 Document 对象。 <br /> <br />    接着创建一个特定于 JDOM 的 XPath 对象：JDOMXPath。<br /> <br />    然后，把“前缀－命名空间”的映射表（HashMap）用 SimpleNamespaceContext 对象封装起来，传递给 XPath 引擎。 <br /> <br />    最后调用 XPath 对象的“selectNodes()”方法来进行查找，并把 JDOM 的 Document 对象作为本方法的输入参数。 <br />JAXP XPathFactory<br />    从 1.3 版起， JAXP 还提供了一种在 XML Object Models 上进行查询的通用机制。 <br /> <br />try {<br /> DocumentBuilderFactory domFactory =DocumentBuilderFactory.newInstance();<br />  domFactory.setNamespaceAware( true);<br />  <br /> DocumentBuilder builder = domFactory.newDocumentBuilder();Document document = builder.parse( new InputSource( "file:catalog.xml"));<br />  <br /> XPathFactory factory =XPathFactory.newInstance();<br /> XPath xpath = factory.newXPath();<br />  xpath.setNamespaceContext( new NamespaceContext() {<br />    public String getNamespaceURI(String prefix) {<br />      if ( prefix.equals( "edx")) {<br />        return "</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">";<br />      } else if ... <br />        ...<br />      }<br />      <br />      return XPathConstants.NULL_NS_URI;<br />    }<br />  <br />    public String getPrefix(String namespaceURI) {<br />      if ( namespaceURI.equals( "</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">")) {<br />        return "edx";<br />      } else if ... <br />        ...<br />      }  <br />    <br />      return null;<br />    }<br />  <br />    public Iterator getPrefixes(String namespaceURI) {<br />     ArrayList list = new ArrayList();<br />    <br />      if ( namespaceURI.equals( "</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">")) {<br />        list.add( "edx");<br />      } else if ... <br />        ...<br />      }<br />    <br />      return list.iterator();<br />    }<br />  });<br />  <br /> Object nodes = xpath.evaluate( "//edx:cd", document.getDocumentElement(), <br />                                XPathConstants.NODESET);<br />  <br />  ...<br />  <br />} catch (ParserConfigurationException e) {<br />  ...<br />} catch (XPathExpressionException e) {<br />  ...<br />} catch (SAXException e) {<br />  ...<br />} catch (IOException e) {<br />  ...<br />}</font>
		</p>
		<p>
				<font face="Courier New" size="2">    首先用 JAXP 的 DocumentBuilderFactory 创建一个org.w3c.dom.Document 对象，确保启用了 namespace 处理功能。 <br /> <br />    现在可以通过 XPathFactory 来创建 XPath 对象，并通过 XPath 对象对文档进行查询。<br /> <br />    为了创建“前缀－命名空间”映射并传递给 XPath 引擎，我们需要实现 NamespaceContext 接口，该接口目前还没有默认实现类。这就意味着要实现 getNamespaceURI、getPrefix 和getPrefixes 方法，并确保这些方法能返回正确的值，包括“xmlns”和“xml”前缀所对应的命名空间的 URI 值。 <br /> <br />    把我们自己实现的 NamespaceContext 对象传递给 XPath 引擎后，就可以通过 evaluate 方法来查询 XPath 表达式所对应的元素：使用上文中提到的 XPath 表达式，并使用 Document 的根节点作为输入入参数，并接收一个 NodeList 对象作为返回结果。 <br />XSLT<br />    XPath 设计的初衷是用于 XSLT。这也许能解释“为什么在 XSLT 中定义命名空间的前缀是一件很平常的事”（也许因为 XSLT 也是一个 XML 名词的缘故吧）。 <br /> <br />&lt;xsl:stylesheet version="1.1" xmlns:xsl="</font>
				<a href="http://www.w3.org/1999/XSL/Transform">
						<font face="Courier New" size="2">http://www.w3.org/1999/XSL/Transform</font>
				</a>
				<font face="Courier New" size="2">"&gt;<br />  &lt;xsl:template match="//edx:cd" xmlns:edx="</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">"&gt;<br />    &lt;xsl:apply-templates/&gt;<br />  &lt;/xsl:template&gt;<br />&lt;/xsl:stylesheet&gt;<br /> <br />    只需要使用 XML 本身的机制，简单地为 edx 前缀赋予一个命名空间的 URI 值。 <br /> <br />    通过与我们的 XPath 表达式“//edx:cd”相匹配的 xsl:template，能得到与上文其他例子相同的输出结果。 </font>
		</p>
		<p>
				<font face="Courier New" size="2">结束语<br />    为了在（缺省）命名空间上使用 XPath 表达式，我们需要指定一个“前缀－命名空间”映射。正如我们所看到的，具体使用什么样的前缀名称，是无关紧要的。 <br /> <br />    同样的方法，也可以用于查询那些用其他前缀修饰的元素。这意味着上面的例子对下述 XML 也有效。下述 XML 没有使用缺省命名空间，而是使用了 examples 作命名空间的前缀： <br /> <br />&lt;examples:catalog xmlns:examples="</font>
				<a href="http://www.edankert.com/examples/">
						<font face="Courier New" size="2">http://www.edankert.com/examples/</font>
				</a>
				<font face="Courier New" size="2">"&gt;<br />  &lt;examples:cd&gt;<br />    &lt;examples:artist&gt;Sufjan Stevens&lt;/examples:artist&gt;<br />    &lt;examples:title&gt;Illinois&lt;/examples:title&gt;<br />    &lt;examples:src&gt;http://www.sufjan.com/&lt;/examples:src&gt;<br />  &lt;/examples:cd&gt;<br />  &lt;examples:cd&gt;<br />    &lt;examples:artist&gt;Stoat&lt;/examples:artist&gt;<br />    &lt;examples:title&gt;Future come and get me&lt;/examples:title&gt;<br />    &lt;examples:src&gt;http://www.stoatmusic.com/&lt;/examples:src&gt;<br />  &lt;/examples:cd&gt;<br />  &lt;examples:cd&gt;<br />    &lt;examples:artist&gt;The White Stripes&lt;/examples:artist&gt;<br />    &lt;examples:title&gt;Get behind me satan&lt;/examples:title&gt;<br />    &lt;examples:src&gt;http://www.whitestripes.com/&lt;/examples:src&gt;<br />  &lt;/examples:cd&gt;<br />&lt;/examples:catalog&gt;</font>
		</p>
		<p>
				<font face="Courier New" size="2"> <br />    使用“//edx:cd”作为 XPath 表达式，使用与前文例子相同的“前缀－命名空间”映射，在这个 XML 上同样能查询出属于“http://www.edankert.com/examples/”命名空间的所有“cd”元素。 <br />资源<br />Extensible Markup Language (XML) 1.0 (Third Edition)<br /></font>
				<a href="http://www.w3.org/TR/REC-xml/">
						<font face="Courier New" size="2">http://www.w3.org/TR/REC-xml/</font>
				</a>
				<font face="Courier New" size="2">
						<br />Namespaces in XML<br /></font>
				<a href="http://www.w3.org/TR/REC-xml-names/">
						<font face="Courier New" size="2">http://www.w3.org/TR/REC-xml-names/</font>
				</a>
				<font face="Courier New" size="2">
						<br />XML Path Language (XPath) Version 1.0<br /></font>
				<a href="http://www.w3.org/TR/xpath">
						<font face="Courier New" size="2">http://www.w3.org/TR/xpath</font>
				</a>
				<font face="Courier New" size="2">
						<br />XSL Transformations (XSLT) Version 1.0<br /></font>
				<a href="http://www.w3.org/TR/xslt">
						<font face="Courier New" size="2">http://www.w3.org/TR/xslt</font>
				</a>
				<font face="Courier New" size="2">
						<br />dom4j<br /></font>
				<a href="http://www.dom4j.org/">
						<font face="Courier New" size="2">http://www.dom4j.org/</font>
				</a>
				<font face="Courier New" size="2">
						<br />XOM<br /></font>
				<a href="http://www.xom.nu/">
						<font face="Courier New" size="2">http://www.xom.nu/</font>
				</a>
				<font face="Courier New" size="2">
						<br />JDOM<br /></font>
				<a href="http://www.jdom.org/">
						<font face="Courier New" size="2">http://www.jdom.org/</font>
				</a>
				<font face="Courier New" size="2">
						<br />Jaxen<br /></font>
				<a href="http://www.jaxen.org/">
						<font face="Courier New" size="2">http://www.jaxen.org/</font>
				</a>
				<font face="Courier New" size="2">
						<br />Java 5.0<br /></font>
				<a href="http://java.sun.com/j2se/1.5.0/">
						<font face="Courier New" size="2">http://java.sun.com/j2se/1.5.0/</font>
				</a>
				<font face="Courier New" size="2">
				</font>
		</p>
<img src ="http://www.blogjava.net/byterat/aggbug/105172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2007-03-21 10:13 <a href="http://www.blogjava.net/byterat/archive/2007/03/21/105172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Eclipse中常用的快捷键</title><link>http://www.blogjava.net/byterat/archive/2006/12/19/88734.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Tue, 19 Dec 2006 04:18:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/12/19/88734.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/88734.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/12/19/88734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/88734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/88734.html</trackback:ping><description><![CDATA[
		<span class="tpc_content">
				<font face="Courier New" size="2">Eclipse中常用的快捷键(最经典的快捷键,就不用多说了)<br /><br />Ctrl+D: 删除当前行     <br /><br />Ctrl+Alt+↓ 复制当前行到下一行(复制增加)<br /><br />Ctrl+Alt+↑ 复制当前行到上一行(复制增加)<br /><br />Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)<br /><br />Alt+↑   当前行和上面一行交互位置(同上)<br /><br />Alt+← 前一个编辑的页面<br /><br />Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)<br /><br />Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性<br /><br />Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)<br /><br />Shift+Ctrl+Enter 在当前行插入空行(原理同上条)<br /><br />Ctrl+Q   定位到最后编辑的地方<br /><br />Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)<br /><br />Ctrl+M 最大化当前的Edit或View (再按则反之)<br /><br />Ctrl+/   注释当前行,再按则取消注释<br /><br />Ctrl+O   快速显示 OutLine<br /><br />Ctrl+T   快速显示当前类的继承结构<br /><br />Ctrl+W 关闭当前Editer<br /><br />Ctrl+K   参照选中的Word快速定位到下一个<br /><br />Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)<br /><br />Ctrl+/(小键盘) 折叠当前类中的所有代码<br /><br />Ctrl+×(小键盘) 展开当前类中的所有代码<br /><br />Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)<br /><br />Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)<br /><br />Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)<br /><br />Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)<br /><br />Ctrl+Shift+F4 关闭所有打开的Editer<br /><br />Ctrl+Shift+X   把当前选中的文本全部变味小写<br /><br />Ctrl+Shift+Y   把当前选中的文本全部变为小写<br /><br />Ctrl+Shift+F 格式化当前代码<br /><br />Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)<br /><br />下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)<br /><br />Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)<br /><br />Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)<br /><br />Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)<br /><br />Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)<br /><br />Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)<br /><br />Alt+Shift+I 合并变量(可能这样说有点不妥Inline) <br /><br />Alt+Shift+V 移动函数和变量(不怎么常用)<br /><br />Alt+Shift+Z 重构的后悔药(Undo)<br /><br />Ctrl+Shift+U 选择选中的文字后非常类似于UE的列表查询<br /><br /><br />Eclipse启动参数大全 - -<br />                          <br />Eclipse 运行命令行参数大全 <br />包括英文版本和中文版本两种的说明, 特别需要值得一提的是那个 -nl 参数, 可以指定程序启动时所使用的语言. 例如:<br />eclipse -nl en_US<br />将启动英文语言, 这个特性在安装了国际化语言包以后特别有用, 可以方便的切换各个语言的版本. 注意 IBM WSAD v5.1 也支持这个功能. <br /><br />运行 Eclipse<br />将 Eclipse 驱动程序安装（解压缩）到某个目录（例如，c:\eclipse）中之后，通过运行顶级安装目录中的 Eclipse 可执行文件来启动"工作台"。在 Windows 系统上，该可执行文件称为 eclipse.exe，而在 Linux 系统上称为 eclipse。注意：下列讨论描述 Windows 系统上的设置。Linux 上的设置是相似的。<br /><br />如果您没有另行指定，则平台将缺省工作区目录创建为可执行文件的兄弟目录（例如 c:\eclipse\workspace）。此工作区目录用作项目的缺省内容区，还用于保存任何必需的元数据。要进行共享安装或多工作区安装，应明确指出工作区的位置而不是使用缺省值。有两种控制工作区位置的方法：使用当前工作目录或使用 -data 命令行自变量。<br /><br />将工作区位置设置为在当前工作目录内<br />在此方案中，工作区位置将是当前工作目录中称为 workspace 的目录。<br /><br />实现此目的最容易的方法可能是使用下列步骤来创建快捷方式：<br /><br />导航到 Windows 资源管理器中的 eclipse.exe 并使用右键拖动来创建 eclipse.exe 的快捷方式。 <br />编辑快捷方式的属性，以使启动位置：字段标识工作区位置的父目录（例如，c:\users\robert）。 <br />关闭属性对话框并双击快捷方式（如果提供的目录为 c:\users\robert，则工作区位置将为 c:\users\robert\workspace）。 <br />当然，您也可以使用命令提示符（通过将目录切换为工作区父目录然后运行 eclipse.exe）来获得同样的效果。<br /><br />使用 -data 设置工作区的特定位置<br />要使用 -data 命令行自变量，只要将 -data your_workspace_location（例如，-data c:\users\robert\myworkspace）添加至快捷方式属性中的目标字段或显式地将它包括在命令行上。<br /><br />使用 -vm 设置 java VM<br />建议显式指定在运行 Eclipse 时要使用哪个 Java VM。使用 -vm 命令行自变量（例如，-vm c:\jre\bin\javaw.exe）可以实现此目的。如果不使用 -vm，则 Eclipse 将使用在 O/S 路径上找到的一个 Java VM。当安装其它产品时，它们可更改您的路径，导致在下一次启动 Eclipse 时使用另一 Java VM。<br /><br />运行 Eclipse 中的高级主题<br />Eclipse 可执行文件及平台本身提供了人们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。运行 Eclipse 可执行文件的一般格式是：<br /><br />eclipse [platform options] [-vmargs [Java VM arguments]]<br />Eclipse 启动参数 命令 描述 原因 <br />-arch architecture<br />定义 Eclipse 平台在其上运行的处理器体系结构。Eclipse 平台通常使用 Java os.arch 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOSArch() 用于插件。示例值有："x86"、"sparc"、"PA-RISC"和"ppc"。 2.0 <br />-application applicationId<br />要运行的应用程序。应用程序由向 org.eclipse.core.runtime.applications 扩展点提供扩展的插件来声明。通常不需要此自变量。如果指定了此项，则该值会覆盖配置提供的值。如果不指定此项，则会运行"Eclipse 工作台"。 1.0 <br />-boot bootJarURL<br />（建议不使用；用 -configuration 代替；支持 1.0 兼容）。Eclipse 平台的引导插件代码（boot.jar）的位置，表示为 URL。如果指定此项，则会用它来为装入 Eclipse 平台引导程序类装入器的类装入器设置类路径。仅当更改 startup.jar 和 boot.jar 的相对位置时才需要它。注意，不允许使用相对 URL。 *1.0 <br />-classloaderproperties [file]<br />如果指定的话，则使用给定位置处的类装入器属性文件来激活平台类类装入器增强。文件自变量可以是文件路径或 URL。注意，不允许使用相对 URL。单击此处以获得更多详细信息。 2.0.2 <br />-configuration configurationFileURL<br />Eclipse 平台配置文件的位置，表示为 URL。配置文件确定 Eclipse 平台、可用插件集和主要功能部件的位置。注意，不允许使用相对 URL。当安装或更新 Eclipse 平台时配置文件被写至此位置。 2.0 <br />-consolelog<br />将 Eclipse 平台的错误日志镜像到用来运行 Eclipse 的控制台。与 -debug 组合时很方便使用。 1.0 <br />-data workspacePath<br />要运行 Eclipse 平台的工作区的路径。工作区位置也是项目的缺省位置。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <br />-debug [optionsFile]<br />将平台置于调试方式，并从给定位置处的文件装入调试选项（如果指定的话）。此文件指示哪些调试点可用于插件以及是否已启用它们。如果未给出文件位置，则平台在启动 eclipse 的目录中查找称为".options"的文件。URL 和文件系统路径都可作为文件位置。 1.0 <br />-dev [classpathEntries]<br />将平台置于开发方式。将可选类路径条目（用逗号分隔的列表）添加至每个插件的运行时类路径。例如，当工作区包含要开发的插件时，指定 -dev bin 会为每个插件项目的名为 bin 的目录添加类路径条目，允许在其中存储最新生成的类文件。除去了冗余或不存在的类路径条目。 1.0 <br />-endsplash params<br />用于在 Eclipse 平台启动并运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <br />-feature featureId<br />主要功能部件的标识。主要功能部件为 Eclipse 的已启动实例提供了产品个性，并确定使用的产品定制信息。 2.0 <br />-keyring keyringFilePath<br />磁盘上授权数据库（或"密钥环"文件）的位置。此自变量必须与 -password 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <br />-nl locale<br />定义 Eclipse 平台在其上运行的语言环境的名称。Eclipse 平台通常自动计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getNL() 用于插件。示例值有："en_US"和"fr_FR_EURO"。 2.0 <br />-nolazyregistrycacheloading<br />取消激活装入优化的平台插件注册表高速缓存。缺省情况下，仅当需要时才从注册表高速缓存（可用时）中装入扩展的配置元素，以减少内存占用。此选项将在启动时强制完全装入注册表高速缓存。 2.1 <br />-noregistrycache<br />绕过读写内部插件注册表高速缓存文件。 2.0 <br />-nosplash<br />运行平台而不显示闪屏。 1.0 <br />-os operatingSystem<br />定义 Eclipse 平台在其上运行的操作系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOS() 用于插件，并用于解析插件清单文件中提及的路径中 $os$ 变量的出现。示例值有："win32"、"linux"、"hpux"、"solaris"和"aix"。 1.0 <br />-password password<br />授权数据库的密码。与 -keyring 选项配合使用。 1.0 <br />-perspective perspectiveId<br />启动时要在活动工作台窗口中打开的透视图。如果没有指定该参数，则将打开关闭时活动的透视图。 1.0 <br />-plugincustomization   propertiesFile<br />包含插件首选项缺省设置的属性文件的位置。这些缺省设置覆盖在主要功能部件中指定的缺省设置。相对于从中启动 eclipse 的目录来解释相对路径。 2.0 <br />-plugins pluginsFileURL<br />（建议不使用；用 -configuration 代替；支持 1.0 兼容）。 指定 Eclipse 平台查找插件的文件的位置，表示为 URL。该文件为属性文件格式，其中键是任意用户定义名称，值是指向 plugin.xml 文件的显式路径或指向包含插件的目录的路径的用逗号分隔的列表。注意，不允许使用相对 URL。如果指定此项，则此选项会导致创建适当的临时配置。 *1.0 <br />-refresh <br />启动时执行工作区的全局刷新的选项。这将使从上次平台运行以来在文件系统中所做的任何更改一致。 1.0 <br />-showlocation <br />用于在窗口标题栏中显示工作区的位置的选项。在发行版 2.0 中，此选项仅与 -data 命令行自变量一起使用。 2.0 <br />-showsplash params<br />用于显示闪屏（由可执行的 Eclipse 平台启动器执行）的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <br />-vm vmPath<br />要用来运行 Eclipse 平台的"Java 运行时环境"（JRE）的位置。如果不指定此项，则 JRE 位于 jre（它是 Eclipse 可执行文件的兄弟目录）。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <br />-ws windowSystem<br />定义 Eclipse 平台在其上运行的 Windows 系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getWS() 用于插件、用于配置 SWT 以及用于解析插件清单文件中提及的路径中 $ws$ 变量的出现。示例值有："win32"、"motif"和"gtk"。 1.0 <br /><br />将 -vmargs 条目后面的所有自变量（但不包括 -vmargs）作为虚拟机自变量（即，在要运行的类的前面）直接传递到所指示的 Java VM。注意：如果 Eclipse 启动在 Java vm 自变量（-vmargs）之后提供的自变量（例如，-data），则 Eclipse 将不会启动并且您将接收到"JVM 已终止。出口代码为 1"的错误。<br /><br />在不同的 VM 上运行 <br />在 J9 上运行 Eclipse<br />当在 J9 版本 1.5 上运行 Eclipse 时，建议使用以下 VM 选项： <br /><br />eclipse.exe [eclipse arguments] -vm path_to_j9w.exe         -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000<br />当在 J9 版本 2.0 上运行 Eclipse 时，J9W 选择的缺省自变量应为合适的选项。但是，要覆盖 Eclipse 可执行文件以内部方式自动设置的参数，必须指定 -vmargs 不带任何参数，如下所示： <br /><br />eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs<br />有关进一步信息，参考 J9 VM 文档和帮助。<br /><br />在 IBM Developer Kit, Java(TM) Technology Edition VM 上运行 Eclipse<br />IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 设置适合进行初期研究工作，但在进行大型开发时是不够的。对于大型开发，应修改 VM 自变量以使有更多的堆可用。例如，下列设置将允许 Java 堆增大为 256MB</font>
		</span>
<img src ="http://www.blogjava.net/byterat/aggbug/88734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-12-19 12:18 <a href="http://www.blogjava.net/byterat/archive/2006/12/19/88734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个典型的build.xml</title><link>http://www.blogjava.net/byterat/archive/2006/11/08/79765.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 08 Nov 2006 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/11/08/79765.html</guid><description><![CDATA[
		<p>
				<font face="Courier New" size="2">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;project name="test" default="compile" basedir="."&gt;<br />  &lt;!-- define the properties for target reference --&gt;<br />  &lt;property name="dir.src" value="src"/&gt;<br />  &lt;property name="dir.etc" value="etc"/&gt;   <br />  &lt;property name="dir.web" value="web"/&gt;<br />  &lt;property name="dir.meta" value="meta"/&gt;   <br />  &lt;property name="dir.lib" value="${dir.web}/WEB-INF/lib"/&gt;<br />  &lt;property name="dir.build" value="${dir.web}/WEB-INF"/&gt;<br />  &lt;property name="dir.classes" value="${dir.web}/WEB-INF/classes"/&gt;<br />  &lt;property name="app.name" value="ocs"/&gt;</font>
		</p>
		<p>
				<font face="Courier New" size="2">  &lt;!-- data base --&gt;   <br />  &lt;property file="${dir.web}/WEB-INF/config/jdbc.properties"/&gt;   <br />  &lt;property name="database.driver"   value="${jdbc.driverClassName}"/&gt;<br />  &lt;property name="database.url"      value="${jdbc.url}"/&gt;<br />  &lt;property name="database.username" value="${jdbc.username}"/&gt;<br />  &lt;property name="database.password" value="${jdbc.password}"/&gt;</font>
		</p>
		<p>
				<font face="Courier New" size="2">  &lt;!-- the classpth of ant --&gt;<br />  &lt;path id="classpath"&gt;<br />    &lt;fileset dir="${dir.lib}" includes="**/*.jar" /&gt;<br />    &lt;pathelement path="${dir.classes}"/&gt;<br />  &lt;/path&gt;</font>
		</p>
		<p>
				<br />
				<font face="Courier New" size="2">  &lt;!-- compile the src and test source code --&gt;<br />  &lt;target name="compile" description="Compile main source and test tree java files"&gt;<br />   &lt;delete dir="${dir.classes}"/&gt;    <br />   &lt;mkdir dir="${dir.classes}"/&gt;<br />    &lt;javac srcdir="${dir.src}" destdir="${dir.classes}" debug="on"&gt;<br />      &lt;classpath refid="classpath"/&gt;<br />    &lt;/javac&gt;<br />    &lt;copy todir="${dir.classes}"&gt;<br />      &lt;fileset dir="${dir.src}" includes="**/*.xml,**/*.properties"&gt;<br />          &lt;!--exclude name="**/*.hbm.xml" /--&gt;<br />      &lt;/fileset&gt;<br />      &lt;fileset dir="${dir.etc}" includes="**/*.properties"/&gt;<br />    &lt;/copy&gt;<br />  &lt;native2ascii dest="${dir.classes}" src="${dir.etc}" encoding="UTF-8" includes="**/*.src" ext=".properties" /&gt;<br />  &lt;/target&gt;</font>
		</p>
		<p>
				<font face="Courier New" size="2"> <br />  &lt;!-- setup the database and initialize the data --&gt;<br />  &lt;target name="setup-db"&gt;<br />    &lt;echo message="=========================================================="/&gt;<br />    &lt;echo message="database driver:${database.driver}"/&gt;<br />    &lt;echo message="database </font>
				<a href="${database.url}&quot;/">
						<font face="Courier New" size="2">url:${database.url}"/</font>
				</a>
				<font face="Courier New" size="2">&gt;<br />    &lt;echo message="database username:${database.username}"/&gt;<br />    &lt;echo message="database password:${database.password}"/&gt;<br />    &lt;echo message="=========================================================="/&gt;   <br />    <br />    &lt;antcall target="runSql" inheritAll="false"&gt;<br />      &lt;param name="script.sql" value="${dir.meta}/database-setup.sql"/&gt;<br />      &lt;param name="database.driver" value="${database.driver}"/&gt;<br />      &lt;param name="database.url" value="${database.url}"/&gt;<br />      &lt;param name="database.username" value="${database.username}"/&gt;<br />      &lt;param name="database.password" value="${database.password}"/&gt;<br />    &lt;/antcall&gt;<br />    &lt;echo message="initialize Sample data..."/&gt;<br />    &lt;antcall target="runSql" inheritAll="false"&gt;<br />      &lt;param name="script.sql" value="${dir.meta}/database-init.sql"/&gt;<br />      &lt;param name="database.driver" value="${database.driver}"/&gt;<br />      &lt;param name="database.url" value="${database.url}"/&gt;<br />      &lt;param name="database.username" value="${database.username}"/&gt;<br />      &lt;param name="database.password" value="${database.password}"/&gt;<br />    &lt;/antcall&gt;<br />  &lt;/target&gt;<br />   <br /> <br />  &lt;!-- run the sql to setup database --&gt;<br />  &lt;target name="runSql"&gt;<br />    &lt;sql src="${script.sql}"<br />         driver="${database.driver}"<br />         url="${database.url}"<br />         userid="${database.username}"<br />         password="${database.password}"<br />         classpathref="classpath"<br />         onerror="continue"/&gt;<br />  &lt;/target&gt;</font>
		</p>
		<p>
				<font face="Courier New" size="2">  &lt;target name="clean" description="Clean output directories"&gt;<br />    &lt;delete dir="${dir.classes}"/&gt;<br />  &lt;/target&gt;<br /> <br />    <br />  &lt;target name="deploy" description="deploy......" depends="clean,compile" &gt;<br />  &lt;/target&gt; <br />&lt;/project&gt;<br /></font>
		</p>
<img src ="http://www.blogjava.net/byterat/aggbug/79765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-11-08 09:47 <a href="http://www.blogjava.net/byterat/archive/2006/11/08/79765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用WPT 1.5.x 时的一些配置</title><link>http://www.blogjava.net/byterat/archive/2006/11/08/79761.html</link><dc:creator>比特鼠</dc:creator><author>比特鼠</author><pubDate>Wed, 08 Nov 2006 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/byterat/archive/2006/11/08/79761.html</guid><wfw:comment>http://www.blogjava.net/byterat/comments/79761.html</wfw:comment><comments>http://www.blogjava.net/byterat/archive/2006/11/08/79761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/byterat/comments/commentRss/79761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/byterat/services/trackbacks/79761.html</trackback:ping><description><![CDATA[
		<font face="Courier New" size="2">1. window -- Preferences<br />      1.1 Content Types <br />          设置相关的文件为"UTF-8", 如果在列表中没有文件后缀, 则增加相应的文件后缀.<br /><br />      1.2 Workspace<br />          设置"Text file encoding" 为 "UTF-8".<br /><br /><br />2. Validation<br />      将Validator中, 除了Application client validator外的所有validator的"Manual"和"Build", 全部置空(即取消打勾)</font>
<img src ="http://www.blogjava.net/byterat/aggbug/79761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/byterat/" target="_blank">比特鼠</a> 2006-11-08 09:44 <a href="http://www.blogjava.net/byterat/archive/2006/11/08/79761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>