﻿<?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-table-文章分类-j2se</title><link>http://www.blogjava.net/table/category/34873.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 12 Aug 2009 20:30:38 GMT</lastBuildDate><pubDate>Wed, 12 Aug 2009 20:30:38 GMT</pubDate><ttl>60</ttl><item><title>利用java操作Excel文件</title><link>http://www.blogjava.net/table/articles/270187.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Tue, 12 May 2009 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/270187.html</guid><wfw:comment>http://www.blogjava.net/table/comments/270187.html</wfw:comment><comments>http://www.blogjava.net/table/articles/270187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/270187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/270187.html</trackback:ping><description><![CDATA[很久以来都想研究一下利用java操作Excel的方法，今天没事，就稍微了解了一下，特总结一下。利用java操作Excel，有个开源的东东－jxl.jar，可以到<a href="http://sourceforge.net/project/showfiles.php?group_id=79926"><font color="#1d58d1">http://sourceforge.net/project/showfiles.php?group_id=79926</font></a>下载。
<p><strong>一.读取Excel文件内容</strong></p>
<div>
<div>java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span>/**读取Excel文件的内容 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*&nbsp;@param&nbsp;file&nbsp;&nbsp;待读取的文件 </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;*&nbsp;@return </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;readExcel(File&nbsp;file){ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Workbook&nbsp;wb&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//构造Workbook（工作薄）对象 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wb=Workbook.getWorkbook(file); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(BiffException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(wb==</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//获得了Workbook对象之后，就可以通过它得到Sheet（工作表）对象了 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Sheet[]&nbsp;sheet&nbsp;=&nbsp;wb.getSheets(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(sheet!=</span><span class="keyword">null</span><span>&amp;&amp;sheet.length&gt;</span><span class="number">0</span><span>){ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//对每个工作表进行循环 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//得到当前工作表的行数 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;rowNum&nbsp;=&nbsp;sheet[i].getRows(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;j=</span><span class="number">0</span><span>;j </span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//得到当前行的所有单元格 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cell[]&nbsp;cells&nbsp;=&nbsp;sheet[i].getRow(j); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(cells!=</span><span class="keyword">null</span><span>&amp;&amp;cells.length&gt;</span><span class="number">0</span><span>){ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//对每个单元格进行循环 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;k=</span><span class="number">0</span><span>;k </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//读取当前单元格的值 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cellValue&nbsp;=&nbsp;cells[k].getContents(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(cellValue+</span><span class="string">"\t"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">"\r\n"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span class="string">"\r\n"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//最后关闭资源，释放内存 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;wb.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;sb.toString(); &nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<span></div>
<p dir="ltr"><strong>二.写入Excel文件</strong></p>
<p dir="ltr">这里有很多格式了，比如文本内容加粗，加上某些颜色等，可以参考jxl的api，同时还推荐一篇不错的文章：<a href="http://www.ibm.com/developerworks/cn/java/l-javaExcel/?ca=j-t10">http://www.ibm.com/developerworks/cn/java/l-javaExcel/?ca=j-t10</a></p>
<div>java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span>/**生成一个Excel文件 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;fileName&nbsp;&nbsp;要生成的Excel文件名 </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;writeExcel(String&nbsp;fileName){ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritableWorkbook&nbsp;wwb&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wwb&nbsp;=&nbsp;Workbook.createWorkbook(</span><span class="keyword">new</span><span>&nbsp;File(fileName)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(wwb!=</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//创建一个可写入的工作表 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//Workbook的createSheet方法有两个参数，第一个是工作表的名称，第二个是工作表在工作薄中的位置 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritableSheet&nbsp;ws&nbsp;=&nbsp;wwb.createSheet(</span><span class="string">"sheet1"</span><span>,&nbsp;</span><span class="number">0</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//下面开始添加单元格 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;</span><span class="number">10</span><span>;i++){ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;j=</span><span class="number">0</span><span>;j&lt;</span><span class="number">5</span><span>;j++){ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//这里需要注意的是，在Excel中，第一个参数表示列，第二个表示行 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Label&nbsp;labelC&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Label(j,&nbsp;i,&nbsp;</span><span class="string">"这是第"</span><span>+(i+</span><span class="number">1</span><span>)+</span><span class="string">"行，第"</span><span>+(j+</span><span class="number">1</span><span>)+</span><span class="string">"列"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//将生成的单元格添加到工作表中 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ws.addCell(labelC); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(RowsExceededException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(WriteException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//从内存中写入文件中 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wwb.write(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//关闭资源，释放内存 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wwb.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(WriteException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p dir="ltr"><strong>三.在一个Excel文件中查找是否包含某一个关键字</strong></p>
<div>java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span>/**搜索某一个文件中是否包含某个关键字 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;file&nbsp;&nbsp;待搜索的文件 </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;keyWord&nbsp;&nbsp;要搜索的关键字 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;searchKeyWord(File&nbsp;file,String&nbsp;keyWord){ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;res&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Workbook&nbsp;wb&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//构造Workbook（工作薄）对象 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wb=Workbook.getWorkbook(file); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(BiffException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;res; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;res; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(wb==</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;res; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//获得了Workbook对象之后，就可以通过它得到Sheet（工作表）对象了 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sheet[]&nbsp;sheet&nbsp;=&nbsp;wb.getSheets(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;breakSheet&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(sheet!=</span><span class="keyword">null</span><span>&amp;&amp;sheet.length&gt;</span><span class="number">0</span><span>){ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//对每个工作表进行循环 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i </span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(breakSheet) &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//得到当前工作表的行数 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;rowNum&nbsp;=&nbsp;sheet[i].getRows(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;breakRow&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;j=</span><span class="number">0</span><span>;j </span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(breakRow) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//得到当前行的所有单元格 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cell[]&nbsp;cells&nbsp;=&nbsp;sheet[i].getRow(j); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(cells!=</span><span class="keyword">null</span><span>&amp;&amp;cells.length&gt;</span><span class="number">0</span><span>){ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;breakCell&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//对每个单元格进行循环 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;k=</span><span class="number">0</span><span>;k </span>
    <li class="alt"><span>&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;</span><span class="keyword">if</span><span>(breakCell) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&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;</span><span>//读取当前单元格的值 </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&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;String&nbsp;cellValue&nbsp;=&nbsp;cells[k].getContents(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&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;</span><span class="keyword">if</span><span>(cellValue==</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&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;</span><span class="keyword">if</span><span>(cellValue.contains(keyWord)){ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakCell&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakRow&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakSheet&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&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;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//最后关闭资源，释放内存 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wb.close(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;res; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p><strong>四.往Excel中插入图片图标</strong></p>
<p>插入图片的实现很容易，参看以下代码：</p>
<div>java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span>/**往Excel中插入图片 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*&nbsp;@param&nbsp;dataSheet&nbsp;&nbsp;待插入的工作表 </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;*&nbsp;@param&nbsp;col&nbsp;图片从该列开始 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*&nbsp;@param&nbsp;row&nbsp;图片从该行开始 </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;*&nbsp;@param&nbsp;width&nbsp;图片所占的列数 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*&nbsp;@param&nbsp;height&nbsp;图片所占的行数 </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;*&nbsp;@param&nbsp;imgFile&nbsp;要插入的图片文件 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;insertImg(WritableSheet&nbsp;dataSheet,&nbsp;</span><span class="keyword">int</span><span>&nbsp;col,&nbsp;</span><span class="keyword">int</span><span>&nbsp;row,&nbsp;</span><span class="keyword">int</span><span>&nbsp;width, &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;height,&nbsp;File&nbsp;imgFile){ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;WritableImage&nbsp;img&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;WritableImage(col,&nbsp;row,&nbsp;width,&nbsp;height,&nbsp;imgFile); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;dataSheet.addImage(img); &nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>以上代码的注释已经很清楚了，大概也就不用再解释了，我们可以用如下程序验证：</p>
<div>java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//创建一个工作薄 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>WritableWorkbook&nbsp;workbook&nbsp;=&nbsp;Workbook.createWorkbook(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"D:/test1.xls"</span><span>)); &nbsp;&nbsp;</span>
    <li class=""><span><span>//待插入的工作表 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>WritableSheet&nbsp;imgSheet&nbsp;=&nbsp;workbook.createSheet(</span><span class="string">"Images"</span><span>,</span><span class="number">0</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span><span>//要插入的图片文件 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>File&nbsp;imgFile&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"D:/1.png"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span><span>//图片插入到第二行第一个单元格，长宽各占六个单元格 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>insertImg(imgSheet,</span><span class="number">0</span><span>,</span><span class="number">1</span><span>,</span><span class="number">6</span><span>,</span><span class="number">6</span><span>,imgFile); &nbsp;&nbsp;</span>
    <li class=""><span>workbook.write(); &nbsp;&nbsp;</span>
    <li class="alt"><span>workbook.close(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(WriteException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>e.printStackTrace(); &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;但是jxl只支持png格式的图片，jpg格式和gif格式都不支持</p>
</div>
</div>
<p dir="ltr"><strong>五.插入页眉页脚</strong></p>
<p dir="ltr">一般的页眉页脚都分为三个部分,左,中,右三部分,利用如下代码可实现插入页眉页脚</p>
<div>java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span>/**向Excel中加入页眉页脚 </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*&nbsp;@param&nbsp;dataSheet&nbsp;待加入页眉的工作表 </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;*&nbsp;@param&nbsp;left </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*&nbsp;@param&nbsp;center </span>&nbsp;</span>
    <li class="alt"><span><span>&nbsp;*&nbsp;@param&nbsp;right </span>&nbsp;</span>
    <li class=""><span><span>&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setHeader(WritableSheet&nbsp;dataSheet,String&nbsp;left,String&nbsp;center,String&nbsp;right){ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;HeaderFooter&nbsp;hf&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HeaderFooter(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;hf.getLeft().append(left); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;hf.getCentre().append(center); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;hf.getRight().append(right); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//加入页眉 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;dataSheet.getSettings().setHeader(hf); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//加入页脚 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//dataSheet.getSettings().setFooter(hf); </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>我们可以用如下代码测试该方法:</p>
<div>java 代码</div>
<div class="dp-highlighter">
<div class="bar">
<ol class="dp-j">
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//创建一个工作薄 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;WritableWorkbook&nbsp;workbook&nbsp;=&nbsp;Workbook.createWorkbook(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"D:/test1.xls"</span><span>)); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//待插入的工作表 </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;WritableSheet&nbsp;dataSheet&nbsp;=&nbsp;workbook.createSheet(</span><span class="string">"加入页眉"</span><span>,</span><span class="number">0</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ExcelUtils.setHeader(dataSheet,&nbsp;</span><span class="string">"chb"</span><span>,&nbsp;</span><span class="string">"2007-03-06"</span><span>,&nbsp;</span><span class="string">"第1页,共3页"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;workbook.write(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;workbook.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(WriteException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
</span></div>
</span></span></span></span></span></span>
<img src ="http://www.blogjava.net/table/aggbug/270187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2009-05-12 14:11 <a href="http://www.blogjava.net/table/articles/270187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各种排序算法java实现</title><link>http://www.blogjava.net/table/articles/269223.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Wed, 06 May 2009 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/269223.html</guid><wfw:comment>http://www.blogjava.net/table/comments/269223.html</wfw:comment><comments>http://www.blogjava.net/table/articles/269223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/269223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/269223.html</trackback:ping><description><![CDATA[<p>插入排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;<br />
/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class InsertSort implements SortUtil.Sort{</p>
<p>&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;data.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=i;(j&gt;0)&amp;&amp;(data[j]&lt;data[j-1]);j--){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,j,j-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}<br />
冒泡排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class BubbleSort implements SortUtil.Sort{</p>
<p>&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;data.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=data.length-1;j&gt;i;j--){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(data[j]&lt;data[j-1]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,j,j-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>选择排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class SelectionSort implements SortUtil.Sort {</p>
<p>&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp;&nbsp; * (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; data.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lowIndex = i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = data.length - 1; j &gt; i; j--) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (data[j] &lt; data[lowIndex]) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lowIndex = j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,i,lowIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>Shell排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class ShellSort implements SortUtil.Sort{</p>
<p>&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=data.length/2;i&gt;2;i/=2){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;i;j++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertSort(data,j,i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertSort(data,0,1);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param data<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param j<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param i<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void insertSort(int[] data, int start, int inc) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=start+inc;i&lt;data.length;i+=inc){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=i;(j&gt;=inc)&amp;&amp;(data[j]&lt;data[j-inc]);j-=inc){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,j,j-inc);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>快速排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class QuickSort implements SortUtil.Sort{</p>
<p>&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; quickSort(data,0,data.length-1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; private void quickSort(int[] data,int i,int j){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pivotIndex=(i+j)/2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //swap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,pivotIndex,j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k=partition(data,i-1,j,data[j]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,k,j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((k-i)&gt;1) quickSort(data,i,k-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((j-k)&gt;1) quickSort(data,k+1,j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param data<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param i<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param j<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private int partition(int[] data, int l, int r,int pivot) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(data[++l]&lt;pivot);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((r!=0)&amp;&amp;data[--r]&gt;pivot);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,l,r);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(l&lt;r);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,l,r);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return l;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}<br />
改进后的快速排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class ImprovedQuickSort implements SortUtil.Sort {</p>
<p>&nbsp;&nbsp;&nbsp; private static int MAX_STACK_SIZE=4096;<br />
&nbsp;&nbsp;&nbsp; private static int THRESHOLD=10;<br />
&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] stack=new int[MAX_STACK_SIZE];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int top=-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pivot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int pivotIndex,l,r;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stack[++top]=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stack[++top]=data.length-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(top&gt;0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j=stack[top--];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i=stack[top--];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pivotIndex=(i+j)/2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pivot=data[pivotIndex];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,pivotIndex,j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //partition<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l=i-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r=j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(data[++l]&lt;pivot);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((r!=0)&amp;&amp;(data[--r]&gt;pivot));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,l,r);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(l&lt;r);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,l,r);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,l,j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((l-i)&gt;THRESHOLD){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stack[++top]=i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stack[++top]=l-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((j-l)&gt;THRESHOLD){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stack[++top]=l+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stack[++top]=j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //new InsertSort().sort(data);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertSort(data);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param data<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void insertSort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;data.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=i;(j&gt;0)&amp;&amp;(data[j]&lt;data[j-1]);j--){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,j,j-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>归并排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class MergeSort implements SortUtil.Sort{</p>
<p>&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] temp=new int[data.length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mergeSort(data,temp,0,data.length-1);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private void mergeSort(int[] data,int[] temp,int l,int r){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mid=(l+r)/2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(l==r) return ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mergeSort(data,temp,l,mid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mergeSort(data,temp,mid+1,r);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=l;i&lt;=r;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp[i]=data[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i1=l;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i2=mid+1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int cur=l;cur&lt;=r;cur++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i1==mid+1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[cur]=temp[i2++];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(i2&gt;r)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[cur]=temp[i1++];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(temp[i1]&lt;temp[i2])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[cur]=temp[i1++];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[cur]=temp[i2++];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>改进后的归并排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class ImprovedMergeSort implements SortUtil.Sort {</p>
<p>&nbsp;&nbsp;&nbsp; private static final int THRESHOLD = 10;</p>
<p>&nbsp;&nbsp;&nbsp; /*<br />
&nbsp;&nbsp;&nbsp;&nbsp; * (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * <br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int[] temp=new int[data.length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mergeSort(data,temp,0,data.length-1);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void mergeSort(int[] data, int[] temp, int l, int r) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i, j, k;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mid = (l + r) / 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (l == r)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((mid - l) &gt;= THRESHOLD)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mergeSort(data, temp, l, mid);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertSort(data, l, mid - l + 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((r - mid) &gt; THRESHOLD)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mergeSort(data, temp, mid + 1, r);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insertSort(data, mid + 1, r - mid);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = l; i &lt;= mid; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp[i] = data[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j = 1; j &lt;= r - mid; j++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp[r - j + 1] = data[j + mid];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int a = temp[l];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int b = temp[r];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i = l, j = r, k = l; k &lt;= r; k++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (a &lt; b) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[k] = temp[i++];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a = temp[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[k] = temp[j--];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = temp[j];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param data<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param l<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param i<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; private void insertSort(int[] data, int start, int len) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=start+1;i&lt;start+len;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=i;(j&gt;start) &amp;&amp; data[j]&lt;data[j-1];j--){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(data,j,j-1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>}<br />
堆排序:</p>
<p>package org.rut.util.algorithm.support;</p>
<p>import org.rut.util.algorithm.SortUtil;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class HeapSort implements SortUtil.Sort{</p>
<p>&nbsp;&nbsp;&nbsp; /* (non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaxHeap h=new MaxHeap();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h.init(data);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;data.length;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h.remove();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.arraycopy(h.queue,1,data,0,data.length);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp; private static class MaxHeap{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void init(int[] data){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.queue=new int[data.length+1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;data.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queue[++size]=data[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fixUp(size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int size=0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int[] queue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int get() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return queue[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void remove() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortUtil.swap(queue,1,size--);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fixDown(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //fixdown<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void fixDown(int k) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((j = k &lt;&lt; 1) &lt;= size) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j &lt; size &amp;&amp; queue[j]&lt;queue[j+1])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j++; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (queue[k]&gt;queue[j]) //不用交换<br />
&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; SortUtil.swap(queue,j,k);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void fixUp(int k) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (k &gt; 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = k &gt;&gt; 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (queue[j]&gt;queue[k])<br />
&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; SortUtil.swap(queue,j,k);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k = j;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>SortUtil:</p>
<p>package org.rut.util.algorithm;</p>
<p>import org.rut.util.algorithm.support.BubbleSort;<br />
import org.rut.util.algorithm.support.HeapSort;<br />
import org.rut.util.algorithm.support.ImprovedMergeSort;<br />
import org.rut.util.algorithm.support.ImprovedQuickSort;<br />
import org.rut.util.algorithm.support.InsertSort;<br />
import org.rut.util.algorithm.support.MergeSort;<br />
import org.rut.util.algorithm.support.QuickSort;<br />
import org.rut.util.algorithm.support.SelectionSort;<br />
import org.rut.util.algorithm.support.ShellSort;</p>
<p>/**<br />
&nbsp;* @author treeroot<br />
&nbsp;* @since 2006-2-2<br />
&nbsp;* @version 1.0<br />
&nbsp;*/<br />
public class SortUtil {<br />
&nbsp;&nbsp;&nbsp; public final static int INSERT = 1;</p>
<p>&nbsp;&nbsp;&nbsp; public final static int BUBBLE = 2;</p>
<p>&nbsp;&nbsp;&nbsp; public final static int SELECTION = 3;</p>
<p>&nbsp;&nbsp;&nbsp; public final static int SHELL = 4;</p>
<p>&nbsp;&nbsp;&nbsp; public final static int QUICK = 5;</p>
<p>&nbsp;&nbsp;&nbsp; public final static int IMPROVED_QUICK = 6;</p>
<p>&nbsp;&nbsp;&nbsp; public final static int MERGE = 7;</p>
<p>&nbsp;&nbsp;&nbsp; public final static int IMPROVED_MERGE = 8;</p>
<p>&nbsp;&nbsp;&nbsp; public final static int HEAP = 9;</p>
<p>&nbsp;&nbsp;&nbsp; public static void sort(int[] data) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sort(data, IMPROVED_QUICK);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; private static String[] name={<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "insert","bubble","selection","shell","quick","improved_quick","merge","improved_merge","heap"<br />
&nbsp;&nbsp;&nbsp; };<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private static Sort[] impl=new Sort[]{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new InsertSort(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new BubbleSort(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new SelectionSort(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ShellSort(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new QuickSort(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ImprovedQuickSort(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new MergeSort(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ImprovedMergeSort(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new HeapSort()<br />
&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp; public static String toString(int algorithm){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name[algorithm-1];<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void sort(int[] data, int algorithm) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; impl[algorithm-1].sort(data);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static interface Sort {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void sort(int[] data);<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void swap(int[] data, int i, int j) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int temp = data[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[i] = data[j];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[j] = temp;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</p>
</font>
<img src ="http://www.blogjava.net/table/aggbug/269223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2009-05-06 13:23 <a href="http://www.blogjava.net/table/articles/269223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail API简介</title><link>http://www.blogjava.net/table/articles/268801.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Mon, 04 May 2009 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/268801.html</guid><wfw:comment>http://www.blogjava.net/table/comments/268801.html</wfw:comment><comments>http://www.blogjava.net/table/articles/268801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/268801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/268801.html</trackback:ping><description><![CDATA[JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包（标准扩展）。您可使用这种包创建邮件用户代理（Mail User Agent ，MUA） 类型的程序，它类似于Eudora、Pine及Microsoft Outlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代理（Mail Transfer Agent，MTA）类型的程序那样用于传输、发送和转发消息。换句话说，用户可以与MUA类型的程序交互，以阅读和撰写电子邮件。MUA依靠MTA处理实际的发送任务。<br />
JavaMail API的设计是，为收发信息提供与协议无关的访问。方式是把该API划分成两个部分：<br />
&#183; 该API的第一个部分是本课程的重点。基本上是如何发送和接收独立于提供程序/协议的消息。<br />
&#183; 第二个部分则使用特定的协议语言，如：SMTP、POP、IMAP和NNTP。如果要让JavaMail API与服务器通信，就需要为之提供协议。由于Sun公司对特定协议提供程序有充分的介绍，用户可以免费获取，所以本课程没有介绍创建特定协议提供程序的内容。<br />
复习相关协议<br />
在学习JavaMail API的深层知识之前，让我们回过头来看一看在该API中使用的协议,本质上有4种人们常用的协议：<br />
&#183; SMTP<br />
&#183; POP<br />
&#183; IMAP<br />
&#183; MIME<br />
您还需要了解NNTP及其他一些协议。理解这些协议的基本原理有助于您理解如何使用JavaMail API。而该API的设计要与协议无关，所以不能克服这些基础协议的限制。如果选用的协议不支持某种功能，那么JavaMail API也无法在其上添加这种功能。（正如您一会儿就会看到的，在操作POP协议时，常常会碰到这种问题）。<br />
SMTP<br />
简单邮件传输协议（SMTP）是用于传送电子邮件的机制。在JavaMail API环境中，您的基于JavaMail的程序将与您公司或Internet服务提供商（ISP）的SMTP服务器通信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器，最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证，所以不需要SMTP服务器是一种开放的转发器，但需要确保SMTP服务器配置正确。JavaMail API中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这一类任务的功能。<br />
POP<br />
POP的含义是邮局协议，当前的版本为3，也称作POP3，该协议是在RFC 1939中定义的。POP是Internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定义支持，这是它所做的全部工作，也是大多数问题的根源。在使用POP协议时，人们熟悉的很多功能，如查看收到了多少新邮件消息的功能，POP根本不支持。这些功能都内置到诸如Eudora或Microsoft Outlook之类的邮件程序中，能为您记住接收的上一封邮件，以及计算有多少新邮件这类信息。因此，使用JavaMail API时，如果想获取这类信息，将需要由自己进行计算。<br />
IMAP<br />
IMAP是用于接收消息的更加高级的协议，它是在RFC 2060中定义的。IMAP的含义是&#8220;Internet消息访问协议&#8221;，当前版本是第4版，也称作IMAP4。使用IMAP时，您的邮件服务器必须支持该协议。您不能只是简单地把程序转变为支持IMAP，而不是支持POP，就指望能支持IMAP中的一切。假定您的邮件服务器支持IMAP，那么基于JavaMail的程序就可利用在服务器上拥有多个文件夹的用户，并且这些文件夹可以被多个用户共享的功能。<br />
由于IMAP协议具有更高级的功能，您也许会想IMAP应该被每一个人使用，但事实不是这样。因为IMAP会加重邮件服务器的负荷，它需要服务器接收新消息，发送消息给请求的用户，并在多个文件夹中为每个用户维护这些消息。而这要集中备份，因而长期下去用户的文件夹会变得越来越大，当磁盘空间用光了时，每个人都会遭受损失。而使用POP协议时，已保存消息可以解除服务器的重负。<br />
MIME<br />
MIME的含义是&#8220;多用途的网际邮件扩充协议&#8221;。它不是一种邮件传输协议，相反，它定义传输的内容：消息的格式、附件等。许多文档都定义了MIME协议，包含：RFC 822、RFC 2045、RFC 2046和RFC 2047。作为JavaMail API的用户，一般不需要担心这些格式。但是，这些格式确实存在，并为您的程序所用。<br />
NNP和其他协议<br />
由于JavaMail API分开了提供程序和其他部分，所以您可以轻松地为附加协议添加支持。Sun公司提供第3方提供程序清单，这些提供程序要利用 Sun公司不支持的少见的协议。在这份清单中，您将会看到对NNTP（网络新闻传输协议）[新闻组]、S/MIME（安全多用途的网际邮件扩充协议）及其他协议的提供支持的第3方提供程序。<br />
安装<br />
目前有两种版本的JavaMail API最常用：1.2和1.1.3。本课程中的所有例子都适用于这两种版本。其中JavaMail API 1.2是最新的，而JavaMail API 1.1.3中包含了Java 2企业版（J2EE）平台1.2.1版，所以它仍然很常用。使用JavaMail API的版本会对您的下载和安装产生一些影响。这两种版本的JavaMail API都能与JDK 1.1.6、Java 2标准版（J2SE）平台1.2.x和1.3.x协同工作。<br />
注意：在安装了Sun公司的JavaMail工具后，会在演示目录下看到许多示例程序。<br />
安装JavaMail 1.2<br />
要使用JavaMail 1.2 API，可以下载JavaMail 1.2工具，然后解压缩javamail-1_2.zip文件，并把mail.jar文件添加到典型安装路径下。JavaMail 1.2工具带有SMTP、IMAP4和POP3提供程序以及核心类。<br />
安装完JavaMail 1.2后，再安装JavaBeans Activation Framework。<br />
安装JavaMail 1.1.3<br />
要使用JavaMail 1.1.3 API，可以下载JavaMail 1.1.3工具，然后解压缩javamail1_1_3.zip文件，并把mail.jar文件添加到典型安装路径下。JavaMail 1.1.3工具带有SMTP和IMAP4提供程序以及核心类。<br />
如果您想用JavaMail 1.1.3访问POP服务器，需要下载并安装POP3提供程序。Sun公司拥有一个独立于 JavaMail 工具的提供程序。在下载并解压缩pop31_1_1.zip文件后，也还需要把pop3.jar添加到典型安装路径下。<br />
安装完JavaMail 1.1.3后，再安装JavaBeans Activation Framework。<br />
安装JavaBeans Activation Framework<br />
JavaMail API的所有版本都需要JavaBeans Activation Framework（JavaBeans激活框架），这种框架提供了对输入任意数据块的支持，并能相应地对其进行处理。看上去效果好像不太好，但该框架是在当今的许多浏览器和邮件工具中可以找到的基本MIME类型支持。下载该框架后，解压缩jaf1_0_1.zip文件，并将activation.jar文件添加到典型安装路径下。<br />
对于JavaMail 1.2用户，现在应该把mail.jar和activation.jar文件添加到典型安装路径下。<br />
对于JavaMail 1.1.3用户，现在应该把mail.jar、pop3.jar和activation.jar添加到典型安装路径下。如果您不打算使用POP3，就不需要把pop3.jar文件添加到典型安装路径下。<br />
如果您不想更改安装路径环境变量，可以把JAR文件复制到Java运行时环境（JRE）目录下的lib/ext目录下。例如，对于J2SE 1.3版本，Windows平台上的默认目录应该是C:\jdk1.3\jre\lib\ext。<br />
使用Java 2企业版<br />
如果您使用的是J2EE，则在使用基本JavaMail API时，不需要做什么特殊的工作；JavaMail API带有J2EE类。只要确保j2ee.jar文件位于典型安装路径下，并完成了所有的设置工作。 <br />
对于J2EE 1.2.1，POP3提供程序是单独提供的，因此需要下载该提供程序，并按安装JavaMail 1.1.3的步骤，在J2EE 1.2.1中包含POP3提供程序。J2EE 1.3的用户会获得J2EE和POP3提供程序，因而不需要对POP3提供程序执行独立安装。使用这两种版本的J2EE用户，都不需要安装JavaBeans Activation Framework。<br />
练习<br />
设置您的 JavaMail 环境。<br />
复习核心类<br />
在开始深入研究JavaMail类之前，首先让用户浏览一下构成API的核心类：会话、消息、地址、验证程序、传输，存储和文件夹。所有这些类都可以在JavaMail API即javax.mail的顶层包中找到，尽管您将频繁地发现您自己使用的子类是在javax.mail.internet包中找到的。<br />
Session类<br />
Session类定义了一个基本的邮件会话。通过该会话可让别的工作顺利执行。Session对象利用java.util.Properties对象获取诸如邮件服务器、用户名、密码等信息，以及其他可在整个应用程序中共享的信息。<br />
Session类的构造器是私有的。您可以获得一个可被getDefaultInstance()方法共享的单一的默认会话：<br />
Properties props = new Properties();<br />
// fill props with any information<br />
Session session = Session.getDefaultInstance(props, null);<br />
或者，您可以用getInstance()方法创建一个独特的会话：<br />
Properties props = new Properties();<br />
// fill props with any information<br />
Session session = Session.getInstance(props, null);<br />
这两种情形下的null参数都是一种Authenticator对象，它不是在此时使用的。详细信息请参阅其后的&#8220;Autherticator&#8221;一节。<br />
在大多数情况下，使用共享会话就足够了，即使为多个用户邮箱处理邮件会话也是如此。您可以在通信过程的后面一步添加上用户名和密码的组合，并保持所有的一切是独立的。<br />
Message类<br />
一旦创建了自己的Session对象，就是该去创建要发送的消息的时候了。这时就要用到消息类型。作为一个抽象类，您必须操作一个子类，在大多数情况下，该子类是javax.mail.internet.MimeMessage。一个MimeMessage是一种理解MIME类型和报头（在不同的RFC文档中均有定义）的消息。消息的报头被严格限制成只能使用US-ASCII字符，尽管非ASCII字符可以被编码到某些报头字段中。<br />
可以通过将Session对象传递给MimeMessage构造器的方法来创建消息：<br />
MimeMessage message = new MimeMessage(session);<br />
注意：还有其他的构造器，像用于创建消息的源于RFC822格式化的输入流的构造器。<br />
一旦创建了消息，就可以设置其各个部分，如Message(消息)实现Part（部分）接口（以MimeMessage实现MimePart）。设置内容的基本机制是setContent()方法，它带有表示内容和MIME类型的参数：<br />
message.setContent("Hello", "text/plain");<br />
但是，如果正在使用 MimeMessage，并且您的消息是纯文本，那么您就可以使用setText()方法。该方法只需要一个表示实际内容的参数，默认的MIME类型为纯文本：<br />
message.setText("Hello");<br />
对于纯文本消息，setText()方法更常常被用来设置内容。要发送其他类型的消息，如HTML消息，就要使用setContent方法()。现在用的更多的是HTML消息。<br />
要设置主题，可以使用setSubject()方法：<br />
message.setSubject("First");<br />
Address类<br />
一旦创建了会话和消息，并为消息填充了内容，就需要用Address类为您的信件标上地址了。同Message类一样，Address类也是一种抽象类。您可以使用javax.mail.internet.InternetAddress类。<br />
要创建只带有电子邮件地址的地址，可以把电子邮件地址传递给Address类的构造器：<br />
Address address = new InternetAddress("president@whitehouse.gov");<br />
如果想让一个名字出现在电子邮件地址后，也可以将其传递给构造器：<br />
Address address = new InternetAddress("president@whitehouse.gov", "George Bush");<br />
您要为消息的from（发送者）字段和to（接收者）字段创建地址对象。除非您的邮件服务器阻止这样做，否则要在发送的消息中注明该消息的发送者。<br />
一旦创建好了地址，有两种方法可让您将地址与消息连接起来。为了鉴别发送者，您可以使用setFrom()和setReplyTo()方法。<br />
message.setFrom(address)<br />
如果您的消息需要显示多个地址来源，则可以使用addFrom()方法：<br />
Address address[] = ...;<br />
message.addFrom(address);<br />
为了鉴别消息接收者，您可以使用addRecipient()方法。该方法除了需要一个地址参数外，还需要一个Message.RecipientType属性（消息的接收类型）。<br />
message.addRecipient(type, address)<br />
地址的3种预定义类型如下：<br />
&#183; Message.RecipientType.TO <br />
&#183; Message.RecipientType.CC <br />
&#183; Message.RecipientType.BCC <br />
因此，如果一条消息将发送给副总统，同时还将发送该消息的副本给第一夫人，则采用下面的代码：<br />
Address toAddress = new InternetAddress("vice.president@whitehouse.gov");<br />
Address ccAddress = new InternetAddress("first.lady@whitehouse.gov");<br />
message.addRecipient(Message.RecipientType.TO, toAddress);<br />
message.addRecipient(Message.RecipientType.CC, ccAddress);<br />
JavaMail API没有提供检查电子邮件地址有效性的机制。您可以自己编写支持扫描有效字符（在RFC 822文档中所定义的）的程序或检验MX（邮件交换）记录，这些都超越了JavaMail API的范围。<br />
Authenticator类<br />
与java.net类一样，JavaMail API可以利用Authenticator（验证程序）类通过用户名和密码来访问受保护的资源。对于JavaMail API来说，这种受保护的资源是指邮件服务器。JavaMail的Authenticator类可以在javax.mail包中找到，并有别于同名的java.net类。当JavaMail API在Java 1.1下工作时，JavaMail和java.net不会共享同一个Authenticator类名称，这是因为Java 1.1中不含有java.net。<br />
要使用Authenticator类，您可以使用该抽象类的子类，并通过getPasswordAuthentication()方法返回一个PasswordAuthentication实例。在创建时，您必须用会话记录Authentication类。其后，当需要进行身份验证时，会通知您的Authenticator。会弹出一个窗口，或从一个配置文件（尽管不加密就不安全）中读取用户名和密码，并把它们作为一个PasswordAuthentication对象返回给调用程序。<br />
Properties props = new Properties();<br />
// fill props with any information<br />
Authenticator auth = new MyAuthenticator();<br />
Session session = Session.getDefaultInstance(props, auth);<br />
Transport类<br />
发送消息的最后一步操作是使用Transport类。该类使用特定于协议（通常是SMTP）的语言来发送消息。它是一个抽象类，其操作与Session类有些相似。您可以通过只调用静态的send()方法来使用该类的默认版本：<br />
Transport.send(message);<br />
或者，您可以从用于您的协议的会话中获取一个特定的实例，然后传递用户名和密码（不必要时可以为空）并发送消息，最后关闭连接：<br />
message.saveChanges(); // implicit with send()<br />
Transport transport = session.getTransport("smtp");<br />
transport.connect(host, username, password);<br />
transport.sendMessage(message, message.getAllRecipients());<br />
transport.close();<br />
当您需要发送多个消息时，建议采用后一种方法，因为它将保持消息间活动服务器的连接。而基本的send()机制会为每一个方法调用都建立一条独立的连接。<br />
注意：要查看经过邮件服务器邮件命令，可以用session.setDebug(true)方法设置调试标志。<br />
Store和Folder类<br />
使用Session类来获取消息，开始时与发送消息很相似。但是，在获取会话后，很有可能使用用户名和密码或Authenticator类来连接Store类。与Transport类一样，您要告诉Store类将使用什么协议：<br />
// Store store = session.getStore("imap");<br />
Store store = session.getStore("pop3");<br />
store.connect(host, username, password);<br />
在连接Store类后，就可以获取一个Folder类，在读取其中的消息前必须先打开该类。<br />
Folder folder = store.getFolder("INBOX");<br />
folder.open(Folder.READ_ONLY);<br />
Message message[] = folder.getMessages();<br />
对于POP3协议，惟一可用的文件夹是INBOX。如果使用的是IMAP协议，则可以使用其他的文件夹。<br />
注意：Sun公司的提供程序本来想提供方便。而Message message[]=folder.getMessages();这条语句却是一种从服务器逐条读取消息的缓慢操作，所以仅当您确实需要获取消息部分（该内容是所检索消息的内容）时可以使用这条语句。<br />
一旦读取消息，就可以使用getContent()方法获取其内容，或使用writeTo()方法将其内容写到一个流中。getContent()方法只获取消息内容，而writeTo()方法则还会输出报头。<br />
System.out.println(((MimeMessage)message).getContent());<br />
一旦您阅读完邮件，就可以关闭对文件夹和存储的连接。<br />
folder.close(aBoolean);<br />
store.close();<br />
传递给文件夹的close()方法的布尔变量指定了是否通过清除已删除的消息来更新文件夹。<br />
继续前进<br />
实际上，理解使用这7个类的方式，是使用JavaMail API处理几乎所有事情所需要的全部内容。用这7个类以外的方式构建的JavaMail API，其大多数功能都是以几乎完全相同或特定的方式来执行任务的，就好像内容是附件。特定的任务，如：搜索、隔离等将在后面进行介绍。<br />
使用JavaMail API<br />
您已经看到了如何操作JavaMail API的核心部分。在下面几节中，您将学习如何连接几个部分以执行特定的任务。<br />
发送消息<br />
发送电子邮件消息涉及到获取会话、创建和填充消息并发送消息这些操作。您可以在获取Session时，通过为要传递的Properties对象设置mail.smtp.host属性来指定您的SMTP服务器。<br />
String host = ...;<br />
String from = ...;<br />
String to = ...;<br />
// Get system properties<br />
Properties props = System.getProperties();<br />
// Setup mail server<br />
props.put("mail.smtp.host", host);<br />
// Get session<br />
Session session = Session.getDefaultInstance(props, null);<br />
// Define message<br />
MimeMessage message = new MimeMessage(session);<br />
message.setFrom(new InternetAddress(from));<br />
message.addRecipient(Message.RecipientType.TO, <br />
new InternetAddress(to));<br />
message.setSubject("Hello JavaMail");<br />
message.setText("Welcome to JavaMail");<br />
// Send message<br />
Transport.send(message);<br />
您应该在try-catch块中编写代码，以在创建消息并发送它时可以抛出一个异常。<br />
练习<br />
发送您的第一个消息<br />
获取消息<br />
对于阅读邮件来说，首先您要获取一个会话，然后获取并连接到一个相应的用于您的收件箱的存储上，接着打开相应的文件夹，再获取消息。同时，不要忘记了操作完成后关闭连接。<br />
String host = ...;<br />
String username = ...;<br />
String password = ...;<br />
// Create empty properties<br />
Properties props = new Properties();<br />
// Get session<br />
Session session = Session.getDefaultInstance(props, null);<br />
// Get the store<br />
Store store = session.getStore("pop3");<br />
store.connect(host, username, password);<br />
// Get folder<br />
Folder folder = store.getFolder("INBOX");<br />
folder.open(Folder.READ_ONLY);<br />
// Get directory<br />
Message message[] = folder.getMessages();<br />
for (int i=0, n=message.length; i&lt;n; i++) {<br />
System.out.println(i + ": " + message[i].getFrom()[0] <br />
+ "\t" + message[i].getSubject());<br />
}<br />
// Close connection <br />
folder.close(false);<br />
store.close();<br />
每一条消息执行何种操作取决于自己决定。上面的代码块只是显示了消息的发送者和主题。从技术上讲，发送者地址列表可以为空，此时getFrom()[0]调用会抛出一个异常。<br />
为了显示整条消息，您可以提示用户在看完消息的发送者和主题字段后，如果想看到消息的内容，可以再调用消息的writeTo()方法。<br />
BufferedReader reader = new BufferedReader (<br />
new InputStreamReader(System.in));<br />
// Get directory<br />
Message message[] = folder.getMessages();<br />
for (int i=0, n=message.length; i&lt;n; i++) {<br />
System.out.println(i + ": " + message[i].getFrom()[0] <br />
+ "\t" + message[i].getSubject());<br />
System.out.println("Do you want to read message? " +<br />
"[YES to read/QUIT to end]");<br />
String line = reader.readLine();<br />
if ("YES".equals(line)) {<br />
message[i].writeTo(System.out);<br />
} else if ("QUIT".equals(line)) {<br />
break;<br />
}<br />
}<br />
练习<br />
检查邮件<br />
删除消息和标志<br />
删除消息涉及到操作与消息关联的标志。对不同的状态有不同的标志，有些标志是系统定义的，有些则是由用户定义的。预定义的标志都是在内部类Flags.Flag中定义的，如下所示：<br />
&#183; Flags.Flag.ANSWERED <br />
&#183; Flags.Flag.DELETED <br />
&#183; Flags.Flag.DRAFT <br />
&#183; Flags.Flag.FLAGGED <br />
&#183; Flags.Flag.RECENT <br />
&#183; Flags.Flag.SEEN <br />
&#183; Flags.Flag.USER <br />
仅仅因为标志存在，并不表示标志为所有的邮件服务器/提供程序所支持。例如，除了删除消息外，POP协议对它们都不支持。检查新邮件不是POP的任务，但它已内置到邮件客户程序中。要搞清楚什么标志受到支持，可以使用getPermanentFlags()方法来询问文件夹。<br />
要删除消息，需要为消息设置DELETE标志：<br />
message.setFlag(Flags.Flag.DELETED, true);<br />
第一次以READ_WRITE（读-写）模式打开文件夹：<br />
folder.open(Folder.READ_WRITE);<br />
然后，处理完了所有的消息，请关闭文件夹，并传递true值以擦去删除的消息。<br />
folder.close(true);<br />
用户可使用Folder类的expunge()方法来删除消息。但是，该方法对Sun公司的POP3提供程序不起作用。其他提供程序或许能也或许不能实现其功能。它更有可能适用于IMAP提供程序。由于POP只支持对收件箱的简单访问，使用Sun公司的提供程序时，您将不得不关闭文件夹以删除消息。<br />
要移去标志，只需传递一个false值给setFlag()方法。要看看是否设置了某个标志，可以使用isSet()进行检查。<br />
自我验证<br />
先前学到的是使用Authenticator类，以在需要时提示输入用户名和密码，而不是以字符串的形式传入它们。这里，您将真正看到如何更加充分地使用验证。<br />
不需使用主机、用户名和密码连接到Store，您可以配置Properties带有主机，并告诉Session关于您自定义的Authenticator实例，如下所示：<br />
// Setup properties<br />
Properties props = System.getProperties();<br />
props.put("mail.pop3.host", host);<br />
// Setup authentication, get session<br />
Authenticator auth = new PopupAuthenticator();<br />
Session session = Session.getDefaultInstance(props, auth);<br />
// Get the store<br />
Store store = session.getStore("pop3");<br />
store.connect();<br />
然后您可以使用Authenticator类的子类，并通过getPasswordAuthentication()方法返回一个PasswordAuthentication对象。下面是这种实现的一个例子，其中一个字段同时适用于两部分内容。它不是一个Project Swing指南，只是在一个字段中输入了两部分内容，它们是用逗号隔开的。<br />
import javax.mail.*;<br />
import javax.swing.*;<br />
import java.util.*;<br />
public class PopupAuthenticator extends Authenticator {<br />
public PasswordAuthentication getPasswordAuthentication() {<br />
String username, password;<br />
String result = JOptionPane.showInputDialog(<br />
"Enter 'username,password'");<br />
StringTokenizer st = new StringTokenizer(result, ",");<br />
username = st.nextToken();<br />
password = st.nextToken();<br />
return new PasswordAuthentication(username, password);<br />
}<br />
}<br />
由于PopupAuthenticator依赖于Swing，因而将会启动用于AWT的事件处理线程。这在本质上要求您在代码中添加一个对System.exit()的调用，以终止程序的执行。<br />
回复消息<br />
Message类包含一个reply()方法，以用正确的接收者和主题（添加&#8220;Re:：&#8221;，如果没有的话）配置一条新消息。该方法不会为消息添加任何内容，只是为新的接收者复制发送者或回复到的报头。该方法使用一个布尔型参数，提示是否只回复给发送者（false）或回复给所有人(true)。<br />
MimeMessage reply = (MimeMessage)message.reply(false);<br />
reply.setFrom(new InternetAddress("president@whitehouse.gov"));<br />
reply.setText("Thanks");<br />
Transport.send(reply);<br />
在发送消息时要配置回复到地址，可使用setReplyTo()方法。<br />
练习<br />
回复邮件<br />
转发消息<br />
转发消息涉及的内容要稍微多一点，没有一个专门用于转发消息的方法，您可以通过处理组成消息的各个部分来创建要转发的消息。<br />
一条邮件消息可由多个部分组成，每一部分是一个BodyPart（报文部分），或更特殊一点，在操作MIME消息时则是MimeBodyPart。不同的报文部分组合到一个称为Multipart的容器中，或者又更特殊一点，是一个MimeMultipart容器。要转发消息，您要创建一个用于消息文本的部分，和用于要转发的消息的第二个部分，并将这两个部分组合成一个multipart（多个部分）。然后您可以把这个multipart添加到一个合适的注明地址的消息中并发送它。<br />
这就是转发消息的本质。要把一条消息的内容复制给另一条消息，只需通过它的DataHandler类复制即可，它是出自于JavaBeans Activation Framework的一个类。<br />
// Create the message to forward<br />
Message forward = new MimeMessage(session);<br />
// Fill in header<br />
forward.setSubject("Fwd: " + message.getSubject());<br />
forward.setFrom(new InternetAddress(from));<br />
forward.addRecipient(Message.RecipientType.TO, <br />
new InternetAddress(to));<br />
// Create your new message part<br />
BodyPart messageBodyPart = new MimeBodyPart();<br />
messageBodyPart.setText(<br />
"Here you go with the original message:\n\n");<br />
// Create a multi-part to combine the parts<br />
Multipart multipart = new MimeMultipart();<br />
multipart.addBodyPart(messageBodyPart);<br />
// Create and fill part for the forwarded content<br />
messageBodyPart = new MimeBodyPart();<br />
messageBodyPart.setDataHandler(message.getDataHandler());<br />
// Add part to multi part<br />
multipart.addBodyPart(messageBodyPart);<br />
// Associate multi-part with message<br />
forward.setContent(multipart);<br />
// Send message<br />
Transport.send(forward);<br />
操作附件<br />
附件是与邮件消息关联的资源，通常保存在消息之外，如：一个文本文件，电子表格或图片。对于像Eudora和Pine之类的常用邮件程序，您可以通过JavaMail API把资源附加到邮件消息上，并在您接收消息时获取附件。<br />
发送附件<br />
发送附件与转发消息非常相似，您要创建组成完整消息的各个部分。在创建好第一个部分即消息文本之后，您添加的用DataHandler类处理的其他部分就是您的附件，而不是转发消息中的共享处理程序。当您从一个文件读取附件时，附件的数据资源是FileDataSource；从URL读取时，则是URLDataSource。一旦您有了自己的DataSource，在将其通过setDataHandler()方法最终附加到BodyPart上之前，只需将其传递给DataHandler类的构造器即可。假定您想保留附件的原始文件名，要做的最后一件事就是用BodyPart类的setFileName()方法设置与附件关联的文件名。所有这些操作如下所示：<br />
// Define message<br />
Message message = new MimeMessage(session);<br />
message.setFrom(new InternetAddress(from));<br />
message.addRecipient(Message.RecipientType.TO, <br />
new InternetAddress(to));<br />
message.setSubject("Hello JavaMail Attachment");<br />
// Create the message part <br />
BodyPart messageBodyPart = new MimeBodyPart();<br />
// Fill the message<br />
messageBodyPart.setText("Pardon Ideas");<br />
Multipart multipart = new MimeMultipart();<br />
multipart.addBodyPart(messageBodyPart);<br />
// Part two is attachment<br />
messageBodyPart = new MimeBodyPart();<br />
DataSource source = new FileDataSource(filename);<br />
messageBodyPart.setDataHandler(new DataHandler(source));<br />
messageBodyPart.setFileName(filename);<br />
multipart.addBodyPart(messageBodyPart);<br />
// Put parts in message<br />
message.setContent(multipart);<br />
// Send the message<br />
Transport.send(message);<br />
在消息中包含附件时，如果您的程序是一个servlet，您的用户就必须上传附件，并告诉您要把消息发送到什么位置。上传的每一个文件都可以用一个表单来处理，该表单是以multipart/表单数据（form-data）来编码的。<br />
&lt;FORM ENCTYPE="multipart/form-data" <br />
method=post action="/myservlet"&gt; <br />
&lt;INPUT TYPE="file" NAME="thefile"&gt;<br />
&lt;INPUT TYPE="submit" VALUE="Upload"&gt;<br />
&lt;/FORM&gt;<br />
注意：消息的大小要受到您的SMTP服务器的限制，而不是由JavaMail API限制的。如果出现了问题，可以通过设置ms和mx参数来考虑增加Java堆区的空间尺寸。<br />
练习<br />
发送附件<br />
获取附件<br />
从消息中取出附件比发送附件涉及的操作要稍微多一点，而MIME没有简单的附件概念。当消息带有附件时，消息的内容就是一个Multipart对象。然后需要处理各个部分，以获取主要内容和附件。通过part.getDisposition()方法标记上Part.ATTACHMENT配置的部分显然就是附件。同时，附件也可以不带有配置（和非文本MIME类型）或Part.INLINE配置。当配置是Part.ATTACHMENT或Part.INLINE时，您可以脱离该消息部分的内容将其保存起来。只需通过getFileName()方法获取原始文件名，并通过getInputStream()方法获取输入流即可。<br />
Multipart mp = (Multipart)message.getContent();<br />
for (int i=0, n=multipart.getCount(); i&lt;n; i++) {<br />
Part part = multipart.getBodyPart(i));<br />
String disposition = part.getDisposition();<br />
if ((disposition != null) &amp;&amp; <br />
((disposition.equals(Part.ATTACHMENT) || <br />
(disposition.equals(Part.INLINE))) {<br />
saveFile(part.getFileName(), part.getInputStream());<br />
}<br />
}<br />
saveFile()方法只用于根据文件名创建一个文件，从输入流中读取字节，并将它们写入一个文件中去。如果文件已存在，将在文件名后添加一个编号，直到找到一个不存在的文件为止。<br />
// from saveFile()<br />
File file = new File(filename);<br />
for (int i=0; file.exists(); i++) {<br />
file = new File(filename+i);<br />
}<br />
上面的代码介绍了消息的各个部分被标上相应的标志的一个最简单的例子。要想包含所有的情况，还要对disposition值为null及消息部分为MIME类型的情况作相应处理。<br />
if (disposition == null) {<br />
// Check if plain<br />
MimeBodyPart mbp = (MimeBodyPart)part;<br />
if (mbp.isMimeType("text/plain")) {<br />
// Handle plain<br />
} else {<br />
// Special non-attachment cases here of image/gif, text/html, ...<br />
}<br />
...<br />
}<br />
处理HTML消息<br />
发送基于HTML的消息比发送纯文本消息要稍微复杂一点，尽管它不需要做大量的工作。它全部取决于您特定的需求。<br />
发送HTML消息<br />
如果您所要做的全部工作是发送一个等价的HTML文件作为消息，并让邮件阅读者忧心于取出任何嵌入的图片或相关片段，那么就可以使用消息的setContent()方法，以字符串形式传递消息内容，并把内容类型设置为text/html。<br />
String htmlText = "&lt;H1&gt;Hello&lt;/H1&gt;" + <br />
"&lt;img src=\"/ShowImg.asp?p=/2008-5-14/45749picalogo.gif\"&gt;";<br />
message.setContent(htmlText, "text/html"));<br />
在接收端，如果您用JavaMail API获取消息，在该API中没有内置任何用于以HTML格式显示消息的功能。JavaMail API只以字节流的形式来查看消息。要以HTML格式显示消息，您必须使用Swing JeditorPane或某些第3方HTML阅读器组件。<br />
if (message.getContentType().equals("text/html")) {<br />
String content = (String)message.getContent();<br />
JFrame frame = new JFrame();<br />
JEditorPane text = new JEditorPane("text/html", content);<br />
text.setEditable(false);<br />
JScrollPane pane = new JScrollPane(text);<br />
frame.getContentPane().add(pane);<br />
frame.setSize(300, 300);<br />
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);<br />
frame.show();<br />
}<br />
在消息中包含图片<br />
另一方面，如果您的HTML消息中嵌入了作为消息一部分的图片，并且您想保持消息内容的完整，就必须把图片看作附件，并用特殊的通信标识符URL引用该图片，该通信标识符引用的是图片附件的内容ID报文。<br />
嵌入图片的处理与附加一个文件到消息上非常相似，惟一的不同之处在于：您必须区分MimeMultipart中，哪些部分是在构造器（或通过setSubType()方法）通过设置其子类型而使之相关的，以及将图片的内容ID报头设置成任意字符串，它将在img标记中用作图片的源路径。下面显示了一个完整的示例：<br />
String file = ...;<br />
// Create the message<br />
Message message = new MimeMessage(session);<br />
// Fill its headers<br />
message.setSubject("Embedded Image");<br />
message.setFrom(new InternetAddress(from));<br />
message.addRecipient(Message.RecipientType.TO, <br />
new InternetAddress(to));<br />
// Create your new message part<br />
BodyPart messageBodyPart = new MimeBodyPart();<br />
String htmlText = "&lt;H1&gt;Hello&lt;/H1&gt;" + <br />
"&lt;img src=\"cid:memememe\"&gt;";<br />
messageBodyPart.setContent(htmlText, "text/html");<br />
// Create a related multi-part to combine the parts<br />
MimeMultipart multipart = new MimeMultipart("related");<br />
multipart.addBodyPart(messageBodyPart);<br />
// Create part for the image<br />
messageBodyPart = new MimeBodyPart();<br />
// Fetch the image and associate to part<br />
DataSource fds = new FileDataSource(file);<br />
messageBodyPart.setDataHandler(new DataHandler(fds));<br />
messageBodyPart.setHeader("Content-ID","memememe");<br />
// Add part to multi-part<br />
multipart.addBodyPart(messageBodyPart);<br />
// Associate multi-part with message<br />
message.setContent(multipart);<br />
练习<br />
发送带有图片的 HTML 消息<br />
用SearchTerm搜索<br />
JavaMail API包含一种可用于创建SearchTerm（搜索条件）的筛选机制，它可以在javax.mail.search包中找到。一旦创建了SearchTerm，您就可以询问某个文件夹匹配的消息，并检索出消息对象数组：<br />
SearchTerm st = ...;<br />
Message[] msgs = folder.search(st);<br />
有22种不同的类可用于帮助创建搜索条件。<br />
&#183; AND条件(AndTerm类) <br />
&#183; OR条件(OrTerm类) <br />
&#183; NOT条件(NotTerm类) <br />
&#183; SENT DATE条件(SentDateTerm类) <br />
&#183; CONTENT条件(BodyTerm类) <br />
&#183; HEADER条件(FromTerm / FromStringTerm, RecipientTerm / RecipientStringTerm, SubjectTerm, etc.) <br />
本质上，您可以为匹配的消息创建一个逻辑表达式，然后进行搜索。例如，下面显示了一条消息的条件搜索示例，该消息带有（部分带有）一个ADV主题字符串，其发送者字段为friend@public.com。您可能考虑定期运行该查询，并自动删除任何返回的消息。<br />
SearchTerm st = <br />
new OrTerm(<br />
new SubjectTerm("ADV:"), <br />
new FromStringTerm("friend@public.com"));<br />
Message[] msgs = folder.search(st);<br />
</font>　　 
<img src ="http://www.blogjava.net/table/aggbug/268801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2009-05-04 13:44 <a href="http://www.blogjava.net/table/articles/268801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HttpClient入门</title><link>http://www.blogjava.net/table/articles/256220.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Mon, 23 Feb 2009 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/256220.html</guid><wfw:comment>http://www.blogjava.net/table/comments/256220.html</wfw:comment><comments>http://www.blogjava.net/table/articles/256220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/256220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/256220.html</trackback:ping><description><![CDATA[<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0">
    <tbody>
        <tr>
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td>
            <table cellspacing="0" cellpadding="0" width="150" border="0">
                <tbody>
                    <tr>
                        <td class="v14-header-1-small">文档选项</td>
                    </tr>
                </tbody>
            </table>
            <table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td class="no-padding" width="150">
                        <table cellspacing="0" cellpadding="0" width="143" border="0">
                            <script language="JavaScript" type="text/javascript">
<!-- document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img alt="将打印机的版面设置成横向打印模式" height="16" src="//www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3"  /></td><td width="122"><p><strong><a class="smallplainlink" href="javascript:print()">打印本页</a></strong></p></td></tr>');
//-->
</script>
                            <tbody>
                                <tr valign="top">
                                    <td width="8"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></td>
                                    <td width="16"><img height="16" alt="将打印机的版面设置成横向打印模式" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td>
                                    <td width="122">
                                    <p><strong><a class="smallplainlink" href="javascript:print()" cmimpressionsent="1">打印本页</a></strong></p>
                                    </td>
                                </tr>
                                <noscript></noscript>
                                <form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp" cm1="1">
                                    <input type="hidden" value="HttpClient 是 Apache Jakarta Common 下的子项目，可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient，然后根据作者实际工作经验给出了一些常见问题的解决方法。" name="body" cM3 cm1="1" cm2="0" /><input type="hidden" value="HttpClient入门" name="subject" cM3 cm1="1" cm2="1" /><input type="hidden" value="cn" name="lang" cM3 cm1="1" cm2="2" /> <script language="JavaScript" type="text/javascript">
<!-- document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送"  /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p></td></tr>');
//-->
</script>
                                    <tr valign="top">
                                        <td width="8"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></td>
                                        <td width="16"><img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" /></td>
                                        <td width="122">
                                        <p><a class="smallplainlink" href="javascript:document.email.submit();" cmimpressionsent="1"><strong>将此页作为电子邮件发送</strong></a></p>
                                        </td>
                                    </tr>
                                    <noscript>
                                    <tr valign="top">
                                        <td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"  /></td>
                                        <td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"  /></td>
                                        <td class="small" width="122">
                                        <p><span class="ast">未显示需要 JavaScript 的文档选项</span></p>
                                        </td>
                                    </tr>
                                    </noscript>
                                </form>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br />
            </td>
        </tr>
    </tbody>
</table>
<p>级别： 高级</p>
<p><a href="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/#author" cmimpressionsent="1">发华 金</a>, 软件工程师，IBM CSDL, IBM<br />
<a href="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/#author" cmimpressionsent="1">樟洪 陈</a>, 软件工程师，IBM CSDL, IBM<br />
</p>
<p>2005 年 11 月 10 日</p>
<blockquote>HttpClient 是 Apache Jakarta Common 下的子项目，可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient，然后根据作者实际工作经验给出了一些常见问题的解决方法。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name="N1004B"><span class="atitle">HttpClient简介</span></a></p>
<p>HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了，越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能，但是对于大部分应用程序来说，JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目，用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包，并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中，比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient，更多使用 HttpClient 的应用可以参见<a href="http://wiki.apache.org/jakarta-httpclient/HttpClientPowered" cmimpressionsent="1">http://wiki.apache.org/jakarta-httpclient/HttpClientPowered</a>。HttpClient 项目非常活跃，使用的人还是非常多的。目前 HttpClient 版本是在 2005.10.11 发布的 3.0 RC4 。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10058"><span class="atitle">HttpClient 功能介绍</span></a></p>
<p>以下列出的是 HttpClient 提供的主要的功能，要知道更多详细的功能可以参见 HttpClient 的主页。</p>
<ul>
    <li>实现了所有 HTTP 的方法（GET,POST,PUT,HEAD 等）
    <li>支持自动转向
    <li>支持 HTTPS 协议
    <li>支持代理服务器等 </li>
</ul>
<p>下面将逐一介绍怎样使用这些功能。首先，我们必须安装好 HttpClient。</p>
<ul>
    <li>HttpClient 可以在<a href="http://jakarta.apache.org/commons/httpclient/downloads.html" cmimpressionsent="1">http://jakarta.apache.org/commons/httpclient/downloads.html</a>下载
    <li>HttpClient 用到了 Apache Jakarta common 下的子项目 logging，你可以从这个地址<a href="http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi" cmimpressionsent="1">http://jakarta.apache.org/site/downloads/downloads_commons-logging.cgi</a>下载到 common logging，从下载后的压缩包中取出 commons-logging.jar 加到 CLASSPATH 中
    <li>HttpClient 用到了 Apache Jakarta common 下的子项目 codec，你可以从这个地址<a href="http://jakarta.apache.org/site/downloads/downloads_commons-codec" cmimpressionsent="1">http://jakarta.apache.org/site/downloads/downloads_commons-codec</a>.cgi 下载到最新的 common codec，从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中 </li>
</ul>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1008B"><span class="atitle">HttpClient 基本功能的使用</span></a></p>
<p><a name="N10091"><span class="smalltitle">GET 方法</span></a></p>
<p>使用 HttpClient 需要以下 6 个步骤：</p>
<p>1. 创建 HttpClient 的实例</p>
<p>2. 创建某种连接方法的实例，在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址</p>
<p>3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例</p>
<p>4. 读 response</p>
<p>5. 释放连接。无论执行方法是否成功，都必须释放连接</p>
<p>6. 对得到后的内容进行处理</p>
<p>根据以上步骤，我们来编写用GET方法来取得某网页内容的代码。</p>
<ul>
    <li>大部分情况下 HttpClient 默认的构造函数已经足够使用。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">HttpClient httpClient = new HttpClient();
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。用GetMethod将会自动处理转发过程，如果想要把自动处理转发过程去掉的话，可以调用方法setFollowRedirects(false)。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">GetMethod getMethod = new GetMethod("http://www.ibm.com/");
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序，在运行executeMethod方法的时候，需要处理两个异常，分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对，比如不小心将"http"写成"htp"，或者服务器端返回的内容不正常等，并且该异常发生是不可恢复的；第二种异常一般是由于网络原因引起的异常，对于这种异常 （IOException），HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义（通过实现接口HttpMethodRetryHandler来实现）。通过httpClient的方法setParameter设置你实现的恢复策略，本文中使用的是系统提供的默认恢复策略，该策略在碰到第二类异常的时候将自动重试3次。executeMethod返回值是一个整数，表示了执行该方法后服务器返回的状态码，该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转（默认状态下GetMethod的实例是自动处理跳转的）等。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">//设置成了默认的恢复策略，在发生异常时候将自动重试3次，在这里你也可以设置成自定义的恢复策略
                getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                new DefaultHttpMethodRetryHandler());
                //执行getMethod
                int statusCode = client.executeMethod(getMethod);
                if (statusCode != HttpStatus.SC_OK) {
                System.err.println("Method failed: " + getMethod.getStatusLine());
                }
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>在返回的状态码正确后，即可取得内容。取得目标地址的内容有三种方法：第一种，getResponseBody，该方法返回的是目标的二进制的byte流；第二种，getResponseBodyAsString，这个方法返回的是String类型，值得注意的是该方法返回的String的编码是根据系统默认的编码方式，所以返回的String值可能编码类型有误，在本文的"字符编码"部分中将对此做详细介绍；第三种，getResponseBodyAsStream，这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">byte[] responseBody = method.getResponseBody();
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>释放连接。无论执行方法是否成功，都必须释放连接。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">method.releaseConnection();
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>处理内容。在这一步中根据你的需要处理内容，在例子中只是简单的将内容打印到控制台。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">System.out.println(new String(responseBody));
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    </li>
</ul>
<p>下面是程序的完整代码，这些代码也可在附件中的test.GetSample中找到。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">package test;
            import java.io.IOException;
            import org.apache.commons.httpclient.*;
            import org.apache.commons.httpclient.methods.GetMethod;
            import org.apache.commons.httpclient.params.HttpMethodParams;
            public class GetSample{
            public static void main(String[] args) {
            //构造HttpClient的实例
            HttpClient httpClient = new HttpClient();
            //创建GET方法的实例
            GetMethod getMethod = new GetMethod("http://www.ibm.com");
            //使用系统提供的默认的恢复策略
            getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
            new DefaultHttpMethodRetryHandler());
            try {
            //执行getMethod
            int statusCode = httpClient.executeMethod(getMethod);
            if (statusCode != HttpStatus.SC_OK) {
            System.err.println("Method failed: "
            + getMethod.getStatusLine());
            }
            //读取内容
            byte[] responseBody = getMethod.getResponseBody();
            //处理内容
            System.out.println(new String(responseBody));
            } catch (HttpException e) {
            //发生致命的异常，可能是协议不对或者返回的内容有问题
            System.out.println("Please check your provided http address!");
            e.printStackTrace();
            } catch (IOException e) {
            //发生网络异常
            e.printStackTrace();
            } finally {
            //释放连接
            getMethod.releaseConnection();
            }
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N100E8"><span class="smalltitle">POST方法</span></a></p>
<p>根据RFC2616，对POST的解释如下：POST方法用来向目的服务器发出请求，要求它接受被附在请求后的实体，并把它当作请求队列（Request-Line）中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能：</p>
<ul>
    <li>对现有资源的注释（Annotation of existing resources）
    <li>向电子公告栏、新闻组，邮件列表或类似讨论组发送消息
    <li>提交数据块，如将表单的结果提交给数据处理过程
    <li>通过附加操作来扩展数据库 </li>
</ul>
<p>调用HttpClient中的PostMethod与GetMethod类似，除了设置PostMethod的实例与GetMethod有些不同之外，剩下的步骤都差不多。在下面的例子中，省去了与GetMethod相同的步骤，只说明与上面不同的地方，并以登录清华大学BBS为例子进行说明。</p>
<ul>
    <li>构造PostMethod之前的步骤都相同，与GetMethod一样，构造PostMethod也需要一个URI参数，在本例中，登录的地址是http://www.newsmth.net/bbslogin2.php。在创建了PostMethod的实例之后，需要给method实例填充表单的值，在BBS的登录表单中需要有两个域，第一个是用户名（域名叫id），第二个是密码（域名叫passwd）。表单中的域用类NameValuePair来表示，该类的构造函数第一个参数是域名，第二参数是该域的值；将表单所有的值设置到PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面，但是HttpClient对于要求接受后继服务的请求，比如POST和PUT，不支持自动转发，因此需要自己对页面转向做处理。具体的页面转向处理请参见下面的"自动转向"部分。代码如下：
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">String url = "http://www.newsmth.net/bbslogin2.php";
                PostMethod postMethod = new PostMethod(url);
                // 填入各个表单域的值
                NameValuePair[] data = { new NameValuePair("id", "youUserName"),
                <!-- code sample is too wide -->new NameValuePair("passwd", "yourPwd") };
                // 将表单的值放入postMethod中
                postMethod.setRequestBody(data);
                // 执行postMethod
                int statusCode = httpClient.executeMethod(postMethod);
                // HttpClient对于要求接受后继服务的请求，象POST和PUT等不能自动处理转发
                // 301或者302
                if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
                statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
                // 从头中取出转向的地址
                Header locationHeader = postMethod.getResponseHeader("location");
                String location = null;
                if (locationHeader != null) {
                location = locationHeader.getValue();
                System.out.println("The page was redirected to:" + location);
                } else {
                System.err.println("Location field value is null.");
                }
                return;
                }
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    </li>
</ul>
<p>完整的程序代码请参见附件中的test.PostSample</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10110"><span class="atitle">使用HttpClient过程中常见的一些问题</span></a></p>
<p>下面介绍在使用HttpClient过程中常见的一些问题。</p>
<p><a name="N10119"><span class="smalltitle">字符编码</span></a></p>
<p>某目标页的编码可能出现在两个地方，第一个地方是服务器返回的http头中，另外一个地方是得到的html/xml页面中。</p>
<ul>
    <li>在http头的Content-Type字段可能会包含字符编码信息。例如可能返回的头会包含这样子的信息：Content-Type: text/html; charset=UTF-8。这个头信息表明该页的编码是UTF-8，但是服务器返回的头信息未必与内容能匹配上。比如对于一些双字节语言国家，可能服务器返回的编码类型是UTF-8，但真正的内容却不是UTF-8编码的，因此需要在另外的地方去得到页面的编码信息；但是如果服务器返回的编码不是UTF-8，而是具体的一些编码，比如gb2312等，那服务器返回的可能是正确的编码信息。通过method对象的getResponseCharSet()方法就可以得到http头中的编码信息。
    <li>对于象xml或者html这样的文件，允许作者在页面中直接指定编码类型。比如在html中会有&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"/&gt;这样的标签；或者在xml中会有&lt;?xml version="1.0" encoding="gb2312"?&gt;这样的标签，在这些情况下，可能与http头中返回的编码信息冲突，需要用户自己判断到底那种编码类型应该是真正的编码。 </li>
</ul>
<p><a name="N1012B"><span class="smalltitle">自动转向</span></a></p>
<p>根据RFC2616中对自动转向的定义，主要有两种：301和302。301表示永久的移走（Moved Permanently），当返回的是301，则表示请求的资源已经被移到一个固定的新地方，任何向该地址发起请求都会被转到新的地址上。302表示暂时的转向，比如在服务器端的servlet程序调用了sendRedirect方法，则在客户端就会得到一个302的代码，这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。</p>
<p>HttpClient支持自动转向处理，但是象POST和PUT方式这种要求接受后继服务的请求方式，暂时不支持自动转向，因此如果碰到POST方式提交后返回的是301或者302的话需要自己处理。就像刚才在POSTMethod中举的例子：如果想进入登录BBS后的页面，必须重新发起登录的请求，请求的地址可以在头字段location中得到。不过需要注意的是，有时候location返回的可能是相对路径，因此需要对location返回的值做一些处理才可以发起向新地址的请求。</p>
<p>另外除了在头中包含的信息可能使页面发生重定向外，在页面中也有可能会发生页面的重定向。引起页面自动转发的标签是：&lt;meta http-equiv="refresh" content="5; url=http://www.ibm.com/us"&gt;。如果你想在程序中也处理这种情况的话得自己分析页面来实现转向。需要注意的是，在上面那个标签中url的值也可以是一个相对地址，如果是这样的话，需要对它做一些处理后才可以转发。</p>
<p><a name="N1013A"><span class="smalltitle">处理HTTPS协议</span></a></p>
<p>HttpClient提供了对SSL的支持，在使用SSL之前必须安装JSSE。在Sun提供的1.4以后的版本中，JSSE已经集成到JDK中，如果你使用的是JDK1.4以前的版本则必须安装JSSE。JSSE不同的厂家有不同的实现。下面介绍怎么使用HttpClient来打开Https连接。这里有两种方法可以打开https连接，第一种就是得到服务器颁发的证书，然后导入到本地的keystore中；另外一种办法就是通过扩展HttpClient的类来实现自动接受证书。</p>
<p>方法1，取得证书，并导入本地的keystore：</p>
<ul>
    <li>安装JSSE （如果你使用的JDK版本是1.4或者1.4以上就可以跳过这一步）。本文以IBM的JSSE为例子说明。先到IBM网站上下载JSSE的安装包。然后解压开之后将ibmjsse.jar包拷贝到&lt;java-home&gt;\lib\ext\目录下。
    <li>取得并且导入证书。证书可以通过IE来获得：
    <p>1． 用IE打开需要连接的https网址，会弹出如下对话框：</p>
    <br />
    <img height="301" alt="" src="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/images/image001.png" width="384" border="0" /> <br />
    <p>2． 单击"View Certificate"，在弹出的对话框中选择"Details"，然后再单击"Copy to File"，根据提供的向导生成待访问网页的证书文件</p>
    <br />
    <img height="476" alt="" src="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/images/image003.png" width="409" border="0" /> <br />
    <p>3． 向导第一步，欢迎界面，直接单击"Next"，</p>
    <br />
    <img height="386" alt="" src="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/images/image005.png" width="503" border="0" /> <br />
    <p>4． 向导第二步，选择导出的文件格式，默认，单击"Next"，</p>
    <br />
    <img height="386" alt="" src="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/images/image007.png" width="503" border="0" /> <br />
    <p>5． 向导第三步，输入导出的文件名，输入后，单击"Next"，</p>
    <br />
    <img height="454" alt="" src="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/images/image009.png" width="506" border="0" /> <br />
    <p>6． 向导第四步，单击"Finish"，完成向导</p>
    <br />
    <img height="386" alt="" src="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/images/image011.png" width="503" border="0" /> <br />
    <p>7． 最后弹出一个对话框，显示导出成功</p>
    <br />
    <img height="100" alt="" src="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/images/image013.png" width="183" border="0" /> <br />
    <li>
    <p>用keytool工具把刚才导出的证书倒入本地keystore。Keytool命令在&lt;java-home&gt;\bin\下，打开命令行窗口，并到&lt;java-home&gt;\lib\security\目录下，运行下面的命令：</p>
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">keytool -import -noprompt -keystore cacerts -storepass changeit -alias yourEntry1 -file your.cer
                <!-- code sample is too wide --></pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <p>其中参数alias后跟的值是当前证书在keystore中的唯一标识符，但是大小写不区分；参数file后跟的是刚才通过IE导出的证书所在的路径和文件名；如果你想删除刚才导入到keystore的证书，可以用命令：</p>
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">keytool -delete -keystore cacerts -storepass changeit -alias yourEntry1
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>写程序访问https地址。如果想测试是否能连上https，只需要稍改一下GetSample例子，把请求的目标变成一个https地址。
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">GetMethod getMethod = new GetMethod("https://www.yourdomain.com");
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <p>运行该程序可能出现的问题：</p>
    <p>1. 抛出异常java.net.SocketException: Algorithm SSL not available。出现这个异常可能是因为没有加JSSEProvider，如果用的是IBM的JSSE Provider，在程序中加入这样的一行：</p>
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode"> if(Security.getProvider("com.ibm.jsse.IBMJSSEProvider") == null)
                Security.addProvider(new IBMJSSEProvider());
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <p>或者也可以打开&lt;java-home&gt;\lib\security\java.security，在行</p>
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">security.provider.1=sun.security.provider.Sun
                security.provider.2=com.ibm.crypto.provider.IBMJCE
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <p>后面加入security.provider.3=com.ibm.jsse.IBMJSSEProvider</p>
    <p>2. 抛出异常java.net.SocketException: SSL implementation not available。出现这个异常可能是你没有把ibmjsse.jar拷贝到&lt;java-home&gt;\lib\ext\目录下。</p>
    <p>3. 抛出异常javax.net.ssl.SSLHandshakeException: unknown certificate。出现这个异常表明你的JSSE应该已经安装正确，但是可能因为你没有把证书导入到当前运行JRE的keystore中，请按照前面介绍的步骤来导入你的证书。</p>
    </li>
</ul>
<p>方法２，扩展HttpClient类实现自动接受证书</p>
<p>因为这种方法自动接收所有证书，因此存在一定的安全问题，所以在使用这种方法前请仔细考虑您的系统的安全需求。具体的步骤如下：</p>
<ul>
    <li>提供一个自定义的socket factory（test.MySecureProtocolSocketFactory）。这个自定义的类必须实现接口org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory，在实现接口的类中调用自定义的X509TrustManager(test.MyX509TrustManager)，这两个类可以在随本文带的附件中得到
    <li>创建一个org.apache.commons.httpclient.protocol.Protocol的实例，指定协议名称和默认的端口号
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>注册刚才创建的https协议对象
    <table cellspacing="0" cellpadding="0" width="100%" border="0">
        <tbody>
            <tr>
                <td class="code-outline">
                <pre class="displaycode">Protocol.registerProtocol("https ", myhttps);
                </pre>
                </td>
            </tr>
        </tbody>
    </table>
    <br />
    <li>然后按照普通编程方式打开https的目标地址，代码请参见test.NoCertificationHttpsGetSample </li>
</ul>
<p><a name="N1022A"><span class="smalltitle">处理代理服务器</span></a></p>
<p>HttpClient中使用代理服务器非常简单，调用HttpClient中setProxy方法就可以，方法的第一个参数是代理服务器地址，第二个参数是端口号。另外HttpClient也支持SOCKS代理。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">httpClient.getHostConfiguration().setProxy(hostName,port);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-httpclient/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1023C"><span class="atitle">结论</span></a></p>
<p>从上面的介绍中，可以知道HttpClient对http协议支持非常好，使用起来很简单，版本更新快，功能也很强大，具有足够的灵活性和扩展性。对于想在Java应用中直接访问http资源的编程人员来说，HttpClient是一个不可多得的好工具。</p>
<br />
<br />
<p><a name="resources"><span class="atitle">参考资料 </span></a></p>
<ul>
    <li>Commons logging包含了各种各样的日志API的实现，读者可以通过站点http://jakarta.apache.org/commons/logging/得到详细的内容<br />
    <br />
    <li>Commons codec包含了一些一般的解码/编码算法。包含了语音编码、十六进制、Base64和URL编码等，通过http://jakarta.apache.org/commons/codec/可以得到详细的内容<br />
    <br />
    <li>rfc2616是关于HTTP/1.1的文档，可以在http://www.faqs.org/rfcs/rfc2616.html上得到详细的内容，另外rfc1945是关于HTTP/1.0的文档，通过http://www.faqs.org/rfcs/rfc1945.html可以得到详细内容<br />
    <br />
    <li>SSL――SSL 是由 Netscape Communications Corporation 于 1994 年开发的，而 TLS V1.0 是由 Internet Engineering Task Force（IETF）定义的标准，它基于 SSL V3.0，并且在使用的加密算法上与其有些许的不同。例如，SSL 使用 Message Authentication Code（MAC）算法来生成完整性校验值，而 TLS 应用密钥的 Hashing for Message Authentication Code（HMAC）算法。<br />
    <br />
    <li>IBM JSSE提供了SSL（Secure Sockets Layer）和TLS（Transport Layer Security）的java实现，在http://www-03.ibm.com/servers/eserver/zseries/software/java/jsse.html中可以得到详细的信息<br />
    <br />
    <li>Keytool是一个管理密钥和证书的工具。关于它详细的使用信息可以在http://www.doc.ic.ac.uk/csg/java/1.3.1docs/tooldocs/solaris/keytool.html上得到<br />
    <br />
    <li>HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/，你可以在这里得到关于HttpClient更加详细的信息<br />
    </li>
</ul>
<br />
<br />
<p><a name="author"><span class="atitle">作者简介</span></a></p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td>
        </tr>
        <tr valign="top" align="left">
            <td>
            <p>&nbsp;</p>
            </td>
            <td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td>
            <td width="100%">
            <p>金发华是一名工作在 IBM CSDL 的软件工程师。他喜欢钻研各种新的技术，在 Java 网络开发和 Web 开发方面颇有经验。</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td>
        </tr>
        <tr valign="top" align="left">
            <td>
            <p>&nbsp;</p>
            </td>
            <td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td>
            <td width="100%">
            <p>陈樟洪是一位 IBM CSDL 的软件工程师，目前从事企业电子商务应用的开发。</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/table/aggbug/256220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2009-02-23 14:43 <a href="http://www.blogjava.net/table/articles/256220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>巩固java基础之值传递和引用传递</title><link>http://www.blogjava.net/table/articles/246910.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Wed, 17 Dec 2008 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/246910.html</guid><wfw:comment>http://www.blogjava.net/table/comments/246910.html</wfw:comment><comments>http://www.blogjava.net/table/articles/246910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/246910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/246910.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>值传递：方法调用时，实际参数把它的值传递给对应的形式参数，方法执行中形式参数值的改变不影响实际参&nbsp;数的值。<br />
引用传递：也称为传地址。方法调用时，实际参数的引用(地址，而不是参数的值)被传递给方法中相对应的形式参数，在方法执行中，对形式参数的操作实际上就是对实际参数的操作，方法执行中形式参数值的改变将会影响实际参数的值。<br />
下面举例说明：<br />
<strong><em><span style="color: #ff0000"><strong><em style="color: #ff6600">传值---传递基本数据类型参数</em></strong></span></em></strong></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://beckdim.javaeye.com/blog/199658#"><img alt="复制代码" src="http://beckdim.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">class</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PassValue{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;exchange(</span><span class="keyword">int</span><span>&nbsp;a,&nbsp;</span><span class="keyword">int</span><span>&nbsp;b){</span><span class="comment">//静态方法，交换a,b的值 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;temp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;a; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;b; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;temp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">10</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;j&nbsp;=&nbsp;</span><span class="number">100</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"before&nbsp;call:&nbsp;"</span><span>&nbsp;+&nbsp;</span><span class="string">"i="</span><span>&nbsp;+&nbsp;i&nbsp;+&nbsp;</span><span class="string">"\t"</span><span>&nbsp;+&nbsp;</span><span class="string">"j&nbsp;=&nbsp;"</span><span>&nbsp;+&nbsp;j);</span><span class="comment">//调用前 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exchange(i,&nbsp;j);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//值传递，main方法只能调用静态方法 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"after&nbsp;call:&nbsp;"</span><span>&nbsp;+&nbsp;</span><span class="string">"i="</span><span>&nbsp;+&nbsp;i&nbsp;+&nbsp;</span><span class="string">"\t"</span><span>&nbsp;+&nbsp;</span><span class="string">"j&nbsp;=&nbsp;"</span><span>&nbsp;+&nbsp;j);</span><span class="comment">//调用后 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public    class           PassValue{
static void exchange(int a, int b){//静态方法，交换a,b的值
int temp;
temp = a;
a = b;
b = temp;
}
public static void main(String[] args){
int i = 10;
int j = 100;
System.out.println("before call: " + "i=" + i + "\t" + "j = " + j);//调用前
exchange(i, j);                                                                    //值传递，main方法只能调用静态方法
System.out.println("after call: " + "i=" + i + "\t" + "j = " + j);//调用后
}
}
</pre>
<p><em><strong>&nbsp;<br />
</strong><strong>&nbsp;</strong></em>
<p>运行结果：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;before call: i = 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = 100<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;after&nbsp;&nbsp;&nbsp;&nbsp;call: i = 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = 100<br />
说明：调用exchange(i, j)时，实际参数i，j分别把值传递给相应的形式参数a，b,在执行方法exchange()时，形式参数a，b的值的改变不影响实际参数i和j的值，i和j的值在调用前后并没改变。<br />
<strong><em style="color: #ff6600">引用传递---对象作为参数<br />
</em></strong>如果在方法中把对象（或数组）作为参数，方法调用时，参数传递的是对象的引用（地址），即在方法调用时，实际参数把对对象的引用（地址）传递给形式参数。这是实际参数与形式参数指向同一个地址，即同一个对象（数组），方法执行时，对形式参数的改变实际上就是对实际参数的改变，这个结果在调用结束后被保留了下来。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://beckdim.javaeye.com/blog/199658#"><img alt="复制代码" src="http://beckdim.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">class</span><span>&nbsp;Book{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;folat&nbsp;price; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;Book(String&nbsp;n,&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">float</span><span>&nbsp;){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//构造方法 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;n; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;price&nbsp;=&nbsp;p; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;&nbsp;</span><span class="keyword">void</span><span>&nbsp;&nbsp;change(Book&nbsp;a_book,&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;n,&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">float</span><span>&nbsp;p){&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//静态方法，对象作为参数 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a_book.name&nbsp;=&nbsp;n; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a_book.price&nbsp;=&nbsp;p; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;output(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//实例方法，输出对象信息 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"name:&nbsp;"</span><span>&nbsp;+&nbsp;name&nbsp;+&nbsp;</span><span class="string">"\t"</span><span>&nbsp;+&nbsp;</span><span class="string">"price:&nbsp;"</span><span>&nbsp;+&nbsp;price); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;PassAddr{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;[]&nbsp;args){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;b&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Book(</span><span class="string">"java2"</span><span>,&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">32</span><span>.5f); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span class="string">"before&nbsp;call:\t"</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//调用前 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.output(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.change(b,&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">"c++"</span><span>,&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="number">45</span><span>.5f);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//引用传递，传递对象b的引用，修改对象b的值 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span class="string">"after&nbsp;call:\t"</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//调用后 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.output(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">class Book{
String name;
private folat price;
Book(String n,    float ){                //构造方法
name = n;
price = p;
}
static  void  change(Book a_book,    String n,    float p){    //静态方法，对象作为参数
a_book.name = n;
a_book.price = p;
}
public void output(){        //实例方法，输出对象信息
System.out.println("name: " + name + "\t" + "price: " + price);
}
}
public class PassAddr{
public static void main(String [] args){
Book b = new Book("java2",    32.5f);
System.out.print("before call:\t");        //调用前
b.output();
b.change(b,    "c++",    45.5f);            //引用传递，传递对象b的引用，修改对象b的值
System.out.print("after call:\t");            //调用后
b.output();
}
}
</pre>
<p>&nbsp;</p>
<p>运行结果：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;before&nbsp;&nbsp;&nbsp;&nbsp;call:&nbsp;&nbsp;&nbsp;&nbsp;name:java2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;price:32.5<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;after&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call:&nbsp;&nbsp;&nbsp;&nbsp;name:c++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;price:45.5<br />
说明：调用change(b,"c++",45.5f)时，对象b作为实际参数，把引用传递给相应的形式参数a_book,实际上a_book也指向同一个对象，即该对象有两个引用名：b和a_book。在执行方法change()时，对形式参数a_book操作就是对实际参数b的操作。</p>
<p>&nbsp;</p>
</div>
<img src ="http://www.blogjava.net/table/aggbug/246910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2008-12-17 16:57 <a href="http://www.blogjava.net/table/articles/246910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SimpleDateFormat格式化日期 </title><link>http://www.blogjava.net/table/articles/246908.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Wed, 17 Dec 2008 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/246908.html</guid><wfw:comment>http://www.blogjava.net/table/comments/246908.html</wfw:comment><comments>http://www.blogjava.net/table/articles/246908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/246908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/246908.html</trackback:ping><description><![CDATA[<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://beckdim.javaeye.com/blog/251423#"><img alt="复制代码" src="http://beckdim.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">import</span><span>&nbsp;java.text.SimpleDateFormat; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.util.Date; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;test&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String&nbsp;[]aa){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;SimpleDateFormat&nbsp;dateformat1=</span><span class="keyword">new</span><span>&nbsp;SimpleDateFormat(</span><span class="string">"yyyy-MM-dd&nbsp;HH:mm:ss&nbsp;E"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;String&nbsp;a1=dateformat1.format(</span><span class="keyword">new</span><span>&nbsp;Date()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;System.out.println(</span><span class="string">"时间2:"</span><span>+a1); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;System.out.println(</span><span class="keyword">new</span><span>&nbsp;Date().getYear()+</span><span class="number">1900</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;SimpleDateFormat&nbsp;dateformat2=</span><span class="keyword">new</span><span>&nbsp;SimpleDateFormat(</span><span class="string">"yyyy年MM月dd日&nbsp;HH时mm分ss秒&nbsp;E&nbsp;"</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;a2=dateformat2.format(</span><span class="keyword">new</span><span>&nbsp;Date()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"时间2:"</span><span>+a2);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">import java.text.SimpleDateFormat;
import java.util.Date;
public class test {
public static void main(String []aa){
SimpleDateFormat dateformat1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
String a1=dateformat1.format(new Date());
System.out.println("时间2:"+a1);
System.out.println(new Date().getYear()+1900);
SimpleDateFormat dateformat2=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 E ");
String a2=dateformat2.format(new Date());
System.out.println("时间2:"+a2);
}
}</pre>
<p>&nbsp;<br />
<br />
<br />
执行结果:<br />
时间2:2006-12-21 14:40:59 星期四<br />
2006<br />
时间2:2006年12月21日 14时40分59秒 星期四<br />
<br />
<br />
</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://beckdim.javaeye.com/blog/251423#"><img alt="复制代码" src="http://beckdim.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>java.util.Calendar对于日期的处理非常的方便，如newDate.set(Calendar.MONTH,&nbsp;</span><span class="number">12</span><span>);&nbsp;</span><span class="comment">//加12个月，newDate.set(Calendar.DATE,&nbsp;-1);&nbsp;//前一天 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.text.SimpleDateFormat; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.util.Date; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.util.Calendar; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;calendartest&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;*&nbsp;@param&nbsp;args </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;SimpleDateFormat&nbsp;dateformat=</span><span class="keyword">new</span><span>&nbsp;SimpleDateFormat(</span><span class="string">"yyyy-MM-dd&nbsp;HH:mm:ss&nbsp;E"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;System.out.println(</span><span class="string">"今天&nbsp;&nbsp;:"</span><span>+dateformat.format(</span><span class="keyword">new</span><span>&nbsp;Date())); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;Calendar&nbsp;c=Calendar.getInstance();&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;c.set(Calendar.DAY_OF_WEEK,&nbsp;Calendar.MONDAY); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;Date&nbsp;d1=</span><span class="keyword">new</span><span>&nbsp;Date(c.getTimeInMillis()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;System.out.println(</span><span class="string">"星期一:"</span><span>+dateformat.format(d1)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;c.set(Calendar.DAY_OF_WEEK,&nbsp;Calendar.SUNDAY); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;Date&nbsp;d2=</span><span class="keyword">new</span><span>&nbsp;Date(c.getTimeInMillis()); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;System.out.println(</span><span class="string">"星期日:"</span><span>+dateformat.format(d2));&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">java.util.Calendar对于日期的处理非常的方便，如newDate.set(Calendar.MONTH, 12); //加12个月，newDate.set(Calendar.DATE, -1); //前一天
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
public class calendartest {
/**
* @param args
*/
public static void main(String[] args) {
SimpleDateFormat dateformat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
System.out.println("今天  :"+dateformat.format(new Date()));
Calendar c=Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
Date d1=new Date(c.getTimeInMillis());
System.out.println("星期一:"+dateformat.format(d1));
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Date d2=new Date(c.getTimeInMillis());
System.out.println("星期日:"+dateformat.format(d2));
}
}
</pre>
<p>&nbsp;<br />
<br />
执行结果:<br />
今天&nbsp; :2006-12-21 16:39:03 星期四<br />
星期一:2006-12-18 16:39:03 星期一<br />
星期日:2006-12-17 16:39:03 星期日</p>
<img src ="http://www.blogjava.net/table/aggbug/246908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2008-12-17 16:54 <a href="http://www.blogjava.net/table/articles/246908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java如何远程访问一个共享目录</title><link>http://www.blogjava.net/table/articles/246906.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Wed, 17 Dec 2008 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/246906.html</guid><wfw:comment>http://www.blogjava.net/table/comments/246906.html</wfw:comment><comments>http://www.blogjava.net/table/articles/246906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/246906.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/246906.html</trackback:ping><description><![CDATA[<p>由于工作需要读取局域网中一台机器的 共享目录中的文件,需要<a href="http://jcifs.samba.org/src/"><span style="color: #075db3">jcifs-1.1.11.jar</span></a>的支持,使用<a href="http://www.yuanma.org/data/2006/0614/article_826.htm"><span style="color: #075db3">SMB协议</span></a>协议,以下是实现了远程读取并复制到本地,然后删除本地文件的功能:</p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://beckdim.javaeye.com/blog/276022#"><img alt="复制代码" src="http://beckdim.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">import</span><span>&nbsp;java.io.BufferedInputStream; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.io.BufferedOutputStream; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.io.File; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.io.FileOutputStream; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.io.InputStream; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.io.OutputStream; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.util.Date; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;jcifs.smb.SmbFile; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;jcifs.smb.SmbFileInputStream; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestReadSmb&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;...{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;smbMachine=</span><span class="string">"smb://10.108.23.200/temp/说明文件.txt"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;localPath=</span><span class="string">"D:/temp"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file=readFromSmb(smbMachine,localPath); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removeFile(file); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/**&nbsp;*** </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;从smbMachine读取文件并存储到localpath指定的路径 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;smbMachine </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;共享机器的文件,如smb://xxx:xxx@10.108.23.112/myDocument/测试文本.txt,xxx:xxx是共享机器的用户名密码 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;localpath </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本地路径 </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;*&nbsp;@return </span>&nbsp;</span></li>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;File&nbsp;readFromSmb(String&nbsp;smbMachine,String&nbsp;localpath){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;localfile=</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;bis=</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;bos=</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;...{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SmbFile&nbsp;rmifile&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SmbFile(smbMachine); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filename=rmifile.getName(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis=</span><span class="keyword">new</span><span>&nbsp;BufferedInputStream(</span><span class="keyword">new</span><span>&nbsp;SmbFileInputStream(rmifile)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localfile=</span><span class="keyword">new</span><span>&nbsp;File(localpath+File.separator+filename); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos=</span><span class="keyword">new</span><span>&nbsp;BufferedOutputStream(</span><span class="keyword">new</span><span>&nbsp;FileOutputStream(localfile)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;length=rmifile.getContentLength(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;buffer=</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[length]; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date=</span><span class="keyword">new</span><span>&nbsp;Date(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.read(buffer); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.write(buffer);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;end=</span><span class="keyword">new</span><span>&nbsp;Date(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;time=&nbsp;(</span><span class="keyword">int</span><span>)&nbsp;((end.getTime()-date.getTime())/</span><span class="number">1000</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(time&gt;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"用时:"</span><span>+time+</span><span class="string">"秒&nbsp;"</span><span>+</span><span class="string">"速度:"</span><span>+length/time/</span><span class="number">1024</span><span>+</span><span class="string">"kb/秒"</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;...{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">finally</span><span>{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.close(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li><span>&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;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;localfile; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;removeFile(File&nbsp;file)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;file.delete(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
public class TestReadSmb {
public static void main(String[] args) ...{
String smbMachine="smb://10.108.23.200/temp/说明文件.txt";
String localPath="D:/temp";
File file=readFromSmb(smbMachine,localPath);
removeFile(file);
}
/** ***
* 从smbMachine读取文件并存储到localpath指定的路径
*
* @param smbMachine
*            共享机器的文件,如smb://xxx:xxx@10.108.23.112/myDocument/测试文本.txt,xxx:xxx是共享机器的用户名密码
* @param localpath
*            本地路径
* @return
*/
public static File readFromSmb(String smbMachine,String localpath){
File localfile=null;
InputStream bis=null;
OutputStream bos=null;
try ...{
SmbFile rmifile = new SmbFile(smbMachine);
String filename=rmifile.getName();
bis=new BufferedInputStream(new SmbFileInputStream(rmifile));
localfile=new File(localpath+File.separator+filename);
bos=new BufferedOutputStream(new FileOutputStream(localfile));
int length=rmifile.getContentLength();
byte[] buffer=new byte[length];
Date date=new Date();
bis.read(buffer);
bos.write(buffer);
Date end=new Date();
int time= (int) ((end.getTime()-date.getTime())/1000);
if(time&gt;0)
System.out.println("用时:"+time+"秒 "+"速度:"+length/time/1024+"kb/秒");
} catch (Exception e) ...{
// TODO Auto-generated catch block
System.out.println(e.getMessage());
}finally{
try {
bos.close();
bis.close();
} catch (IOException e) {
//                // TODO Auto-generated catch block
e.printStackTrace();
}
}
return localfile;
}
public static boolean removeFile(File file) {
return file.delete();
}
}
</pre>
<img src ="http://www.blogjava.net/table/aggbug/246906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2008-12-17 16:52 <a href="http://www.blogjava.net/table/articles/246906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>处理clob大字段相关配置</title><link>http://www.blogjava.net/table/articles/246338.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Mon, 15 Dec 2008 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/246338.html</guid><wfw:comment>http://www.blogjava.net/table/comments/246338.html</wfw:comment><comments>http://www.blogjava.net/table/articles/246338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/246338.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/246338.html</trackback:ping><description><![CDATA[<p>在hibernate映射文件里默认String类型改为ClobStringType--<br />
&lt;property name="content" type="org.springframework.orm.hibernate3.support.ClobStringType" lazy="true" length="1048576000"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;column name="CONTENT" /&gt;<br />
&lt;/property&gt;<br />
===================================================<br />
在sessionFactory里添加--<br />
&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
&nbsp;&nbsp; &lt;!-- 为处理Clob类型字段的句柄声明 //--&gt;<br />
&nbsp;&nbsp; &lt;property name="lobHandler" ref="lobHandler" /&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true" /&gt;<br />
&lt;bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true"&gt;<br />
&nbsp;&nbsp; &lt;property name="nativeJdbcExtractor"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;ref local="nativeJdbcExtractor" /&gt;<br />
&nbsp;&nbsp; &lt;/property&gt;<br />
&lt;/bean&gt;</p>
<img src ="http://www.blogjava.net/table/aggbug/246338.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2008-12-15 10:36 <a href="http://www.blogjava.net/table/articles/246338.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp导出word、excel</title><link>http://www.blogjava.net/table/articles/246336.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Mon, 15 Dec 2008 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/246336.html</guid><wfw:comment>http://www.blogjava.net/table/comments/246336.html</wfw:comment><comments>http://www.blogjava.net/table/articles/246336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/246336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/246336.html</trackback:ping><description><![CDATA[<p>把对象或者列表传到Jsp页面上；</p>
<p>头部加入：word为&lt;%@ page contentType="application/vnd.ms-word; charset=gb2312" %&gt;，Excel为&lt;%@ page contentType="application/msexcel; charset=gb2312" %&gt;</p>
<p>加入此句，给导出的文件命名：&lt;%response.setHeader("Content-disposition","attachment; filename="+"txl"+".xls");%&gt;或者response.setHeader("Content-disposition","attachment; filename=print_tmp.doc");</p>
<p>即可，注意的是，导出的文件命名用中文出错，对word排版最好用div，用table即使border=0在word上还是有虚框出来。</p>
<img src ="http://www.blogjava.net/table/aggbug/246336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2008-12-15 10:34 <a href="http://www.blogjava.net/table/articles/246336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中格式化输出数字</title><link>http://www.blogjava.net/table/articles/246327.html</link><dc:creator>小卓</dc:creator><author>小卓</author><pubDate>Mon, 15 Dec 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/table/articles/246327.html</guid><wfw:comment>http://www.blogjava.net/table/comments/246327.html</wfw:comment><comments>http://www.blogjava.net/table/articles/246327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/table/comments/commentRss/246327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/table/services/trackbacks/246327.html</trackback:ping><description><![CDATA[在实际工作中，常常需要设定数字的输出格式，如以百分比的形式输出，或者设定小数位数等，现稍微总结如下。<br />
主要使用的类：java.text.DecimalFormat<br />
1。实例化对象，可以用如下两种方法：<br />
&nbsp;&nbsp;&nbsp; DecimalFormat df=(DecimalFormat)NumberFormat.getInstance();<br />
&nbsp;&nbsp;&nbsp; DecimalFormat df1=(DecimalFormat) DecimalFormat.getInstance();<br />
&nbsp;&nbsp; 因为DecimalFormat继承自NumberFormat。<br />
2。设定小数位数<br />
系统默认小数位数为3，如：<br />
&nbsp;&nbsp; DecimalFormat df=(DecimalFormat)NumberFormat.getInstance();<br />
&nbsp;&nbsp; System.out.println(df.format(12.3456789));<br />
输出：12.346<br />
现在可以通过如下方法把小数为设为两位：<br />
<font color="#ff0000">df.setMaximumFractionDigits(2);<br />
</font>&nbsp;&nbsp; System.out.println(df.format(12.3456789));<br />
则输出为：12.35<br />
3。将数字转化为百分比输出，有如下两种方法：<br />
(1) <br />
<font color="#ff0000">df.applyPattern("##.##%");<br />
</font>&nbsp;&nbsp; System.out.println(df.format(12.3456789));<br />
&nbsp;&nbsp; System.out.println(df.format(1));<br />
&nbsp;&nbsp; System.out.println(df.format(0.015));<br />
输出分别为：1234.57% 100%&nbsp;&nbsp;&nbsp; 1.5%<br />
(2)<br />
df.setMaximumFractionDigits(2);<br />
&nbsp;&nbsp; System.out.println(df.format(12.3456789*100)+"%");<br />
&nbsp;&nbsp; System.out.println(df.format(1*100)+"%");<br />
&nbsp;&nbsp; System.out.println(df.format(0.015*100)+"%");<br />
输出分别为：<br />
1,234.57%&nbsp;&nbsp; 100%&nbsp;&nbsp; 1.5%<br />
4。设置分组大小<br />
&nbsp;&nbsp; DecimalFormat df1=(DecimalFormat) DecimalFormat.getInstance();<br />
<font color="#ff0000">df1.setGroupingSize(2);<br />
</font>&nbsp;&nbsp; System.out.println(df1.format(123456789));<br />
输出：1,23,45,67,89<br />
还可以通过df1.setGroupingUsed(false);来禁用分组设置，如：<br />
&nbsp;&nbsp; DecimalFormat df1=(DecimalFormat) DecimalFormat.getInstance();<br />
&nbsp;&nbsp; df1.setGroupingSize(2);<br />
<font color="#ff0000">df1.setGroupingUsed(false);<br />
</font>&nbsp;&nbsp; System.out.println(df1.format(123456789));<br />
输出：123456789<br />
5。设置小数为必须为2位<br />
DecimalFormat df2=(DecimalFormat) DecimalFormat.getInstance();<br />
&nbsp;&nbsp;<font color="#ff0000">df2.applyPattern("0.00");<br />
</font>&nbsp;&nbsp; System.out.println(df2.format(1.2));<br />
输出：1.20
<img src ="http://www.blogjava.net/table/aggbug/246327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/table/" target="_blank">小卓</a> 2008-12-15 10:08 <a href="http://www.blogjava.net/table/articles/246327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>