﻿<?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-sooxin-JAVA-文章分类-JAVA</title><link>http://www.blogjava.net/sooxin/category/21788.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 24 Apr 2008 11:38:17 GMT</lastBuildDate><pubDate>Thu, 24 Apr 2008 11:38:17 GMT</pubDate><ttl>60</ttl><item><title>MyEclipse下设置合适的Content Assist快捷键</title><link>http://www.blogjava.net/sooxin/articles/194987.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Wed, 23 Apr 2008 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/194987.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/194987.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/194987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/194987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/194987.html</trackback:ping><description><![CDATA[<p>MyEclipse安装完成之后，有一个很常用的快捷键Content Assist（即代码提示）被默认为Ctrl + Space。</p>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/pic/item/d664f2ec40e949de2f2e21ec.jpg" border="0" small="0"  alt="" /></div>
<div forimg="1"></div>
<p>这会使得我们使用中文操作系统的计算机用起来很不方便，因为我们平时打字必用的切换打字法的快捷键，恰恰就是这个！</p>
<p>当然，你可以直接在Windows =&gt; Preferences... =&gt; General =&gt; Keys去替换掉这个快捷键，不过可能还会有其他快捷键与我们的中文操作系统有冲突。这里介绍一个一劳永逸，也是更&#8220;Eclipse化&#8221;的方法来改变这种尴尬局面：</p>
<p>在MyEclipse的启动选项中，其实有Duser.language这样一项设置，在MyEclipse安装完之后，它的默认值是等于en的，只要把它改成zh，重启MyEclipse之后，即可将Content Assist的快捷键改成Alt + /。</p>
<p>具体修改方式如下：</p>
<p>【方法一】右击MyEclipse快捷方式，选择属性，打开属性对话框，如下：</p>
<div forimg="1">
<p><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/pic/item/3f57af97913e436254fb962f.jpg" border="0" small="0"  alt="" /></p>
<p><font color="#c0c0c0">将 -Duser.language=en 改为 -Duser.language=zh；</font></p>
<p><font color="#c0c0c0">【方法二】在Eclipse安装目录下，有一个eclipse.ini的配置文件，用文本编辑器打开它，找到-Duser.language=en这样一行，将它改为-Duser.language=zh即可：</font></p>
<div forimg="1">
<p><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/pic/item/c71db0122de3ce5ef919b817.jpg" border="0" small="0"  alt="" /></p>
<p><font color="#c0c0c0">改完之后，可以到Edit =&gt; Content Assist菜单下或快捷键设置面板中看到新的快捷键：</font></p>
<div forimg="1">
<p><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/pic/item/ba40a134dd7b7d345ab5f53f.jpg" border="0" small="0"  alt="" /></p>
<p><font color="#c0c0c0">这样，就通过更改MyEclipse的默认系统语言，来达到更改使用习惯（如快捷键）的目的。</font></p>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/sooxin/aggbug/194987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2008-04-23 11:52 <a href="http://www.blogjava.net/sooxin/articles/194987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用POI生成Excel文件</title><link>http://www.blogjava.net/sooxin/articles/165652.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Wed, 05 Dec 2007 13:34:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/165652.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/165652.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/165652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/165652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/165652.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Apache的Jakata项目的POI子项目，目标是处理ole2对象。 POI可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 下载。 编译好的jar主要有这样4个：poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时，需要有poi包就可以了。HSSF提供给用户使用的对象在org.apache.p...&nbsp;&nbsp;<a href='http://www.blogjava.net/sooxin/articles/165652.html'>阅读全文</a><img src ="http://www.blogjava.net/sooxin/aggbug/165652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-12-05 21:34 <a href="http://www.blogjava.net/sooxin/articles/165652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POI读写Excel文件</title><link>http://www.blogjava.net/sooxin/articles/165651.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Wed, 05 Dec 2007 13:32:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/165651.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/165651.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/165651.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/165651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/165651.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="新宋体" size="2">在上一篇文章中，我们介绍了POI项目的基本概念，了解了如何用POI来读写OLE 2复合文档结构，并给出了两个简单的例子：用POI来读写Excel文件的Workbook流。本文继续前文的话题，阐述如何用POI来读取/写入完整的Excel文件。<br />
<br />
　 　约定：POI项目2.0版现在已经接近正式发行阶段，开发进度迅速，不断有新的功能集成到原有的系统，同时也有对原有系统的修改。为了保证本文的及时 性，本文将按照最近的1.9开发版说明。虽然编译最近的发行版源代码也能正常运行，但现在的代码和2.0的发行版会有一些出入。<br />
<br />
　　一、Excel基础<br />
<br />
　 　Microsoft Excel 97文件格式也被称为BIFF8，最近版本的Excel只对该格式作了少量的改动。增加对新格式的支持除了增加项目的复杂性之外，唯一的效果也许只是不得 不使每个用户升级代码，没有什么实际的好处。因此，在下文说明中，凡是提到Excel 97格式的地方其实都是指Excel从97到XP的格式。<br />
<br />
　　二、HSSF概况<br />
<br />
　 　POI项目实现的Excel 97文件格式称为HSSF——也许你已经猜到，HSSF是Horrible SpreadSheet Format的缩写，也即&#8220;讨厌的电子表格格式&#8221;（微软使某些原本简单的事情过分复杂，同时又过分简单地处理了某些原本需要灵活性的事情，让人不胜佩 服！）也许HSSF的名字有点滑稽，就本质而言它是一个非常严肃、正规的API。通过HSSF，你可以用纯Java代码来读取、写入、修改Excel文 件。<br />
<br />
　　前面一篇文章提到了POIFS，那么HSSF和POIFS又有什么关系呢？就象其他POI的API一样，HSSF建立在 POIFS的基础上，因此在HSSF内的有些代码和前文的某些代码很相似。不过，当我们编写基于HSSF API的代码时，一般不需要了解POIFS API的细节。<br />
<br />
　　HSSF为读取操作提供了两类API：usermodel和eventusermodel，即&#8220;用户模型&#8221;和&#8220;事 件-用户模型&#8221;。前者很好理解，后者比较抽象，但操作效率要高得多。usermodel主要有 org.apache.poi.hssf.usermodel和org.apache.poi.hssf.eventusermodel包实现（在 HSSF的早期版本中，org.apache.poi.hssf.eventusermodel属于eventmodel包）。<br />
<br />
　　 usermodel包把Excel文件映射成我们熟悉的结构，诸如Workbook、Sheet、Row、Cell等，它把整个结构以一组对象的形式保存 在内存之中。eventusermodel要求用户熟悉文件格式的底层结构，它的操作风格类似于XML的SAX API和AWT的事件模型（这就是eventusermodel名称的起源），要掌握窍门才能用好。另外，eventusermodel的API只提供读 取文件的功能，也就是说不能用这个API来修改文件。<br />
<br />
　　三、通过usermodel读取文件<br />
<br />
　　用HSSF的usermodel读取文件很简单。首先创建一个InputStream，然后创建一个HSSFWorkbook：<br />
<br />
InputStream myxls = new FileInputStream("workbook.xls"));<br />
HSSFWorkbook wb&nbsp;&nbsp;&nbsp;&nbsp; = new HSSFWorkbook(myxls);<br />
<br />
　　有了HSSFWorkbook实例，接下来就可以提取工作表、工作表的行和列，例如：<br />
<br />
HSSFSheet sheet = wb.getSheetAt(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 第一个工作表<br />
HSSFRow row&nbsp;&nbsp;&nbsp;&nbsp; = sheet.getRow(2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 第三行<br />
HSSFCell cell&nbsp;&nbsp; = row.getCell((short)3);&nbsp;&nbsp;// 第四个单元格<br />
<br />
　　上面这段代码提取出第一个工作表第三行第四单元格。利用单元格对象可以获得它的值，提取单元格的值时请注意它的类型：<br />
<br />
if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;("单元格是字符串，值是： " + cell.getStringCellValue());<br />
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;("单元格是数字，值是： " + cell.getCellValue());<br />
} else () {<br />
&nbsp;&nbsp;&nbsp;&nbsp;("单元格的值不是字符串或数值。");<br />
}<br />
<br />
　　如果搞错了数据类型，程序将遇到异常。特别地，用HSSF处理日期数据要小心。Excel内部以数值的形式保存日期数据，区别日期数据的唯一办法是通过单元格的格式（如果你曾经在Excel中设置过日期格式，应该明白这是什么意思）。<br />
<br />
　 　因此，对于包含日期数据的单元格，cell.getCellType()将返回HSSFCell.CELL_TYPE_NUMERIC，不过利用工具函 数HSSFDateUtil.isCellDateFormatted(cell)可以判断出单元格的值是否为日期。 isCellDateFormatted函数通过比较单元格的日期和Excel的内置日期格式得出结论——可以想象，按照这种判断方法，很多时候 isCellDateFormatted函数会返回否定的结论，存在一定的误判可能。<br />
<br />
　　本文附录包含了一个在Servlet环境中利用HSSF创建和返回Excel工作簿的实例。<br />
<br />
　　四、通过usermodel写入文件<br />
<br />
　　写入XLS文件比读取XLS文件还要简单。创建一个HSSFWorkbook实例，然后在适当的时候创建一个把文件写入磁盘的OutputStream，但延迟到处理结束时创建OutputStream也可以：<br />
<br />
HSSFWorkbook wb = new HSSFWorkbook();<br />
FileOutputStream fileOut<br />
　　 = new FileOutputStream("workbook.xls");<br />
wb.write(fileOut);<br />
fileOut.close();<br />
<br />
　　创建工作表及其内容必须从相应的父对象出发，例如：<br />
<br />
HSSFSheet sheet = wb.createSheet();<br />
HSSFRow row&nbsp;&nbsp;&nbsp;&nbsp; = sheet.createRow((short)0);<br />
HSSFCell cell&nbsp;&nbsp; = row.createCell((short)0);<br />
cell.setCellValue(1);<br />
row.createCell((short)1).setCellValue(1.2);<br />
row.createCell((short)2).setCellValue("一个字符串");<br />
row.createCell((short)3).setCellValue(true);<br />
<br />
　 　如果要设置单元格的样式，首先要创建一个样式对象，然后把它指定给一个单元格——或者把它指定给多个具有相同样式的单元格，例如，如果Excel表格中 有一个摘要行，摘要行的数据必须是粗体、斜体，你可以创建一个summaryRowStyle样式对象，然后把这个样式指定给所有摘要行上的单元格。<br />
<br />
　　注意，CellFormat和CellStyle对象是工作簿对象的成员，单元格对象只是引用它们。<br />
<br />
...<br />
HSSFCellStyle style = workbook.createCellStyle();<br />
style.setDataFormat<br />
　　(HSSFDataFormat.getBuiltinFormat("($#,##0_);[Red]($#,##0)"));<br />
style.setFillBackgroundColor(HSSFColor.AQUA.index);<br />
style.setFillPattern(HSSFCellStyle.BIG_SPOTS);<br />
...<br />
someCell.setCellStyle(style);<br />
someOtherCell.setCellStyle(style);<br />
<br />
<br />
<br />
　　版本较新的HSSF允许使用数量有限的Excel公式。这一功能目前还是&#8220;Beta级质量&#8221;，正式使用之前务必仔细测试。指定公式的方式类如：someCell.setCellFormula(SUM(A1:A2:);。<br />
<br />
　　当前，公式中已经可以调用所有内建的函数或操作符，但逻辑操作符和函数（例如IF函数）除外，这部分功能目前还在开发之中。<br />
<br />
　　五、通过eventusermodel读取文件<br />
<br />
　 　通过eventusermodel读取文件要比使用usermodel复杂得多，但效率也要高不少，因为它要求应用程序一边读取数据，一边处理数据。 eventusermodel实际上模拟了DOM环境下SAX处理XML文档的办法，应用程序首先要注册期望处理的数据，eventusermodel将 在遇到匹配的数据结构时回调应用程序注册的方法。使用eventusermodel最大的困难在于你必须熟悉Excel工作簿的内部结构。<br />
<br />
　 　在HSSF中，低层次的二进制结构称为记录（Record）。记录有不同的类型，每一种类型由org.apache.poi.hssf.record包 中的一个Java类描述。例如，BOFRecord记录表示Workbook或Sheet区域的开始，RowRecord表示有一个行存在并保存其样式信 息。所有具有CellValueRecordInterface接口的记录表示Excel的单元格，包括NumericRecord、 LabelSSTRecord和FormulaRecord（还有其他一些，其中部分已被弃置不用，部分用于优化处理，但一般而言，HSSF可以转换它 们）。<br />
<br />
　　下面是一个注册事件处理句柄的例子：<br />
<br />
private EventRecordFactory factory = new EventRecordFactory();<br />
factory.registerListener(new ERFListener() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;public boolean processRecord(Record rec) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(got BOF Record);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}, new short[] {BOFRecord.sid});<br />
factory.processRecords(someInputStream);<br />
<br />
　　六、HSSF电子表格结构<br />
<br />
　 　如前所述，HSSF建立在POIFS的基础上。具体地说，Excel 97+文件是OLE 2复合文档（ OLE 2 Compound Document），底层的OLE 2复合文档保存了一个总是命名为Workbook（Excel 95除外，HSSF不支持Excel 95）的流。然而，宏和图片并不保存在Workbook流，它们有自己独立的流，有时甚至会放到OLE 2 CDF文件之内的另一个目录。理想情况下，宏也应该被保留，不过目前POI项目中还没有合适的API来处理宏。<br />
<br />
　　每一个流之内是一组记录，一个记录其实就是一个字节数组，可分为记录头、记录体两部分。记录头指明了记录的类型（也即ID）以及后继数据的长度，记录体被分割成多个字段（Field），字段包含数值数据（包括对其他记录的引用）、字符数据或标记。<br />
<br />
　　下图概要说明了Excel工作簿的顶级结构：<br />
<br />
Bla.xls {<br />
&nbsp;&nbsp;&nbsp;&nbsp;OLE2CDF headers<br />
&nbsp;&nbsp;&nbsp;&nbsp;"Workbook" stream {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Workbook {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Static String Table Record..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sheet names&#8230; and pointers<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sheet {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROW<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ROW<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUMBER RECORD (cell)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LABELSST Record (cell)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sheet<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
&#8230; images, macros, etc.<br />
Document Summary<br />
Summary<br />
<br />
　　七、通过HPSF读取文档属性<br />
<br />
　　在Microsoft Word、Excel、PowerPoint等软件中，用户可以通过&#8220;文件&#8221;&#8594;&#8220;属性&#8221;菜单给文档添加附加信息，包括文档的标题、主题、摘要、类别、关键词等，同时应用软件本身还会加入最后访问的用户、最后访问和修改/打印的日期时间等信息。<br />
<br />
　 　文档的属性和正文是分开保存的。如前所述，OLE 2 CDF文件内部就象是一个容器，里面包含许多类似目录和文件的结构，而POIFS就是用来访问其中的文件的工具。这些文件也称为流，文档的属性就保存在 POIFS文件系统中专用的流里面。以一个Word文档为例：虽然在资源管理器中你只看到一个叫做MyFile.doc的文档，其实在这个文档的内部，又 包含了一个WordDocument、一个SummaryInformation和一个DocumentSummaryInformation文档；通常 还会有其他的文档，这里暂且不管。<br />
<br />
　　你能够猜出这些文档（流）分别包含什么内容吗？不错，WordDocument包含了你在 Word里面编辑的文本，文档的属性保存在SummaryInformation和DocumentSummaryInformation流里面。也许将 所有属性保存在单个文档里面看起来太简单了，所以Microsoft决心要使用两个流，为了使事情更复杂一点，这两个流的名字前面还加上了八进制的 \005字符——这是一个不可打印的字符，因此前面就把它省略了。<br />
<br />
　　Microsoft定义的标准属性有一个好处，它们并不在乎主文档到底是什么类型——不管是Word文档、Excel工作簿还是PowerPoint幻灯。只要你知道如何读取Excel文档的属性，就知道了如何读取其他文档的属性。<br />
<br />
　　读取文档属性其实并不复杂，因为Java程序可以利用POI项目的HPSF包。HPSF是 Horrible Property Set Format的缩写，译成中文就是&#8220;讨厌的属性集格式&#8221;。HPSF包是POI项目实现的读取属性工具，目前还不支持属性写入。<br />
<br />
　 　对于读取Microsoft定义的标准属性，通过HPSF提供的API可以很方便地办到；但如果要读取任意属性集就要用到更一般化的API，可以想象它 要比读取标准属性的API复杂不少。本文只介绍读取标准属性的简单API，因为对大多数应用程序来说这已经完全足够了。<br />
<br />
　　下面就是一个读取OLE 2 CDF文档的标题（title）属性的Java程序：<br />
<br />
import java.io.*;<br />
import org.apache.poi.hpsf.*;<br />
import org.apache.poi.poifs.eventfilesystem.*;<br />
<br />
/**<br />
* 读取OLE 2文档标题的示例程序，<br />
* 在命令行参数中指定文档的文件名字。<br />
*/<br />
<br />
public class ReadTitle<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) throws IOException<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final String filename = args[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POIFSReader r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = new POIFSReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.registerListener(new MyPOIFSReaderListener(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"\005SummaryInformation");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.read(new FileInputStream(filename));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;static class MyPOIFSReaderListener<br />
　　　　 implements POIFSReaderListener<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void processPOIFSReaderEvent(POIFSReaderEvent event)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SummaryInformation si = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si = (SummaryInformation)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertySetFactory.create(event.getStream());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (Exception ex)<br />
&nbsp;&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;&nbsp;&nbsp;throw new RuntimeException<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;("属性集流\"" + event.getPath() +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.getName() + "\": " + ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final String title = si.getTitle();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (title != null)<br />
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;System.out.println("标题: \"" + title + "\"");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("该文档没有标题.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
　 　main()方法利用POIFS的事件系统从命令行指定的OLE 2文档读取名为\005SummaryInformation的流，当POIFSReader 遇到这个流时，它把控制传递给MyPOIFSReaderListener的processPOIFSReaderEvent()方法。<br />
<br />
　　processPOIFSReaderEvent() 到底有什么用呢？它通过参数获得一个输入流，该输入流包含了文档标题等属性。为了访问文档的属性，我们从输入流创建一个PropertySet实例，如下所示：<br />
<br />
si = (SummaryInformation) PropertySetFactory.create(event.getStream());<br />
<br />
<br />
<br />
　　这个语句其实包含三个步骤的操作：<br />
<br />
　　◆ event.getStream()从POIFSReader传入的POIFSReaderEvent获得输入流。<br />
<br />
　 　◆ 以刚才获得的输入流为参数，调用PropertySetFactory的静态方法create()。正如其名字所暗示的， PropertySetFactory是一个工厂类，它有一台&#8220;机器&#8221;能够把一个输入流转换成一个PropertySet实例，这台机器就是create ()方法。<br />
<br />
　　◆ 把create()方法返回的PropertySet定型（cast）成为SummaryInformation。PropertySet提供了按照一般 办法读取属性集的各种机制，SummaryInformation是PropertySet的子类，即SummaryInformation类在 PropertySet类的基础上增加了操作Microsoft标准属性的便捷方法。<br />
<br />
　　在这个处理过程中，可能引起错误的因素很 多，因此我们把这部分内容放入了一个try块——不过这个示例程序只按照最简单的方式处理了异常，在实际应用中，最好能够对可能出现的不同异常类型分别处 理。除了一般的I/O异常之外，还有可能遇到HPSF特有的异常，例如，如果输入流不包含属性集或属性集非法，就会抛出 NoPropertySetStreamException异常。<br />
<br />
　　有一种错误不太常见，但也不是绝无可能——\005SummaryInformation包含一个合法的属性集，但不是摘要信息属性集。如果出现这种情况，则定型成SummaryInformation操作会失败，引发ClassCastException异常。<br />
<br />
　　获得SummaryInformation实例之后，剩下的事情就很简单了，只要调用getTitle()方法，然后输出结果。<br />
<br />
　 　除了getTitle()之外，SummaryInformation还包含其他一些便捷方法，例如getApplicationName()、 getAuthor()、getCharCount()、和getCreateDateTime()等。HPSF的JavaDoc文档详细说明了所有这些 方法。<br />
<br />
　　八、文档摘要信息<br />
<br />
　　遗憾的是，并非所有的属性都保存在摘要信息属性集之中。许多（但不是全部）OLE 2文件还有另一个属性集，称为&#8220;文档摘要信息&#8221;，对应的流是\005DocumentSummaryInformation。这个属性集保存的属性包括文 档的类别、PowerPoint幻灯的多媒体剪辑数量，等等。<br />
<br />
　　要访问文档摘要信息属性集，程序的处理过程也和上例相似，只是注册 的目标应该改成\005DocumentSummaryInformation流——有时，你可能想要同时注册到摘要信息和文档摘要信息这两个流。其余的 处理方式和前面的例子差不多，你应该把包含文档摘要信息的流传递给PropertySetFactory.create()，但这次工厂方法将返回一个 DocumentSummaryInformation对象（而不是前面例子中的SummaryInformation对象）。如果同时注册到了两个流， 注意检查返回值的具体类型，或者使用Java的instanceof操作符，或者使用专用的isSummaryInformation()和 isDocumentSummaryInformation()方法。记住，create()方法返回的总是一个PropertySet对象，因此你总是 可以对create()返回对象调用isSummaryInformation()和isDocumentSummaryInformation()方 法，PropertySet类之所以要提供这两个方法，是因为属性集可能是自定义的。<br />
<br />
　　如果你想要处理自定义的属性集，或者要从标准的属性集读取用户定义的属性，必须使用一个更一般化的API，前面已经提到，这个API要复杂得多，本文不再讨论，请参见HPSF的HOW-TO文档和POI的文档。<br />
<br />
　 　结束语：本文探讨了HSSF的应用以及如何输出到Excel文件，另外还涉及了HPSF以及如何读取属性集文档摘要信息。POI是一个功能非常强大的项 目，许多主题本文尚未涉及，例如如何用HSSF Serializer将XML文档转换成Excel格式等，这一切就有待你自己去研究了。<br />
<br />
　　参考：<br />
<br />
　　Jakarta POI项目主页<br />
<br />
　　Jakarta POI 源代码<br />
<br />
　　九、附录<br />
<br />
　　实例：利用Servlet创建和返回一个工作簿。<br />
<br />
package org.apache.poi.hssf.usermodel.examples;<br />
<br />
import java.io.*;<br />
import java.net.*;<br />
import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
import org.apache.poi.hssf.usermodel.*;<br />
<br />
public class HSSFCreate extends HttpServlet {<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void init(ServletConfig config)<br />
　　 throws ServletException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.init(config);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public void destroy() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/** 处理HTTP GET 和POST请求<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param request：请求<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param response：应答<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;protected void processRequest(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response)<br />
　　　　 throws ServletException, IOException {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType("application/vnd.ms-excel");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFSheet sheet = wb.createSheet("new sheet");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 创建一个新的行，添加几个单元格。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 行号从0开始计算<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFRow row&nbsp;&nbsp;&nbsp;&nbsp; = sheet.createRow((short)0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 创建一个单元格，设置单元格的值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFCell cell&nbsp;&nbsp; = row.createCell((short)0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell.setCellValue(1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.createCell((short)1).setCellValue(1.2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.createCell((short)2).setCellValue("一个字符串值");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row.createCell((short)3).setCellValue(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 写入输出结果<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream out = response.getOutputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wb.write(out);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/** 处理HTTP GET请求<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param request：请求<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param response：应答<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;protected void doGet(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response)<br />
　　　　 throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processRequest(request, response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/** 处理HTTP POST请求<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param request：请求<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param response：应答<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;protected void doPost(HttpServletRequest request,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse response)<br />
　　　　 throws ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processRequest(request, response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/** 返回关于Servlet的简单说明<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;public String getServletInfo() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "示例：在Servlet中用HSSF创建Excel工作簿";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
POI HSSF 操作MS Excel简述 (OMIS二期设计阶段寻找Excel导入导出实现方法）<br />
POI HSSF 操作MS Excel简述<br />
<br />
POI HSSF是一个专门操作EXCEL的java包，可通过纯java操作xls文件。<br />
POI HSSF的类文件都放在在org.apache.poi.hssf包下，通过此包中的类就可实现用java操作Excel文件了。<br />
下面是用POI HSSF操作Excel文件的方法简述：<br />
<br />
一， 建立Excel工作薄<br />
HSSFWorkbook wb = new HSSFWorkbook();<br />
<br />
二， 建立Excel工作表，每个工作表对应的是Excel界面左下角的一个标签sheet1，sheet2 &#8230;<br />
HSSFSheet sheet1 = wb.createSheet("new sheet");<br />
<br />
三， 在工作表中建立单元格<br />
<br />
//首先，建立行对像，行号作为参数传给createRow方法，第一行由0开始计算。<br />
HSSFRow row = sheet.createRow((short)0);<br />
<br />
//建单元格<br />
HSSFCell cell = row.createCell((short)0);<br />
<br />
//给单元格赋值<br />
cell.setCellValue(1);<br />
<br />
//也可同一行内完成建立单元格和赋值<br />
row.createCell((short)1).setCellValue(1.2);<br />
row.createCell((short)2).setCellValue("This is a string");<br />
row.createCell((short)3).setCellValue(true);<br />
<br />
//数据格式可通过创建单元格值时默认如上面所视<br />
//也可以创建单元格后调用setCellType指定<br />
cell.setCellType(CELL_TYPE_NUMERIC);<br />
<br />
四， 向单元格插入日期值<br />
HSSFWorkbook wb = new HSSFWorkbook();<br />
HSSFSheet sheet = wb.createSheet("new sheet");<br />
<br />
// 可通过Sheet.setSheetName(sheetindex,"SheetName",encoding)设定工作表名<br />
<br />
// 创建新行并向其加入单元格，行号由0开始。<br />
HSSFRow row = sheet.createRow((short)0);<br />
<br />
// 创建一个单元格并向其输入一日期值，但这第一个单元格并非是日期格式。<br />
HSSFCell cell = row.createCell((short)0);<br />
cell.setCellValue(new Date());<br />
<br />
// 我们将这第二个单元格改成日期格式，这需要从工作薄创建一个新的单元格格式，这可// 以只影响当前建立的一个单元格。<br />
HSSFCellStyle cellStyle = wb.createCellStyle();<br />
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));<br />
cell = row.createCell((short)1);<br />
cell.setCellValue(new Date());<br />
cell.setCellStyle(cellStyle);<br />
<br />
五， 各种单元格样式<br />
HSSFCellStyle cellStyle = wb.createCellStyle();<br />
//对齐<br />
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);<br />
<br />
//带边框<br />
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);<br />
<br />
//颜色与填充样式<br />
cellStyle.setFillBackgroundColor(HSSFColor.AQUA.index);<br />
cellStyle.setFillPattern(HSSFCellStyle.BIG_SPOTS);<br />
cellStyle.setFillForegroundColor(HSSFColor.ORANGE.index);<br />
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);<br />
<br />
六， 行高,列宽。<br />
HSSFWorkbook wb = new HSSFWorkbook();<br />
HSSFSheet sheet = wb.createSheet("new sheet");<br />
HSSFRow row = sheet.createRow((short)0);<br />
<br />
//2是行高值<br />
row.setRowHeight(2);<br />
<br />
//3是列号，4是列宽值<br />
sheet.setColumnWidth(3, 4);<br />
<br />
<br />
七，例程<br />
<br />
首 先调用一个方法将Oracle数据库中的数据取出，放到List实例中，这里我调用了srrd项目中ProductData类的 listProductQuery()取得一个List实例。List中的对象是一系列名为ProductQuery实体类的实例。然后读List，将 ProductQuery实例中的数据取出放到HSSFCell单元格中。最后将HSSFWorkbook中的数据输出到输出流，完成数据导出。<br />
<br />
//建工作薄<br />
HSSFWorkbook wb = new HSSFWorkbook();<br />
//建名为example的工作表<br />
HSSFSheet sheet = wb.createSheet("example");<br />
//给工作表前8列定义列宽<br />
sheet.setColumnWidth((short)0,(short)2500);<br />
sheet.setColumnWidth((short)1,(short)6000);<br />
sheet.setColumnWidth((short)2,(short)3500);<br />
sheet.setColumnWidth((short)3,(short)9000);<br />
sheet.setColumnWidth((short)4,(short)8000);<br />
sheet.setColumnWidth((short)5,(short)8000);<br />
sheet.setColumnWidth((short)6,(short)20000);<br />
sheet.setColumnWidth((short)7,(short)8000);<br />
//在表中建行<br />
HSSFRow row = sheet.createRow(0);<br />
//建立单元格<br />
HSSFCell cell[] = new HSSFCell[8];<br />
for (short i = 0; i &lt; 8; i++) {<br />
cell</font><font face="新宋体" size="2"><em>= row.createCell(i);<br />
</em>//将单元格定义成UTF_16编码，这样才能使输出数据不会乱码<br />
cell</font><font face="新宋体" size="2">.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
}<br />
//写单元格标题<br />
cell[0].setCellValue("登记ID");<br />
cell[1].setCellValue("登记号");<br />
cell[2].setCellValue("所在地市ID");<br />
cell[3].setCellValue("产品中文名");<br />
cell[4].setCellValue("产品英文名");<br />
cell[5].setCellValue("产品服务对象");<br />
cell[6].setCellValue("产品功能描述");<br />
cell[7].setCellValue("产品类别");<br />
//查询数据库，取得数据列表的List实例<br />
List list = new ArrayList();<br />
ProductDataManager mgr = new ProductDataManager();<br />
try {<br />
list = mgr.listProductQuery("","", "", "", "", "1999-2-1", "2004-2-1");<br />
} catch (SrrdException e) {<br />
e.printStackTrace();<br />
}<br />
//从List中取出数据放入工作表中<br />
if (list != null &amp;&amp; list.size() &gt; 0) {<br />
for (int i = 0; i &lt; list.size() - 1; i++) {<br />
ProductQuery query = (ProductQuery) list.get(i);<br />
HSSFRow datarow = sheet.createRow(i + 1);<br />
HSSFCell data[] = new HSSFCell[8];<br />
for (short j = 0; j &lt; 8; j++) {<br />
data[j] = datarow.createCell(j);<br />
//将单元格定义成UTF_16编码，这样才能使输出数据不会乱码<br />
data[j].setEncoding(HSSFCell.ENCODING_UTF_16);<br />
}<br />
data[0].setCellValue(query.getCertId());<br />
data[1].setCellValue(query.getCertNum());<br />
data[2].setCellValue(query.getCityCode());<br />
data[3].setCellValue(query.getSoftWareCname());<br />
data[4].setCellValue(query.getSoftWareEname());<br />
data[5].setCellValue(query.getSoftwareFor());<br />
data[6].setCellValue(query.getSoftwareFuncDesc());<br />
data[7].setCellValue(query.getSoftwareType());<br />
}<br />
}<br />
//将工作薄输出到输出流<br />
ServletOutputStream sos=response.getOutputStream();<br />
wb.write(sos);<br />
sos.close();<br />
<br />
//也可输出成xls文件<br />
File file = new File("workbook.xls");<br />
try {<br />
FileOutputStream fileOut = new FileOutputStream(file);<br />
wb.write(fileOut);<br />
fileOut.close();<br />
} catch (IOException e) {<br />
e.printStackTrace();<br />
}</font> </p>
<p><font face="新宋体" size="2">/*****************************************************/</font> </p>
<p>package com.kang.test.project; </p>
<p>import org.apache.log4j.Logger; </p>
<p>import java.io.FileInputStream;<br />
import java.io.FileNotFoundException;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
import java.io.InputStream;<br />
import java.util.Calendar;<br />
import java.util.List; </p>
<p>import javax.servlet.ServletOutputStream; </p>
<p>import org.apache.poi.hssf.usermodel.HSSFCell;<br />
import org.apache.poi.hssf.usermodel.HSSFCellStyle;<br />
import org.apache.poi.hssf.usermodel.HSSFFont;<br />
import org.apache.poi.hssf.usermodel.HSSFRow;<br />
import org.apache.poi.hssf.usermodel.HSSFWorkbook;<br />
import org.apache.poi.hssf.usermodel.HSSFSheet;<br />
import org.apache.poi.hssf.util.HSSFColor; </p>
<p>public class TestPOI {<br />
&nbsp;/**<br />
&nbsp; * Logger for this class<br />
&nbsp; */<br />
&nbsp;private static final Logger log = Logger.getLogger(TestPOI.class);<br />
&nbsp;&nbsp;&nbsp; private static String xmlFile=String.valueOf(Calendar.getInstance().getTimeInMillis())+".xls";<br />
&nbsp;&nbsp;&nbsp; private static String file_path="e:\\";<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;TestPOI tpoi=new TestPOI();<br />
&nbsp;&nbsp;String temp=file_path+xmlFile;<br />
&nbsp;&nbsp;log.info("-----temp:"+temp);<br />
&nbsp;&nbsp;tpoi.creatExcelByPOI(temp);<br />
&nbsp;&nbsp;tpoi.getExcelConmentByPOI(temp);<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * 生成excel文件<br />
&nbsp; *<br />
&nbsp; * @param filename<br />
&nbsp; */<br />
&nbsp;public void&nbsp; creatExcelByPOI(String filename){<br />
&nbsp;&nbsp;log.info("-----生成excel文件-----开始-----filename:"+filename);<br />
&nbsp;&nbsp;FileOutputStream ops=null;&nbsp;&nbsp;<br />
&nbsp;&nbsp;HSSFWorkbook workbook=new HSSFWorkbook();<br />
&nbsp;&nbsp;HSSFSheet sheet=workbook.createSheet();<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)0, (short)2000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)1, (short)4000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)2, (short)4000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)3, (short)8000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)4, (short)1000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)5, (short)2000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)6, (short)2000000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)7, (short)200000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)8, (short)20000);<br />
&nbsp;&nbsp;sheet.setColumnWidth((short)9, (short)20000);<br />
&nbsp;&nbsp;//sheet.setDefaultColumnWidth((short)50);<br />
&nbsp;&nbsp;for(int i=0;i&lt;10;i++){<br />
&nbsp;&nbsp;&nbsp;log.info("-----i:"+"第"+i+"行");&nbsp;<br />
&nbsp;&nbsp;&nbsp;HSSFRow row=sheet.createRow((short)i);<br />
&nbsp;&nbsp;&nbsp;for (int j=0;j&lt;10;j++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;HSSFCell cell = row.createCell((short)j);&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 设置其它数据 设置风格<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFCellStyle style = workbook.createCellStyle();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单无格的边框为粗体<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色．<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBorderLeft(HSSFCellStyle.BORDER_THIN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setLeftBorderColor(HSSFColor.BLACK.index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBorderRight(HSSFCellStyle.BORDER_THIN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setRightBorderColor(HSSFColor.BLACK.index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBorderTop(HSSFCellStyle.BORDER_THIN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setTopBorderColor(HSSFColor.BLACK.index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // style.setWrapText(true);//文本区域随内容多少自动调整<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // style.setFillForegroundColor(HSSFColor.LIME.index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 设置单无格的边框为粗体<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBottomBorderColor(HSSFColor.BLACK.index); // 设置单元格的边框颜色．<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBorderLeft(HSSFCellStyle.BORDER_THIN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setLeftBorderColor(HSSFColor.BLACK.index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBorderRight(HSSFCellStyle.BORDER_THIN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setRightBorderColor(HSSFColor.BLACK.index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setTopBorderColor(HSSFColor.BLACK.index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 最好的设置Pattern<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 单元格背景的显示模式．<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setFillForegroundColor(new HSSFColor.BLUE_GREY().getIndex()); // 设置单元格背景色;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平对齐方式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // style.setWrapText(true); //文本区域随内容多少自动调整<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // style.setFillPattern(HSSFCellStyle.//);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置字体Color,首先创建Font对象,后对font设置,然后做为参数传给style<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFFont font = workbook.createFont();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; font.setColor(HSSFFont.SS_NONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // font.setFontHeightInPoints((short)24);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; font.setFontName("Courier New");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // font.setItalic(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // font.setStrikeout(true);//给字体加上删除线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setFont(font);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style.setWrapText(true);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.setCellStyle(style);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//cell.setCellNum((short)(i*10+j));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.setCellType(HSSFCell.CELL_TYPE_STRING);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell.setCellStyle(style); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;cell.setCellValue("今天是第"+j+"天，好好学习天天向上，解决方法我已经找到了，具体应该是这样的用poi包的hssf，怎样让excel中的单元格cell里面的文字自动换行啊");<br />
&nbsp;&nbsp;&nbsp;&nbsp;log.info("-----j:"+"第"+j+"列");<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;ops=new FileOutputStream(filename);<br />
&nbsp;&nbsp;&nbsp;workbook.write(ops);<br />
&nbsp;&nbsp;&nbsp;ops.flush();<br />
&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp; * 在servlet或Controller中<br />
&nbsp;&nbsp;&nbsp; * response.setContentType("application/vnd.ms-excel");<br />
&nbsp;&nbsp;&nbsp; * response.addHeader("Content-Disposition","attachment;filename=testReport.xls");//设置下载的文件名称<br />
&nbsp;&nbsp;&nbsp; * ServletOutputStream output=response.getOutputStream();<br />
&nbsp;&nbsp;&nbsp; * workbook.write(output);<br />
&nbsp;&nbsp;&nbsp; * output.close();<br />
&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;} catch (FileNotFoundException e) {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}catch(IOException e){<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}finally{<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;ops.close();<br />
&nbsp;&nbsp;&nbsp;} catch (IOException e) {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;log.info("-----生成excel文件-----完毕-----");<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; * 解析excel文件<br />
&nbsp; * @param filename<br />
&nbsp; */<br />
&nbsp;public&nbsp; void getExcelConmentByPOI(String filename){<br />
&nbsp;&nbsp;log.info("-----解析excel文件-----开始-----filename:"+filename);<br />
&nbsp;&nbsp;InputStream is;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;is = new FileInputStream(filename);<br />
&nbsp;&nbsp;&nbsp;HSSFWorkbook&nbsp; book=new HSSFWorkbook(is);<br />
&nbsp;&nbsp;&nbsp;HSSFSheet sheet=book.getSheetAt(0);<br />
&nbsp;&nbsp;&nbsp;log.info("-----sheet.getPhysicalNumberOfRows():"+sheet.getPhysicalNumberOfRows());&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;sheet.getPhysicalNumberOfRows();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;HSSFRow row=sheet.getRow(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;log.info("-----第"+i+"行");<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;row.getPhysicalNumberOfCells();j++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HSSFCell cell=row.getCell((short)j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("-----第"+j+"列,内容："+cell.getStringCellValue());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} catch (FileNotFoundException e) {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;} catch (IOException e) {&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;log.info("-----解析excel文件-----完毕-----");<br />
&nbsp;}<br />
&nbsp;/**<br />
&nbsp; *<br />
&nbsp; */<br />
&nbsp;public&nbsp; void getExcelOnWeb(){<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
}&nbsp; </p>
POI读写Excel文件
<img src ="http://www.blogjava.net/sooxin/aggbug/165651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-12-05 21:32 <a href="http://www.blogjava.net/sooxin/articles/165651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java字符串处理总结</title><link>http://www.blogjava.net/sooxin/articles/163501.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Tue, 27 Nov 2007 10:18:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/163501.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/163501.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/163501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/163501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/163501.html</trackback:ping><description><![CDATA[<font color="#000000"><strong><br />
</strong>valueOf&nbsp;&nbsp;&nbsp;<br />
<br />
无需创建对象就可使用的方法&nbsp;&nbsp;&nbsp;&nbsp; String str=String.valueOf(其他类型变量);<br />
<br />
<br />
<strong>拓展字符串</strong><br />
<br />
用加号加就可以&nbsp;&nbsp; str=str+"是的"；<br />
<br />
或者用 concat发法。a=String.concat("是的"); <br />
<br />
StringBuffer才用 append方法<br />
<br />
<br />
<strong>截取单个字符</strong><br />
<br />
charAt(字符下标)<br />
<br />
</font><strong><br />
<font color="#000000">截取字符串</font></strong><br />
<br />
<font color="#000000">substring(startindex)<br />
<br />
substring(startindex,endindex)<br />
<br />
<br />
<strong>截取字符串并赋予字符数组</strong><br />
<br />
getChars(sourceStart,sourceEnd,char target[],int targetStart)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 截取从sourceStart到sourceEnd-1的字符串，下标从0开始<br />
<br />
<strong>把整个字符串转化为字符数组</strong><br />
<br />
char[]&nbsp;&nbsp; toCharArray()<br />
<br />
<strong>把字符串存于字节数组</strong><br />
<br />
byte[] getByes()<br />
<br />
<br />
<strong>字符串中字符替换</strong><br />
<br />
replace(char a,char b)<br />
<br />
<strong>字符串中子字符串替换</strong><br />
<br />
replaceAll(String a ,String b)<br />
<br />
<br />
</font><font color="#000000"><strong>字符串比较<br />
<br />
</strong>equals()<br />
<br />
<br />
大写转小写<br />
<br />
String toLowerCase()<br />
<br />
小写转大写<br />
<br />
String toUpperCase()<br />
<br />
<br />
<strong>搜索字符串</strong><br />
<br />
<strong>搜索字符首次出现在字符串中的下标</strong><br />
<br />
indexOf()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 失败返回-1<br />
<br />
<strong>搜索字符最后出现在字符串中的下标</strong><br />
<br />
lastIndexOf()&nbsp;&nbsp;&nbsp; 失败返回-1<br />
</font>
<img src ="http://www.blogjava.net/sooxin/aggbug/163501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-11-27 18:18 <a href="http://www.blogjava.net/sooxin/articles/163501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器系统时间不是24小时制时间，而是含有上午，下午等中文汉字，导致数图、tasi系统用户登录失败的问题之解决方法</title><link>http://www.blogjava.net/sooxin/articles/163500.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Tue, 27 Nov 2007 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/163500.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/163500.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/163500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/163500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/163500.html</trackback:ping><description><![CDATA[<div><a class="post_title" href="http://seagle.yculblog.com/post.1663522.html" rel="follow">服务器系统时间不是24小时制时间，而是含有上午，下午等中文汉字，导致数图、tasi系统用户登录失败的问题之解决方法</a></div>
<div><span class="post_user">西勾月</span><span class="post_time"> @ 2006-11-14 13:17</span></div>
<br />
<div class="post_content">
<div dir="ltr" align="left"><font size="2">Q：数图3.7使用有密码用户登录时提示&#8220;系统拒绝匿名登录&#8221;，如何解决？</font></div>
<div dir="ltr" align="left"><font size="2">A：1，检查系统时间格式是否为&#8220;2006-11-14 13:01:01&#8221;格式，如果不是按照下面操作。</font></div>
<div dir="ltr" align="left"><span class="153245104-14112006"><font size="2">&nbsp;&nbsp; 2，将服务器系统时间修改成24小时制时间，修改方法:&#8220;控制面板&#8221;- &#8220;区域设置和语言&#8221;&#8211; &#8220;区域选项&#8221;- &#8220;自定义&#8221; &#8211; &#8220;时间&#8221;。<font size="+0"><font size="2"><span class="153245104-14112006">时间格式为：HH:mm:ss ，</span></font></font><font size="+0"><font size="2"><span class="153245104-14112006">日期格式为：yyyy-M-d。</span></font></font></font></span></div>
<div dir="ltr" align="left"><span class="153245104-14112006"><font size="2"><font size="+0"><span class="153245104-14112006"><font size="2">&nbsp;&nbsp; 3，修改注册表。</font>
<div dir="ltr" align="left"><font size="2">将对应键值为</font><font size="2">HKEY_USERS/.Default/Control Panel/International<br />
<span class="153245104-14112006">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HKEY_CURRENT_USER/Control Panel/International<br />
<span class="153245104-14112006">&nbsp;&nbsp;&nbsp; </span>中的iTime = 1。<br />
对应键值为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLEAUT(OLEAUT有可能不存在,那就自己创建一个) </font></div>
<div><font size="2">在该键下创建一个DWORD值 VarConversionLocaleSetting = 2 </font></div>
<div><font size="2">注：DWORD值在中文注册表编辑器里叫"双字节值" 。</font></div>
<div><span class="153245104-14112006"><font size="2">&nbsp; 4，重新启动计算机。</font></span></span></font></font></span></div>
</div>
</div>
<img src ="http://www.blogjava.net/sooxin/aggbug/163500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-11-27 18:16 <a href="http://www.blogjava.net/sooxin/articles/163500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两个分页代码！（mysql  mssql）</title><link>http://www.blogjava.net/sooxin/articles/163054.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Sun, 25 Nov 2007 16:55:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/163054.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/163054.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/163054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/163054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/163054.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: mssql:&nbsp;&nbsp;1&lt;%@&nbsp;page&nbsp;contentType="text/html;&nbsp;charset=gb2312"&nbsp;%&gt;&nbsp;&nbsp;2&lt;%@&nbsp;page&nbsp;language="java"&nbsp;%&gt;&nbsp;&nbsp;3&lt;%@&nbsp;page&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/sooxin/articles/163054.html'>阅读全文</a><img src ="http://www.blogjava.net/sooxin/aggbug/163054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-11-26 00:55 <a href="http://www.blogjava.net/sooxin/articles/163054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两个整数相除得到小数（JAVA）</title><link>http://www.blogjava.net/sooxin/articles/162854.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Sat, 24 Nov 2007 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/162854.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/162854.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/162854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/162854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/162854.html</trackback:ping><description><![CDATA[结果完全不一样<br />
<br />
<span style="background-color: rgb(255,255,255)">&nbsp;<span style="color: rgb(51,102,255)">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public class test{</span></span><br style="color: rgb(51,102,255); background-color: rgb(255,255,255)" />
<span style="color: rgb(51,102,255); background-color: rgb(255,255,255)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; public static void main(String[] args){</span><br style="color: rgb(51,102,255); background-color: rgb(255,255,255)" />
<span style="color: rgb(51,102,255); background-color: rgb(255,255,255)">&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; <span style="color: rgb(255,0,0)">double x = 1/4;</span></span><br style="color: rgb(51,102,255); background-color: rgb(255,255,255)" />
<span style="color: rgb(51,102,255); background-color: rgb(255,255,255)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; System.out.println(x+"");&nbsp;&nbsp; &nbsp;</span><br style="color: rgb(51,102,255); background-color: rgb(255,255,255)" />
<span style="color: rgb(51,102,255); background-color: rgb(255,255,255)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 　}&nbsp;&nbsp; &nbsp;</span><br style="color: rgb(51,102,255); background-color: rgb(255,255,255)" />
<span style="color: rgb(51,102,255); background-color: rgb(255,255,255)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</span><br />
<br />
<br />
　<span style="color: rgb(51,102,255)">　public class test{</span><br style="color: rgb(51,102,255)" />
<span style="color: rgb(51,102,255)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; public static void main(String[] args){</span><br style="color: rgb(51,102,255)" />
<span style="color: rgb(51,102,255)">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: rgb(255,0,0)">double x = (double)1/4;</span></span><br style="color: rgb(51,102,255)" />
<span style="color: rgb(51,102,255)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; System.out.println(x+""); </span><br style="color: rgb(51,102,255)" />
<span style="color: rgb(51,102,255)">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; </span><br style="color: rgb(51,102,255)" />
<span style="color: rgb(51,102,255)">&nbsp;&nbsp;&nbsp; 　}&nbsp;&nbsp; </span><br />
<br />
　　是变笨了还是。。。<br />
　　基础不牢，唯一的解释。<br />
<img src ="http://www.blogjava.net/sooxin/aggbug/162854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-11-24 15:13 <a href="http://www.blogjava.net/sooxin/articles/162854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关于java的反斜杠"\" </title><link>http://www.blogjava.net/sooxin/articles/158256.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Mon, 05 Nov 2007 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/158256.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/158256.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/158256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/158256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/158256.html</trackback:ping><description><![CDATA[先说说java的转义字符
<p>\b&nbsp;&nbsp;&nbsp; backspace键<br />
\t&nbsp;&nbsp;&nbsp;&nbsp; Tab键<br />
\n&nbsp;&nbsp;&nbsp; 按行回车<br />
\r&nbsp;&nbsp;&nbsp;&nbsp; 回车<br />
\&#8221;&nbsp;&nbsp;&nbsp;&nbsp; 双引号<br />
\&#8217;&nbsp;&nbsp;&nbsp;&nbsp; 单引号<br />
\\&nbsp;&nbsp;&nbsp;&nbsp; 反斜杠</p>
<p>&nbsp;再看java的String <strong style="color: black; background-color: #ffff66">replaceAll</strong>(String regex, String replacement)方法的例子:</p>
<p>把字符串ab.c变成ab/c</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img id="_18_176_Open_Image" onclick="this.style.display='none'; document.getElementById('_18_176_Open_Text').style.display='none'; document.getElementById('_18_176_Closed_Image').style.display='inline'; document.getElementById('_18_176_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="_18_176_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_18_176_Closed_Text').style.display='none'; document.getElementById('_18_176_Open_Image').style.display='inline'; document.getElementById('_18_176_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span id="_18_176_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_18_176_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="_61_173_Open_Image" onclick="this.style.display='none'; document.getElementById('_61_173_Open_Text').style.display='none'; document.getElementById('_61_173_Closed_Image').style.display='inline'; document.getElementById('_61_173_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_61_173_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_61_173_Closed_Text').style.display='none'; document.getElementById('_61_173_Open_Image').style.display='inline'; document.getElementById('_61_173_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])</span><span id="_61_173_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_61_173_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">ab.c</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str</span><span style="color: #000000">=</span><span style="color: #000000">str.replaceAll(</span><span style="color: #000000">"</span><span style="color: #000000">\.</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
</div>
<p><font face="Verdana">String.<strong style="color: black; background-color: #ffff66">replaceAll</strong>()是用regular expression 来作为参数的。但是java本身的字符串对于转义符\也有类似的处理。首先，java会把&#8220;\\\\&#8221;解释成一个字符串(其中包含两个char)——&#8220;\\&#8221;这个就是你在JDK的文档里看到的。 <br />
接下来，由于<strong style="color: black; background-color: #ffff66">replaceAll</strong>是以正则表达式作为参数，所以&#8220;\\&#8221;被解释成一个regex。对于一个regex来说这就代表着一个字符，就是&#8220;\&#8221;。对后面的那个8个\来说，最终会被解释成&#8220;\\&#8221;。 </font></p>
<p><font face="Verdana">再来个例子:</font></p>
<p>&nbsp;</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img id="_18_235_Open_Image" onclick="this.style.display='none'; document.getElementById('_18_235_Open_Text').style.display='none'; document.getElementById('_18_235_Closed_Image').style.display='inline'; document.getElementById('_18_235_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="_18_235_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_18_235_Closed_Text').style.display='none'; document.getElementById('_18_235_Open_Image').style.display='inline'; document.getElementById('_18_235_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span id="_18_235_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_18_235_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="_78_232_Open_Image" onclick="this.style.display='none'; document.getElementById('_78_232_Open_Text').style.display='none'; document.getElementById('_78_232_Closed_Image').style.display='inline'; document.getElementById('_78_232_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_78_232_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_78_232_Closed_Text').style.display='none'; document.getElementById('_78_232_Open_Image').style.display='inline'; document.getElementById('_78_232_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception</span><span id="_78_232_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_78_232_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">c:/abc</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str</span><span style="color: #000000">=</span><span style="color: #000000">str.replaceAll(</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">,"\\\\"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 style="color: #008000">//</span><span style="color: #008000">最后打印为&nbsp;c:\abc</span><span style="color: #008000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/sooxin/aggbug/158256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-11-05 14:19 <a href="http://www.blogjava.net/sooxin/articles/158256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用POI来处理Excel和Word文件格式</title><link>http://www.blogjava.net/sooxin/articles/157594.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Thu, 01 Nov 2007 12:56:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/157594.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/157594.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/157594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/157594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/157594.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">7.3&nbsp; 使用POI来处理Excel和Word文件格式</p>
<p style="text-indent: 2em">Microsoft的Office系列产品拥有大量的用户，Word、Excel也成为办公文件的首选。在Java中，已经有很多对于Word、Excel的开源的解决方案，其中比较出色的是Apache的Jakata项目的POI子项目。该项目的官方网站是http://jakarta.apache.org/poi/。</p>
<p style="text-indent: 2em">POI包括一系列的API，它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式文件，可以通过这些API在Java中读写Excel、Word等文件。POI是完全的Java Excel和Java Word解决方案。POI子项目包括：POIFS、HSSF、HDF、HPSF。表7-2对它们进行了简要介绍。</p>
<p style="text-indent: 2em">表7-2&nbsp; POI子项目介绍
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="197">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">子项目名</p>
            </td>
            <td valign="top" width="369">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">说明</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="197">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">POIFS(POI File System)</p>
            </td>
            <td valign="top" width="369">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">POIFS是POI项目中最早的最基础的一个模块，是Java到OLE 2 Compound Document Format的接口，支持读写功能，所有的其他项目都依赖与该项目。</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="197">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">HSSF(Horrible Spreadsheet Format)</p>
            </td>
            <td valign="top" width="369">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">HSSF是Java到Microsoft Excel 97(-2002)文件的接口，支持读写功能</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="197">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">HWPF(Horrible Word Processing Format)</p>
            </td>
            <td valign="top" width="369">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">HWPF是Java到Microsoft Word 97文件的接口，支持读写功能，但目前该模块还处于刚开始开发阶段，只能实现一些简单文件的操作，在后续版本中，会提供更强大的支持</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="197">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">HPSF(Horrible Property Set Format)</p>
            </td>
            <td valign="top" width="369">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">HPSF 是Java到OLE 2 Compound Document Format文件的属性设置的接口，属性设置通常用来设置文档的属性（标题，作者，最后修改日期等），还可以设置用户定义的属性。HPSF支持读写功能，当前发布版本中直支持读功能。</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="text-indent: 2em">7.3.1&nbsp; 对Excel的处理类</p>
<p style="text-indent: 2em">下面通过HSSF提供的接口对Excel文件经行处理。首先需要下载POI的包，可以到apache的官方网站下载，地址为：http://apache.justdn.org/jakarta/poi/，本书采用的是poi-2.5.1-final-20040804.jar，读者可以下载当前的稳定版本。把下载的包按照前面介绍的方式加入Build Path，然后新建一个ch7.poi包，并创建一个ExcelReader类。</p>
<p style="text-indent: 2em">ExcelReader类可以读取一个XLS文件，然后将其内容逐行提取出来，写入文本文件。其代码如下。</p>
<p style="text-indent: 2em">代码7.6</p>
<p style="text-indent: 2em">public class ExcelReader {</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 创建文件输入流</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private BufferedReader reader = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 文件类型</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private String filetype;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 文件二进制输入流</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private InputStream is = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 当前的Sheet</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private int currSheet;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 当前位置</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private int currPosition;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // Sheet数量</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private int numOfSheets;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // HSSFWorkbook</p>
<p style="text-indent: 2em">&nbsp;&nbsp; HSSFWorkbook workbook = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 设置Cell之间以空格分割</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private static String EXCEL_LINE_DELIMITER = " ";</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 设置最大列数</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private static int MAX_EXCEL_COLUMNS = 64;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 构造函数创建一个ExcelReader</p>
<p style="text-indent: 2em">&nbsp;&nbsp; public ExcelReader(String inputfile) throws IOException, Exception {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断参数是否为空或没有意义</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (inputfile == null || inputfile.trim().equals("")) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IOException("no input file specified");</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 取得文件名的后缀名赋值给filetype</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.filetype = inputfile.substring(inputfile.lastIndexOf(".") + 1);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置开始行为0</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currPosition = 0;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置当前位置为0</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currSheet = 0;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建文件输入流</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is = new FileInputStream(inputfile);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断文件格式</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (filetype.equalsIgnoreCase("txt")) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是txt则直接创建BufferedReader读取</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader = new BufferedReader(new InputStreamReader(is));</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">else if (filetype.equalsIgnoreCase("xls")) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是Excel文件则创建HSSFWorkbook读取</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; workbook = new HSSFWorkbook(is);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置Sheet数</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; numOfSheets = workbook.getNumberOfSheets();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">else {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("File Type Not Supported");</p>
<p style="text-indent: 2em">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p style="text-indent: 2em">&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 函数readLine读取文件的一行</p>
<p style="text-indent: 2em">&nbsp;&nbsp; public String readLine() throws IOException {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是txt文件则通过reader读取</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (filetype.equalsIgnoreCase("txt")) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String str = reader.readLine();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 空行则略去，直接读取下一行</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (str.trim().equals("")) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = reader.readLine();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是XLS文件则通过POI提供的API读取文件</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (filetype.equalsIgnoreCase("xls")) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 根据currSheet值获得当前的sheet</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFSheet sheet = workbook.getSheetAt(currSheet);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断当前行是否到但前Sheet的结尾</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (currPosition &gt; sheet.getLastRowNum()) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 当前行位置清零</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currPosition = 0;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断是否还有Sheet</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (currSheet != numOfSheets - 1) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 得到下一张Sheet</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sheet = workbook.getSheetAt(currSheet + 1);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 当前行数是否已经到达文件末尾</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (currPosition == sheet.getLastRowNum()) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 当前Sheet指向下一张Sheet</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currSheet++;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取当前行数</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int row = currPosition;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currPosition++;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取当前行数据</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getLine(sheet, row);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取当前行数</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int row = currPosition;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currPosition++;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 读取当前行数据</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getLine(sheet, row);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // 函数getLine返回Sheet的一行数据</p>
<p style="text-indent: 2em">&nbsp;&nbsp; private String getLine(HSSFSheet sheet, int row) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 根据行数取得Sheet的一行</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFRow rowline = sheet.getRow(row);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 创建字符创缓冲区</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer buffer = new StringBuffer();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取当前行的列数</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int filledColumns = rowline.getLastCellNum();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSSFCell cell = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 循环遍历所有列</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; filledColumns; i++) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 取得当前Cell</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cell = rowline.getCell((short) i);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String cellvalue = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cell != null) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断当前Cell的Type</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (cell.getCellType()) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果当前Cell的Type为NUMERIC</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case HSSFCell.CELL_TYPE_NUMERIC: {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断当前的cell是否为Date</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (HSSFDateUtil.isCellDateFormatted(cell)) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是Date类型则，取得该Cell的Date值</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date date = cell.getDateCellValue();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 把Date转换成本地格式的字符串</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cellvalue = cell.getDateCellValue().toLocaleString();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是纯数字</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 取得当前Cell的数值</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer num = new Integer((int) cell</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getNumericCellValue());</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cellvalue = String.valueOf(num);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果当前Cell的Type为STRIN</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case HSSFCell.CELL_TYPE_STRING:</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 取得当前的Cell字符串</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cellvalue = cell.getStringCellValue().replaceAll("'", "''");</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 默认的Cell值</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cellvalue = " ";</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cellvalue = "";</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 在每个字段之间插入分割符</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.append(cellvalue).append(EXCEL_LINE_DELIMITER);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 以字符串返回该行的数据</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return buffer.toString();</p>
<p style="text-indent: 2em">&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp; // close函数执行流的关闭操作</p>
<p style="text-indent: 2em">&nbsp;&nbsp; public void close() {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果is不为空，则关闭InputSteam文件输入流</p>
<p style="text-indent: 2em">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if (is != null) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is.close();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果reader不为空则关闭BufferedReader文件输入流</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (reader != null) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.close();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} catch (IOException e) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">}</p>
<p style="text-indent: 2em">7.3.2&nbsp; ExcelReader的运行效果</p>
<p style="text-indent: 2em">下面创建一个main函数，用来测试上面的ExcelReader类，代码如下。</p>
<p style="text-indent: 2em">代码7.7</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; public static void main(String[] args) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExcelReader er=new ExcelReader("c:\\xp.xls");&nbsp;&nbsp; </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line=er.readLine();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(line != null){</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(line);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line=er.readLine();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; er.close();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">main函数先创建一个ExcelReader类，然后调用它提供的接口readLine，对XLS文件进行读取，打印到控制台，处理前的XLS文件如图7-12所示。</p>
<p style="text-indent: 2em"><img src="http://book.csdn.net/BookFiles/312/img/image012.jpg" border="0"  alt="" /></p>
<p style="text-indent: 2em">图7-12&nbsp; 处理前的XLS文件内容</p>
<p style="text-indent: 2em">运行main函数进行内容提取后，Eclipse的控制台输出如图7-13所示。</p>
<p style="text-indent: 2em"><img src="http://book.csdn.net/BookFiles/312/img/image013.jpg" border="0"  alt="" /></p>
<p style="text-indent: 2em">图7-13&nbsp; 输出结果</p>
<p style="text-indent: 2em">可以看到，Excel文件中的内容已经被成功的输出了出来。</p>
<p style="text-indent: 2em">7.3.3&nbsp; POI中Excel文件Cell的类型</p>
<p style="text-indent: 2em">在读取每一个Cell的值的时候，通过getCellType方法获得当前Cell的类型，在Excel中Cell有6种类型，如表7-3所示。</p>
<p style="text-indent: 2em">表7-3&nbsp; Cell的类型
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">CellType</p>
            </td>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">说明</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">CELL_TYPE_BLANK</p>
            </td>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">空值</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">CELL_TYPE_BOOLEAN</p>
            </td>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">布尔型</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">CELL_TYPE_ERROR</p>
            </td>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">错误</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">CELL_TYPE_FORMULA</p>
            </td>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">公式型</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">CELL_TYPE_STRING</p>
            </td>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">字符串型</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">CELL_TYPE_NUMERIC</p>
            </td>
            <td valign="top" width="283">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">数值型</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="text-indent: 2em">本例采用了CELL_TYPE_STRING和CELL_TYPE_NUMERIC类型，因为在Excel文件中只有字符串和数字。如果Cell的Type为CELL_TYPE_NUMERIC时，还需要进一步判断该Cell的数据格式，因为它有可能是Date类型，在Excel中的Date类型也是以Double类型的数字存储的。Excel中的Date表示当前时间与1900年1月1日相隔的天数，所以需要调用HSSFDateUtil的isCellDateFormatted方法，判断该Cell的数据格式是否是Excel Date类型。如果是，则调用getDateCellValue方法，返回一个Java类型的Date。</p>
<p style="text-indent: 2em">实际上Excel的数据格式有很多，还支持用户自定义的类型，在Excel中，选择一个单元格然后右键选择&#8220;设置单元格格式&#8221;，在弹出的单元格格式中选中&#8220;数字&#8221;，如图7-14所示。</p>
<p style="text-indent: 2em"><img src="http://book.csdn.net/BookFiles/312/img/image014.jpg" border="0"  alt="" /></p>
<p style="text-indent: 2em">图7-14&nbsp; Excel的单元格格式</p>
<p style="text-indent: 2em">图中的数据有数值、货币、时间、日期、文本等格式。这些数据格式在POI中的HSSFDataFormat类里都有相应的定义。</p>
<p style="text-indent: 2em">HSSFDataFormat是HSSF子项目里面定义的一个类。类HSSFDataFormat允许用户新建数据格式类型。HSSFDataFormat类包含静态方法static&nbsp;java.lang.String getBuiltinFormat(short&nbsp;index)，它可以根据编号返回内置数据类型。另外static&nbsp;short getBuiltinFormat(java.lang.String&nbsp;format)方法则可以根据数据类型返回其编号，static&nbsp;java.util.List getBuiltinFormats()可以返回整个内置的数据格式列表。</p>
<p style="text-indent: 2em">在HSSFDataFormat里一共定义了49种内置的数据格式，如表7-4所示。</p>
<p style="text-indent: 2em">表7-4&nbsp; HSSFDataFormat的数据格式</p>
<p style="text-indent: 2em">
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">内置数据类型</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">编号</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"General"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"0"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">1</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"0.00"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">2</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"#,##0"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">3</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"#,##0.00"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">4</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"($#,##0_);($#,##0)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">5</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"($#,##0_);[Red]($#,##0)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">6</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"($#,##0.00);($#,##0.00)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">7</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"($#,##0.00_);[Red]($#,##0.00)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">8</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"0%"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">9</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"0.00%"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0xa</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"0.00E+00"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0xb</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"# ?/?"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0xc</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"# ??/??"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0xd</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"m/d/yy"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0xe</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"d-mmm-yy"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0xf</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"d-mmm"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x10</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"mmm-yy"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x11</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"h:mm AM/PM"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x12</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"h:mm:ss AM/PM"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x13</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"h:mm"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x14</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"h:mm:ss"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x15</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"m/d/yy h:mm"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x16</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">保留为过国际化用</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x17 - 0x24</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"(#,##0_);(#,##0)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x25</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"(#,##0_);[Red](#,##0)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x26</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"(#,##0.00_);(#,##0.00)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x27</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"(#,##0.00_);[Red](#,##0.00)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x28</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x29</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x2a</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x2b</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x2c</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"mm:ss" </p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x2d</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"[h]:mm:ss"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x2e</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"mm:ss.0"</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x2f</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"##0.0E+0" </p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x30</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="365">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">"@" - This is text format</p>
            </td>
            <td valign="top" width="115">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">0x31</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="text-indent: 2em">在上面表中，字符串类型所对应的是数据格式为"@"（最后一行），也就是HSSFDataFormat中定义的值为0x31（49）的那行。Date类型的值的范围是0xe-0x11，本例子中的Date格式为""m/d/yy""，在HSSFDataFormat定义的值为0xe（14）。</p>
<p style="text-indent: 2em">需要注意的一点是，所创建的Excel必须是在Microsoft Excel 97到Excel XP的版本上的，如果在Excel 2003中创建文件后，在使用POI进行解析时，可能会出现问题。它会把Date类型当作自定义类型。POI目前只提供对Microsoft Excel XP以下的版本的支持，在以后的版本中，希望会提供对Microsoft Excel 2003更好的支持。</p>
<p style="text-indent: 2em">7.3.4&nbsp; 对Word的处理类</p>
<p style="text-indent: 2em">除了支持对Excel文件的读取外，POI还提供对Word的DOC格式文件的读取。但在它的发行版本中没有发布对Word支持的模块，需要另外下载一个POI的扩展的Jar包。用户可以到http://www.ibiblio.org/maven2/org/textmining/tm-extractors/0.4/下载，本书采用的是tm-extractors-0.4_zip。</p>
<p style="text-indent: 2em">下载后，把该包加入工程的Build Path中，然后在ch7.poi包下新建一个类WordReader，该类提供一个静态方法readDoc，读取一个DOC文件并返回文本。函数内容很简单，就是调用WordExtractor的API来提取DOC的内容到字符串，该函数的代码如下。</p>
<p style="text-indent: 2em">代码7.8</p>
<p style="text-indent: 2em">public static String readDoc(String doc) throws Exception {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; // 创建输入流读取DOC文件</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; FileInputStream in = new FileInputStream(new File(doc));</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; WordExtractor extractor = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; String text = null;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; // 创建WordExtractor</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; extractor = new WordExtractor();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; // 对DOC文件进行提取</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; text = extractor.extractText(in);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; return text;</p>
<p style="text-indent: 2em">}</p>
<p style="text-indent: 2em">在同一个类里创建一个main函数，测试WordReader，该main函数代码如下。</p>
<p style="text-indent: 2em">代码7.9</p>
<p style="text-indent: 2em">public static void main(String[] args) {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; String text = WordReader.readDoc("c:/test.doc");</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; System.out.println(text);</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; }</p>
<p style="text-indent: 2em">处理前的Doc文件如图7-15所示。</p>
<p style="text-indent: 2em"><img src="http://book.csdn.net/BookFiles/312/img/image015.jpg" border="0"  alt="" /></p>
<p style="text-indent: 2em">图7-15&nbsp; 处理前的Word文档</p>
<p style="text-indent: 2em">使用代码处理后的文本如图7-16所示。</p>
<p style="text-indent: 2em"><img src="http://book.csdn.net/BookFiles/312/img/image016.jpg" border="0"  alt="" /></p>
<p style="text-indent: 2em">图7-16&nbsp; 处理后的结果</p>
<p style="text-indent: 2em">可以看到Word文档内的文本已经全部被提取了出来。</p>
<img src ="http://www.blogjava.net/sooxin/aggbug/157594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-11-01 20:56 <a href="http://www.blogjava.net/sooxin/articles/157594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Thinking:Java中static、this、super、final用法</title><link>http://www.blogjava.net/sooxin/articles/125885.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Fri, 22 Jun 2007 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/125885.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/125885.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/125885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/125885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/125885.html</trackback:ping><description><![CDATA[本篇旨在帮助准备学习Java以及刚接触Java的朋友认识、掌握和使用static、this、super、final这几个关键字的使用。Java博大精深，我也是一位正在学习和使用Java的爱好者，文中难免有不妥之处，欢迎指正。
<p>一、static</p>
<p>　　请先看下面这段程序：</p>
<p>&nbsp; public class Hello{<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args){ //(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Hello,world!");&nbsp;&nbsp; //(2)<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>　　看过这段程序，对于大多数学过Java 的从来说，都不陌生。即使没有学过Java，而学过其它的高级语言，例如C，那你也应该能看懂这段代码的意思。它只是简单的输出&#8220;Hello,world&#8221;，一点别的用处都没有，然而，它却展示了static关键字的主要用法。</p>
<p>　　在1处，我们定义了一个静态的方法名为main，这就意味着告诉Java编译器，我这个方法不需创建一个此类的对象即可使用。你还得你是怎么运行这个程序吗？一般，我们都是在命令行下，打入如下的命令(加下划线为手动输入)：</p>
<p>javac Hello.java<br>java Hello<br>Hello,world!</p>
<p>　　这就是你运行的过程，第一行用来编译Hello.java这个文件，执行完后，如果你查看当前，会发现多了一个Hello.class文件，那就是第一行产生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中，你可能会想，为什么要这样才能输出。好，我们来分解一下这条语句。（如果没有安装Java文档，请到Sun的官方网站浏览J2SE API）首先，System是位于java.lang包中的一个核心类，如果你查看它的定义，你会发现有这样一行：public static final PrintStream out;接着在进一步，点击PrintStream这个超链接，在METHOD页面，你会看到大量定义的方法，查找println，会有这样一行：</p>
<p>public void println(String x)。</p>
<p>　　好了，现在你应该明白为什么我们要那样调用了，out是System的一个静态变量，所以可以直接使用，而out所属的类有一个println方法。</p>
<p><strong>静态方法</strong></p>
<p>　　通常，在一个类中定义一个方法为static，那就是说，无需本类的对象即可调用此方法。如下所示：</p>
<p>class Simple{<br>&nbsp;&nbsp; static void go(){<br>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Go...");<br>&nbsp;&nbsp; }<br>}<br>public class Cal{<br>&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp; Simple.go();<br>&nbsp; }<br>}</p>
<p>　　调用一个静态方法就是&#8220;类名.方法名&#8221;,静态方法的使用很简单如上所示。一般来说，静态方法常常为应用程序中的其它类提供一些实用工具所用，在Java的类库中大量的静态方法正是出于此目的而定义的。</p>
<p><strong>静态变量</strong></p>
<p>　　静态变量与静态方法类似。所有此类实例共享此静态变量，也就是说在类装载时，只分配一块存储空间，所有此类的对象都可以操控此块存储空间，当然对于final则另当别论了。看下面这段代码：</p>
<p>class Value{<br>&nbsp; static int c=0;<br>&nbsp; static void inc(){<br>&nbsp;&nbsp;&nbsp; c++;<br>&nbsp; }<br>}<br>class Count{<br>&nbsp; public static void prt(String s){<br>&nbsp;&nbsp;&nbsp; System.out.println(s);<br>&nbsp; }<br>&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp; Value v1,v2;<br>&nbsp;&nbsp;&nbsp; v1=new Value();<br>&nbsp;&nbsp;&nbsp; v2=new Value();<br>&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<br>&nbsp;&nbsp;&nbsp; v1.inc();<br>&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);&nbsp; <br>&nbsp; }<br>}</p>
<p>　　结果如下：</p>
<p>v1.c=0&nbsp; v2.c=0<br>v1.c=1&nbsp; v2.c=1</p>
<p><br>&nbsp;</p>
<p>&nbsp;由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。值得探讨的是静态变量的初始化问题。我们修改上面的程序：</p>
<p>class Value{<br>&nbsp; static int c=0;<br>&nbsp; Value(){<br>&nbsp;&nbsp;&nbsp; c=15;<br>&nbsp; }<br>&nbsp; Value(int i){<br>&nbsp;&nbsp;&nbsp; c=i;<br>&nbsp; }<br>&nbsp; static void inc(){<br>&nbsp;&nbsp;&nbsp; c++;<br>&nbsp; }<br>}<br>class Count{<br>&nbsp; public static void prt(String s){<br>&nbsp;&nbsp;&nbsp; System.out.println(s);<br>&nbsp; }<br>&nbsp;&nbsp;&nbsp; Value v=new Value(10);<br>&nbsp;&nbsp;&nbsp; static Value v1,v2;<br>&nbsp;&nbsp;&nbsp; static{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v1=new Value(27);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v2=new Value(15);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp; Count ct=new Count();<br>&nbsp;&nbsp;&nbsp; prt("ct.c="+ct.v.c);<br>&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<br>&nbsp;&nbsp;&nbsp; v1.inc();<br>&nbsp;&nbsp;&nbsp; prt("v1.c="+v1.c+"&nbsp; v2.c="+v2.c);<br>&nbsp;&nbsp;&nbsp; prt("ct.c="+ct.v.c);<br>&nbsp; }<br>}</p>
<p>运行结果如下：</p>
<p>v1.c=0&nbsp; v2.c=0<br>v1.c=27&nbsp; v2.c=27<br>v1.c=15&nbsp; v2.c=15<br>ct.c=10<br>v1.c=10&nbsp; v2.c=10<br>v1.c=11&nbsp; v2.c=11<br>ct.c=11</p>
<p>　　这个程序展示了静态初始化的各种特性。如果你初次接触Java，结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是，static定义的变量会优先于任何其它非static变量，不论其出现的顺序如何。正如在程序中所表现的，虽然v出现在v1和v2的前面，但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码，这是用来进行显式的静态变量初始化，这段代码只会初始化一次，且在类被第一次装载时。如果你能读懂并理解这段代码，会帮助你对static关键字的认识。在涉及到继承的时候，会先初始化父类的static变量，然后是子类的，依次类推。非静态变量不是本文的主题，在此不做详细讨论，请参考Think in Java中的讲解。</p>
<p><strong>静态类</strong></p>
<p>　　通常一个普通类不允许声明为静态的，只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用，而不需实例一个外部类。如下代码所示：</p>
<p>public class StaticCls{<br>&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp; OuterCls.InnerCls oi=new OuterCls.InnerCls();<br>&nbsp; }<br>}<br>class OuterCls{<br>&nbsp; public static class InnerCls{<br>&nbsp;&nbsp;&nbsp; InnerCls(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("InnerCls");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>}</p>
<p>　　输出结果会如你所料：</p>
<p>InnerCls</p>
<p>　　和普通类一样。内部类的其它用法请参阅Think in Java中的相关章节，此处不作详解。</p>
<p>二、this &amp; super</p>
<p>　　在上一篇拙作中，我们讨论了static的种种用法，通过用static来定义方法或成员，为我们编程提供了某种便利，从某种程度上可以说它类似于C语言中的全局函数和全局变量。但是，并不是说有了这种便利，你便可以随处使用，如果那样的话，你便需要认真考虑一下自己是否在用面向对象的思想编程，自己的程序是否是面向对象的。好了，现在开始讨论this&amp;super这两个关键字的意义和用法。</p>
<p>　　在Java中，this通常指当前对象，super则指父类的。当你想要引用当前对象的某种东西，比如当前对象的某个方法，或当前对象的某个成员，你便可以利用this来实现这个目的，当然，this的另一个用途是调用当前对象的另一个构造函数，这些马上就要讨论。如果你想引用父类的某种东西，则非super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系，所以我们在这一块儿来讨论，希望能帮助你区分和掌握它们两个。</p>
<p><strong>在一般方法中</strong></p>
<p>　　最普遍的情况就是，在你的方法中的某个形参名与当前对象的某个成员有相同的名字，这时为了不至于混淆，你便需要明确使用this关键字来指明你要使用某个成员，使用方法是&#8220;this.成员名&#8221;，而不带this的那个便是形参。另外，还可以用&#8220;this.方法名&#8221;来引用当前对象的某个方法，但这时this就不是必须的了，你可以直接用方法名来访问那个方法，编译器会知道你要调用的是那一个。下面的代码演示了上面的用法：</p>
<p><br clear=all><br><br></p>
<p>public class DemoThis{<br>&nbsp; private String name;<br>&nbsp; private int age;<br>&nbsp; DemoThis(String name,int age){<br>&nbsp;&nbsp;&nbsp; setName(name); //你可以加上this来调用方法，像这样：this.setName(name);但这并不是必须的<br>&nbsp;&nbsp;&nbsp; setAge(age);<br>&nbsp;&nbsp;&nbsp; this.print();<br>&nbsp; }&nbsp;&nbsp; <br>&nbsp; public void setName(String name){<br>&nbsp;&nbsp;&nbsp; this.name=name;//此处必须指明你要引用成员变量<br>&nbsp; }<br>&nbsp; public void setAge(int age){<br>&nbsp;&nbsp;&nbsp; this.age=age;<br>&nbsp; }<br>&nbsp; public void print(){<br>&nbsp;&nbsp;&nbsp; System.out.println("Name="+name+" Age="+age);//在此行中并不需要用this，因为没有会导致混淆的东西<br>&nbsp; }<br>&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp; DemoThis dt=new DemoThis("Kevin","22");<br>&nbsp; }<br>}</p>
<p>　　这段代码很简单，不用解释你也应该能看明白。在构造函数中你看到用this.print(),你完全可以用print()来代替它，两者效果一样。下面我们修改这个程序，来演示super的用法。</p>
<p>class Person{<br>&nbsp; public int c;<br>&nbsp; private String name;<br>&nbsp; private int age;<br>&nbsp; protected void setName(String name){<br>&nbsp;&nbsp;&nbsp; this.name=name;<br>&nbsp; }<br>&nbsp; protected void setAge(int age){<br>&nbsp;&nbsp;&nbsp; this.age=age;<br>&nbsp; }<br>&nbsp; protected void print(){<br>&nbsp;&nbsp;&nbsp; System.out.println("Name="+name+" Age="+age);<br>&nbsp; }<br>}<br>public class DemoSuper extends Person{<br>&nbsp; public void print(){<br>&nbsp;&nbsp;&nbsp; System.out.println("DemoSuper:");<br>&nbsp;&nbsp;&nbsp; super.print();<br>&nbsp; }<br>&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp; DemoSuper ds=new DemoSuper();<br>&nbsp;&nbsp;&nbsp; ds.setName("kevin");<br>&nbsp;&nbsp;&nbsp; ds.setAge(22);<br>&nbsp;&nbsp;&nbsp; ds.print();<br>&nbsp; }<br>}</p>
<p>　　在DemoSuper中，重新定义的print方法覆写了父类的print方法，它首先做一些自己的事情，然后调用父类的那个被覆写了的方法。输出结果说明了这一点：</p>
<p>DemoSuper:<br>Name=kevin Age=22</p>
<p>　　这样的使用方法是比较常用的。另外如果父类的成员可以被子类访问，那你可以像使用this一样使用它，用&#8220;super.父类中的成员名&#8221;的方式，但常常你并不是这样来访问父类中的成员名的。</p>
<p><strong>在构造函数中</strong></p>
<p>　　构造函数是一种特殊的方法，在对象初始化的时候自动调用。在构造函数中，this和super也有上面说的种种使用方式，并且它还有特殊的地方，请看下面的例子：</p>
<p>class Person{<br>&nbsp; public static void prt(String s){<br>&nbsp;&nbsp;&nbsp; System.out.println(s);<br>&nbsp; }<br>&nbsp; Person(){<br>&nbsp;&nbsp;&nbsp; prt("A Person.");<br>&nbsp; }<br>&nbsp; Person(String name){<br>&nbsp;&nbsp;&nbsp; prt("A person name is:"+name);<br>&nbsp; }<br>}<br>public class Chinese extends Person{<br>&nbsp; Chinese(){<br>&nbsp;&nbsp;&nbsp; super();&nbsp; //调用父类构造函数（1）<br>&nbsp;&nbsp;&nbsp; prt("A chinese.");//(4)<br>&nbsp; }<br>&nbsp; Chinese(String name){<br>&nbsp;&nbsp;&nbsp; super(name);//调用父类具有相同形参的构造函数（2）<br>&nbsp;&nbsp;&nbsp; prt("his name is:"+name);<br>&nbsp; }<br>&nbsp; Chinese(String name,int age){<br>&nbsp;&nbsp;&nbsp; this(name);//调用当前具有相同形参的构造函数（3）<br>&nbsp;&nbsp;&nbsp; prt("his age is:"+age);<br>&nbsp; }<br>&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp; Chinese cn=new Chinese();<br>&nbsp;&nbsp;&nbsp; cn=new Chinese("kevin");<br>&nbsp;&nbsp;&nbsp; cn=new Chinese("kevin",22);<br>&nbsp; }<br>}</p>
<p>　　在这段程序中，this和super不再是像以前那样用&#8220;.&#8221;连接一个方法或成员，而是直接在其后跟上适当的参数，因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同形式的构造函数，如1和2处。this后加参数则调用的是当前具有相同参数的构造函数，如3处。当然，在Chinese的各个重载构造函数中，this和super在一般方法中的各种用法也仍可使用，比如4处，你可以将它替换为&#8220;this.prt&#8221;(因为它继承了父类中的那个方法）或者是&#8220;super.prt&#8221;（因为它是父类中的方法且可被子类访问），它照样可以正确运行。但这样似乎就有点画蛇添足的味道了。</p>
<p>　　最后，写了这么多，如果你能对&#8220;this通常指代当前对象，super通常指代父类&#8221;这句话牢记在心，那么本篇便达到了目的，其它的你自会在以后的编程实践当中慢慢体会、掌握。另外关于本篇中提到的继承，请参阅相关Java教程。</p>
<p>三、final</p>
<p>　　final在Java中并不常用，然而它却为我们提供了诸如在C语言中定义常量的功能，不仅如此，final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能，这些特点使final在Java中拥有了一个不可或缺的地位，也是学习Java时必须要知道和掌握的关键字之一。</p>
<p><strong>final成员</strong></p>
<p>　　当你在类中定义变量时，在其前面加上final关键字，那便是说，这个变量一旦被初始化便不可改变，这里不可改变的意思对基本类型来说是其值不可变，而对于对象变量来说其引用不可再变。其初始化可以在两个地方，一是其定义处，也就是说在final变量定义时直接给其赋值，二是在构造函数中。这两个地方只能选其一，要么在定义时给值，要么在构造函数中给值，不能同时既在定义时给了值，又在构造函数中给另外的值。下面这段代码演示了这一点：</p>
<p><br clear=all></p>
<p>import java.util.List;<br>import java.util.ArrayList;<br>import java.util.LinkedList;<br>public class Bat{<br>&nbsp;&nbsp;&nbsp; final PI=3.14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在定义时便给址值<br>&nbsp;&nbsp;&nbsp; final int i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //因为要在构造函数中进行初始化，所以此处便不可再给值<br>&nbsp;&nbsp;&nbsp; final List list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //此变量也与上面的一样<br>&nbsp;&nbsp;&nbsp; Bat(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=100;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list=new LinkedList();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; Bat(int ii,List l){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=ii;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list=l;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bat b=new Bat();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.list.add(new Bat());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //b.i=25;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //b.list=new ArrayList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("I="+b.i+" List Type:"+b.list.getClass());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b=new Bat(23,new ArrayList());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.list.add(new Bat());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("I="+b.i+" List Type:"+b.list.getClass());<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>　　此程序很简单的演示了final的常规用法。在这里使用在构造函数中进行初始化的方法，这使你有了一点灵活性。如Bat的两个重载构造函数所示，第一个缺省构造函数会为你提供默认的值，重载的那个构造函数会根据你所提供的值或类型为final变量初始化。然而有时你并不需要这种灵活性，你只需要在定义时便给定其值并永不变化，这时就不要再用这种方法。在main方法中有两行语句注释掉了，如果你去掉注释，程序便无法通过编译，这便是说，不论是i的值或是list的类型，一旦初始化，确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型，输出结果中显示了这一点：</p>
<p>I=100 List Type:class java.util.LinkedList<br>I=23 List Type:class java.util.ArrayList</p>
<p>　　还有一种用法是定义方法中的参数为final，对于基本类型的变量，这样做并没有什么实际意义，因为基本类型的变量在调用方法时是传值的，也就是说你可以在方法中更改这个参数变量而不会影响到调用语句，然而对于对象变量，却显得很实用，因为对象变量在传递时是传递其引用，这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量，当你在方法中不需要改变作为参数的对象变量时，明确使用final进行声明，会防止你无意的修改而影响到调用方法。<br>另外方法中的内部类在用到方法中的参变量时，此参变也必须声明为final才可使用，如下代码所示：</p>
<p>public class INClass{<br>&nbsp;&nbsp; void innerClass(final String str){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class IClass{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IClass(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str);<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; IClass ic=new IClass();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INClass inc=new INClass();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inc.innerClass("Hello");<br>&nbsp; }<br>}</p>
<p><strong>final方法</strong></p>
<p>　　将方法声明为final，那就说明你已经知道这个方法提供的功能已经满足你要求，不需要进行扩展，并且也不允许任何从此类继承的类来覆写这个方法，但是继承仍然可以继承这个方法，也就是说可以直接使用。另外有一种被称为inline的机制，它会使你在调用final方法时，直接将方法主体插入到调用处，而不是进行例行的方法调用，例如保存断点，压栈等，这样可能会使你的程序效率有所提高，然而当你的方法主体非常庞大时，或你在多处调用此方法，那么你的调用主体代码便会迅速膨胀，可能反而会影响效率，所以你要慎用final进行方法定义。</p>
<p><strong>final类</strong></p>
<p>　　当你将final用于类身上时，你就需要仔细考虑，因为一个final类是无法被任何人继承的，那也就意味着此类在一个继承树中是一个叶子类，并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员，你可以定义其为final，也可以不是final。而对于方法，由于所属类为final的关系，自然也就成了final型的。你也可以明确的给final类中的方法加上一个final，但这显然没有意义。</p>
<p>　　下面的程序演示了final方法和final类的用法：</p>
<p>final class final{<br>&nbsp;&nbsp;&nbsp; final String str="final Data";<br>&nbsp;&nbsp;&nbsp; public String str1="non final data";<br>&nbsp;&nbsp;&nbsp; final public void print(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("final method.");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; public void what(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(str+"\n"+str1);<br>&nbsp;&nbsp;&nbsp; }<br>}<br>public class FinalDemo {&nbsp;&nbsp; //extends final 无法继承 <br>&nbsp;&nbsp;&nbsp; public static void main(String[] args){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final f=new final();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.what();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.print();<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>　　从程序中可以看出，final类与普通类的使用几乎没有差别，只是它失去了被继承的特性。final方法与非final方法的区别也很难从程序行看出，只是记住慎用。</p>
<p><strong>final在设计模式中的应用</strong></p>
<p>　　在设计模式中有一种模式叫做不变模式，在Java中通过final关键字可以很容易的实现这个模式，在讲解final成员时用到的程序Bat.java就是一个不变模式的例子。如果你对此感兴趣，可以参考阎宏博士编写的《Java与模式》一书中的讲解。</p>
<p>　　到此为止，this,static,supert和final的使用已经说完了，如果你对这四个关键字已经能够大致说出它们的区别与用法，那便说明你基本已经掌握。然而，世界上的任何东西都不是完美无缺的，Java提供这四个关键字，给程序员的编程带来了很大的便利，但并不是说要让你到处使用，一旦达到滥用的程序，便适得其反，所以在使用时请一定要认真考虑。</p>
<img src ="http://www.blogjava.net/sooxin/aggbug/125885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-06-22 17:13 <a href="http://www.blogjava.net/sooxin/articles/125885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中static的作用 </title><link>http://www.blogjava.net/sooxin/articles/125850.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Fri, 22 Jun 2007 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/125850.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/125850.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/125850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/125850.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/125850.html</trackback:ping><description><![CDATA[<p>有时你希望定义一个类成员，使它的使用完全独立于该类的任何对象。通常情况下，类成员必须通过它的类的对象访问，但是可以创建这样一个成员，它能够被它自己使用，而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static，它就能够在它的类的任何对象创建之前被访问，而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ，所以它被声明为static。 </p>
<p>声明为static的变量实质上就是全局变量。当声明一个对象时，并不产生static变量的拷贝，而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制： <br>&#183; <br>它们仅能调用其他的static 方法。 <br>&#183; <br>它们只能访问static数据。 <br>&#183; <br>它们不能以任何方式引用this 或super（关键字super 与继承有关，在下一章中描述）。 <br>如果你需要通过计算来初始化你的static变量，你可以声明一个static块，Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法，一些static变量，以及一个static 初始化块： <br>// Demonstrate static variables，methods，and blocks. </p>
<p>class UseStatic { <br>static int a = 3; <br>static int b; </p>
<p><br>static void meth(int x) { <br>System.out.println("x = " + x); <br>System.out.println("a = " + a); <br>System.out.println("b = " + b); </p>
<p><br>} </p>
<p>static { <br>System.out.println("Static block initialized."); <br>b = a * 4; </p>
<p><br>} </p>
<p>public static void main(String args[]) { <br>meth(42); <br>} <br>} </p>
<p><br>一旦UseStatic 类被装载，所有的static语句被运行。首先，a被设置为3，接着static 块执行(打印一条消息)，最后，b被初始化为a*4 或12。然后调用main()，main() 调用meth() ，把值42传递给x。3个println ( ) 语句引用两个static变量a和b，以及局部变量x 。 </p>
<p>注意：在一个static 方法中引用任何实例变量都是非法的。 </p>
<p>下面是该程序的输出： </p>
<p>Static block initialized. <br>x = 42 <br>a = 3 <br>b = 12 <br>在定义它们的类的外面，static 方法和变量能独立于任何对象而被使用。这样，你只要在类的名字后面加点号运算符即可。例如，如果你希望从类外面调用一个static方法，你可以使用下面通用的格式： </p>
<p>classname.method( ) </p>
<p>这里，classname 是类的名字，在该类中定义static方法。可以看到，这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的格式来访问——类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。 </p>
<p>下面是一个例子。在main() 中，static方法callme() 和static 变量b在它们的类之外被访问。 </p>
<p>class StaticDemo { <br>static int a = 42; <br>static int b = 99; <br>static void callme() { </p>
<p><br>System.out.println("a = " + a); <br>} <br>} </p>
<p><br>class StaticByName { </p>
<p>public static void main(String args[]) { <br>StaticDemo.callme(); <br>System.out.println("b = " + StaticDemo.b); </p>
<p><br>} <br>} </p>
<p>下面是该程序的输出： </p>
<p>a = 42 <br>b = 99</p>
<p><br>&nbsp;</p>
<p>static成员是不能被其所在class创建的实例访问的。</p>
<p>如果不加static修饰的成员是对象成员，也就是归每个对象所有的。 </p>
<p>加static修饰的成员是类成员，就是可以由一个类直接调用，为所有对象共有的<br></p>
<img src ="http://www.blogjava.net/sooxin/aggbug/125850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-06-22 15:23 <a href="http://www.blogjava.net/sooxin/articles/125850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Where does the target="" go when using location.href=""?</title><link>http://www.blogjava.net/sooxin/articles/124539.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Fri, 15 Jun 2007 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/124539.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/124539.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/124539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/124539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/124539.html</trackback:ping><description><![CDATA[<p>By default when using location.href="fileName.html", the target is the current document. </p>
<p>When coding location.href="fileName.html" what we are actually coding is document.location.href="fileName.html" or self.location.href="fileName.html", the self specifies the current window, or window.location.href="fileName.html". </p>
<p>When we need to target another window we need to navigate the window object hierarchy, either by specifying the parent frame, or the top frame (which may in fact be the same thing). </p>
<p>top.location.href="fileName.html" targets the top document. </p>
<p>top.frameName.location.href="fileName.html" targets the frame frameName within the top document. </p>
<p>parent.location.href="fileName.html" targets the parent of the current document. </p>
<p>parent.frameName.location.href="fileName.html" targets the child frame frameName of the parent of the current document, i.e. a sibling frame. </p>
<!-- content end-->
<p><strong>Feedback on <em>'Q18 Where does the target="" go when using location.href=""?'</em></strong></p>
<img src ="http://www.blogjava.net/sooxin/aggbug/124539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-06-15 17:21 <a href="http://www.blogjava.net/sooxin/articles/124539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 16进制字符串与2进制字符串相互转换</title><link>http://www.blogjava.net/sooxin/articles/115948.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Tue, 08 May 2007 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/115948.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/115948.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/115948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/115948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/115948.html</trackback:ping><description><![CDATA[<span class=keyword>public</span> <span class=keyword>static</span> String hexString2binaryString(String hexString) <span class=bracket>{</span><br>&nbsp;&nbsp;&nbsp; <span class=keyword>if</span> (hexString == <span class=keyword>null</span> || hexString.length() % <span class=number>2</span> != <span class=number>0</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class=keyword>return</span> <span class=keyword>null</span>;<br>&nbsp;&nbsp;&nbsp; String bString = <span class=string>""</span>, tmp;<br>&nbsp;&nbsp;&nbsp; <span class=keyword>for</span> (<span class=keyword>int</span> i = <span class=number>0</span>; i &lt; hexString.length(); i++) <span class=bracket>{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = <span class=string>"0000"</span> + Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + <span class=number>1</span>), <span class=number>16</span>));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bString += tmp.substring(tmp.length() - <span class=number>4</span>);<br>&nbsp;&nbsp;&nbsp; <span class=bracket>}</span><br>&nbsp;&nbsp;&nbsp; <span class=keyword>return</span> bString;<br>&nbsp; <span class=bracket>}</span><br><span class=comment>//------------------------------------------------------</span><br>&nbsp; <span class=keyword>public</span> <span class=keyword>static</span> String binaryString2hexString(String bString) <span class=bracket>{</span><br>&nbsp;&nbsp;&nbsp; <span class=keyword>if</span> (bString == <span class=keyword>null</span> || bString.equals(<span class=string>""</span>) || bString.length() % <span class=number>8</span> != <span class=number>0</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class=keyword>return</span> <span class=keyword>null</span>;<br>&nbsp;&nbsp;&nbsp; StringBuffer tmp=<span class=keyword>new</span> StringBuffer();<br>&nbsp;&nbsp;&nbsp; <span class=keyword>int</span> iTmp = <span class=number>0</span>;<br>&nbsp;&nbsp;&nbsp; <span class=keyword>for</span> (<span class=keyword>int</span> i = <span class=number>0</span>; i &lt; bString.length(); i += <span class=number>4</span>) <span class=bracket>{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iTmp = <span class=number>0</span>;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class=keyword>for</span> (<span class=keyword>int</span> j = <span class=number>0</span>; j &lt; <span class=number>4</span>; j++) <span class=bracket>{</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iTmp += Integer.parseInt(bString.substring(i + j, i + j + <span class=number>1</span>)) &lt;&lt; (<span class=number>4</span> - j - <span class=number>1</span>);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class=bracket>}</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp.append(Integer.toHexString(iTmp));<br>&nbsp;&nbsp;&nbsp; <span class=bracket>}</span><br>&nbsp;&nbsp;&nbsp; <span class=keyword>return</span> tmp.toString();<br>&nbsp; <span class=bracket>}</span><br>
<img src ="http://www.blogjava.net/sooxin/aggbug/115948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-05-08 15:10 <a href="http://www.blogjava.net/sooxin/articles/115948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中常用数据类型转换函数</title><link>http://www.blogjava.net/sooxin/articles/115944.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Tue, 08 May 2007 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/115944.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/115944.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/115944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/115944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/115944.html</trackback:ping><description><![CDATA[<div>JAVA中常用数据类型转换函数:
<p>&#160;</p>
<p>string-&gt;byte<br>Byte&nbsp;static&nbsp;byte&nbsp;parseByte(String&nbsp;s)&nbsp;</p>
<p>byte-&gt;string&nbsp;<br>Byte&nbsp;static&nbsp;String&nbsp;toString(byte&nbsp;b)&nbsp;</p>
<p>char-&gt;string&nbsp;<br>Character&nbsp;static&nbsp;String&nbsp;to&nbsp;String&nbsp;(char&nbsp;c)&nbsp;</p>
<p>string-&gt;Short&nbsp;<br>Short&nbsp;static&nbsp;Short&nbsp;parseShort(String&nbsp;s)&nbsp;</p>
<p>Short-&gt;String&nbsp;<br>Short&nbsp;static&nbsp;String&nbsp;toString(Short&nbsp;s)&nbsp;</p>
<p>String-&gt;Integer&nbsp;<br>Integer&nbsp;static&nbsp;int&nbsp;parseInt(String&nbsp;s)</p>
<p>Integer-&gt;String&nbsp;<br>Integer&nbsp;static&nbsp;String&nbsp;tostring(int&nbsp;i)&nbsp;</p>
<p>String-&gt;Long&nbsp;<br>Long&nbsp;static&nbsp;long&nbsp;parseLong(String&nbsp;s)&nbsp;</p>
<p>Long-&gt;String&nbsp;<br>Long&nbsp;static&nbsp;String&nbsp;toString(Long&nbsp;i)&nbsp;</p>
<p>String-&gt;Float&nbsp;<br>Float&nbsp;static&nbsp;float&nbsp;parseFloat(String&nbsp;s)&nbsp;</p>
<p>Float-&gt;String&nbsp;<br>Float&nbsp;static&nbsp;String&nbsp;toString(float&nbsp;f)&nbsp;</p>
<p>String-&gt;Double&nbsp;<br>Double&nbsp;static&nbsp;double&nbsp;parseDouble(String&nbsp;s)</p>
<p>Double-&gt;String<br>Double&nbsp;static&nbsp;String&nbsp;toString(Double&nbsp;d)&nbsp;</p>
<p>这是一个例子，说的是JAVA中数据数型的转换。供大家学习参考&nbsp;</p>
<p>package&nbsp;cn.com.lwkj.erts.register;&nbsp;<br>import&nbsp;java.sql.Date;&nbsp;<br>public&nbsp;class&nbsp;TypeChange&nbsp;{&nbsp;<br>public&nbsp;TypeChange()&nbsp;{&nbsp;<br>}&nbsp;<br>//change&nbsp;the&nbsp;string&nbsp;type&nbsp;to&nbsp;the&nbsp;int&nbsp;type&nbsp;<br>public&nbsp;static&nbsp;int&nbsp;stringToInt(String&nbsp;intstr)&nbsp;<br>{&nbsp;<br>Integer&nbsp;integer;&nbsp;<br>integer&nbsp;=&nbsp;Integer.valueOf(intstr);&nbsp;<br>return&nbsp;integer.intValue();&nbsp;<br>}&nbsp;<br>//change&nbsp;int&nbsp;type&nbsp;to&nbsp;the&nbsp;string&nbsp;type&nbsp;<br>public&nbsp;static&nbsp;String&nbsp;intToString(int&nbsp;value)&nbsp;<br>{&nbsp;<br>Integer&nbsp;integer&nbsp;=&nbsp;new&nbsp;Integer(value);&nbsp;<br>return&nbsp;integer.toString();&nbsp;<br>}&nbsp;<br>//change&nbsp;the&nbsp;string&nbsp;type&nbsp;to&nbsp;the&nbsp;float&nbsp;type&nbsp;<br>public&nbsp;static&nbsp;float&nbsp;stringToFloat(String&nbsp;floatstr)&nbsp;<br>{&nbsp;<br>Float&nbsp;floatee;&nbsp;<br>floatee&nbsp;=&nbsp;Float.valueOf(floatstr);&nbsp;<br>return&nbsp;floatee.floatValue();&nbsp;<br>}&nbsp;<br>//change&nbsp;the&nbsp;float&nbsp;type&nbsp;to&nbsp;the&nbsp;string&nbsp;type&nbsp;<br>public&nbsp;static&nbsp;String&nbsp;floatToString(float&nbsp;value)&nbsp;<br>{&nbsp;<br>Float&nbsp;floatee&nbsp;=&nbsp;new&nbsp;Float(value);&nbsp;<br>return&nbsp;floatee.toString();&nbsp;<br>}&nbsp;<br>//change&nbsp;the&nbsp;string&nbsp;type&nbsp;to&nbsp;the&nbsp;sqlDate&nbsp;type&nbsp;<br>public&nbsp;static&nbsp;java.sql.Date&nbsp;stringToDate(String&nbsp;dateStr)&nbsp;<br>{&nbsp;<br>return&nbsp;java.sql.Date.valueOf(dateStr);&nbsp;<br>}&nbsp;<br>//change&nbsp;the&nbsp;sqlDate&nbsp;type&nbsp;to&nbsp;the&nbsp;string&nbsp;type&nbsp;<br>public&nbsp;static&nbsp;String&nbsp;dateToString(java.sql.Date&nbsp;datee)&nbsp;<br>{&nbsp;<br>return&nbsp;datee.toString();&nbsp;<br>}&nbsp;</p>
<p>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;<br>{&nbsp;<br>java.sql.Date&nbsp;day&nbsp;;&nbsp;<br>day&nbsp;=&nbsp;TypeChange.stringToDate("2003-11-3");&nbsp;<br>String&nbsp;strday&nbsp;=&nbsp;TypeChange.dateToString(day);&nbsp;<br>System.out.println(strday);&nbsp;<br>}&nbsp;</p>
<p><br>}&nbsp;</p>
<p>&#160;</p>
</div>
<img src ="http://www.blogjava.net/sooxin/aggbug/115944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-05-08 14:53 <a href="http://www.blogjava.net/sooxin/articles/115944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搭建Eclipse+MyEclipse开发环境</title><link>http://www.blogjava.net/sooxin/articles/114149.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Fri, 27 Apr 2007 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/114149.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/114149.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/114149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/114149.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/114149.html</trackback:ping><description><![CDATA[<h1>搭建Eclipse+MyEclipse开发环境</h1>
<div id=contentTxt><strong>一、安装JDK<br></strong><br>　　首先下载JDK 5.0（JDK 5.0的下载页面为：<a href="http://java.sun.com/j2se/1.5.0/download.jsp"><u><font color=red>http://java.sun.com/j2se/1.5.0/download.jsp</font></u></a><a href="https://sdlc3a.sun.com/ECom/EComActionServlet;jsessionid=DEE87FD4DE317FFDAB7B07E037FFCE16"></a>）； 然后运行JDK 5.0安装程序jdk-1_5_0_06-windows-i586-p.exe，安装过程中所有选项保持默认；最后配置JDK的环境变量：在&#8220;我的电脑&#8221;上点右键—&gt;&#8220;属性&#8221;—&gt;&#8220;高级&#8221;—&gt; &#8220;环境变量(N)&#8221;。<br><br><img style="FILTER: ; WIDTH: 600px; HEIGHT: 498px" height=498 alt=" " hspace=0 src="http://dev.yesky.com/imagelist/06/26/l3aq3ziq91b9.jpg" width=600 border=0> <br><br>　　新建系统变量JAVA_HOME：C:\Program Files\Java\jdk1.5.0_06；<br><br>　　新建系统变量CLASSPATH：.;%JAVA_HOME%\lib;（注意：点号表示当前目录，不能省略）<br><br>　　在系统变量Path的值的<strong>前面</strong>加入以下内容：%JAVA_HOME%\bin;(注意:这里的分号不能省略)<br><br>　　到这里，JDK安装完毕。<br><br>　　下面我们测试一下JDK是否安装成功：<br><br>　　将以下内容复制到记事本中：<br><br>public class HelloJAVA<br>{<br>public static void main(String srg[])<br>{<br>System.out.println("Hello JAVA!");<br>}<br>}<br><br>　　另存为&#8220;HelloJAVA.java&#8221;（不含引号，下同），并保存到D盘根目录下。<br><br>　　在命令行依次输入下图中红线所标注的命令：<br><br><img alt=" " src="http://dev.yesky.com/imagelist/06/26/98q69009ho23.jpg"><br><br>　　如果出现上图红框中所标注的内容，则说明JDK安装成功！<br><br>　　注意:如果以后要安装诸如Eclipse、Borland JBuilder、JCreator、IntelliJ IDEA等集成开发环境(IDE,Integrated Development Environment),应该在IDE中编译运行一个简单的HelloWorld程序，以保证IDE可以识别出JDK的位置。<br><br>　　<strong>二、安装Tomcat<br></strong><br>　　首先下载jakarta-tomcat-5.0.30.zip，之所以下载免安装版的好处是可以使用多个Tomcat（jakarta-tomcat-5.0.30.zip的下载页面为：<br><a href="http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/"><br><u><font color=#ff0000>http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/</font></u></a>）；<br><br>　　然后将jakarta-tomcat-5.0.30.zip直接解压到D盘根目录：<br><br><img style="FILTER: ; WIDTH: 600px; HEIGHT: 524px" height=524 alt=" " hspace=0 src="http://dev.yesky.com/imagelist/06/26/9youd9g03j97.jpg" width=600 border=0><br><br>　　最后配置Tomcat的环境变量：在&#8220;我的电脑&#8221;上点右键—&gt;&#8220;属性&#8221;—&gt;&#8220;高级&#8221;—&gt; &#8220;环境变量(N)&#8221;。<br><br>　　新建系统变量CATALINA_HOME：D:\jakarta-tomcat-5.0.30<br><br>　　在系统变量CLASSPATH的值的<strong>后面</strong>加入：%CATALINA_HOME%\common\lib;<br><br>　　在系统变量Path的值中"%JAVA_HOME%\bin;"的<strong>后面</strong>加入以下内容：%CATALINA_HOME%\bin;<br><br>　　到这里，Tomcat安装完毕。<br><br>　　进行完一、二两步的设置以后，各系统变量的值如下：<br><br>JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06<br>CATALINA_HOME:D:\jakarta-tomcat-5.0.30<br>CLASSPATH:.;%JAVA_HOME%\lib;%CATALINA_HOME%\common\lib;<br>Path:%JAVA_HOME%\bin;%CATALINA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
<p>　　<strong>三、安装Eclipse<br></strong><br>　　首先下载eclipse-SDK-3.1.2-win32.zip（eclipse-SDK-3.1.2-win32.zip下载地址为：<br><br><a href="http://www.eclipse.org/downloads/"><u><font color=#ff0000>http://www.eclipse.org/downloads/</font></u></a>）；<br><br>　　然后将eclipse-SDK-3.1.2-win32.zip直接解压到D盘根目录：<br><br><img style="FILTER: ; WIDTH: 600px; HEIGHT: 470px" height=470 alt=" " hspace=0 src="http://dev.yesky.com/imagelist/06/26/j308makicd4t.jpg" width=600 border=0> <br><br>　　到这里， Eclipse安装完毕。<br><br>　　<strong>四、安装MyEclipse</strong><br><br>　　首先下载EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe（EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe 的下载地址为：<br><a href="http://www.myeclipseide.com/ContentExpress-display-ceid-10.html"><font color=#ff0000>http://www.myeclipseide.com/ContentExpress-display-ceid-10.html</font></a>）；<br><br>　　然后安装EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe。注意：当安装到下图所示的步骤的时候要选择Eclipse的安装路径（如图），其他选项保持默认。<br><br><img style="FILTER: ; WIDTH: 600px; HEIGHT: 442px" height=442 alt=" " hspace=0 src="http://dev.yesky.com/imagelist/06/26/b174o00go1t1.jpg" width=600 border=0><br><br>　　安装完毕之后，将MyEclipse安装目录下的features和plugins这2个目录覆盖到Eclipse的安装目录下。<br><br>　　最后将刚才安装的 MyEclipse 卸载。<br><br>　　解释一下上面这样做的原因： 因为MyEclipse是Eclipse的插件，所以只要把features和plugins这2个目录覆盖到Eclipse的安装目录，Eclipse就会自动认出这些插件。 <br><br>　　到这里，MyEclipse安装完毕。<br><br>　　<strong>五、破解MyEclipse</strong><br><br>　　运行MyEclipse4.1.1注册机MyEclipseKeyGen.exe，选择MyEclipse的版本号，输入注册名，生成序列号。（MyEclipse4.x注册机的下载地址为：<br><br><a href="http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar"><u><font color=#ff0000>http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar</font></u></a>）<br><br>　　运行eclipse.exe（首次运行要求指定Workspace），依次点击Window ----&gt; Preferences ----&gt;MyEclipse----&gt;Subscription ----&gt; Enter Subscription，输入注册名以及注册机生成的注册码。<br><br>　　到这里，MyEclipse破解完毕。</p>
<p>　　<strong>六、指定Eclipse+MyEclipse的JRE 和Tomcat 服务器</strong><br><br>　　1.设定Eclipse+MyEclipse的JRE<br><br>　　一般情况下，Eclipse可以自动找到JRE，我们不用进行过多的设置。<br><br>　　2.设定Eclipse+MyEclipse的Tomcat 服务器<br><br>　　只需设置图中所标注的两处即可，图中其余部分是自动生成的。<br><br><img alt=" " src="http://dev.yesky.com/imagelist/06/26/q3n61g6q0p77.jpg"><br><br>　　到这里，我们的Eclipse+MyEclipse开发环境就搭建完毕了！<br><br>　　<strong>七、新建一个项目来测试一下Eclipse+MyEclipse开发环境是否搭建成功<br></strong><br>　　1.在Eclipse中依次点击&#8220; File ----&gt; New ----&gt; Project&#8221; , 在弹出的&#8220;New Project&#8221;对话框中依次点击&#8220;Web Project ----&gt;MyEclipse----&gt;J2EE Projects----&gt;Web Project&#8221;， 再点&#8220;Next&#8221;，在&#8220;Project Name&#8221;中输入项目的名字&#8220;test&#8221;,最后点&#8220;Finish&#8221;。<br><br>　　2.在Eclipse左边Package Explorer列表中点击&#8220;test&#8221;，将项目test展开。右键点击 WebRoot ----&gt; New ----&gt; JSP , 新建一个名为hello.jsp的 JSP 页面 。 代码如下图（图中标注部分需要我们手动添加，其余部分是系统自动生成的）：<br><br><img style="FILTER: ; WIDTH: 600px; HEIGHT: 559px" height=559 alt=" " hspace=0 src="http://dev.yesky.com/imagelist/06/26/25z2ibx7xvua.png" width=600 border=0><br><br>　　3. 再用同样的方法， 新建一个叫 hello_result.jsp 的JSP文件， 代码如下图：<br><br><img style="FILTER: ; WIDTH: 600px; HEIGHT: 566px" height=566 alt=" " hspace=0 src="http://dev.yesky.com/imagelist/06/26/990kesr30l4x.png" width=600 border=0><br><br>　　4. deploy（部署）项目。 <br><br>　　点击 deploy 按钮（用红线画了的按钮就是 deploy 按钮）， 在弹出的窗口中点击Add， 部署test项目（如图所示）。<br><br><img style="FILTER: ; WIDTH: 600px; HEIGHT: 532px" height=532 alt=" " hspace=0 src="http://dev.yesky.com/imagelist/06/26/6dhz9hc84r01.jpg" width=600 border=0><br><br>　　5. 启动Tomcat服务器。<br><br>　　如下图所示（用红线画了的按钮就是 启动Tomcat 的按钮）：<br><br><img alt=" " src="http://dev.yesky.com/imagelist/06/26/426en882l235.jpg"><br><br>　　Tomcat 启动输出信息如下图：<br><br><img style="FILTER: ; WIDTH: 600px; HEIGHT: 366px" height=366 alt="" hspace=0 src="http://dev.yesky.com/imagelist/06/26/6o93m9f74993.jpg" width=600 border=0><br><br>　　6.项目test的运行结果：<br><br><img alt=" " src="http://dev.yesky.com/imagelist/06/26/2se5y0gnr6su.jpg"> <br><br>　　我们可以去Eclipse的Workspace目录下看看test项目的代码，也可以去Tomcat的webapps目录下，看看部署之后的 test项目的结构。</p>
</div>
<img src ="http://www.blogjava.net/sooxin/aggbug/114149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-04-27 17:11 <a href="http://www.blogjava.net/sooxin/articles/114149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA字符串处理。</title><link>http://www.blogjava.net/sooxin/articles/113829.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Thu, 26 Apr 2007 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/113829.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/113829.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/113829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/113829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/113829.html</trackback:ping><description><![CDATA[<p align=left><font size=3><span>第一节、</span><span><font face="Times New Roman">String</font></span><span>对象</span><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></font></p>
<p align=left><span><font size=3>一、</font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Java</font></span><span>中将字符串作为</span><span><font face="Times New Roman">String</font></span><span>类型对象来处理。当创建一个</span><span><font face="Times New Roman">String</font></span><span>对象时，被创建的字符串是不能被改变的。每次需要改变字符串时都要创建一个新的</span><span><font face="Times New Roman">String</font></span><span>对象来保存新的内容。原始的字符串不变。之所以采用这种方法是因为实现固定的，不可变的字符串比实现可变的字符串更高效。对于那些想得到改变的字符串的情况，有一个叫做</span><span><font face="Times New Roman">StringBuffer</font></span><span>的</span><span><font face="Times New Roman">String</font></span><span>类的友类，它的对象包含了在创建之后可以改变的字符串。</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String</font></span><span>类和</span><span><font face="Times New Roman">StringBuffer</font></span><span>类都在</span><span><font face="Times New Roman">java.lang</font></span><span>中定义。因此它们可以自动的被所有程序使用。两者均被说明为</span><span><font face="Times New Roman">final</font></span><span>，这意味着两者均不含子类。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span>二、</span><span><font face="Times New Roman">String</font></span><span>构造函数</span></font></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">1</font></span><span>）</span><span><font face="Times New Roman">String()</font></span><span>，</span><font face="Times New Roman"> </font><span>默认构造函数，无参数</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String&nbsp;s1 = new&nbsp;String();<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">2</font></span><span>）</span><span><font face="Times New Roman">String( char chars[]) </font></span><span>，传入字符数组</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char[] myChars={'a', 'b', 'c'};</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String&nbsp;s2 = new String(myChars)&nbsp;// </font></span><span>使用字符串&#8220;</span><span><font face="Times New Roman">abc</font></span><span>&#8221;初始化</span><span><font face="Times New Roman">s2</font></span></font></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">3</font></span><span>）</span><span><font face="Times New Roman">String( char chars[], int startIndex, int numChars) </font></span><span>，传入一个字符数组，从指定下标位置开始获取指定个数的字符，用这些字符来初始化字符串变量。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char[] myChars={'h', 'e', 'l', 'l', 'o'};</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String s3 = new String(myChars,1,3);&nbsp;//</font></span><span>使用字符串&#8220;</span><span><font face="Times New Roman">ell</font></span><span>&#8221;初始化</span><span><font face="Times New Roman">s3</font></span></font></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">4</font></span><span>）</span><span><font face="Times New Roman">String(String strObj)</font></span><span>，传入另一个字符串对象，用该字符串对象的内容初始化</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String s4= new String(s3);&nbsp;// </font></span><span>这是</span><span><font face="Times New Roman">s4</font></span><span>也是&#8220;</span><span><font face="Times New Roman">ell</font></span><span>&#8221;了。</span></font></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">5</font></span><span>）</span><span><font face="Times New Roman">String(byte asciiChars[])</font></span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;String(byte asciiChars[], int startIndex, int numChars) </font></font></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>尽管</span><span><font face="Times New Roman">Java</font></span><span>的</span><span><font face="Times New Roman">char</font></span><span>类型使用</span><span><font face="Times New Roman">16</font></span><span>位（</span><span><font face="Times New Roman">bit</font></span><span>）表示</span><span><font face="Times New Roman">Unicode</font></span><span>编码字符集，在</span><span><font face="Times New Roman">Internet</font></span><span>中，</span></font></p>
<p align=left><font size=3><span>字符串的典型格式使用由</span><span><font face="Times New Roman">ASCII</font></span><span>字符集构成的</span><span><font face="Times New Roman">8</font></span><span>位数组，因为</span><span><font face="Times New Roman">8</font></span><span>位</span><span><font face="Times New Roman">ASCII</font></span><span>字符串是共同的，当给定一个字节（</span><span><font face="Times New Roman">byte</font></span><span>）数组时，</span><span><font face="Times New Roman">String</font></span><span>类提供了上面两个初始化字符串的构造函数。</span></font></p>
<p align=left><span><font size=3>例子：</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>package Examples;</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>class SubStringConv{</font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public static void main(String[] args){</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>byte ascii[]={65,66,67,68,69,70};</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String s1=new String(ascii);</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(s1);</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String s2=new String(ascii,2,3);</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(s2);</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font></font></span></p>
<p align=left><span><font face="Times New Roman" size=3>}</font></span></p>
<p align=left><span><font size=3>编译和运行后输出：</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>ABCDEF</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>CDE</font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><span><font size=3>三、</font></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">1</font></span><span>）调用字符串的</span><span><font face="Times New Roman">length()</font></span><span>方法可以得到该字符串的长度（字符个数）；</span></font></p>
<p align=left><span><span><font face="Times New Roman" size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">2</font></span><span>）前面说明了如何使用</span><span><font face="Times New Roman">new</font></span><span>运算符创建一个字符串实例。然而这是一种早期的使用字符串常量的处理方法。对于程序中的每一个字符串常量，</span><span><font face="Times New Roman">Java</font></span><span>会自动创建</span><span><font face="Times New Roman">String</font></span><span>对象。因此，可以使用字符串常量初始化</span><span><font face="Times New Roman">String</font></span><span>对象。例如：</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String s5="abc";</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int&nbsp;i = "abc".length(); //</font></span><span>可以将字符串作为对象来进行操作</span></font></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">3</font></span><span>）可以使用&#8220;</span><span><font face="Times New Roman">+</font></span><span>&#8221;运算符来将两个字符串连接起来产生一个新的</span><span><font face="Times New Roman">String</font></span><span>对象。只要</span><span><font face="Times New Roman">+</font></span><span>运算符有一个运算数是字符串（</span><span><font face="Times New Roman">String</font></span><span>）实例时，编译器就将另一个运算数转换为它的字符串形式。这种操作是通过调用一个由</span><span><font face="Times New Roman">String</font></span><span>类定义的</span><font face="Times New Roman"> </font><span>字符串转换方法</span><span><font face="Times New Roman">valueOf()</font></span><span>来完成的。对于简单类型，</span><span><font face="Times New Roman">valueOf()</font></span><span>方法返回一个字符串，该字符串包含了该类型的值的字符串。对于对象，</span><span><font face="Times New Roman">valueOf()</font></span><span>方法调用</span><span><font face="Times New Roman">toString()</font></span><span>方法。每一个类都执行</span><span><font face="Times New Roman">toString()</font></span><span>方法，因为它是由</span><span><font face="Times New Roman">Object</font></span><span>定义的。</span><span><font face="Times New Roman">toString()</font></span><span>方法具有如下一般形式：</span><span><font face="Times New Roman"> String toString()<span>&nbsp;&nbsp; </span></font></span><span>。</span><span><font face="Times New Roman"> toString()</font></span><span>方法返回一个</span><span><font face="Times New Roman">String</font></span><span>对象（即字符串）。该对象一般是对类的一个描述。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><span><font size=3>四、一些字符串操作</font></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>（</span><span><font face="Times New Roman">1</font></span><span>）字符截取</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>*char &nbsp;charAt(int&nbsp;where) </font></span><span>，注意，这里返回一个</span><span><font face="Times New Roman">char</font></span><span>字符例如：</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char a ;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>a="abcde".charAt(2);&nbsp;//</font></span><span>将索引为</span><span><font face="Times New Roman">2 </font></span><span>，即第三个字符赋给</span><span><font face="Times New Roman">a</font></span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;&nbsp;* void getChars(int sourceStart, int sourceEnd, char target[], int targetStart) </font></span><span>，这里是无返回值方法，指定要截取的子字符串的开始和结束下标，再指定要储存子字符串内字符的数组，和存放这些字符的起始位置。注意，子字符串并不包括位于结束下标的字符。</span></font></p>
<p align=left><span><span><font face="Times New Roman" size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p align=left><font size=3><span><font face="Times New Roman">&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;* byte[] getBytes()<span>&nbsp;&nbsp;&nbsp; </span></font></span><span>这是</span><span><font face="Times New Roman">getBytes()</font></span><span>方法最简单的形式，它实现将字符存放于字节数组中。在将字符串（</span><span><font face="Times New Roman">String</font></span><span>）值输出到一个不支持</span><span><font face="Times New Roman">16</font></span><span>位</span><span><font face="Times New Roman">Unicode</font></span><span>编码的环境时，</span><span><font face="Times New Roman">getBytes</font></span></font></p>
<p align=left><font size=3><span><font face="Times New Roman">()</font></span><span>是最有用的。例如，大多数</span><span><font face="Times New Roman">Internet</font></span><span>协议和文本文件格式在文本交换时使用</span><span><font face="Times New Roman">8</font></span><span>位</span><span><font face="Times New Roman">ASCII</font></span><span>编码。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman">&nbsp;* char[]&nbsp;toCharArray()&nbsp;</font></span><span>将字符串中所有的字符转换到一个字符数组的最简当方法，也可以使用</span><span><font face="Times New Roman">getChars()</font></span><span>方法实现。</span></font></p>
<p align=left><span><font face="Times New Roman"><font size=3>&nbsp;</font></font></span></p>
<p align=left><font size=3><span>（</span><span><font face="Times New Roman">2</font></span><span>）字符串比较</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>* boolean equals(Object str)&nbsp;</font></span><span>比较两个字符串对象是否相等</span><span><font face="Times New Roman">, </font></span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp; </span>boolean equalsIgnoreCaseJ(String str)&nbsp;</font></span><span>比较两个字符串对象，且忽略字符的大小写</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman">&nbsp;* regionMatches() </font></span><span>方法允许将一个字符串中指定的区间和另一字符串中指定的区间进行比较，它的重载形式允许在比较时忽略大小写。下面给出这两种方法的一般形式：</span><font face="Times New Roman"> </font></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp; </span>boolean&nbsp;regionMatches(int startIndex,String str2,int str2StartIndex,int numChars)</font></font></span></p>
<p align=left><span><font face="Times New Roman" size=3>boolean&nbsp;regionMatches(boolean ignoreCase ,int startIndex,String str2,int str2StartIndex,int numChars)</font></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>其中</span><span><font face="Times New Roman">startIndex</font></span><span>指定调用此方法的字符串内子字符串的起始位置。</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman">*&nbsp;boolean startsWith(String str)<span>&nbsp;&nbsp;&nbsp; </span>startsWith</font></span><span>方法还有第二种形式：</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;boolean startWith(String str, int startIndex)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp; </span>boolean endsWith(String str)</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp; </span>&nbsp;</font></span><span>上面的方法用来判断一个给定的字符串是否是从指定的字符串开始或结束。</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman">* int compareTo(String str) </font></span><span>方法用于比较两个字符串的大小。字符串比较的结果及其含义：</span></font></p>
<div align=left>
<table cellSpacing=0 cellPadding=0 align=left border=1>
    <tbody>
        <tr>
            <td vAlign=top width=229>
            <p><span><font size=3>值</font></span></p>
            </td>
            <td vAlign=top width=284>
            <p><span><font size=3>含义</font></span></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=229>
            <p><font size=3><span>小于</span><span><font face="Times New Roman">0</font></span></font></p>
            </td>
            <td vAlign=top width=284>
            <p><font size=3><span>调用此方法的字符串小于参数</span><span><font face="Times New Roman">str</font></span></font></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=229>
            <p><font size=3><span>大于</span><span><font face="Times New Roman">0</font></span></font></p>
            </td>
            <td vAlign=top width=284>
            <p><font size=3><span>调用此方法的字符串大于参数</span><span><font face="Times New Roman">str</font></span></font></p>
            </td>
        </tr>
        <tr>
            <td vAlign=top width=229>
            <p><font size=3><span>等于</span><span><font face="Times New Roman">0</font></span></font></p>
            </td>
            <td vAlign=top width=284>
            <p><span><font size=3>两个字符串相等</font></span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p align=left><span><font face="Times New Roman"><font size=3>&nbsp;</font></font></span></p>
<p align=left><font size=3><span>（</span><span><font face="Times New Roman">3</font></span><span>）其他操作</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman">* </font></span><span>搜索字符串：</span></font></p>
<p align=left><span><font face="Times New Roman" size=3>int&nbsp;indexOf( int ch)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>int&nbsp;lastIndexOf( int ch)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>int&nbsp;indexOf(String str)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>int&nbsp;lastIndexOf(String str)</font></span></p>
<p align=left><span><font size=3>指定搜索的起始点：</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>int&nbsp;indexOf( int ch, int startIndex)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>int&nbsp;lastIndexOf( int ch ,int startIndex)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>int&nbsp;indexOf(String str ,int startIndex)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>int&nbsp;lastIndexOf(String str, int startIndex)</font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman">* </font></span><span>使用</span><span><font face="Times New Roman"> substring()</font></span><span>截取子字符串：</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String&nbsp;substring(int startIndex)<span>&nbsp;&nbsp;&nbsp; </span></font></span><span>注意</span><span><font face="Times New Roman">substring</font></span><span>中</span><span><font face="Times New Roman">string</font></span><span>没有大写，截取指定位置后的子字符串。</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String&nbsp;substring(int startIndex,int endIndex) </font></span><span>截取指定起始位置和结束位置的子字符串。注意截取的字字符串不包括结束位置的字符。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman">* concat() </font></span><span>连接连个字符串，与</span><span><font face="Times New Roman">+ </font></span><span>运算符执行相同功能。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String concat(String str)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>* replace() </font></span><span>用另一个字符取代指定字符串中指定字符：</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman">String replace(char original, char replacement)<span>&nbsp;&nbsp;&nbsp; </span></font></span><span>例如：</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String s=&#8221;Hello&#8221;.replace(&#8216;l&#8217;,&#8217;w&#8217;);&nbsp;//</font></span><span>执行后</span><font face="Times New Roman"> <span>s =&#8221;Hewwo&#8221;;</span></font></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>* trim() </font></span><span>返回一个字符串，该字符串是删除调用字符串前后的空白符所得的字符串</span></font></p>
<p align=left><span><span><font face="Times New Roman" size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>* </font></span><span>改变字符串内字符的大小写</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;String&nbsp;toLowerCase() </font></span><span>返回一个所有字母都是小写的字符串</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;String&nbsp;toUpperCase()</font></span><span>返回一个所有字母都是大写的字符串</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>* </font></span><span>使用</span><span><font face="Times New Roman"> valueOf()</font></span><span>方法实现数据转换</span></font></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>例如：</span><font face="Times New Roman"> </font></font></p>
<p align=left><font size=3><span><font face="Times New Roman">String str = String.valueOf(3) ;&nbsp;//</font></span><span>将</span><span><font face="Times New Roman">int</font></span><span>类型转换成字符串类型，其他基本数据类型和任何类的对象也可作为参数。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span>第二节、</span><span><font face="Times New Roman">StringBuffer</font></span></font></p>
<p align=left><font size=3><span><font face="Times New Roman">StringBuffer</font></span><span>定义了下面三个构造函数：</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>StringBuffer()<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// </font></span><span>默认构造函数，预留了</span><span><font face="Times New Roman">16</font></span><span>个字符的空间，该空间不需再分配</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>StringBuffer(int size)<span> </span>&nbsp;// </font></span><span>设置指定缓冲区大小</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman">StringBuffer(String str)<span> </span>// </font></span><span>设置</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象初始化的内容并预留</span><span><font face="Times New Roman">16</font></span><span>个字符空间，且不需再分配空间</span></font></p>
<p align=left><span><font face="Times New Roman" size=3>* int length()</font></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>调用</span><span><font face="Times New Roman">length()</font></span><span>方法可以得到</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象的长度，调用</span><span><font face="Times New Roman">capacity()</font></span><span>可以得到总的分配容量。两个方法都是返回一个</span><span><font face="Times New Roman">int</font></span><span>类型的值。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>* void ensureCapacity(int capacity)</font></font></span></p>
<p align=left><font size=3><span>如果想在构造</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象后为某些字符预分配空间，可以使用</span><span><font face="Times New Roman">ensureCapacity()</font></span><span>方法，设置缓冲区的大小，这在事先已知要在</span><span><font face="Times New Roman">StringBuffer</font></span><span>上追加大量小字符串的情况下是有用的。</span><span><font face="Times New Roman">ensureCapcity()</font></span><span>方法具有如下的一般形式：</span><span><font face="Times New Roman">&nbsp;void&nbsp;ensureCapacity(int capacity)</font></span></font></p>
<p align=left><span><font face="Times New Roman" size=3>* void setLength(int len)</font></span></p>
<p align=left><font size=3><span>使用</span><span><font face="Times New Roman">setLength()</font></span><span>方法可以设置</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象的长度，它的一般形式如下：</span></font></p>
<p align=left><font size=3><span><font face="Times New Roman">void&nbsp;setLength(int len)<span>&nbsp;&nbsp;&nbsp; </span></font></span><span>如果</span><span><font face="Times New Roman">len</font></span><span>大于</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象当前的</span><span><font face="Times New Roman">length()</font></span><span>值的话，那么会在</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象后面加上空字符；如果比</span><span><font face="Times New Roman">length()</font></span><span>小的话，则</span><span><font face="Times New Roman">len</font></span><span>后面的字符串会丢失。</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>* char charAt(int where)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;void setCharAt(int where, char ch)</font></font></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span>使用</span><span><font face="Times New Roman">charAt()</font></span><span>方法可以得到</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象中指定位置上的字符，</span><span><font face="Times New Roman">setCharAt()<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span>可以设置指定位置上的字符。它们的一般形式如下：</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char charAt(int where)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>void setCharAt(int where,char ch) <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></font></span></p>
<p align=left><font size=3><span>对于这两种法法，</span><span><font face="Times New Roman">where</font></span><span>值必须是非负的，同时不能超过或等于</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象的长度。</span></font></p>
<p align=left><span><font face="Times New Roman" size=3>* getChars(int suorceStart,int sourceEnd,char target[] , int targetStart)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>* append()</font></span></p>
<p align=left><font size=3><span><font face="Times New Roman">&nbsp;Append()</font></span><span>方法将任一其他类型数据的字符串形式连接到调用</span><span><font face="Times New Roman">StringBuffer</font></span><span>对象的后面，对所有内置的类型和</span><span><font face="Times New Roman">Object</font></span><span>，它都有重载形式。下面是几种形式：</span></font></p>
<p align=left><span><font face="Times New Roman" size=3>StringBuffer append(String str)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>StringBuffer append(int num)</font></span></p>
<p align=left><span><font face="Times New Roman" size=3>StringBuffer append(Object obj)</font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><span><font face="Times New Roman" size=3>* insert()</font></span></p>
<p align=left><font size=3><span><font face="Times New Roman">&nbsp;Insert()</font></span><span>方法将一个字符串插入另一个字符串中。下面是它的几种形式：</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;StringBuffer insert(int index,String str)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;StringBuffer insert(int index,char ch)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;StringBuffer insert(int index,Object obj)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>*reverse()<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// StringBuffer reverse()</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;StringBuffer strbf=new StringBuffer(&#8220;ABCDEFG&#8221;);</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;strbf.reverse();&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;System.out.println(strbf);<span> </span>//</font></span><span>输出</span><span><font face="Times New Roman"> GFEDCBA</font></span></font></p>
<p align=left><span><span><font face="Times New Roman" size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp; </span>* StringBuffer delete(int startIndex,int endIndex)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;StringBuffer deleteCharAt(int loc)</font></font></span></p>
<p align=left><font size=3><span><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span>删除指定位置的字符串和指定位置的字符。例如删除第一个字符后的所有字符：</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;strbf.delete(1,strbf.length());</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>* replace()<span>&nbsp;&nbsp;&nbsp; </span></font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;</font></span><span>它完成在</span><span><font face="Times New Roman">StringBuffer</font></span><span>内部用一个字符串代替另一个指定起始位置和结束位置的字符串的功能，注意的是，被代替的字符不包括结束位置上的字符，它的一般形式是，：</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;StringBuffer replace(int startIndex, int endIndex,String str)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman">&nbsp;</font></font></span></p>
<p align=left><font size=3><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>* substring()&nbsp;</font></span><span>返回</span><span><font face="Times New Roman">StringBuffer</font></span><span>的一部分值</span></font></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;String substring(int startIndex)</font></font></span></p>
<p align=left><span><font size=3><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;String substring(int startIndex, int endIndex)</font></font></span></p>
<p id=TBPingURL align=left>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=610794</p>
<img src ="http://www.blogjava.net/sooxin/aggbug/113829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-04-26 16:18 <a href="http://www.blogjava.net/sooxin/articles/113829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP从mysql中读取图片。</title><link>http://www.blogjava.net/sooxin/articles/113824.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Thu, 26 Apr 2007 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/113824.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/113824.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/113824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/113824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/113824.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 数据库应用程序，特别是基于WEB的数据库应用程序，常会涉及到图片信息的存储和显示。通常我们使用的方法是将所要显示的图片存在特定的目录下，在数据库中保存相应的图片的名称，在JSP中建立相应的数据源，利用数据库访问技术处理图片信息。但是，如果我们想动态的显示图片，上述方法就不能满足需要了。我们必须把图片存入数据库，然后通过编程动态地显示我们需要的图片。实际操作中，可以利用JSP的编程模式来实现图片的数据库存储和显示。&nbsp;&nbsp;<a href="http://www.blogjava.net/lzqdiy/archive/2007/04/20/112242.html">阅读全文</a><img height=1 src="http://www.blogjava.net/lzqdiy/aggbug/112242.html" width=1><br><br>
<div align=right><a style="TEXT-DECORATION: none" href="http://www.blogjava.net/lzqdiy/" target=_blank>我为J狂</a> 2007-04-20 16:38 <a style="TEXT-DECORATION: none" href="http://www.blogjava.net/lzqdiy/archive/2007/04/20/112242.html#Feedback" target=_blank>发表评论</a></div>
<br>文章来源:<a href="http://www.blogjava.net/lzqdiy/archive/2007/04/20/112242.html">http://www.blogjava.net/lzqdiy/archive/2007/04/20/112242.html</a> 
<img src ="http://www.blogjava.net/sooxin/aggbug/113824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-04-26 16:14 <a href="http://www.blogjava.net/sooxin/articles/113824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从JAVA读取BLOB</title><link>http://www.blogjava.net/sooxin/articles/113822.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Thu, 26 Apr 2007 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/113822.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/113822.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/113822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/113822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/113822.html</trackback:ping><description><![CDATA[<span class=javascript id=text63963>如果將要檔案寫入資料庫，您可以在欄位上使用BLOB或CLOB資料型態，BLOB全名Binary Large Object，用於儲存大量的二進位資料，CLOB全名Character Large Object，用於儲存大量的文字資料。 <br><br>在JDBC中也提供了Blob與Clob兩個類別分別代表BLOB與CLOB資料，JDBC並沒有提供直接存入BLOB或CLOB的對應介面（像是setBlob()、setClob()等），但我們可以使用PreparedStatement的setBinaryStream()、setObject()、setAsciiStream()、setUnicodeStream()等方法來代替，例如我們可以如下取得一個檔案，並將之存入資料庫中： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>            <font class=java-comment>// 取得檔案</font>
            File file = <font class=java-reserved_word><strong>new</strong></font> File(<font class=java-string>"./logo_phpbb.jpg"</font>);
            <font class=java-reserved_word><strong>int</strong></font> length = (<font class=java-reserved_word><strong>int</strong></font>) file.length();
            InputStream fin = <font class=java-reserved_word><strong>new</strong></font> FileInputStream(file);
            <font class=java-comment>// 填入資料庫</font>
            PreparedStatement pstmt = conn.prepareStatement(
            <font class=java-string>"INSERT INTO files VALUES(?, ?)"</font>);
            &nbsp;
            pstmt.setString(1, <font class=java-string>"米小國Logo"</font>);
            pstmt.setBinaryStream (2, fin, length);
            &nbsp;
            pstmt.executeUpdate();
            pstmt.clearParameters();
            pstmt.close();
            fin.close();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>如果要從資料庫中取得BLOB或CLOB資料，我們可以如下進行： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>Blob blob = result.getBlob(2);  <font class=java-comment>// 取得BLOB</font>
            Clob clob = result.getClob(2)  <font class=java-comment>// 取得CLOB </font>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>Blob擁有getBinaryStream()、getBytes()等方法，可以取得二進位串流或byte等資料，同樣的，Clob擁有getCharacterStream()、getSubString()等方法，可以取得字元串流或子字串等資料，您可以查看API文件來獲得更詳細的訊息。 <br><br>下面這個程式示範基本的檔案存入資料庫並取出另存新檔： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>import</strong></font> java.io.*;
            <font class=java-reserved_word><strong>import</strong></font> java.sql.*;
            <font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> DBTest <font class=java-bracket>{</font>
            <font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>static</strong></font> <font class=java-reserved_word><strong>void</strong></font> main(String[] args) <font class=java-bracket>{</font>
            String driver = <font class=java-string>"com.mysql.jdbc.Driver"</font>;
            String url = <font class=java-string>"jdbc:mysql://localhost:3306/upload?useUnicode=true&amp;characterEncoding=Big5"</font>;
            String user = <font class=java-string>"caterpillar"</font>;
            String password = <font class=java-string>"123456"</font>;
            <font class=java-reserved_word><strong>try</strong></font> <font class=java-bracket>{</font>
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, user, password);
            &nbsp;
            <font class=java-comment>// 取得檔案</font>
            File file = <font class=java-reserved_word><strong>new</strong></font> File(<font class=java-string>"./logo_phpbb.jpg"</font>);
            <font class=java-reserved_word><strong>int</strong></font> length = (<font class=java-reserved_word><strong>int</strong></font>) file.length();
            InputStream fin = <font class=java-reserved_word><strong>new</strong></font> FileInputStream(file);
            &nbsp;
            <font class=java-comment>// 填入資料庫</font>
            PreparedStatement pstmt = conn.prepareStatement(
            <font class=java-string>"INSERT INTO files VALUES(?, ?)"</font>);
            pstmt.setString(1, <font class=java-string>"米小國Logo"</font>);
            pstmt.setBinaryStream (2, fin, length);
            pstmt.executeUpdate();
            pstmt.clearParameters();
            pstmt.close();
            fin.close();
            &nbsp;
            <font class=java-comment>// 從資料庫取出檔案</font>
            Statement stmt = conn.createStatement();
            ResultSet result = stmt.executeQuery(<font class=java-string>"SELECT * FROM files"</font>);
            result.next();
            String description = result.getString(1);
            Blob blob = result.getBlob(2);
            &nbsp;
            <font class=java-comment>// 寫入檔案</font>
            System.out.println(<font class=java-string>"檔案描述："</font> + description);
            FileOutputStream fout = <font class=java-reserved_word><strong>new</strong></font> FileOutputStream(<font class=java-string>"./logo_phpbb_2.jpg"</font>);
            fout.write(blob.getBytes(1, (<font class=java-reserved_word><strong>int</strong></font>)blob.length()));
            fout.flush();
            fout.close();
            stmt.close();
            conn.close();
            <font class=java-bracket>}</font>
            <font class=java-reserved_word><strong>catch</strong></font>(ClassNotFoundException e) <font class=java-bracket>{</font>
            System.out.println(<font class=java-string>"找不到驅動程式"</font>);
            e.printStackTrace();
            <font class=java-bracket>}</font>
            <font class=java-reserved_word><strong>catch</strong></font>(SQLException e) <font class=java-bracket>{</font>
            e.printStackTrace();
            <font class=java-bracket>}</font>
            <font class=java-reserved_word><strong>catch</strong></font>(IOException e) <font class=java-bracket>{</font>
            e.printStackTrace();
            <font class=java-bracket>}</font>
            <font class=java-bracket>}</font>
            <font class=java-bracket>}</font>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</span><br><br>
<img src ="http://www.blogjava.net/sooxin/aggbug/113822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-04-26 16:13 <a href="http://www.blogjava.net/sooxin/articles/113822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>您的位置：本站首页-JAVA指导-JAVA字符谜题8:字符串奶酪</title><link>http://www.blogjava.net/sooxin/articles/113137.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Tue, 24 Apr 2007 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/113137.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/113137.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/113137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/113137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/113137.html</trackback:ping><description><![CDATA[下面的程序从一个字节序列创建了一个字符串，然后迭代遍历字符串中的字符，并将它们作为数字打印。请描述一下程序打印出来的数字序列：
<pre>public class StringCheese {
public static void main(String[] args) {
byte bytes[] = new byte[256];
for (int i = 0; i &lt; 256; i++)
bytes[i] = (byte)i;
String str = new String(bytes);
for (int i = 0, n = str.length(); i &lt; n; i++)
System.out.println((int)str.charAt(i) + " ");
}
}
</pre>
</font>首先，byte数组用从0到255每一个可能的byte数值进行了初始化，然后这些byte数值通过String构造器被转换成了char数值。最后，char数值被转型为int数值并被打印。打印出来的数值肯定是非负整数，因为char数值是无符号的，因此，你可能期望该程序将按顺序打印出0到255的整数。
<p>如果你运行该程序，可能会看到这样的序列。但是在运行一次，可能看到的就不是这个序列了。我们在四台机器上运行它，会看到四个不同的序列，包括前面描述的那个序列。这个程序甚至都不能保证会正常终止，比打印其他任何特定字符串都要缺乏这种保证。它的行为完全是不确定的。
<p>这里的罪魁祸首就是String(byte[])构造器。有关它的规范描述道：&#8220;在通过解码使用平台缺省字符集的指定byte数组来构造一个新的String时，该新String的长度是字符集的一个函数，因此，它可能不等于byte数组的长度。当给定的所有字节在缺省字符集中并非全部有效时，这个构造器的行为是不确定的&#8221;[ Java -API]。
<p>到底什么是字符集？从技术角度上讲，它是&#8220;被编码的字符集合和字符编码模式的结合物&#8221;[Java-API]。换句话说，字符集是一个包，包含了字符、表示字符的数字编码以及在字符编码序列和字节序列之间来回转换的方式。转换模式在字符集之间存在着很大的区别：某些是在字符和字节之间做一对一的映射，但是大多数都不是这样。ISO-8859-1是唯一能够让该程序按顺序打印从0到255的整数的缺省字符集，它更为大家所熟知的名字是Latin-1[ISO-8859-1]。
<p>J2SE运行期环境（JRE）的缺省字符集依赖于底层的操作系统和语言。如果你想知道你的JRE的缺省字符集，并且你使用的是5.0或更新的版本，那么你可以通过调用java.nio.charset.Charset.defaultCharset()来了解。如果你使用的是较早的版本，那么你可以通过阅读系统属性&#8220;file.encoding&#8221;来了解。
<p>幸运的是，你没有被强制要求必须去容忍各种稀奇古怪的缺省字符集。当你在char序列和byte序列之间做转换时，你可以且通常是应该显式地指定字符集。除了接受byte数字之外，还可以接受一个字符集名称的String构造器就是专为此目的而设计的。如果你用下面的构造器去替换在最初的程序中的String构造器，那么不管缺省的字符集是什么，该程序都保证能够按照顺序打印从0到255的整数：
<p>
<pre>String str = new String(bytes, "ISO-8859-1");
</pre>
</font>这个构造器声明会抛出UnsupportedEncodingException异常，因此你必须捕获它，或者更适宜的方式是声明main方法将抛出它，要不然程序不能通过编译。尽管如此，该程序实际上不会抛出异常。Charset的规范要求Java平台的每一种实现都要支持某些种类的字符集，ISO-8859-1就位列其中。
<p>这个谜题的教训是：每当你要将一个byte序列转换成一个String时，你都在使用某一个字符集，不管你是否显式地指定了它。如果你想让你的程序的行为是可预知的，那么就请你在每次使用字符集时都明确地指定。对API的设计者来说，提供这么一个依赖于缺省字符集的String(byte[])构造器可能并非是一个好主意。</p>
<img src ="http://www.blogjava.net/sooxin/aggbug/113137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-04-24 12:03 <a href="http://www.blogjava.net/sooxin/articles/113137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：与struts的亲密接触&amp;理解web开发</title><link>http://www.blogjava.net/sooxin/articles/112373.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Fri, 20 Apr 2007 17:08:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/112373.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/112373.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/112373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/112373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/112373.html</trackback:ping><description><![CDATA[<p><font face="verdana, arial, helvetica" size=2><span class=javascript id=text7270390 style="FONT-SIZE: 12px">与struts的亲密接触<br>当时上网看招聘信息，j2ee相关职位的都要求懂struts。看来学习struts是势在必行了。Struts的确是当时最优秀的框架，开发人员再也不用对每个方法都写一个servlet类了。请求成功或失败后的页面跳转不用写死在代码中，而是可以通过struts-config.xml来进行配置，表单组件可以自动的绑定成actionForm对象。还可以自定义数据校验逻辑。Struts还提供了一个通用的数据校验框架.struts还提供了丰富的显示标签。主要的时间都花在标签的学习上了。Struts显示标签比时当时的jsp 表达式的确是一大进步了。在jsp页面，不达再写&#8217;&lt;% %&gt;&#8217;这些表过式语言了，而是使用像html那样的标签。当jstl出现后，jstl的类似c语言似的标记语言要比struts显示标答优秀得多。Struts显示标签不能自动处理null值问题，struts显示标签还是显得太复杂了，花那么大的力气去学习struts显示标签显然是很不值的一件事！<br>我用jsp+servlet开发的时间要比用struts进行开发的时间长得多，但是struts的确是一个非常优秀的框架。<br><br>基于html: web应用是基于html的，不管是jsp还是asp，asp.net还是jsf都是在服务器端把相应的代码解释成html代码，然后在客户端通过浏览器解析显示出来。<br>无状态编程：不管采用什么技术，web开发终竟是无状态编程。也就是在客户端并不能保持应用程序的任何状态。在swing或vb等桌面开发时，客户程序可以通过变量来保持系统的状态。而基于html的web应用是无法保持状态的。Web应用状态都需要由应用服务器来保持。<br>请求响应及推/拉模式：在swing或vb等桌面应用程序中，当某一状态发生改变时，后台程序可以触发系统更新前端的UI组件，甚至可以使用观察者模式，当某一状态发生改变时，通知所有需要更新的前端UI组件，加载数据刷新组件。完成UI组件的更新，用户可能没有做任何动作，这就是推模式。而web应用正好相反，用户从客户端发出一个请求，服务器接到客户端的请求后，读取请求参数，调用业务方法，获得业务数据，用业务数据重新生成新的html页面，呈现给客户端，由浏览器进行解析显示,这就是拉模式。请求响应的拉模式是web应用最大的特点，任何请求的页面在发出请求后，请求页面所有组件的状态都被刷新而无法得以保持。<br>MVC：MVC即model模型数据，view 视图,controller 控制器。MVC模式让每一个组件都有了一个明确的职责,模型数据不含有视图特有的代码，视图不含有控制代码或数据访问代码,主要是显示模型数据。控制器接收请求，获得数据，进行视图转发。<br>控制器是WEB应用中的中枢神经,web应用控制器的主要职责：校验及获取请数参数,调用业务对象进行业务处理,把从页面获得的请求参数传递给业务对象。通过业务调用获得数据或创建模型数据。在需要保持服务端状态的应用中，创建或操作session状态。创建一个视图，由视图来使用模型数据。<br>模型含有由视图显示的数据，在j2ee web应用中，模型一般是JavaBean。Web应用中的模型一般表示一个完整的业务操作的结果对象。这个结果对象通常不是一个真实的领域对象，而是一个只有getter,setter方法的对象(如值对象),通常称为伪数据对象。模型没有必要进行进一步的操作，如数据访问等，模型也不应该依赖Serlvet或某一WEB应用框架.<br>视图用于呈现模型数据，负责生成标签或其它内容。视图不需要了解控制器或业务对象。视图不应该直接处理请求参数，而是应该由控制器去做。也不应该进行数据查询，如sql查询,视图不应该处理数据查询异常。显图只需要执行必要的显示逻辑，把模型数据通过一定的逻辑呈现给用户。<br>Front Controller前端控制器与命令模式:采用纯Servlet和JSP的model 1进行web开发都是非常复杂的。不可能实现java开发人员与UI开发人员角色的分离。采用纯Servlet来开发web应用，如果要从serlvet这种纯java对象中配合html标记进行web开发是非常笨拙的，这样将十分难以维护。采用纯JSP来开发web应用，JSP可能很容易的嵌入html代码，并通过jsp表达式可以很容易的动成生成html内容，JSP还定义了对象的作用域。关键是可以在jsp中编写任何java代码,相比纯servlet来说，用JSP开发要轻松多了。但是把所有业务代码编写在JSP中，任然不能把java开发人员与UI开发人员进行分工。业务方法无法进行测试和重用，代码重用只能是简单的代码复制，这样的web应用仍然难以进行维护。<br>采用jsp+servlet的MVC模式进行开发，java开发人员负责开发servlet,而UI开发人员设计HTMl和编写JSP，每一个请求对应一个servlet，由servlet调用业务对象，获得业务数据，并选择视图进行转发。在这里JSP没有了任何业务代码，仅仅是显示数据。这样通过JSP与servlet相结合的MVC模式，可以让java开发人员与UI人员进行分工，也便于了业务代码的测试。但是每一个请求都对应一个单一的servlet,需要产生大量的servlet类，把许多方法分散到多个servlet类中，需要对相似的请求过程编写独立的方法，不能进行方法的重用。从而产生大量的重复代码，大量的servlet配置将非常烦琐。从而需要对大量的servlet进行维护。如果有一个控制器来接收所有的请求，根据请求的参数，把请求传递一个委托对象，由委托对象来完成以前控制器完成的工作。这个控制器一般由一个servlet来完成,这就是前端控制器模式。这个前端控制器作为一个web应用的处理中心，用来处理所有相关的请求，对所有请求进行集中控制。前端控制器相当于web应用的集中处理器，完成所有请求的控制，对所有请求都需要处理的逻辑可以在端控制器中完成。把请求对象传递给委托对象。这个委托对象就像以前的控制器那样工作，也就是命令模式的运用。通过这种方式，一个WEB应用只需要配置一个前端控制器（当然有必要时可以多个）,具体的控制逻辑交给委托对象去完成,我把这个委托对象称为控制器，可以很好的实现代码重用，java开发人员与UI开发人员的真正分离，让开发人员只关心真正的业务实现。业务对象是真正的pojo对象，可以方便的进行单元测试。<br>几乎所有WEB框架都是基于前端控制器，命令模式的MVC运用,如webwork,spring mvc,struts。</span></font></p>
<img src ="http://www.blogjava.net/sooxin/aggbug/112373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-04-21 01:08 <a href="http://www.blogjava.net/sooxin/articles/112373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二进制数据就是完全数字型</title><link>http://www.blogjava.net/sooxin/articles/112152.html</link><dc:creator>sooxin</dc:creator><author>sooxin</author><pubDate>Fri, 20 Apr 2007 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/sooxin/articles/112152.html</guid><wfw:comment>http://www.blogjava.net/sooxin/comments/112152.html</wfw:comment><comments>http://www.blogjava.net/sooxin/articles/112152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sooxin/comments/commentRss/112152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sooxin/services/trackbacks/112152.html</trackback:ping><description><![CDATA[二进制文件："二进制文件"本来就是一种似是而非的叫法。我们知道,存在有种类繁多的不同类型(格式)的文件,如文本文件,视频文件,图像文件,数据库文件...., 文件格式的具体定义取决于应用。不同的文件格式的主要差别之一就是信息的编码不同,而编码总归都是"二进制"的,从这个方面看,所有的都是"二进制文件 "。而我们常讲的"二进制文件"并不是这个意思,它是想对于"文本文件"而言的,也就是说,所有非文本文件(即非ASCII编码)都被称为"二进制文件 ".在这里很容易提出疑问,文本文件只是文件格式的一种,所有格式的文件应该都是平等的,为什么在这里把它单独提出来作为一种特殊的参照呢?原因很简单, 那就是无论从应用时间的久远程度还是应用的普遍性上,ASCII编码的文件都是其他格式的文件所不能比拟的。<br>可以简单理解成：<br><br>只由ASCII字符构成的文件称为[b]文本文件[/b]（text files），所有其他的文件则称为[b]二进制文件[/b]。<br><br>所谓的ASII字符构成的文件，就是用一个唯一的字节大小的整数值来表示每个字符，比如字符"i"的ASCII值为105，"c"为99，&#8220;\n&#8221;为10 等等。更通俗的讲，在文本文件中，你看到的是一个个的字符&#8220;a&#8221;，&#8220;b&#8221;，&#8220;c&#8221;，他们都由一个唯一的整数值表示，表现在内存上，就是整数值97，98， 99。而二进制文件没有字符概念，它是一个个的值，当然，你认为这个值代表什么，它就可以代表什么。<br>二进制对象：计算机中，一个大型二进制对象通常是一个大型的文件，例如一个<a class=bluekey href="http://www.yesky.com/key/446/446.html" target=_blank><u><font color=#0000ff>图片</font></u></a>或<a class=bluekey href="http://www.yesky.com/key/2378/7378.html" target=_blank><u><font color=#800080>声音文件</font></u></a>。而这些文件不得不以一种特殊的方式存放在数据库中。按照<a class=bluekey href="http://www.yesky.com/key/4783/164783.html" target=_blank><u><font color=#0000ff>Eric</font></u></a> Raymond的解释，大型二进制对象的意义在于，当文件的处理者（例如<a class=bluekey href="http://www.yesky.com/key/2687/177687.html" target=_blank><u><font color=#0000ff>数据库管理工具</font></u></a>）<a class=bluekey href="http://www.yesky.com/key/3277/153277.html" target=_blank><u><font color=#0000ff>无法识别</font></u></a>文件的<a class=bluekey href="http://www.yesky.com/key/3236/193236.html" target=_blank><u><font color=#0000ff>格式</font></u></a>以致无法处理该文件时，就把它作为大型二进制对象来处理。也有人说大型二进制对象实际上指代的是大型数据对象。一个需要处理大型二进制对象的应用程序是存储了大型多<a class=bluekey href="http://www.yesky.com/key/2548/72548.html" target=_blank><u><font color=#0000ff>媒体</font></u></a>对象（例如<a class=bluekey href="http://www.yesky.com/key/1721/1721.html" target=_blank><u><font color=#0000ff>电影</font></u></a>和<a class=bluekey href="http://www.yesky.com/key/1583/171583.html" target=_blank><u><font color=#0000ff>电视节目</font></u></a>）的<a class=bluekey href="http://www.yesky.com/key/4508/174508.html" target=_blank><u><font color=#0000ff>数据存储</font></u></a>器。 
<img src ="http://www.blogjava.net/sooxin/aggbug/112152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sooxin/" target="_blank">sooxin</a> 2007-04-20 11:21 <a href="http://www.blogjava.net/sooxin/articles/112152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>