﻿<?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-semovy-文章分类-JAVA应用</title><link>http://www.blogjava.net/WshmAndLily/category/16310.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 22 Mar 2008 08:50:51 GMT</lastBuildDate><pubDate>Sat, 22 Mar 2008 08:50:51 GMT</pubDate><ttl>60</ttl><item><title>FtpClient的上传,下载等操作</title><link>http://www.blogjava.net/WshmAndLily/articles/187894.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 22 Mar 2008 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/187894.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/187894.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/187894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/187894.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/187894.html</trackback:ping><description><![CDATA[<p>package com.semovy.test;</p>
<p>import java.io.BufferedReader;<br />
import java.io.File;<br />
import java.io.FileInputStream;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
import java.io.InputStream;<br />
import java.io.InputStreamReader;<br />
import java.io.OutputStream;</p>
<p>import sun.net.TelnetInputStream;<br />
import sun.net.TelnetOutputStream;<br />
import sun.net.ftp.FtpClient;</p>
<p>public class FTPTest extends FtpClient {</p>
<p>&nbsp;public void connectServer(String server, String user, String password,<br />
&nbsp;&nbsp;&nbsp;String path) throws Exception {<br />
&nbsp;&nbsp;openServer(server);<br />
&nbsp;&nbsp;login(user, password);<br />
&nbsp;&nbsp;System.out.println("login&nbsp;&nbsp; success!");<br />
&nbsp;&nbsp;if (path.length() != 0)<br />
&nbsp;&nbsp;&nbsp;cd(path);<br />
&nbsp;&nbsp;binary();<br />
&nbsp;}</p>
<p>&nbsp;// 向ftp服务器发送操作命令<br />
&nbsp;public void sendCommand(String command) throws IOException {<br />
&nbsp;&nbsp;issueCommand(command);<br />
&nbsp;}</p>
<p>&nbsp;// 删除文件<br />
&nbsp;public void deleteFile(String fileName) throws IOException {<br />
&nbsp;&nbsp;issueCommand("DELE " + fileName);<br />
&nbsp;}</p>
<p>&nbsp;public void closeConnect() {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;closeServer();<br />
&nbsp;&nbsp;} catch (IOException ex) {<br />
&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;public void upload(String localFilePath, String remoteFilePath) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;TelnetOutputStream os = put(remoteFilePath);<br />
&nbsp;&nbsp;&nbsp;File file_in = new File(localFilePath);<br />
&nbsp;&nbsp;&nbsp;FileInputStream is = new FileInputStream(file_in);<br />
&nbsp;&nbsp;&nbsp;byte[] bytes = new byte[1024];<br />
&nbsp;&nbsp;&nbsp;int ch;<br />
&nbsp;&nbsp;&nbsp;while ((ch = is.read(bytes)) != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;os.write(bytes, 0, ch);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;os.close();<br />
&nbsp;&nbsp;&nbsp;System.out.println("upload file successfully.");<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;public void download(String localFilePath, String remoteFilePath) {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;int ch;<br />
&nbsp;&nbsp;&nbsp;File fi = new File(localFilePath);<br />
&nbsp;&nbsp;&nbsp;OutputStream out = new FileOutputStream(fi);<br />
&nbsp;&nbsp;&nbsp;TelnetInputStream fget = get(remoteFilePath);<br />
&nbsp;&nbsp;&nbsp;byte[] b = new byte[1024];<br />
&nbsp;&nbsp;&nbsp;int len = 0;<br />
&nbsp;&nbsp;&nbsp;while ((len = fget.read(b)) != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;out.write(b, 0, len);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;fget.close();<br />
&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;System.out.println("download file successfully.");<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;public static void list(FtpClient ftp)throws Exception<br />
&nbsp;{<br />
&nbsp;&nbsp;InputStream in = ftp.list();<br />
&nbsp;&nbsp;BufferedReader reader = new BufferedReader(new InputStreamReader(in));<br />
&nbsp;&nbsp;String temp = null;<br />
&nbsp;&nbsp;while((temp = reader.readLine()) != null)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;System.out.println(temp);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;in.close();<br />
&nbsp;}<br />
&nbsp;public static void main(String[] args) throws Exception {<br />
&nbsp;&nbsp;FTPTest ftp = new FTPTest();<br />
&nbsp;&nbsp;ftp.connectServer("teckotooling.vicp.net", "admin", "admin", "");<br />
&nbsp;&nbsp;String localFilePath = "d:/iReport-2.0.5-windows-installer.exe";<br />
&nbsp;&nbsp;String remoteFilePath = "iReport-2.0.5-windows-installer.exe";<br />
&nbsp;&nbsp;ftp.upload(localFilePath,remoteFilePath);<br />
&nbsp;&nbsp;ftp.download(localFilePath, remoteFilePath);<br />
&nbsp;&nbsp;ftp.deleteFile("AI_CS3_chs.exe");<br />
&nbsp;&nbsp;ftp.rename("中草药", "一起走过的日子");<br />
&nbsp;&nbsp;list(ftp);<br />
&nbsp;&nbsp;ftp.cd("一起走过的日子");<br />
&nbsp;&nbsp;list(ftp);<br />
&nbsp;&nbsp;ftp.cdUp();<br />
&nbsp;&nbsp;list(ftp);<br />
&nbsp;&nbsp;System.out.println("ftp.getLocalAddress(): " + ftp.getLocalAddress());<br />
&nbsp;&nbsp;System.out.println("ftp.welcomeMsg: " + ftp.welcomeMsg);<br />
&nbsp;&nbsp;System.out.println("ftp.getConnectTimeout(): " + ftp.getConnectTimeout());<br />
&nbsp;&nbsp;System.out.println("ftp.getReadTimeout(): " + ftp.getReadTimeout());<br />
&nbsp;&nbsp;System.out.println("ftp.system(): " + ftp.system());<br />
&nbsp;&nbsp;System.out.println("ftp.FTP_PORT: " + ftp.FTP_PORT);<br />
&nbsp;&nbsp;System.out.println("ftp.encoding: " + ftp.encoding);<br />
&nbsp;&nbsp;System.out.println("ftp.getFtpProxyHost(): " + ftp.getFtpProxyHost());<br />
&nbsp;&nbsp;System.out.println("ftp.serverIsOpen(): " + ftp.serverIsOpen());<br />
&nbsp;&nbsp;ftp.closeConnect();<br />
&nbsp;}<br />
}<br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/187894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-03-22 14:38 <a href="http://www.blogjava.net/WshmAndLily/articles/187894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JXL Excell基本操作</title><link>http://www.blogjava.net/WshmAndLily/articles/186388.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 14 Mar 2008 14:06:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/186388.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/186388.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/186388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/186388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/186388.html</trackback:ping><description><![CDATA[<p>package com.semovy.test;</p>
<p>import java.io.FileOutputStream;<br />
import java.io.OutputStream;</p>
<p>import jxl.Workbook;<br />
import jxl.write.WritableFont;<br />
import jxl.write.WritableSheet;<br />
import jxl.write.WritableWorkbook;</p>
<p>public class JXLTest {<br />
&nbsp;public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;String targetfile = "c:/out.xls";// 输出的excel文件名<br />
&nbsp;&nbsp;String worksheet = "List";// 输出的excel文件工作表名<br />
&nbsp;&nbsp;String[] title = { "ID", "NAME", "DESCRIB" };// excel工作表的标题</p>
<p>&nbsp;&nbsp;WritableWorkbook workbook;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;// 创建可写入的Excel工作薄,运行生成的文件在tomcat/bin下<br />
&nbsp;&nbsp;&nbsp;// workbook = Workbook.createWorkbook(new File("output.xls"));<br />
&nbsp;&nbsp;&nbsp;System.out.println("begin");</p>
<p>&nbsp;&nbsp;&nbsp;OutputStream os = new FileOutputStream(targetfile);<br />
&nbsp;&nbsp;&nbsp;workbook = Workbook.createWorkbook(os);</p>
<p>&nbsp;&nbsp;&nbsp;WritableSheet sheet = workbook.createSheet(worksheet, 0); // 添加第一个工作表<br />
&nbsp;&nbsp;&nbsp;// WritableSheet sheet1 = workbook.createSheet("MySheet1", 1);<br />
&nbsp;&nbsp;&nbsp;// //可添加第二个工作<br />
&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp; * jxl.write.Label label = new jxl.write.Label(0, 2, "A label<br />
&nbsp;&nbsp;&nbsp; * record"); //put a label in cell A3, Label(column,row)<br />
&nbsp;&nbsp;&nbsp; * sheet.addCell(label);<br />
&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp;jxl.write.Label label;<br />
&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; title.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// Label(列号,行号 ,内容 )<br />
&nbsp;&nbsp;&nbsp;&nbsp;label = new jxl.write.Label(i, 0, title[i]); // put the title<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// in row1<br />
&nbsp;&nbsp;&nbsp;&nbsp;sheet.addCell(label);<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;// 下列添加的对字体等的设置均调试通过，可作参考用</p>
<p>&nbsp;&nbsp;&nbsp;// 添加数字<br />
&nbsp;&nbsp;&nbsp;jxl.write.Number number = new jxl.write.Number(3, 4, 3.14159); // put<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// the<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// number<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 3.14159<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// in<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// cell<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// D5<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(number);</p>
<p>&nbsp;&nbsp;&nbsp;// 添加带有字型Formatting的对象<br />
&nbsp;&nbsp;&nbsp;jxl.write.WritableFont wf = new jxl.write.WritableFont(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritableFont.TIMES, 10, WritableFont.BOLD, true);<br />
&nbsp;&nbsp;&nbsp;jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wf);<br />
&nbsp;&nbsp;&nbsp;jxl.write.Label labelCF = new jxl.write.Label(4, 4, "文本", wcfF);<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(labelCF);</p>
<p>&nbsp;&nbsp;&nbsp;// 添加带有字体颜色,带背景颜色 Formatting的对象<br />
&nbsp;&nbsp;&nbsp;jxl.write.WritableFont wfc = new jxl.write.WritableFont(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritableFont.ARIAL, 10, WritableFont.BOLD, false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jxl.format.UnderlineStyle.NO_UNDERLINE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jxl.format.Colour.RED);<br />
&nbsp;&nbsp;&nbsp;jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wfc);<br />
&nbsp;&nbsp;&nbsp;wcfFC.setBackground(jxl.format.Colour.BLUE);<br />
&nbsp;&nbsp;&nbsp;jxl.write.Label labelCFC = new jxl.write.Label(1, 5, "带颜色", wcfFC);<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(labelCFC);</p>
<p>&nbsp;&nbsp;&nbsp;// 添加带有formatting的Number对象<br />
&nbsp;&nbsp;&nbsp;jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");<br />
&nbsp;&nbsp;&nbsp;jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nf);<br />
&nbsp;&nbsp;&nbsp;jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcfN);<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(labelNF);</p>
<p>&nbsp;&nbsp;&nbsp;// 3.添加Boolean对象<br />
&nbsp;&nbsp;&nbsp;jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(labelB);</p>
<p>&nbsp;&nbsp;&nbsp;// 4.添加DateTime对象<br />
&nbsp;&nbsp;&nbsp;jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new java.util.Date());<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(labelDT);</p>
<p>&nbsp;&nbsp;&nbsp;// 添加带有formatting的DateFormat对象<br />
&nbsp;&nbsp;&nbsp;jxl.write.DateFormat df = new jxl.write.DateFormat(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ddMMyyyyhh:mm:ss");<br />
&nbsp;&nbsp;&nbsp;jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;df);<br />
&nbsp;&nbsp;&nbsp;jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new java.util.Date(), wcfDF);<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(labelDTF);</p>
<p>&nbsp;&nbsp;&nbsp;// 和宾单元格<br />
&nbsp;&nbsp;&nbsp;// sheet.mergeCells(int col1,int row1,int col2,int row2);//左上角到右下角<br />
&nbsp;&nbsp;&nbsp;sheet.mergeCells(4, 5, 8, 10);// 左上角到右下角<br />
&nbsp;&nbsp;&nbsp;wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 40,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritableFont.BOLD, false,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jxl.format.UnderlineStyle.NO_UNDERLINE,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jxl.format.Colour.GREEN);<br />
&nbsp;&nbsp;&nbsp;jxl.write.WritableCellFormat wchB = new jxl.write.WritableCellFormat(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wfc);<br />
&nbsp;&nbsp;&nbsp;wchB.setAlignment(jxl.format.Alignment.CENTRE);<br />
&nbsp;&nbsp;&nbsp;labelCFC = new jxl.write.Label(4, 5, "单元合并", wchB);<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(labelCFC); //</p>
<p>&nbsp;&nbsp;&nbsp;// 设置边框<br />
&nbsp;&nbsp;&nbsp;jxl.write.WritableCellFormat wcsB = new jxl.write.WritableCellFormat();<br />
&nbsp;&nbsp;&nbsp;wcsB.setBorder(jxl.format.Border.ALL,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jxl.format.BorderLineStyle.THICK);<br />
&nbsp;&nbsp;&nbsp;labelCFC = new jxl.write.Label(0, 6, "边框设置", wcsB);<br />
&nbsp;&nbsp;&nbsp;sheet.addCell(labelCFC);<br />
&nbsp;&nbsp;&nbsp;workbook.write();<br />
&nbsp;&nbsp;&nbsp;workbook.close();<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;System.out.println("end");<br />
&nbsp;&nbsp;Runtime r = Runtime.getRuntime();<br />
&nbsp;&nbsp;Process p = null;<br />
&nbsp;&nbsp;// String cmd[]={"notepad","exec.java"};<br />
&nbsp;&nbsp;String cmd[] = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;"C:\\Program Files\\Microsoft Office\\Office\\EXCEL.EXE",<br />
&nbsp;&nbsp;&nbsp;&nbsp;targetfile };<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;p = r.exec(cmd);<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("error executing: " + cmd[0]);<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;}</p>
<p>}<br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/186388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-03-14 22:06 <a href="http://www.blogjava.net/WshmAndLily/articles/186388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用java的动态代理写日志</title><link>http://www.blogjava.net/WshmAndLily/articles/179319.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 04 Feb 2008 19:12:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/179319.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/179319.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/179319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/179319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/179319.html</trackback:ping><description><![CDATA[1.测试的实体Bean&nbsp; Person类<br />
<br />
Person.java<br />
<br />
<p>package com.semovy.bean;</p>
<p>public class Person {<br />
&nbsp;<br />
&nbsp;private String id;</p>
<p>&nbsp;private String name;</p>
<p>&nbsp;private String note;</p>
<p>&nbsp;public String getId() {<br />
&nbsp;&nbsp;return id;<br />
&nbsp;}</p>
<p>&nbsp;public void setId(String id) {<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;}</p>
<p>&nbsp;public String getName() {<br />
&nbsp;&nbsp;return name;<br />
&nbsp;}</p>
<p>&nbsp;public void setName(String name) {<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;}</p>
<p>&nbsp;public String getNote() {<br />
&nbsp;&nbsp;return note;<br />
&nbsp;}</p>
<p>&nbsp;public void setNote(String note) {<br />
&nbsp;&nbsp;this.note = note;<br />
&nbsp;}</p>
<p>&nbsp;public Person(String id, String name, String note) {<br />
&nbsp;&nbsp;super();<br />
&nbsp;&nbsp;this.id = id;<br />
&nbsp;&nbsp;this.name = name;<br />
&nbsp;&nbsp;this.note = note;<br />
&nbsp;}</p>
<p>&nbsp;@Override<br />
&nbsp;public String toString() {<br />
&nbsp;&nbsp;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;return "id: " + id + " name: " +&nbsp; name + " note: " + note;<br />
&nbsp;}</p>
<p>}<br />
2.操作Person实体类的接口PersonService<br />
<br />
PersonService.java<br />
<br />
</p>
<p>package com.semovy.service;</p>
<p>import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import com.semovy.bean.Person;</p>
<p>public interface PersonService {</p>
<p>&nbsp;public List&lt;Person&gt; persons = new ArrayList&lt;Person&gt;();</p>
<p>&nbsp;public abstract void addPerson(Person person);</p>
<p>&nbsp;public abstract Person getPersonById(String id);</p>
<p>&nbsp;public abstract void deletePersonById(String id);</p>
<p>&nbsp;//public abstract void updatePerson(Person person);</p>
<p>&nbsp;public abstract void displayPersonById(String id);</p>
<p>&nbsp;public abstract void displayAllPersons();<br />
}<br />
3.实现PersonService接口的PersonServiceImpl<br />
<br />
PersonServiceImpl.java<br />
<br />
</p>
<p>package com.semovy.service.impl;</p>
<p>import java.util.Iterator;</p>
<p>import com.semovy.bean.Person;<br />
import com.semovy.service.PersonService;</p>
<p>public class PersonServiceImpl implements PersonService {</p>
<p>&nbsp;public void addPerson(Person person) {<br />
&nbsp;&nbsp;persons.add(person);<br />
&nbsp;}</p>
<p>&nbsp;public void deletePersonById(String id) {<br />
&nbsp;&nbsp;Iterator it = persons.iterator();<br />
&nbsp;&nbsp;while(it.hasNext())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Person person = (Person)it.next();<br />
&nbsp;&nbsp;&nbsp;if(person.getId().equals(id))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;it.remove();<br />
&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;public void displayAllPersons() {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Iterator it = persons.iterator();<br />
&nbsp;&nbsp;while(it.hasNext())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Person person = (Person)it.next();<br />
&nbsp;&nbsp;&nbsp;System.out.println(person.toString());<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;public void displayPersonById(String id) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Iterator it = persons.iterator();<br />
&nbsp;&nbsp;while(it.hasNext())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Person person = (Person)it.next();<br />
&nbsp;&nbsp;&nbsp;if(person.getId().equals(id))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(person.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;}</p>
<p>&nbsp;public Person getPersonById(String id) {<br />
&nbsp;&nbsp;Iterator it = persons.iterator();<br />
&nbsp;&nbsp;while(it.hasNext())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Person person = (Person)it.next();<br />
&nbsp;&nbsp;&nbsp;if(person.getId().equals(id))<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return person;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return null;<br />
&nbsp;}</p>
<p>&nbsp;/*public void updatePerson(Strin) {<br />
&nbsp;&nbsp;Iterator it = persons.iterator();<br />
&nbsp;&nbsp;while(it.hasNext())<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;Person person = (Person)it.next();<br />
&nbsp;&nbsp;&nbsp;if(person == aperson)<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;persons.set(arg0, arg1)<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}*/</p>
<p>}<br />
</p>
<p>4.写日志的代理类LogProxy&nbsp;&nbsp; 它实现了InvocationHandler接口<br />
<br />
LogProxy.java<br />
<br />
</p>
<p>package com.semovy.bean;</p>
<p>import java.lang.reflect.InvocationHandler;<br />
import java.lang.reflect.Method;<br />
import java.lang.reflect.Proxy;</p>
<p>import org.apache.log4j.Level;<br />
import org.apache.log4j.Logger;</p>
<p><br />
public class LogProxy implements InvocationHandler {<br />
&nbsp;<br />
&nbsp;Logger logger = Logger.getLogger(this.getClass().getName());<br />
&nbsp;private Object delegate = null;<br />
&nbsp;<br />
&nbsp;public Object getDelegate() {<br />
&nbsp;&nbsp;return delegate;<br />
&nbsp;}</p>
<p>&nbsp;public void setDelegate(Object delegate) {<br />
&nbsp;&nbsp;this.delegate = delegate;<br />
&nbsp;}</p>
<p>&nbsp;public Object bind(Object delegate) {<br />
&nbsp;&nbsp;this.delegate = delegate;<br />
&nbsp;&nbsp;return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;delegate.getClass().getInterfaces(),this);<br />
&nbsp;}</p>
<p>&nbsp;public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<br />
&nbsp;&nbsp;Object result = null;<br />
&nbsp;&nbsp;try<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;logger.log(Level.INFO,method.getName() +&nbsp; " 开始处理...");<br />
&nbsp;&nbsp;&nbsp;result = method.invoke(this.delegate, args);<br />
&nbsp;&nbsp;&nbsp;logger.log(Level.INFO,method.getName() +&nbsp; " 结束处理...");<br />
&nbsp;&nbsp;}catch(Exception e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;logger.log(Level.ERROR,e.getLocalizedMessage());<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;return result;<br />
&nbsp;}<br />
}<br />
</p>
<p>5.在eclipse中添加log4j.properties<br />
<br />
log4j.properties<br />
<br />
log4j.rootLogger=DEBUG,stdout<br />
log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n<br />
<br />
5.写测试类Test.java<br />
<br />
Test.java<br />
<br />
</p>
<p>package com.semovy.test;</p>
<p>import java.io.File;<br />
import java.io.IOException;<br />
import java.io.PrintWriter;<br />
import java.util.Iterator;<br />
import java.util.List;</p>
<p>import com.semovy.bean.LogProxy;<br />
import com.semovy.bean.Person;<br />
import com.semovy.service.PersonService;<br />
import com.semovy.service.impl.PersonServiceImpl;</p>
<p>public class Test {</p>
<p>&nbsp;/**<br />
&nbsp; * @param args<br />
&nbsp; */<br />
&nbsp;public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;LogProxy logProxy = new LogProxy();<br />
&nbsp;&nbsp;PersonService personService = (PersonService)logProxy.bind(new PersonServiceImpl());<br />
&nbsp;&nbsp;personService.addPerson(new Person("1","name1","note1"));<br />
&nbsp;&nbsp;personService.addPerson(new Person("2","name2","note2"));<br />
&nbsp;&nbsp;personService.addPerson(new Person("3","name3","note3"));<br />
&nbsp;&nbsp;personService.addPerson(new Person("4","name4","note4"));<br />
&nbsp;&nbsp;personService.displayPersonById("3");<br />
&nbsp;&nbsp;personService.displayAllPersons();<br />
&nbsp;&nbsp;Person person = personService.getPersonById("2");<br />
&nbsp;&nbsp;person.setName("名称2");<br />
&nbsp;&nbsp;person.setNote("注脚2");<br />
&nbsp;&nbsp;personService.displayAllPersons();<br />
&nbsp;&nbsp;personService.deletePersonById("2");<br />
&nbsp;&nbsp;personService.displayAllPersons();<br />
&nbsp;&nbsp;//saveToFile(persons,"c:/persons.txt");<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public static void saveToFile(List list,String path)<br />
&nbsp;{<br />
&nbsp;&nbsp;System.out.println("开始写入文件...");<br />
&nbsp;&nbsp;try<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;PrintWriter out = new PrintWriter(new File(path));<br />
&nbsp;&nbsp;&nbsp;Iterator it = list.iterator();<br />
&nbsp;&nbsp;&nbsp;while(it.hasNext())<br />
&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Person person = (Person)it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;out.println(person.toString());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;out.flush();<br />
&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;System.out.println("结束写入文件...");<br />
&nbsp;&nbsp;}catch(IOException e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;System.out.println(e.getLocalizedMessage());<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
}<br />
</p>
<p><br />
6.运行测试结果:<br />
<br />
2008-02-05 02:55:28,926&nbsp; INFO (LogProxy.java:34) - addPerson 开始处理...<br />
2008-02-05 02:55:28,926&nbsp; INFO (LogProxy.java:36) - addPerson 结束处理...<br />
2008-02-05 02:55:28,926&nbsp; INFO (LogProxy.java:34) - addPerson 开始处理...<br />
2008-02-05 02:55:28,926&nbsp; INFO (LogProxy.java:36) - addPerson 结束处理...<br />
2008-02-05 02:55:28,926&nbsp; INFO (LogProxy.java:34) - addPerson 开始处理...<br />
2008-02-05 02:55:28,936&nbsp; INFO (LogProxy.java:36) - addPerson 结束处理...<br />
2008-02-05 02:55:28,936&nbsp; INFO (LogProxy.java:34) - addPerson 开始处理...<br />
2008-02-05 02:55:29,036&nbsp; INFO (LogProxy.java:36) - addPerson 结束处理...<br />
2008-02-05 02:55:29,036&nbsp; INFO (LogProxy.java:34) - displayPersonById 开始处理...<br />
id: 3 name: name3 note: note3<br />
2008-02-05 02:55:29,036&nbsp; INFO (LogProxy.java:36) - displayPersonById 结束处理...<br />
2008-02-05 02:55:29,036&nbsp; INFO (LogProxy.java:34) - displayAllPersons 开始处理...<br />
id: 1 name: name1 note: note1<br />
id: 2 name: name2 note: note2<br />
id: 3 name: name3 note: note3<br />
id: 4 name: name4 note: note4<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:36) - displayAllPersons 结束处理...<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:34) - getPersonById 开始处理...<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:36) - getPersonById 结束处理...<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:34) - displayAllPersons 开始处理...<br />
id: 1 name: name1 note: note1<br />
id: 2 name: 名称2 note: 注脚2<br />
id: 3 name: name3 note: note3<br />
id: 4 name: name4 note: note4<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:36) - displayAllPersons 结束处理...<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:34) - deletePersonById 开始处理...<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:36) - deletePersonById 结束处理...<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:34) - displayAllPersons 开始处理...<br />
id: 1 name: name1 note: note1<br />
id: 3 name: name3 note: note3<br />
id: 4 name: name4 note: note4<br />
2008-02-05 02:55:29,046&nbsp; INFO (LogProxy.java:36) - displayAllPersons 结束处理...<br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/179319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2008-02-05 03:12 <a href="http://www.blogjava.net/WshmAndLily/articles/179319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA得到网卡物理地址(windows和Linux) </title><link>http://www.blogjava.net/WshmAndLily/articles/148704.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 27 Sep 2007 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/148704.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/148704.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/148704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/148704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/148704.html</trackback:ping><description><![CDATA[在我们在写程序的过程中,有些时候需要知道一些电脑的硬件信息,比如我们写一些需要注册的程序的时候,就需要得到某个电脑特定的信息,一般来说,网卡的物理地址是不会重复的,我们正好可以用它来做为我们识别一台电脑的标志.那如何得到网卡的物理地址呢?我们可以借助于ProcessBuilder这个类,这个类是JDK1.5新加的,以前也可以用Runtime.exce这个类.在此我们将演示一下如何在Windows和Linux环境下得到网卡的物理地址.<br />
<br />
代码如下:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000">/*</span><span style="color: #008000"><br />
&nbsp;*&nbsp;Test.java<br />
&nbsp;*<br />
&nbsp;*&nbsp;Created&nbsp;on&nbsp;2007-9-27,&nbsp;9:11:15<br />
&nbsp;*<br />
&nbsp;*&nbsp;To&nbsp;change&nbsp;this&nbsp;template,&nbsp;choose&nbsp;Tools&nbsp;|&nbsp;Templates<br />
&nbsp;*&nbsp;and&nbsp;open&nbsp;the&nbsp;template&nbsp;in&nbsp;the&nbsp;editor.<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test2;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.BufferedReader;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.InputStreamReader;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Properties;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.logging.Level;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.logging.Logger;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;hadeslee<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;{<br />
<br />
&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;String&nbsp;getMACAddress()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;os&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.getProperty(</span><span style="color: #000000">"</span><span style="color: #000000">os.name</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(os);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(os&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(os.startsWith(</span><span style="color: #000000">"</span><span style="color: #000000">Windows</span><span style="color: #000000">"</span><span style="color: #000000">))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessBuilder&nbsp;pb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ProcessBuilder(</span><span style="color: #000000">"</span><span style="color: #000000">ipconfig</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/all</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pb.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedReader(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputStreamReader(p.getInputStream()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((line&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;br.readLine())&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<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;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(line.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">Physical&nbsp;Address</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;index&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;line.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;line.substring(index&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address.trim();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(os.startsWith(</span><span style="color: #000000">"</span><span style="color: #000000">Linux</span><span style="color: #000000">"</span><span style="color: #000000">)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessBuilder&nbsp;pb&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ProcessBuilder(</span><span style="color: #000000">"</span><span style="color: #000000">ifconfig</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pb.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedReader(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputStreamReader(p.getInputStream()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">((line</span><span style="color: #000000">=</span><span style="color: #000000">br.readLine())</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">){<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;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;index</span><span style="color: #000000">=</span><span style="color: #000000">line.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">硬件地址</span><span style="color: #000000">"</span><span style="color: #000000">);<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;</span><span style="color: #0000ff">if</span><span style="color: #000000">(index</span><span style="color: #000000">!=-</span><span style="color: #000000">1</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address</span><span style="color: #000000">=</span><span style="color: #000000">line.substring(index</span><span style="color: #000000">+</span><span style="color: #000000">4</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address.trim();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;ex)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.getLogger(Test.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getName()).log(Level.SEVERE,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;address;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&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;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">""</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;Test.getMACAddress());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000"><br />
</span></div>
<br />
我们可以看一下1.5新增的ProcessBuilder这个类,这个类比起以前用Runtime.exec来说,要强大一些,它可以指定一个环境 变量,并指定程序运行时的目录空间,并且也可以得到程序运行时的环境变量.因为ipconfig这个命令已经是system32里面的,所以不需要我们另外再设环境变量或者指定程序的运行时目录空间.我们直接用就可以了,然后得到进程的输出流,就可以分析出我们所需要的东西了.是不是挺简单的呢:)<br />
<br />
此程序可以得到windows下和Linux下的网卡地址，不过LINUX要是中文版的，英文版的也一样，只不过把字替换一下就可以了。这样我们的程序就有了两个平台的实现。<br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/148704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-27 14:34 <a href="http://www.blogjava.net/WshmAndLily/articles/148704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java给图片加水印，文字水印 </title><link>http://www.blogjava.net/WshmAndLily/articles/143765.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 09 Sep 2007 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143765.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143765.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143765.html</trackback:ping><description><![CDATA[public<span>&nbsp;</span><span>final</span><span>&nbsp;</span><span>class</span><span>&nbsp;ImageUtils&nbsp;</span><span id="_31_2525_Closed_Text">...</span><span id="_31_2525_Open_Text"><span>{<br />
<img id="_54_58_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_54_58_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;ImageUtils()&nbsp;</span><span id="_54_58_Closed_Text">...</span><span id="_54_58_Open_Text"><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="_107_186_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_107_186_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>final</span><span>&nbsp;</span><span>static</span><span>&nbsp;String&nbsp;getPressImgPath()</span><span id="_107_186_Closed_Text">...</span><span id="_107_186_Open_Text"><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>return</span><span>&nbsp;ApplicationContext.getRealPath(</span><span>"</span><span>/template/data/util/shuiyin.gif</span><span>"</span><span>);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="_190_295_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_190_295_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span id="_190_295_Closed_Text">/**&nbsp;*/</span><span id="_190_295_Open_Text"><span>/**</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;*&nbsp;把图片印刷到图片上<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;pressImg&nbsp;--&nbsp;水印文件<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;targetImg&nbsp;&nbsp;--&nbsp;目标文件<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;x<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;y<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;</span><span>*/</span></span><span><br />
<img id="_383_1269_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_383_1269_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>final</span><span>&nbsp;</span><span>static</span><span>&nbsp;</span><span>void</span><span>&nbsp;pressImage(String&nbsp;pressImg,&nbsp;String&nbsp;targetImg,&nbsp;</span><span>int</span><span>&nbsp;x,&nbsp;</span><span>int</span><span>&nbsp;y)&nbsp;</span><span id="_383_1269_Closed_Text">...</span><span id="_383_1269_Open_Text"><span>{<br />
<img id="_391_1216_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_391_1216_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span>&nbsp;</span><span id="_391_1216_Closed_Text">...</span><span id="_391_1216_Open_Text"><span>{<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;File&nbsp;_file&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;File(targetImg);<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;Image&nbsp;src&nbsp;</span><span>=</span><span>&nbsp;ImageIO.read(_file);<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;</span><span>int</span><span>&nbsp;wideth&nbsp;</span><span>=</span><span>&nbsp;src.getWidth(</span><span>null</span><span>);<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;</span><span>int</span><span>&nbsp;height&nbsp;</span><span>=</span><span>&nbsp;src.getHeight(</span><span>null</span><span>);<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;BufferedImage&nbsp;image&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;BufferedImage(wideth,&nbsp;height,<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;BufferedImage.TYPE_INT_RGB);<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;Graphics&nbsp;g&nbsp;</span><span>=</span><span>&nbsp;image.createGraphics();<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;g.drawImage(src,&nbsp;</span><span>0</span><span>,&nbsp;</span><span>0</span><span>,&nbsp;wideth,&nbsp;height,&nbsp;</span><span>null</span><span>);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//</span><span>&nbsp;水印文件</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;_filebiao&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;File(pressImg);<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;Image&nbsp;src_biao&nbsp;</span><span>=</span><span>&nbsp;ImageIO.read(_filebiao);<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;</span><span>int</span><span>&nbsp;wideth_biao&nbsp;</span><span>=</span><span>&nbsp;src_biao.getWidth(</span><span>null</span><span>);<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;</span><span>int</span><span>&nbsp;height_biao&nbsp;</span><span>=</span><span>&nbsp;src_biao.getHeight(</span><span>null</span><span>);<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;g.drawImage(src_biao,&nbsp;wideth&nbsp;</span><span>-</span><span>&nbsp;wideth_biao&nbsp;</span><span>-</span><span>&nbsp;x,&nbsp;height&nbsp;</span><span>-</span><span>&nbsp;height_biao&nbsp;</span><span>-</span><span>y,&nbsp;wideth_biao,<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;height_biao,&nbsp;</span><span>null</span><span>);<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;</span><span>//</span><span>&nbsp;/</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.dispose();<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;FileOutputStream&nbsp;out&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;FileOutputStream(targetImg);<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;JPEGImageEncoder&nbsp;encoder&nbsp;</span><span>=</span><span>&nbsp;JPEGCodec.createJPEGEncoder(out);<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;encoder.encode(image);<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;out.close();<br />
<img id="_1238_1266_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_1238_1266_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span>&nbsp;</span><span>catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="_1238_1266_Closed_Text">...</span><span id="_1238_1266_Open_Text"><span>{<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;e.printStackTrace();<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="_1273_1490_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_1273_1490_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="_1273_1490_Closed_Text">/**&nbsp;*/</span><span id="_1273_1490_Open_Text"><span>/**</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&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;</span><span>@param</span><span>&nbsp;pressText&nbsp;--文字<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;targetImg&nbsp;--&nbsp;目标图片<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;fontName&nbsp;--&nbsp;字体名<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;fontStyle&nbsp;--&nbsp;字体样式<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;color&nbsp;--&nbsp;字体颜色<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;fontSize&nbsp;--&nbsp;字体大小<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;x&nbsp;--&nbsp;偏移量<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span>@param</span><span>&nbsp;y<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>*/</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="_1631_2402_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_1631_2402_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>static</span><span>&nbsp;</span><span>void</span><span>&nbsp;pressText(String&nbsp;pressText,&nbsp;String&nbsp;targetImg,&nbsp;String&nbsp;fontName,</span><span>int</span><span>&nbsp;fontStyle,&nbsp;</span><span>int</span><span>&nbsp;color,&nbsp;</span><span>int</span><span>&nbsp;fontSize,&nbsp;</span><span>int</span><span>&nbsp;x,&nbsp;</span><span>int</span><span>&nbsp;y)&nbsp;</span><span id="_1631_2402_Closed_Text">...</span><span id="_1631_2402_Open_Text"><span>{<br />
<img id="_1639_2347_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_1639_2347_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span>&nbsp;</span><span id="_1639_2347_Closed_Text">...</span><span id="_1639_2347_Open_Text"><span>{<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;File&nbsp;_file&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;File(targetImg);<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;Image&nbsp;src&nbsp;</span><span>=</span><span>&nbsp;ImageIO.read(_file);<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;</span><span>int</span><span>&nbsp;wideth&nbsp;</span><span>=</span><span>&nbsp;src.getWidth(</span><span>null</span><span>);<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;</span><span>int</span><span>&nbsp;height&nbsp;</span><span>=</span><span>&nbsp;src.getHeight(</span><span>null</span><span>);<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;BufferedImage&nbsp;image&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;BufferedImage(wideth,&nbsp;height,<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;BufferedImage.TYPE_INT_RGB);<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;Graphics&nbsp;g&nbsp;</span><span>=</span><span>&nbsp;image.createGraphics();<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;g.drawImage(src,&nbsp;</span><span>0</span><span>,&nbsp;</span><span>0</span><span>,&nbsp;wideth,&nbsp;height,&nbsp;</span><span>null</span><span>);<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;</span><span>//</span><span>&nbsp;String&nbsp;s="www.qhd.com.cn";</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.setColor(Color.RED);<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;g.setFont(</span><span>new</span><span>&nbsp;Font(fontName,&nbsp;fontStyle,&nbsp;fontSize));<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawString(pressText,&nbsp;wideth&nbsp;</span><span>-</span><span>&nbsp;fontSize&nbsp;</span><span>-</span><span>&nbsp;x,&nbsp;height&nbsp;</span><span>-</span><span>&nbsp;fontSize</span><span>/</span><span>2</span><span>&nbsp;</span><span>-</span><span>&nbsp;y);<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;g.dispose();<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;FileOutputStream&nbsp;out&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;FileOutputStream(targetImg);<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;JPEGImageEncoder&nbsp;encoder&nbsp;</span><span>=</span><span>&nbsp;JPEGCodec.createJPEGEncoder(out);<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;encoder.encode(image);<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;out.close();<br />
<img id="_2369_2399_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_2369_2399_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span>&nbsp;</span><span>catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="_2369_2399_Closed_Text">...</span><span id="_2369_2399_Open_Text"><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="_2445_2523_Open_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="_2445_2523_Closed_Image" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span>&nbsp;</span><span>static</span><span>&nbsp;</span><span>void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="_2445_2523_Closed_Text">...</span><span id="_2445_2523_Open_Text"><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pressImage(</span><span>"</span><span>C:/shuiyin/shuiyin.gif</span><span>"</span><span>,&nbsp;</span><span>"</span><span>c:/shuiyin/DSC02342.JPG</span><span>"</span><span>,&nbsp;</span><span>20</span><span>&nbsp;,</span><span>20</span><span>);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span>&nbsp;<br />
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-09 13:40 <a href="http://www.blogjava.net/WshmAndLily/articles/143765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java操作EXCEL文件</title><link>http://www.blogjava.net/WshmAndLily/articles/143458.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143458.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143458.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143458.html</trackback:ping><description><![CDATA[很久以来都想研究一下利用java操作Excel的方法，今天没事，就稍微了解了一下，特总结一下。利用java操作Excel，有个开源的东东－jxl.jar，可以到<a href="http://sourceforge.net/project/showfiles.php?group_id=79926"><font color="#1d58d1">http://sourceforge.net/project/showfiles.php?group_id=79926</font></a>下载。&nbsp;
<p><strong>一.读取Excel文件内容</strong></p>
<p>java&nbsp;代码<br />
/**读取Excel文件的内容&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;@param&nbsp;file&nbsp;&nbsp;待读取的文件&nbsp;&nbsp;&nbsp;<br />
&nbsp;*&nbsp;@return&nbsp;&nbsp;&nbsp;<br />
&nbsp;*/&nbsp;&nbsp;&nbsp;<br />
public&nbsp;static&nbsp;String&nbsp;readExcel(File&nbsp;file){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuffer();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Workbook&nbsp;wb&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造Workbook（工作薄）对象&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wb=Workbook.getWorkbook(file);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(BiffException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(wb==null)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//获得了Workbook对象之后，就可以通过它得到Sheet（工作表）对象了&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Sheet[]&nbsp;sheet&nbsp;=&nbsp;wb.getSheets();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(sheet!=null&amp;&amp;sheet.length&gt;0){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//对每个工作表进行循环&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//得到当前工作表的行数&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rowNum&nbsp;=&nbsp;sheet[i].getRows();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;j=0;j&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//得到当前行的所有单元格&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cell[]&nbsp;cells&nbsp;=&nbsp;sheet[i].getRow(j);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cells!=null&amp;&amp;cells.length&gt;0){&nbsp;&nbsp;&nbsp;&nbsp;<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;k=0;k&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取当前单元格的值&nbsp;&nbsp;&nbsp;&nbsp;<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;String&nbsp;cellValue&nbsp;=&nbsp;cells[k].getContents();&nbsp;&nbsp;&nbsp;&nbsp;<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;sb.append(cellValue+"\t");&nbsp;&nbsp;&nbsp;&nbsp;<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("\r\n");&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append("\r\n");&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//最后关闭资源，释放内存&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;wb.close();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sb.toString();&nbsp;&nbsp;&nbsp;&nbsp;<br />
}&nbsp;&nbsp;&nbsp;<br />
</p>
<p dir="ltr"><strong>二.写入Excel文件</strong></p>
<blockquote dir="ltr" style="margin-right: 0px">
<p dir="ltr">这里有很多格式了，比如文本内容加粗，加上某些颜色等，可以参考jxl的api，同时还推荐一篇不错的文章：<a href="http://www.ibm.com/developerworks/cn/java/l-javaExcel/?ca=j-t10">http://www.ibm.com/developerworks/cn/java/l-javaExcel/?ca=j-t10</a></p>
<p dir="ltr">java&nbsp;代码<br />
/**生成一个Excel文件&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;fileName&nbsp;&nbsp;要生成的Excel文件名&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;writeExcel(String&nbsp;fileName){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritableWorkbook&nbsp;wwb&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wwb&nbsp;=&nbsp;Workbook.createWorkbook(new&nbsp;File(fileName));&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(wwb!=null){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建一个可写入的工作表&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Workbook的createSheet方法有两个参数，第一个是工作表的名称，第二个是工作表在工作薄中的位置&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WritableSheet&nbsp;ws&nbsp;=&nbsp;wwb.createSheet("sheet1",&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下面开始添加单元格&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;10;i++){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;j=0;j&lt;5;j++){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里需要注意的是，在Excel中，第一个参数表示列，第二个表示行&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Label&nbsp;labelC&nbsp;=&nbsp;new&nbsp;Label(j,&nbsp;i,&nbsp;"这是第"+(i+1)+"行，第"+(j+1)+"列");&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将生成的单元格添加到工作表中&nbsp;&nbsp;&nbsp;&nbsp;<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;ws.addCell(labelC);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(RowsExceededException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<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;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(WriteException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<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;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;<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;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//从内存中写入文件中&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wwb.write();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭资源，释放内存&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wwb.close();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(WriteException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p dir="ltr"><strong></strong></p>
<p dir="ltr"><strong>三.在一个Excel文件中查找是否包含某一个关键字</strong></p>
<blockquote dir="ltr" style="margin-right: 0px">
<div class="code_title">java&nbsp;代码</div>
<div class="code_title">/**搜索某一个文件中是否包含某个关键字&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;file&nbsp;&nbsp;待搜索的文件&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;keyWord&nbsp;&nbsp;要搜索的关键字&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;boolean&nbsp;searchKeyWord(File&nbsp;file,String&nbsp;keyWord){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;res&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Workbook&nbsp;wb&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造Workbook（工作薄）对象&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wb=Workbook.getWorkbook(file);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(BiffException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;res;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;res;&nbsp;&nbsp;&nbsp;&nbsp;<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(wb==null)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;res;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得了Workbook对象之后，就可以通过它得到Sheet（工作表）对象了&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sheet[]&nbsp;sheet&nbsp;=&nbsp;wb.getSheets();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;breakSheet&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(sheet!=null&amp;&amp;sheet.length&gt;0){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//对每个工作表进行循环&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(breakSheet)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;int&nbsp;rowNum&nbsp;=&nbsp;sheet[i].getRows();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;breakRow&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;j=0;j&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(breakRow)&nbsp;&nbsp;&nbsp;&nbsp;<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;break;&nbsp;&nbsp;&nbsp;&nbsp;<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cell[]&nbsp;cells&nbsp;=&nbsp;sheet[i].getRow(j);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cells!=null&amp;&amp;cells.length&gt;0){&nbsp;&nbsp;&nbsp;&nbsp;<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;boolean&nbsp;breakCell&nbsp;=&nbsp;false;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//对每个单元格进行循环&nbsp;&nbsp;&nbsp;&nbsp;<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;for(int&nbsp;k=0;k&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(breakCell)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取当前单元格的值&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cellValue&nbsp;=&nbsp;cells[k].getContents();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cellValue==null)&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cellValue.contains(keyWord)){&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakCell&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakRow&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;breakSheet&nbsp;=&nbsp;true;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<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;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wb.close();&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;res;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</div>
</blockquote></blockquote>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 16:11 <a href="http://www.blogjava.net/WshmAndLily/articles/143458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>根据对象生成XML文档</title><link>http://www.blogjava.net/WshmAndLily/articles/143443.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143443.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143443.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143443.html</trackback:ping><description><![CDATA[<p><font face="Arial">根据对象生成XML文档. 使用Java提供的java.beans.XMLEncoder<br />
和java.beans.XMLDecoder类<br />
一、生成的xml文件如下：AStudent.xml<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />
&lt;java version="1.5.0" class="java.beans.XMLDecoder"&gt; <br />
&lt;object class="StudentBean"&gt; <br />
&nbsp;&nbsp; &lt;void property="age"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;int&gt;15&lt;/int&gt; <br />
&nbsp;&nbsp; &lt;/void&gt; <br />
&nbsp;&nbsp; &lt;void property="gender"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;male&lt;/string&gt; <br />
&nbsp;&nbsp; &lt;/void&gt; <br />
&nbsp;&nbsp; &lt;void property="name"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;wamgwu&lt;/string&gt; <br />
&nbsp;&nbsp; &lt;/void&gt; <br />
&nbsp;&nbsp; &lt;void property="phone"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;string&gt;55556666&lt;/string&gt; <br />
&nbsp;&nbsp; &lt;/void&gt; <br />
&lt;/object&gt;&lt;/java&gt; <br />
二、描述学生的JavaBean</font></p>
<p><font face="Arial">/**<br />
* 描述学生的JavaBean<br />
*/<br />
public class StudentBean {<br />
// 学生姓名<br />
private String name;<br />
// 学生性别 <br />
private String gender;<br />
// 学生年龄<br />
private int age;<br />
// 学生电话号码<br />
private String phone;<br />
public String toString(){<br />
&nbsp;&nbsp; StringBuffer sb = new StringBuffer();<br />
&nbsp;&nbsp; sb.append("姓名：").append(this.name).append("；&nbsp;&nbsp; ");<br />
&nbsp;&nbsp; sb.append("性别：").append(gender).append("；&nbsp;&nbsp; ");<br />
&nbsp;&nbsp; sb.append("年龄：").append(age).append("；&nbsp;&nbsp; ");<br />
&nbsp;&nbsp; sb.append("电话：").append(phone);<br />
&nbsp;&nbsp; return sb.toString();<br />
}<br />
<br />
/**<br />
&nbsp;&nbsp; * @return 返回 age。<br />
&nbsp;&nbsp; */<br />
public int getAge() {<br />
&nbsp;&nbsp; return age;<br />
}<br />
/**<br />
&nbsp;&nbsp; * @param age 要设置的 age。<br />
&nbsp;&nbsp; */<br />
public void setAge(int age) {<br />
&nbsp;&nbsp; this.age = age;<br />
}<br />
/**<br />
&nbsp;&nbsp; * @return 返回 gender。<br />
&nbsp;&nbsp; */<br />
public String getGender() {<br />
&nbsp;&nbsp; return gender;<br />
}<br />
/**<br />
&nbsp;&nbsp; * @param gender 要设置的 gender。<br />
&nbsp;&nbsp; */<br />
public void setGender(String gender) {<br />
&nbsp;&nbsp; this.gender = gender;<br />
}<br />
/**<br />
&nbsp;&nbsp; * @return 返回 name。<br />
&nbsp;&nbsp; */<br />
public String getName() {<br />
&nbsp;&nbsp; return name;<br />
}<br />
/**<br />
&nbsp;&nbsp; * @param name 要设置的 name。<br />
&nbsp;&nbsp; */<br />
public void setName(String name) {<br />
&nbsp;&nbsp; this.name = name;<br />
}<br />
/**<br />
&nbsp;&nbsp; * @return 返回 phone。<br />
&nbsp;&nbsp; */<br />
public String getPhone() {<br />
&nbsp;&nbsp; return phone;<br />
}<br />
/**<br />
&nbsp;&nbsp; * @param phone 要设置的 phone。<br />
&nbsp;&nbsp; */<br />
public void setPhone(String phone) {<br />
&nbsp;&nbsp; this.phone = phone;<br />
}<br />
}三、主程序&nbsp;&nbsp; import java.beans.XMLDecoder;<br />
import java.beans.XMLEncoder;<br />
import java.io.BufferedInputStream;<br />
import java.io.BufferedOutputStream;<br />
import java.io.File;<br />
import java.io.FileInputStream;<br />
import java.io.FileNotFoundException;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
/**<br />
* 根据对象生成XML文档.<br />
* 使用Java提供的java.beans.XMLEncoder和java.beans.XMLDecoder类。<br />
* 这是JDK 1.4以后才出现的类<br />
*/<br />
public class Object2XML {<br />
/**<br />
&nbsp;&nbsp; * 对象输出到XML文件<br />
&nbsp;&nbsp; * @param obj 待输出的对象<br />
&nbsp;&nbsp; * @param outFileName 目标XML文件的文件名<br />
&nbsp;&nbsp; * @return 返回输出XML文件的路径<br />
&nbsp;&nbsp; * @throws FileNotFoundException<br />
&nbsp;&nbsp; */<br />
public static String object2XML(Object obj, String outFileName)<br />
&nbsp;&nbsp;&nbsp; throws FileNotFoundException {<br />
&nbsp;&nbsp; // 构造输出XML文件的字节输出流<br />
&nbsp;&nbsp; File outFile = new File(outFileName);<br />
&nbsp;&nbsp; BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outFile));<br />
&nbsp;&nbsp; // 构造一个XML编码器<br />
&nbsp;&nbsp; XMLEncoder xmlEncoder = new XMLEncoder(bos);<br />
&nbsp;&nbsp; // 使用XML编码器写对象<br />
&nbsp;&nbsp; xmlEncoder.writeObject(obj);<br />
&nbsp;&nbsp; // 关闭编码器<br />
&nbsp;&nbsp; xmlEncoder.close();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; return outFile.getAbsolutePath();<br />
}<br />
/**<br />
&nbsp;&nbsp; * 把XML文件解码成对象<br />
&nbsp;&nbsp; * @param inFileName 输入的XML文件<br />
&nbsp;&nbsp; * @return 返回生成的对象<br />
&nbsp;&nbsp; * @throws FileNotFoundException<br />
&nbsp;&nbsp; */<br />
public static Object xml2Object(String inFileName)<br />
&nbsp;&nbsp;&nbsp; throws FileNotFoundException {<br />
&nbsp;&nbsp; // 构造输入的XML文件的字节输入流<br />
&nbsp;&nbsp; BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inFileName));<br />
&nbsp;&nbsp; // 构造一个XML解码器<br />
&nbsp;&nbsp; XMLDecoder xmlDecoder = new XMLDecoder(bis);<br />
&nbsp;&nbsp; // 使用XML解码器读对象<br />
&nbsp;&nbsp; Object obj = xmlDecoder.readObject();<br />
&nbsp;&nbsp; // 关闭解码器<br />
&nbsp;&nbsp; xmlDecoder.close();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; return obj;<br />
}<br />
public static void main(String[] args) throws IOException {<br />
&nbsp;&nbsp; // 构造一个StudentBean对象<br />
&nbsp;&nbsp; StudentBean student = new StudentBean();<br />
&nbsp;&nbsp; student.setName("wamgwu");<br />
&nbsp;&nbsp; student.setGender("male");<br />
&nbsp;&nbsp; student.setAge(15);<br />
&nbsp;&nbsp; student.setPhone("55556666");<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; // 将StudentBean对象写到XML文件<br />
&nbsp;&nbsp; String fileName = "AStudent.xml";<br />
&nbsp;&nbsp; Object2XML.object2XML(student, fileName);<br />
&nbsp;&nbsp; // 从XML文件读StudentBean对象<br />
&nbsp;&nbsp; StudentBean aStudent = (StudentBean)Object2XML.xml2Object(fileName);<br />
&nbsp;&nbsp; // 输出读到的对象<br />
&nbsp;&nbsp; System.out.println(aStudent.toString());<br />
}<br />
}<br />
运行结果：<br />
C:\java&gt;java Object2XML姓名：wamgwu；&nbsp;&nbsp; 性别：male；&nbsp;&nbsp; 年龄：15；&nbsp;&nbsp; 电话：55556666</font></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 15:51 <a href="http://www.blogjava.net/WshmAndLily/articles/143443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Java将Word转为Html或txt</title><link>http://www.blogjava.net/WshmAndLily/articles/143428.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143428.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143428.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143428.html</trackback:ping><description><![CDATA[<p>package org.client;</p>
<p>// 使用Java将Word转为Html或txt!<br />
import com.jacob.com.*;<br />
import com.jacob.activeX.*;<br />
import java.io.*;</p>
<p>public class Client {</p>
<p>// 取得指定目录下面所有的doc文件名称<br />
// ------------------------------------------------------------------------------<br />
// 方法原型: change(String paths, String savepaths)<br />
// 功能描述: 将指定目录下面所有的doc文件转化为HTML并存储在相同目录下<br />
// 输入参数: String<br />
// 输出参数: 无<br />
// 返 回 值: 无<br />
// 其它说明: 递归<br />
// ------------------------------------------------------------------------------<br />
public static void change(String paths, String savepaths) {</p>
<p>&nbsp;&nbsp; File d = new File(paths);<br />
&nbsp;&nbsp; // 取得当前文件夹下所有文件和目录的列表<br />
&nbsp;&nbsp; File lists[] = d.listFiles();<br />
&nbsp;&nbsp; String path = new String("");</p>
<p>&nbsp;&nbsp; // 对当前目录下面所有文件进行检索<br />
&nbsp;&nbsp; for (int i = 0; i &lt; lists.length; i++) {<br />
&nbsp;&nbsp;&nbsp; if (lists[i].isFile()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String filename = lists[i].getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp; String filetype = new String("");<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 取得文件类型<br />
&nbsp;&nbsp;&nbsp;&nbsp; filetype = filename.substring((filename.length() - 3), filename<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .length());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; // 判断是否为doc文件<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (filetype.equals("doc")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("当前正在转换......");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 打印当前目录路径<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(paths);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 打印doc文件名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(filename.substring(0,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (filename.length() - 4)));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActiveXComponent app = new ActiveXComponent(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Word.Application");// 启动word</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String docpath = paths + filename;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String htmlpath = savepaths<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + filename.substring(0, (filename.length() - 4));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String inFile = docpath;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 要转换的word文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String tpFile = htmlpath;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // HTML文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app.setProperty("Visible", new Variant(false));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置word不可见<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object docs = app.getProperty("Documents").toDispatch();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object doc = Dispatch.invoke(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docs,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Open",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispatch.Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Object[] { inFile, new Variant(false),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Variant(true) }, new int[1])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .toDispatch();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 打开word文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispatch.invoke(doc, "SaveAs", Dispatch.Method,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Object[] { tpFile, new Variant(8) },<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new int[1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 作为html格式保存到临时文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Variant f = new Variant(false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispatch.call(doc, "Close", f);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app.invoke("Quit", new Variant[] {});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("转化完毕！");<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp; path = paths;<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 进入下一级目录<br />
&nbsp;&nbsp;&nbsp;&nbsp; path = path + lists[i].getName() + "\\";<br />
&nbsp;&nbsp;&nbsp;&nbsp; // 递归遍历所有目录<br />
&nbsp;&nbsp;&nbsp;&nbsp; change(path, savepaths);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}</p>
<p>// ------------------------------------------------------------------------------<br />
// 方法原型: main(String[] args)<br />
// 功能描述: main文件<br />
// 输入参数: 无<br />
// 输出参数: 无<br />
// 返 回 值: 无<br />
// 其它说明: 无<br />
// ------------------------------------------------------------------------------<br />
public static void main(String[] args) {<br />
&nbsp;&nbsp; String paths = new String("D:\\作业<a href="file://day54//">\\day54\\</a>");<br />
&nbsp;&nbsp; String savepaths = new String("D:\\作业<a href="file://day54//">\\day54\\</a>");<br />
&nbsp;&nbsp; change(paths, savepaths);<br />
}<br />
/*<br />
&nbsp;&nbsp; * 其中import的jar包是一个开源的东东，网上搜索即得。 Dispatch.invoke(doc, "SaveAs",<br />
&nbsp;&nbsp; * Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);<br />
&nbsp;&nbsp; * 修改Variant(8)},里面得参数即可将Word转化为各种类型。<br />
&nbsp;&nbsp; */</p>
<p>}<br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 15:29 <a href="http://www.blogjava.net/WshmAndLily/articles/143428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java实现汉字转换为拼音</title><link>http://www.blogjava.net/WshmAndLily/articles/143422.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143422.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143422.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143422.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143422.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143422.html</trackback:ping><description><![CDATA[<p>import java.util.HashMap;<br />
import java.util.Iterator;<br />
import java.util.LinkedHashMap;<br />
import java.util.Set;</p>
<p>public class Client {<br />
private static HashMap spellMap = null;</p>
<p>static {<br />
&nbsp;&nbsp; if (spellMap == null) {<br />
&nbsp;&nbsp;&nbsp; spellMap = new LinkedHashMap(400);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; initialize();<br />
&nbsp;&nbsp; System.out.println("Chinese transfer Spell Done.");<br />
}</p>
<p>private Client() {<br />
}</p>
<p>private static void spellPut(String spell, int ascii) {<br />
&nbsp;&nbsp; spellMap.put(spell, new Integer(ascii));<br />
}</p>
<p>private static void initialize() {<br />
&nbsp;&nbsp; spellPut("a", -20319);<br />
&nbsp;&nbsp; spellPut("ai", -20317);<br />
&nbsp;&nbsp; spellPut("an", -20304);<br />
&nbsp;&nbsp; spellPut("ang", -20295);<br />
&nbsp;&nbsp; spellPut("ao", -20292);<br />
&nbsp;&nbsp; spellPut("ba", -20283);<br />
&nbsp;&nbsp; spellPut("bai", -20265);<br />
&nbsp;&nbsp; spellPut("ban", -20257);<br />
&nbsp;&nbsp; spellPut("bang", -20242);<br />
&nbsp;&nbsp; spellPut("bao", -20230);<br />
&nbsp;&nbsp; spellPut("bei", -20051);<br />
&nbsp;&nbsp; spellPut("ben", -20036);<br />
&nbsp;&nbsp; spellPut("beng", -20032);<br />
&nbsp;&nbsp; spellPut("bi", -20026);<br />
&nbsp;&nbsp; spellPut("bian", -20002);<br />
&nbsp;&nbsp; spellPut("biao", -19990);<br />
&nbsp;&nbsp; spellPut("bie", -19986);<br />
&nbsp;&nbsp; spellPut("bin", -19982);<br />
&nbsp;&nbsp; spellPut("bing", -19976);<br />
&nbsp;&nbsp; spellPut("bo", -19805);<br />
&nbsp;&nbsp; spellPut("bu", -19784);<br />
&nbsp;&nbsp; spellPut("ca", -19775);<br />
&nbsp;&nbsp; spellPut("cai", -19774);<br />
&nbsp;&nbsp; spellPut("can", -19763);<br />
&nbsp;&nbsp; spellPut("cang", -19756);<br />
&nbsp;&nbsp; spellPut("cao", -19751);<br />
&nbsp;&nbsp; spellPut("ce", -19746);<br />
&nbsp;&nbsp; spellPut("ceng", -19741);<br />
&nbsp;&nbsp; spellPut("cha", -19739);<br />
&nbsp;&nbsp; spellPut("chai", -19728);<br />
&nbsp;&nbsp; spellPut("chan", -19725);<br />
&nbsp;&nbsp; spellPut("chang", -19715);<br />
&nbsp;&nbsp; spellPut("chao", -19540);<br />
&nbsp;&nbsp; spellPut("che", -19531);<br />
&nbsp;&nbsp; spellPut("chen", -19525);<br />
&nbsp;&nbsp; spellPut("cheng", -19515);<br />
&nbsp;&nbsp; spellPut("chi", -19500);<br />
&nbsp;&nbsp; spellPut("chong", -19484);<br />
&nbsp;&nbsp; spellPut("chou", -19479);<br />
&nbsp;&nbsp; spellPut("chu", -19467);<br />
&nbsp;&nbsp; spellPut("chuai", -19289);<br />
&nbsp;&nbsp; spellPut("chuan", -19288);<br />
&nbsp;&nbsp; spellPut("chuang", -19281);<br />
&nbsp;&nbsp; spellPut("chui", -19275);<br />
&nbsp;&nbsp; spellPut("chun", -19270);<br />
&nbsp;&nbsp; spellPut("chuo", -19263);<br />
&nbsp;&nbsp; spellPut("ci", -19261);<br />
&nbsp;&nbsp; spellPut("cong", -19249);<br />
&nbsp;&nbsp; spellPut("cou", -19243);<br />
&nbsp;&nbsp; spellPut("cu", -19242);<br />
&nbsp;&nbsp; spellPut("cuan", -19238);<br />
&nbsp;&nbsp; spellPut("cui", -19235);<br />
&nbsp;&nbsp; spellPut("cun", -19227);<br />
&nbsp;&nbsp; spellPut("cuo", -19224);<br />
&nbsp;&nbsp; spellPut("da", -19218);<br />
&nbsp;&nbsp; spellPut("dai", -19212);<br />
&nbsp;&nbsp; spellPut("dan", -19038);<br />
&nbsp;&nbsp; spellPut("dang", -19023);<br />
&nbsp;&nbsp; spellPut("dao", -19018);<br />
&nbsp;&nbsp; spellPut("de", -19006);<br />
&nbsp;&nbsp; spellPut("deng", -19003);<br />
&nbsp;&nbsp; spellPut("di", -18996);<br />
&nbsp;&nbsp; spellPut("dian", -18977);<br />
&nbsp;&nbsp; spellPut("diao", -18961);<br />
&nbsp;&nbsp; spellPut("die", -18952);<br />
&nbsp;&nbsp; spellPut("ding", -18783);<br />
&nbsp;&nbsp; spellPut("diu", -18774);<br />
&nbsp;&nbsp; spellPut("dong", -18773);<br />
&nbsp;&nbsp; spellPut("dou", -18763);<br />
&nbsp;&nbsp; spellPut("du", -18756);<br />
&nbsp;&nbsp; spellPut("duan", -18741);<br />
&nbsp;&nbsp; spellPut("dui", -18735);<br />
&nbsp;&nbsp; spellPut("dun", -18731);<br />
&nbsp;&nbsp; spellPut("duo", -18722);<br />
&nbsp;&nbsp; spellPut("e", -18710);<br />
&nbsp;&nbsp; spellPut("en", -18697);<br />
&nbsp;&nbsp; spellPut("er", -18696);<br />
&nbsp;&nbsp; spellPut("fa", -18526);<br />
&nbsp;&nbsp; spellPut("fan", -18518);<br />
&nbsp;&nbsp; spellPut("fang", -18501);<br />
&nbsp;&nbsp; spellPut("fei", -18490);<br />
&nbsp;&nbsp; spellPut("fen", -18478);<br />
&nbsp;&nbsp; spellPut("feng", -18463);<br />
&nbsp;&nbsp; spellPut("fo", -18448);<br />
&nbsp;&nbsp; spellPut("fou", -18447);<br />
&nbsp;&nbsp; spellPut("fu", -18446);<br />
&nbsp;&nbsp; spellPut("ga", -18239);<br />
&nbsp;&nbsp; spellPut("gai", -18237);<br />
&nbsp;&nbsp; spellPut("gan", -18231);<br />
&nbsp;&nbsp; spellPut("gang", -18220);<br />
&nbsp;&nbsp; spellPut("gao", -18211);<br />
&nbsp;&nbsp; spellPut("ge", -18201);<br />
&nbsp;&nbsp; spellPut("gei", -18184);<br />
&nbsp;&nbsp; spellPut("gen", -18183);<br />
&nbsp;&nbsp; spellPut("geng", -18181);<br />
&nbsp;&nbsp; spellPut("gong", -18012);<br />
&nbsp;&nbsp; spellPut("gou", -17997);<br />
&nbsp;&nbsp; spellPut("gu", -17988);<br />
&nbsp;&nbsp; spellPut("gua", -17970);<br />
&nbsp;&nbsp; spellPut("guai", -17964);<br />
&nbsp;&nbsp; spellPut("guan", -17961);<br />
&nbsp;&nbsp; spellPut("guang", -17950);<br />
&nbsp;&nbsp; spellPut("gui", -17947);<br />
&nbsp;&nbsp; spellPut("gun", -17931);<br />
&nbsp;&nbsp; spellPut("guo", -17928);<br />
&nbsp;&nbsp; spellPut("ha", -17922);<br />
&nbsp;&nbsp; spellPut("hai", -17759);<br />
&nbsp;&nbsp; spellPut("han", -17752);<br />
&nbsp;&nbsp; spellPut("hang", -17733);<br />
&nbsp;&nbsp; spellPut("hao", -17730);<br />
&nbsp;&nbsp; spellPut("he", -17721);<br />
&nbsp;&nbsp; spellPut("hei", -17703);<br />
&nbsp;&nbsp; spellPut("hen", -17701);<br />
&nbsp;&nbsp; spellPut("heng", -17697);<br />
&nbsp;&nbsp; spellPut("hong", -17692);<br />
&nbsp;&nbsp; spellPut("hou", -17683);<br />
&nbsp;&nbsp; spellPut("hu", -17676);<br />
&nbsp;&nbsp; spellPut("hua", -17496);<br />
&nbsp;&nbsp; spellPut("huai", -17487);<br />
&nbsp;&nbsp; spellPut("huan", -17482);<br />
&nbsp;&nbsp; spellPut("huang", -17468);<br />
&nbsp;&nbsp; spellPut("hui", -17454);<br />
&nbsp;&nbsp; spellPut("hun", -17433);<br />
&nbsp;&nbsp; spellPut("huo", -17427);<br />
&nbsp;&nbsp; spellPut("ji", -17417);<br />
&nbsp;&nbsp; spellPut("jia", -17202);<br />
&nbsp;&nbsp; spellPut("jian", -17185);<br />
&nbsp;&nbsp; spellPut("jiang", -16983);<br />
&nbsp;&nbsp; spellPut("jiao", -16970);<br />
&nbsp;&nbsp; spellPut("jie", -16942);<br />
&nbsp;&nbsp; spellPut("jin", -16915);<br />
&nbsp;&nbsp; spellPut("jing", -16733);<br />
&nbsp;&nbsp; spellPut("jiong", -16708);<br />
&nbsp;&nbsp; spellPut("jiu", -16706);<br />
&nbsp;&nbsp; spellPut("ju", -16689);<br />
&nbsp;&nbsp; spellPut("juan", -16664);<br />
&nbsp;&nbsp; spellPut("jue", -16657);<br />
&nbsp;&nbsp; spellPut("jun", -16647);<br />
&nbsp;&nbsp; spellPut("ka", -16474);<br />
&nbsp;&nbsp; spellPut("kai", -16470);<br />
&nbsp;&nbsp; spellPut("kan", -16465);<br />
&nbsp;&nbsp; spellPut("kang", -16459);<br />
&nbsp;&nbsp; spellPut("kao", -16452);<br />
&nbsp;&nbsp; spellPut("ke", -16448);<br />
&nbsp;&nbsp; spellPut("ken", -16433);<br />
&nbsp;&nbsp; spellPut("keng", -16429);<br />
&nbsp;&nbsp; spellPut("kong", -16427);<br />
&nbsp;&nbsp; spellPut("kou", -16423);<br />
&nbsp;&nbsp; spellPut("ku", -16419);<br />
&nbsp;&nbsp; spellPut("kua", -16412);<br />
&nbsp;&nbsp; spellPut("kuai", -16407);<br />
&nbsp;&nbsp; spellPut("kuan", -16403);<br />
&nbsp;&nbsp; spellPut("kuang", -16401);<br />
&nbsp;&nbsp; spellPut("kui", -16393);<br />
&nbsp;&nbsp; spellPut("kun", -16220);<br />
&nbsp;&nbsp; spellPut("kuo", -16216);<br />
&nbsp;&nbsp; spellPut("la", -16212);<br />
&nbsp;&nbsp; spellPut("lai", -16205);<br />
&nbsp;&nbsp; spellPut("lan", -16202);<br />
&nbsp;&nbsp; spellPut("lang", -16187);<br />
&nbsp;&nbsp; spellPut("lao", -16180);<br />
&nbsp;&nbsp; spellPut("le", -16171);<br />
&nbsp;&nbsp; spellPut("lei", -16169);<br />
&nbsp;&nbsp; spellPut("leng", -16158);<br />
&nbsp;&nbsp; spellPut("li", -16155);<br />
&nbsp;&nbsp; spellPut("lia", -15959);<br />
&nbsp;&nbsp; spellPut("lian", -15958);<br />
&nbsp;&nbsp; spellPut("liang", -15944);<br />
&nbsp;&nbsp; spellPut("liao", -15933);<br />
&nbsp;&nbsp; spellPut("lie", -15920);<br />
&nbsp;&nbsp; spellPut("lin", -15915);<br />
&nbsp;&nbsp; spellPut("ling", -15903);<br />
&nbsp;&nbsp; spellPut("liu", -15889);<br />
&nbsp;&nbsp; spellPut("long", -15878);<br />
&nbsp;&nbsp; spellPut("lou", -15707);<br />
&nbsp;&nbsp; spellPut("lu", -15701);<br />
&nbsp;&nbsp; spellPut("lv", -15681);<br />
&nbsp;&nbsp; spellPut("luan", -15667);<br />
&nbsp;&nbsp; spellPut("lue", -15661);<br />
&nbsp;&nbsp; spellPut("lun", -15659);<br />
&nbsp;&nbsp; spellPut("luo", -15652);<br />
&nbsp;&nbsp; spellPut("ma", -15640);<br />
&nbsp;&nbsp; spellPut("mai", -15631);<br />
&nbsp;&nbsp; spellPut("man", -15625);<br />
&nbsp;&nbsp; spellPut("mang", -15454);<br />
&nbsp;&nbsp; spellPut("mao", -15448);<br />
&nbsp;&nbsp; spellPut("me", -15436);<br />
&nbsp;&nbsp; spellPut("mei", -15435);<br />
&nbsp;&nbsp; spellPut("men", -15419);<br />
&nbsp;&nbsp; spellPut("meng", -15416);<br />
&nbsp;&nbsp; spellPut("mi", -15408);<br />
&nbsp;&nbsp; spellPut("mian", -15394);<br />
&nbsp;&nbsp; spellPut("miao", -15385);<br />
&nbsp;&nbsp; spellPut("mie", -15377);<br />
&nbsp;&nbsp; spellPut("min", -15375);<br />
&nbsp;&nbsp; spellPut("ming", -15369);<br />
&nbsp;&nbsp; spellPut("miu", -15363);<br />
&nbsp;&nbsp; spellPut("mo", -15362);<br />
&nbsp;&nbsp; spellPut("mou", -15183);<br />
&nbsp;&nbsp; spellPut("mu", -15180);<br />
&nbsp;&nbsp; spellPut("na", -15165);<br />
&nbsp;&nbsp; spellPut("nai", -15158);<br />
&nbsp;&nbsp; spellPut("nan", -15153);<br />
&nbsp;&nbsp; spellPut("nang", -15150);<br />
&nbsp;&nbsp; spellPut("nao", -15149);<br />
&nbsp;&nbsp; spellPut("ne", -15144);<br />
&nbsp;&nbsp; spellPut("nei", -15143);<br />
&nbsp;&nbsp; spellPut("nen", -15141);<br />
&nbsp;&nbsp; spellPut("neng", -15140);<br />
&nbsp;&nbsp; spellPut("ni", -15139);<br />
&nbsp;&nbsp; spellPut("nian", -15128);<br />
&nbsp;&nbsp; spellPut("niang", -15121);<br />
&nbsp;&nbsp; spellPut("niao", -15119);<br />
&nbsp;&nbsp; spellPut("nie", -15117);<br />
&nbsp;&nbsp; spellPut("nin", -15110);<br />
&nbsp;&nbsp; spellPut("ning", -15109);<br />
&nbsp;&nbsp; spellPut("niu", -14941);<br />
&nbsp;&nbsp; spellPut("nong", -14937);<br />
&nbsp;&nbsp; spellPut("nu", -14933);<br />
&nbsp;&nbsp; spellPut("nv", -14930);<br />
&nbsp;&nbsp; spellPut("nuan", -14929);<br />
&nbsp;&nbsp; spellPut("nue", -14928);<br />
&nbsp;&nbsp; spellPut("nuo", -14926);<br />
&nbsp;&nbsp; spellPut("o", -14922);<br />
&nbsp;&nbsp; spellPut("ou", -14921);<br />
&nbsp;&nbsp; spellPut("pa", -14914);<br />
&nbsp;&nbsp; spellPut("pai", -14908);<br />
&nbsp;&nbsp; spellPut("pan", -14902);<br />
&nbsp;&nbsp; spellPut("pang", -14894);<br />
&nbsp;&nbsp; spellPut("pao", -14889);<br />
&nbsp;&nbsp; spellPut("pei", -14882);<br />
&nbsp;&nbsp; spellPut("pen", -14873);<br />
&nbsp;&nbsp; spellPut("peng", -14871);<br />
&nbsp;&nbsp; spellPut("pi", -14857);<br />
&nbsp;&nbsp; spellPut("pian", -14678);<br />
&nbsp;&nbsp; spellPut("piao", -14674);<br />
&nbsp;&nbsp; spellPut("pie", -14670);<br />
&nbsp;&nbsp; spellPut("pin", -14668);<br />
&nbsp;&nbsp; spellPut("ping", -14663);<br />
&nbsp;&nbsp; spellPut("po", -14654);<br />
&nbsp;&nbsp; spellPut("pu", -14645);<br />
&nbsp;&nbsp; spellPut("qi", -14630);<br />
&nbsp;&nbsp; spellPut("qia", -14594);<br />
&nbsp;&nbsp; spellPut("qian", -14429);<br />
&nbsp;&nbsp; spellPut("qiang", -14407);<br />
&nbsp;&nbsp; spellPut("qiao", -14399);<br />
&nbsp;&nbsp; spellPut("qie", -14384);<br />
&nbsp;&nbsp; spellPut("qin", -14379);<br />
&nbsp;&nbsp; spellPut("qing", -14368);<br />
&nbsp;&nbsp; spellPut("qiong", -14355);<br />
&nbsp;&nbsp; spellPut("qiu", -14353);<br />
&nbsp;&nbsp; spellPut("qu", -14345);<br />
&nbsp;&nbsp; spellPut("quan", -14170);<br />
&nbsp;&nbsp; spellPut("que", -14159);<br />
&nbsp;&nbsp; spellPut("qun", -14151);<br />
&nbsp;&nbsp; spellPut("ran", -14149);<br />
&nbsp;&nbsp; spellPut("rang", -14145);<br />
&nbsp;&nbsp; spellPut("rao", -14140);<br />
&nbsp;&nbsp; spellPut("re", -14137);<br />
&nbsp;&nbsp; spellPut("ren", -14135);<br />
&nbsp;&nbsp; spellPut("reng", -14125);<br />
&nbsp;&nbsp; spellPut("ri", -14123);<br />
&nbsp;&nbsp; spellPut("rong", -14122);<br />
&nbsp;&nbsp; spellPut("rou", -14112);<br />
&nbsp;&nbsp; spellPut("ru", -14109);<br />
&nbsp;&nbsp; spellPut("ruan", -14099);<br />
&nbsp;&nbsp; spellPut("rui", -14097);<br />
&nbsp;&nbsp; spellPut("run", -14094);<br />
&nbsp;&nbsp; spellPut("ruo", -14092);<br />
&nbsp;&nbsp; spellPut("sa", -14090);<br />
&nbsp;&nbsp; spellPut("sai", -14087);<br />
&nbsp;&nbsp; spellPut("san", -14083);<br />
&nbsp;&nbsp; spellPut("sang", -13917);<br />
&nbsp;&nbsp; spellPut("sao", -13914);<br />
&nbsp;&nbsp; spellPut("se", -13910);<br />
&nbsp;&nbsp; spellPut("sen", -13907);<br />
&nbsp;&nbsp; spellPut("seng", -13906);<br />
&nbsp;&nbsp; spellPut("sha", -13905);<br />
&nbsp;&nbsp; spellPut("shai", -13896);<br />
&nbsp;&nbsp; spellPut("shan", -13894);<br />
&nbsp;&nbsp; spellPut("shang", -13878);<br />
&nbsp;&nbsp; spellPut("shao", -13870);<br />
&nbsp;&nbsp; spellPut("she", -13859);<br />
&nbsp;&nbsp; spellPut("shen", -13847);<br />
&nbsp;&nbsp; spellPut("sheng", -13831);<br />
&nbsp;&nbsp; spellPut("shi", -13658);<br />
&nbsp;&nbsp; spellPut("shou", -13611);<br />
&nbsp;&nbsp; spellPut("shu", -13601);<br />
&nbsp;&nbsp; spellPut("shua", -13406);<br />
&nbsp;&nbsp; spellPut("shuai", -13404);<br />
&nbsp;&nbsp; spellPut("shuan", -13400);<br />
&nbsp;&nbsp; spellPut("shuang", -13398);<br />
&nbsp;&nbsp; spellPut("shui", -13395);<br />
&nbsp;&nbsp; spellPut("shun", -13391);<br />
&nbsp;&nbsp; spellPut("shuo", -13387);<br />
&nbsp;&nbsp; spellPut("si", -13383);<br />
&nbsp;&nbsp; spellPut("song", -13367);<br />
&nbsp;&nbsp; spellPut("sou", -13359);<br />
&nbsp;&nbsp; spellPut("su", -13356);<br />
&nbsp;&nbsp; spellPut("suan", -13343);<br />
&nbsp;&nbsp; spellPut("sui", -13340);<br />
&nbsp;&nbsp; spellPut("sun", -13329);<br />
&nbsp;&nbsp; spellPut("suo", -13326);<br />
&nbsp;&nbsp; spellPut("ta", -13318);<br />
&nbsp;&nbsp; spellPut("tai", -13147);<br />
&nbsp;&nbsp; spellPut("tan", -13138);<br />
&nbsp;&nbsp; spellPut("tang", -13120);<br />
&nbsp;&nbsp; spellPut("tao", -13107);<br />
&nbsp;&nbsp; spellPut("te", -13096);<br />
&nbsp;&nbsp; spellPut("teng", -13095);<br />
&nbsp;&nbsp; spellPut("ti", -13091);<br />
&nbsp;&nbsp; spellPut("tian", -13076);<br />
&nbsp;&nbsp; spellPut("tiao", -13068);<br />
&nbsp;&nbsp; spellPut("tie", -13063);<br />
&nbsp;&nbsp; spellPut("ting", -13060);<br />
&nbsp;&nbsp; spellPut("tong", -12888);<br />
&nbsp;&nbsp; spellPut("tou", -12875);<br />
&nbsp;&nbsp; spellPut("tu", -12871);<br />
&nbsp;&nbsp; spellPut("tuan", -12860);<br />
&nbsp;&nbsp; spellPut("tui", -12858);<br />
&nbsp;&nbsp; spellPut("tun", -12852);<br />
&nbsp;&nbsp; spellPut("tuo", -12849);<br />
&nbsp;&nbsp; spellPut("wa", -12838);<br />
&nbsp;&nbsp; spellPut("wai", -12831);<br />
&nbsp;&nbsp; spellPut("wan", -12829);<br />
&nbsp;&nbsp; spellPut("wang", -12812);<br />
&nbsp;&nbsp; spellPut("wei", -12802);<br />
&nbsp;&nbsp; spellPut("wen", -12607);<br />
&nbsp;&nbsp; spellPut("weng", -12597);<br />
&nbsp;&nbsp; spellPut("wo", -12594);<br />
&nbsp;&nbsp; spellPut("wu", -12585);<br />
&nbsp;&nbsp; spellPut("xi", -12556);<br />
&nbsp;&nbsp; spellPut("xia", -12359);<br />
&nbsp;&nbsp; spellPut("xian", -12346);<br />
&nbsp;&nbsp; spellPut("xiang", -12320);<br />
&nbsp;&nbsp; spellPut("xiao", -12300);<br />
&nbsp;&nbsp; spellPut("xie", -12120);<br />
&nbsp;&nbsp; spellPut("xin", -12099);<br />
&nbsp;&nbsp; spellPut("xing", -12089);<br />
&nbsp;&nbsp; spellPut("xiong", -12074);<br />
&nbsp;&nbsp; spellPut("xiu", -12067);<br />
&nbsp;&nbsp; spellPut("xu", -12058);<br />
&nbsp;&nbsp; spellPut("xuan", -12039);<br />
&nbsp;&nbsp; spellPut("xue", -11867);<br />
&nbsp;&nbsp; spellPut("xun", -11861);<br />
&nbsp;&nbsp; spellPut("ya", -11847);<br />
&nbsp;&nbsp; spellPut("yan", -11831);<br />
&nbsp;&nbsp; spellPut("yang", -11798);<br />
&nbsp;&nbsp; spellPut("yao", -11781);<br />
&nbsp;&nbsp; spellPut("ye", -11604);<br />
&nbsp;&nbsp; spellPut("yi", -11589);<br />
&nbsp;&nbsp; spellPut("yin", -11536);<br />
&nbsp;&nbsp; spellPut("ying", -11358);<br />
&nbsp;&nbsp; spellPut("yo", -11340);<br />
&nbsp;&nbsp; spellPut("yong", -11339);<br />
&nbsp;&nbsp; spellPut("you", -11324);<br />
&nbsp;&nbsp; spellPut("yu", -11303);<br />
&nbsp;&nbsp; spellPut("yuan", -11097);<br />
&nbsp;&nbsp; spellPut("yue", -11077);<br />
&nbsp;&nbsp; spellPut("yun", -11067);<br />
&nbsp;&nbsp; spellPut("za", -11055);<br />
&nbsp;&nbsp; spellPut("zai", -11052);<br />
&nbsp;&nbsp; spellPut("zan", -11045);<br />
&nbsp;&nbsp; spellPut("zang", -11041);<br />
&nbsp;&nbsp; spellPut("zao", -11038);<br />
&nbsp;&nbsp; spellPut("ze", -11024);<br />
&nbsp;&nbsp; spellPut("zei", -11020);<br />
&nbsp;&nbsp; spellPut("zen", -11019);<br />
&nbsp;&nbsp; spellPut("zeng", -11018);<br />
&nbsp;&nbsp; spellPut("zha", -11014);<br />
&nbsp;&nbsp; spellPut("zhai", -10838);<br />
&nbsp;&nbsp; spellPut("zhan", -10832);<br />
&nbsp;&nbsp; spellPut("zhang", -10815);<br />
&nbsp;&nbsp; spellPut("zhao", -10800);<br />
&nbsp;&nbsp; spellPut("zhe", -10790);<br />
&nbsp;&nbsp; spellPut("zhen", -10780);<br />
&nbsp;&nbsp; spellPut("zheng", -10764);<br />
&nbsp;&nbsp; spellPut("zhi", -10587);<br />
&nbsp;&nbsp; spellPut("zhong", -10544);<br />
&nbsp;&nbsp; spellPut("zhou", -10533);<br />
&nbsp;&nbsp; spellPut("zhu", -10519);<br />
&nbsp;&nbsp; spellPut("zhua", -10331);<br />
&nbsp;&nbsp; spellPut("zhuai", -10329);<br />
&nbsp;&nbsp; spellPut("zhuan", -10328);<br />
&nbsp;&nbsp; spellPut("zhuang", -10322);<br />
&nbsp;&nbsp; spellPut("zhui", -10315);<br />
&nbsp;&nbsp; spellPut("zhun", -10309);<br />
&nbsp;&nbsp; spellPut("zhuo", -10307);<br />
&nbsp;&nbsp; spellPut("zi", -10296);<br />
&nbsp;&nbsp; spellPut("zong", -10281);<br />
&nbsp;&nbsp; spellPut("zou", -10274);<br />
&nbsp;&nbsp; spellPut("zu", -10270);<br />
&nbsp;&nbsp; spellPut("zuan", -10262);<br />
&nbsp;&nbsp; spellPut("zui", -10260);<br />
&nbsp;&nbsp; spellPut("zun", -10256);<br />
&nbsp;&nbsp; spellPut("zuo", -10254);<br />
}</p>
<p>/**<br />
&nbsp;&nbsp; * 获得单个汉字的Ascii.<br />
&nbsp;&nbsp; * <br />
&nbsp;&nbsp; * @param cn<br />
&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char 汉字字符<br />
&nbsp;&nbsp; * @return int 错误返回 0,否则返回ascii<br />
&nbsp;&nbsp; */<br />
public static int getCnAscii(char cn) {<br />
&nbsp;&nbsp; byte[] bytes = (String.valueOf(cn)).getBytes();<br />
&nbsp;&nbsp; if (bytes == null || bytes.length &gt; 2 || bytes.length &lt;= 0) { // 错误<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; if (bytes.length == 1) { // 英文字符<br />
&nbsp;&nbsp;&nbsp; return bytes[0];<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; if (bytes.length == 2) { // 中文字符<br />
&nbsp;&nbsp;&nbsp; int hightByte = 256 + bytes[0];<br />
&nbsp;&nbsp;&nbsp; int lowByte = 256 + bytes[1];<br />
&nbsp;&nbsp;&nbsp; int ascii = (256 * hightByte + lowByte) - 256 * 256;<br />
&nbsp;&nbsp;&nbsp; return ascii;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; return 0; // 错误<br />
}</p>
<p>/**<br />
&nbsp;&nbsp; * 根据ASCII码到SpellMap中查找对应的拼音<br />
&nbsp;&nbsp; * <br />
&nbsp;&nbsp; * @param ascii<br />
&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int 字符对应的ASCII<br />
&nbsp;&nbsp; * @return String 拼音,首先判断ASCII是否&gt;0&amp;&lt;160,如果是返回对应的字符,<br />
&nbsp;&nbsp; * <br />
&nbsp;&nbsp; * 否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音.<br />
&nbsp;&nbsp; */<br />
public static String getSpellByAscii(int ascii) {<br />
&nbsp;&nbsp; if (ascii &gt; 0 &amp;&amp; ascii &lt; 160) { // 单字符<br />
&nbsp;&nbsp;&nbsp; return String.valueOf((char) ascii);<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; if (ascii &lt; -20319 || ascii &gt; -10247) { // 不知道的字符<br />
&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; Set keySet = spellMap.keySet();<br />
&nbsp;&nbsp; Iterator it = keySet.iterator();<br />
&nbsp;&nbsp; String spell0 = null;<br />
&nbsp;&nbsp; String spell = null;</p>
<p>&nbsp;&nbsp; int asciiRang0 = -20319;<br />
&nbsp;&nbsp; int asciiRang;<br />
&nbsp;&nbsp; while (it.hasNext()) {<br />
&nbsp;&nbsp;&nbsp; spell = (String) it.next();<br />
&nbsp;&nbsp;&nbsp; Object valObj = spellMap.get(spell);<br />
&nbsp;&nbsp;&nbsp; if (valObj instanceof Integer) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; asciiRang = ((Integer) valObj).intValue();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; if (ascii &gt;= asciiRang0 &amp;&amp; ascii &lt; asciiRang) { // 区间找到<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (spell0 == null) ? spell : spell0;<br />
&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spell0 = spell;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asciiRang0 = asciiRang;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; return null;</p>
<p>}</p>
<p>/**<br />
&nbsp;&nbsp; * 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换<br />
&nbsp;&nbsp; * <br />
&nbsp;&nbsp; * @param cnStr<br />
&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String 字符串<br />
&nbsp;&nbsp; * @return String 转换成全拼后的字符串<br />
&nbsp;&nbsp; */<br />
public static String getFullSpell(String cnStr) {<br />
&nbsp;&nbsp; if (null == cnStr || "".equals(cnStr.trim())) {<br />
&nbsp;&nbsp;&nbsp; return cnStr;<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; char[] chars = cnStr.toCharArray();<br />
&nbsp;&nbsp; StringBuffer retuBuf = new StringBuffer();<br />
&nbsp;&nbsp; for (int i = 0, Len = chars.length; i &lt; Len; i++) {<br />
&nbsp;&nbsp;&nbsp; int ascii = getCnAscii(chars[i]);<br />
&nbsp;&nbsp;&nbsp; if (ascii == 0) { // 取ascii时出错<br />
&nbsp;&nbsp;&nbsp;&nbsp; retuBuf.append(chars[i]);<br />
&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp; String spell = getSpellByAscii(ascii);<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (spell == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retuBuf.append(chars[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retuBuf.append(spell);<br />
&nbsp;&nbsp;&nbsp;&nbsp; } // end of if spell == null<br />
&nbsp;&nbsp;&nbsp; } // end of if ascii &lt;= -20400<br />
&nbsp;&nbsp; } // end of for</p>
<p>&nbsp;&nbsp; return retuBuf.toString();<br />
}</p>
<p>public static void main(String[] args) {<br />
&nbsp;&nbsp; String str = null;<br />
&nbsp;&nbsp; str = "中华人民共和国";<br />
&nbsp;&nbsp; System.out.println("Spell=" + Client.getFullSpell(str));</p>
<p>}<br />
}<br />
</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143422.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 15:21 <a href="http://www.blogjava.net/WshmAndLily/articles/143422.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zip解压缩[转]</title><link>http://www.blogjava.net/WshmAndLily/articles/142100.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 02 Sep 2007 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/142100.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/142100.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/142100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/142100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/142100.html</trackback:ping><description><![CDATA[<p><a href="/Files/WshmAndLily/ant.rar">需要的Ant.jar包<br />
</a>package com.semovy.test;<br />
/*<br />
调用org.apache.tools.zip实现压缩。<br />
夜可以使用java.util.zip不过如果是中文的话，<br />
解压缩的时候文件名字会是乱码。原因是解压缩软件的编码格式跟<br />
java.util.zip.ZipInputStream的编码字符集不同<br />
java.util.zip.ZipInputStream的字符集固定是UTF-8</p>
<p>注销的部分是解压缩的代码。<br />
*/<br />
import java.io.File;<br />
import java.io.FileInputStream;<br />
import java.io.FileOutputStream;<br />
import java.io.InputStream;</p>
<p>import org.apache.tools.zip.ZipEntry;<br />
import org.apache.tools.zip.ZipFile;<br />
import org.apache.tools.zip.ZipOutputStream;</p>
<p>/*<br />
* @作者：张华 @日期：2006-5-14 @说明：<br />
*/<br />
public class ZipUtil {</p>
<p>public void zip(String zipFileName, String inputFile) throws Exception {<br />
&nbsp;zip(zipFileName, new File(inputFile));<br />
}</p>
<p>public void zip(String zipFileName, File inputFile) throws Exception {<br />
&nbsp;ZipOutputStream out = new ZipOutputStream(new FileOutputStream(<br />
&nbsp;&nbsp; new String(zipFileName.getBytes("gb2312"))));<br />
&nbsp;System.out.println("zip start");<br />
&nbsp;zip(out, inputFile, "");<br />
&nbsp;System.out.println("zip done");<br />
&nbsp;out.close();<br />
}</p>
<p>public void zip(ZipOutputStream out, File f, String base) throws Exception {<br />
&nbsp;System.out.println("Zipping&nbsp; " + f.getName());<br />
&nbsp;if (f.isDirectory()) {<br />
&nbsp; File[] fl = f.listFiles();<br />
&nbsp; //out.putNextEntry(new ZipEntry(base + "/"));<br />
&nbsp; out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));<br />
&nbsp; base = base.length() == 0 ? "" : base + "/";<br />
&nbsp; for (int i = 0; i &lt; fl.length; i++) {<br />
&nbsp;&nbsp; zip(out, fl[i], base + fl[i].getName());<br />
&nbsp;&nbsp; System.out.println(fl[i].getName());<br />
&nbsp;&nbsp; //System.out.println(new String(fl[i].getName().getBytes("gb2312")));<br />
&nbsp; }<br />
&nbsp;} else {<br />
&nbsp; //out.putNextEntry(new ZipEntry(base));<br />
&nbsp; out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));<br />
&nbsp; System.out.println(base);<br />
&nbsp; FileInputStream in = new FileInputStream(f);<br />
&nbsp; int b;</p>
<p>&nbsp; while ((b = in.read()) != -1)<br />
&nbsp;&nbsp; out.write(b);<br />
&nbsp; in.close();<br />
&nbsp;}</p>
<p>}</p>
<p>private void createDirectory(String directory, String subDirectory) {<br />
&nbsp;String dir[];<br />
&nbsp;File fl = new File(directory);<br />
&nbsp;try {<br />
&nbsp; if (subDirectory == "" &amp;&amp; fl.exists() != true)<br />
&nbsp;&nbsp; fl.mkdir();<br />
&nbsp; else if (subDirectory != "") {<br />
&nbsp;&nbsp; dir = subDirectory.replace('\\', '/').split("/");<br />
&nbsp;&nbsp; for (int i = 0; i &lt; dir.length; i++) {<br />
&nbsp;&nbsp;&nbsp; File subFile = new File(directory + File.separator + dir[i]);<br />
&nbsp;&nbsp;&nbsp; if (subFile.exists() == false)<br />
&nbsp;&nbsp;&nbsp;&nbsp; subFile.mkdir();<br />
&nbsp;&nbsp;&nbsp; directory += File.separator + dir[i];<br />
&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp;} catch (Exception ex) {<br />
&nbsp; System.out.println(ex.getMessage());<br />
&nbsp;}<br />
}</p>
<p>public void unZip(String zipFileName, String outputDirectory)<br />
&nbsp; throws Exception {<br />
&nbsp;try {<br />
&nbsp; ZipFile zipFile = new ZipFile(zipFileName);<br />
&nbsp; java.util.Enumeration e = zipFile.getEntries();<br />
&nbsp; ZipEntry zipEntry = null;<br />
&nbsp; createDirectory(outputDirectory, "");<br />
&nbsp; while (e.hasMoreElements()) {<br />
&nbsp;&nbsp; zipEntry = (ZipEntry) e.nextElement();<br />
&nbsp;&nbsp; System.out.println("正在解压: " + zipEntry.getName());<br />
&nbsp;&nbsp; String name= null;<br />
&nbsp;&nbsp; if (zipEntry.isDirectory()) {<br />
&nbsp;&nbsp;&nbsp; name = zipEntry.getName();<br />
&nbsp;&nbsp;&nbsp; name = name.substring(0, name.length() - 1);<br />
&nbsp;&nbsp;&nbsp; File f = new File(outputDirectory + File.separator + name);<br />
&nbsp;&nbsp;&nbsp; f.mkdir();<br />
&nbsp;&nbsp;&nbsp; System.out.println("创建目录：" + outputDirectory + File.separator + name);<br />
&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp; String fileName = zipEntry.getName();<br />
&nbsp;&nbsp;&nbsp; fileName = fileName.replace('\\', '/');<br />
&nbsp;&nbsp;&nbsp; // System.out.println("测试文件1：" +fileName);<br />
&nbsp;&nbsp;&nbsp; if (fileName.indexOf("/") != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; createDirectory(outputDirectory, fileName.substring(0,fileName.lastIndexOf("/")));<br />
&nbsp;&nbsp;&nbsp;&nbsp; fileName = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; File f = new File(outputDirectory + File.separator + zipEntry.getName());</p>
<p>&nbsp;&nbsp;&nbsp; f.createNewFile();<br />
&nbsp;&nbsp;&nbsp; InputStream in = zipFile.getInputStream(zipEntry);<br />
&nbsp;&nbsp;&nbsp; FileOutputStream out = new FileOutputStream(f);</p>
<p>&nbsp;&nbsp;&nbsp; byte[] by = new byte[1024];<br />
&nbsp;&nbsp;&nbsp; int c;<br />
&nbsp;&nbsp;&nbsp; while ((c = in.read(by)) != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; out.write(by, 0, c);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp; in.close();<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp; } <br />
&nbsp; <br />
&nbsp; //删除文件不能在这里删，因为文件正在使用，应在上传那处删<br />
//&nbsp; 解压后，删除压缩文件<br />
//&nbsp; File zipFileToDel = new File(zipFileName);<br />
//&nbsp; zipFileToDel.delete();<br />
//&nbsp; System.out.println("正在删除文件："+ zipFileToDel.getCanonicalPath());<br />
&nbsp; <br />
//&nbsp; //删除解压后的那一层目录<br />
//&nbsp; delALayerDir(zipFileName, outputDirectory);<br />
&nbsp; <br />
&nbsp;} catch (Exception ex) {<br />
&nbsp; System.out.println(ex.getMessage());<br />
&nbsp;}</p>
<p>}</p>
<p>/**<br />
&nbsp;* 删掉一层目录<br />
&nbsp;* @param zipFileName<br />
&nbsp;* @param outputDirectory<br />
&nbsp;*/<br />
public void delALayerDir(String zipFileName, String outputDirectory) {</p>
<p>&nbsp;String[] dir = zipFileName.replace('\\', '/').split("/");<br />
&nbsp;String fileFullName = dir[dir.length - 1]; //得到aa.zip<br />
&nbsp;int pos = -1;<br />
&nbsp;pos = fileFullName.indexOf(".");<br />
&nbsp;String fileName = fileFullName.substring(0, pos); //得到aa<br />
&nbsp;String sourceDir = outputDirectory + File.separator + fileName;<br />
&nbsp;try {<br />
&nbsp; copyFile(new File(outputDirectory), new File(sourceDir), new File(sourceDir));</p>
<p>&nbsp; deleteSourceBaseDir(new File(sourceDir));</p>
<p>&nbsp;} catch (Exception e) {<br />
&nbsp; e.printStackTrace();<br />
&nbsp;}<br />
}</p>
<p>/**<br />
&nbsp;* 将sourceDir目录的文件全部copy到destDir中去<br />
&nbsp;*/<br />
public void copyFile(File destDir, File sourceBaseDir, File sourceDir)<br />
&nbsp; throws Exception {</p>
<p>&nbsp;File[] lists = sourceDir.listFiles();<br />
&nbsp;String line = null;<br />
&nbsp;String url = null;<br />
&nbsp;if(lists == null)<br />
&nbsp; return;<br />
&nbsp;for (int i = 0; i &lt; lists.length; i++) {<br />
&nbsp; File f = lists[i];<br />
&nbsp; if (f.isFile()) {<br />
&nbsp;&nbsp; FileInputStream fis = new FileInputStream(f);<br />
&nbsp;&nbsp; String content = "";</p>
<p>&nbsp;&nbsp; String sourceBasePath = sourceBaseDir.getCanonicalPath();<br />
&nbsp;&nbsp; String destPath = destDir.getCanonicalPath();<br />
&nbsp;&nbsp; String fPath = f.getCanonicalPath();<br />
&nbsp;&nbsp; String drPath = destDir<br />
&nbsp;&nbsp;&nbsp;&nbsp; + fPath.substring(fPath.indexOf(sourceBasePath)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + sourceBasePath.length());<br />
&nbsp;&nbsp; FileOutputStream fos = new FileOutputStream(drPath);</p>
<p>&nbsp;&nbsp; byte[] b = new byte[2048];<br />
&nbsp;&nbsp; while (fis.read(b) != -1) {<br />
&nbsp;&nbsp;&nbsp; if (content != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp; content += new String(b);<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp; content = new String(b);<br />
&nbsp;&nbsp;&nbsp; b = new byte[2048];<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; content = content.trim();<br />
&nbsp;&nbsp; fis.close();</p>
<p>&nbsp;&nbsp; fos.write(content.getBytes());<br />
&nbsp;&nbsp; fos.flush();<br />
&nbsp;&nbsp; fos.close();</p>
<p>&nbsp; } else {<br />
&nbsp;&nbsp; //先新建目录<br />
&nbsp;&nbsp; new File(destDir + File.separator + f.getName()).mkdir();</p>
<p>&nbsp;&nbsp; copyFile(destDir, sourceBaseDir, f); //递归调用<br />
&nbsp; }<br />
&nbsp;}<br />
}</p>
<p>/**<br />
&nbsp;* 将sourceDir目录的文件全部copy到destDir中去<br />
&nbsp;*/<br />
public void deleteSourceBaseDir(File curFile) throws Exception {</p>
<p>&nbsp;File[] lists = curFile.listFiles();<br />
&nbsp;String line = null;<br />
&nbsp;String url = null;<br />
&nbsp;File parentFile = null;<br />
&nbsp;for (int i = 0; i &lt; lists.length; i++) {<br />
&nbsp; File f = lists[i];<br />
&nbsp; if (f.isFile()) {<br />
&nbsp;&nbsp; f.delete();<br />
&nbsp;&nbsp; //若它的父目录没有文件了，说明已经删完，应该删除父目录<br />
&nbsp;&nbsp; parentFile = f.getParentFile();<br />
&nbsp;&nbsp; if (parentFile.list().length == 0)<br />
&nbsp;&nbsp;&nbsp; parentFile.delete();<br />
&nbsp; } else {<br />
&nbsp;&nbsp; deleteSourceBaseDir(f); //递归调用<br />
&nbsp; }<br />
&nbsp;}<br />
}</p>
<p>public static void main(String[] args) {<br />
&nbsp;try {<br />
&nbsp; ZipUtil t = new ZipUtil();<br />
&nbsp; t.zip("c:\\1.zip", "c:\\1\\");<br />
&nbsp; t.unZip("c:\\1.zip", "c:\\2\\");<br />
&nbsp; <br />
&nbsp;} catch (Exception e) {<br />
&nbsp; e.printStackTrace(System.out);<br />
&nbsp;}<br />
}</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/142100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-02 17:43 <a href="http://www.blogjava.net/WshmAndLily/articles/142100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JAVA API函数实现数据的压缩与解压缩</title><link>http://www.blogjava.net/WshmAndLily/articles/141627.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 31 Aug 2007 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/141627.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/141627.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/141627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/141627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/141627.html</trackback:ping><description><![CDATA[<p><strong>数据压缩概述</strong><br />
<br />
文件中数据冗余的最简单的类型是"字符的复制"。让我们先来看下面一个字符串：<br />
<br />
JJJJJJAAAAVVVVAAAAAA</p>
<p>这个字符串可以用更简洁的方式来编码，那就是通过替换每一个重复的字符串为单个的实例字符加上记录重复次数的数字来表示,上面的字符串可以被编码为下面的形式：6J4A4V6A</p>
<p>在这里，"6J"意味着6个字符J，"4A"意味着4个字符A，以此类推。这种字符串压缩方式称为"行程长度编码"方式，简称RLE。<br />
<br />
再举一个例子，考虑一下矩形图像的存储。一个单色位图，可以被存储为下面这种形式。<br />
<br />
另外一种方式是将图像存为一个图元文件：<br />
<br />
Rectangle 11, 3, 20, 5<br />
<br />
上面的表示方法是讲矩形的起始坐标是（11，3），宽度是20，高度是5。<br />
<br />
上述的矩形图像可以使用RLE编码方式压缩，通过对相同位记数表示如下：<br />
<br />
0, 40<br />
<br />
0, 40<br />
<br />
0,10 1,20 0,10<br />
<br />
0,10 1,1 0,18 1,1 0,10<br />
<br />
0,10 1,1 0,18 1,1 0,10<br />
<br />
0,10 1,1 0,18 1,1 0,10<br />
<br />
0,10 1,20 0,10<br />
<br />
0,40<br />
<br />
上面第一行是讲图像的第一行由40个0组成。第三行是讲图像的第三行是由10个0加上20个1再加上10个0组成，其它行以此类推。<br />
<br />
大家注意，RLE方法需要将其表示的文件与编码文件分开。所以，这种方法不能应用于所有的文件。其它的压缩技术包括变长编码（也被称为哈夫曼编码），还有其它的方法。要想了解更详细的信息，请参考有关数据和图像压缩技术方面的图书，一定会有收获的。<br />
<br />
数据压缩有很多益处。不管怎么说，最主要的好处就是减少存储方面的需求。同样的，对于数据通信来讲，压缩数据在媒体中的将导致信息传输数据的提升。数据的压缩能够通过软件在现有的硬件设备上实现或者通过带有压缩技术的特殊的硬件设备来实现。<br />
<br />
ZIP VS GZIP</p>
<p>如果你是在Windows系统下工作，你可能会对工具WinZip很熟悉，是用来创建压缩档案和解开压缩档案的。而在UNIX平台上，会有一些不同,命令tar用来创建一个档案文件（并不压缩），其它的程序（gzip或compress）用来创建一个压缩档案。<br />
<br />
WinZip和PkZip之类的工具同时扮演着归档和压缩两个角色。他们将文件压缩并将其归档。另一方面，gzip并不将文件归档。所以，在UNIX平台上，命令tar通常用来创建一个档案文件，然后命令gzip来将档案文件压缩。<br />
<br />
<strong>Java.util.zip包</strong><br />
<br />
Java提供了java.util.zip包用来兼容ZIP格式的数据压缩。它提供了一系列的类用来读取，创建，修改ZIP和GZIP格式的文件。它还提供了工具类来计算任意输入流的数目，这可以用来验证输入数据的有效性。该包提供了一个接口，十四个类，和两个异常处理类，如表1所示。<br />
<br />
表1: java.util.zip包<br />
<br />
条目 类型 描述 <br />
<br />
Checksum 接口 被类Adler32和CRC32实现的接口 <br />
<br />
Adler32 类 使用Alder32算法来计算Checksum数目 <br />
<br />
CheckedInputStream 类 一个输入流，保存着被读取数据的Checksum <br />
<br />
CheckedOutputStream 类 一个输出流，保存着被读取数据的Checksum <br />
<br />
CRC32 类 使用CRC32算法来计算Checksum数目 <br />
<br />
Deflater 类 使用ZLIB压缩类，支持通常的压缩方式 <br />
<br />
DeflaterOutputStream 类 一个输出过滤流，用来压缩Deflater格式数据 <br />
<br />
GZIPInputStream 类 一个输入过滤流，读取GZIP格式压缩数据 <br />
<br />
GZIPOutputStream 类 一个输出过滤流，读取GZIP格式压缩数据 <br />
<br />
Inflater 类 使用ZLIB压缩类，支持通常的解压方式 <br />
<br />
InlfaterInputStream 类 一个输入过滤流，用来解压Inlfater格式的压缩数据 <br />
<br />
ZipEntry 类 存储ZIP条目 <br />
<br />
ZipFile 类 从ZIP文件中读取ZIP条目 <br />
<br />
ZipInputStream 类 一个输入过滤流，用来读取ZIP格式文件中的文件 <br />
<br />
ZipOutputStream 类 一个输出过滤流，用来向ZIP格式文件口写入文件 <br />
<br />
DataFormatException 异常类 抛出一个数据格式错误 <br />
<br />
ZipException 异常类 抛出一个ZIP文件 <br />
<br />
注意：ZLIB压缩类最初是作为可移植的网络图像文件格式（PNG）标准的一部分开发的，是不受专利保护的。<br />
<br />
<strong>从ZIP文件中解压缩和提取数据</strong><br />
<br />
java.util.zip包提供了数据压缩与解压缩所需要的类。ZIP文件的解压缩实质上就是从输入流中读取数据。Java.util.zip包提供了类ZipInputStream来读取ZIP文件。ZipInputStream流的创建与其它输入流的创建没什么两样。举个例子，下面的代码段创建了一个输入流来读取ZIP格式的文件：<br />
<br />
FileInputStream fis = new FileInputStream("figs.zip");<br />
<br />
ZipInputStream zin = new ZipInputStream(new BufferedInputStream(fis));<br />
<br />
ZIP输入流打开后，你可以使用getNextEntry方法来读取ZIP文件中的条目数，该方法返回一个ZipEntry对象。如果到达文件的尾部，getNextEntry返回null：<br />
<br />
ZipEntry entry;<br />
<br />
while((entry = zin.getNextEntry()) != null) {<br />
<br />
// extract data<br />
<br />
// open output streams<br />
<br />
}<br />
<br />
现在，你应该建立一个输出流，如下所示：<br />
<br />
int BUFFER = 2048;<br />
<br />
FileOutputStream fos = new FileOutputStream(entry.getName());<br />
<br />
BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);<br />
<br />
注意：在这段代码中我们用BufferedOutputStream代替了ZIPOutputStream。ZIPOutputStream和GZIPOutputStream使用内置的512字节缓冲。当缓冲区的大小大于512字节时，使用BufferedOutputStream才是正确的（例子中设置为2048）。ZIPOutputStream不允许你设置缓冲区的大小，GZIPOutputStream也是一样，但创建 GZIPOutputStream 对象时可以通过构造函数的参数指定内置的缓冲尺寸。<br />
<br />
这段代码中，使用ZIP内含的条目名称创建一个文件输出流。可以使用entry.getName来得到它的返回句柄。接着读出被压缩的源数据，然后写入输出流：<br />
<br />
while ((count = zin.read(data, 0, BUFFER)) != -1) {<br />
<br />
//System.out.write(x);<br />
<br />
dest.write(data, 0, count);<br />
<br />
}<br />
<br />
最后，不要忘记关闭输入和输出流：<br />
<br />
dest.flush();<br />
<br />
dest.close();<br />
<br />
zin.close();<br />
<br />
例程1的源程序UnZip.java显示如何解压缩并从ZIP档案中将文件释放出来。测试这个例子，编译这个类，并运行它，传给它一个ZIP格式的文件作为参数：<br />
<br />
prompt&gt; java UnZip somefile.zip<br />
<br />
注意：somefile.zip应该是一个ZIP压缩档案，可以用任何一种ZIP压缩工具来创建，例如WinZip。<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td align="left" bgcolor="#f7fbfe" colspan="2" height="0">
            <table class="shortmsg" cellspacing="0" cellpadding="0" width="100%" border="0">
                <tbody>
                    <tr>
                        <td class="shortmsg_td">【导读】这篇文章简要的介绍了数据的压缩与解压缩，并展示了用java.util.zip包来实现数据的压缩与解压缩是多么的方便与高效。</td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td align="center" bgcolor="#f7fbfe" colspan="2" height="10"></td>
        </tr>
        <tr>
            <td valign="top" align="left" width="98%" bgcolor="#f7fbfe" height="142"><span class="top11">例程1源代码:<br />
            <br />
            UnZip.java<br />
            <br />
            import java.io.*;<br />
            <br />
            import java.util.zip.*;<br />
            <br />
            public class UnZip {<br />
            <br />
            static final int BUFFER = 2048;<br />
            <br />
            public static void main (String argv[]) {<br />
            <br />
            try {<br />
            <br />
            BufferedOutputStream dest = null;<br />
            <br />
            FileInputStream fis = new <br />
            <br />
            FileInputStream(argv[0]);<br />
            <br />
            ZipInputStream zis = new <br />
            <br />
            ZipInputStream(new BufferedInputStream(fis));<br />
            <br />
            ZipEntry entry;<br />
            <br />
            while((entry = zis.getNextEntry()) != null) {<br />
            <br />
            System.out.println("Extracting: " +entry);<br />
            <br />
            int count;<br />
            <br />
            byte data[] = new byte[BUFFER];<br />
            <br />
            // write the files to the disk<br />
            <br />
            FileOutputStream fos = new <br />
            <br />
            FileOutputStream(entry.getName());<br />
            <br />
            dest = new <br />
            <br />
            BufferedOutputStream(fos, BUFFER);<br />
            <br />
            while ((count = zis.read(data, 0, BUFFER)) <br />
            <br />
            != -1) {<br />
            <br />
            dest.write(data, 0, count);<br />
            <br />
            }<br />
            <br />
            dest.flush();<br />
            <br />
            dest.close();<br />
            <br />
            }<br />
            <br />
            zis.close();<br />
            <br />
            } catch(Exception e) {<br />
            <br />
            e.printStackTrace();<br />
            <br />
            }}<br />
            <br />
            }<br />
            <br />
            有一点值得大家注意，类ZipInputStream读出ZIP文件序列（简单地说就是读出这个ZIP文件压缩了多少文件），而类ZipFile使用内嵌的随机文件访问机制读出其中的文件内容，所以不必顺序的读出ZIP压缩文件序列。<br />
            <br />
            注意：ZIPInputStream和ZipFile之间另外一个基本的不同点在于高速缓冲的使用方面。当文件使用ZipInputStream和FileInputStream流读出的时候，ZIP条目不使用高速缓冲。然而，如果使用ZipFile（文件名）来打开文件，它将使用内嵌的高速缓冲，所以如果ZipFile（文件名）被重复调用的话，文件只被打开一次。缓冲值在第二次打开进使用。如果你工作在UNIX系统下，这是什么作用都没有的，因为使用ZipFile打开的所有ZIP文件都在内存中存在映射，所以使用ZipFile的性能优于ZipInputStream。然而，如果同一ZIP文件的内容在程序执行期间经常改变，或是重载的话，使用ZipInputStream就成为你的首选了。<br />
            <br />
            下面显示了使用类ZipFile来解压一个ZIP文件的过程：<br />
            <br />
            通过指定一个被读取的ZIP文件，或者是文件名，或者是一个文件对象来创建一个ZipFile对象：<br />
            <br />
            ZipFile zipfile = new ZipFile("figs.zip");<br />
            <br />
            使用entries方法，返回一个枚举对象，循环获得文件的ZIP条目对象：<br />
            <br />
            while(e.hasMoreElements()) {<br />
            <br />
            entry = (ZipEntry) e.nextElement();<br />
            <br />
            // read contents and save them<br />
            <br />
            }<br />
            <br />
            ZIP条目作为参数传递给getInputStream方法，可以读取ZIP文件中指定条目的内容，能过其返回的输入流（InputStram）对象可以方便的读出ZIP条目的内容：<br />
            <br />
            is = new BufferedInputStream(zipfile.getInputStream(entry));<br />
            <br />
            获取ZIP条目的文件名，创建输出流，并保存:<br />
            <br />
            byte data[] = new byte[BUFFER];<br />
            <br />
            FileOutputStream fos = new FileOutputStream(entry.getName());<br />
            <br />
            dest = new BufferedOutputStream(fos, BUFFER);<br />
            <br />
            while ((count = is.read(data, 0, BUFFER)) != -1) {<br />
            <br />
            dest.write(data, 0, count);<br />
            <br />
            }<br />
            <br />
            最后关闭所有的输入输出流 dest.flush();<br />
            <br />
            dest.close();<br />
            <br />
            is.close();<br />
            <br />
            完整的程序代码如例程2所示。再次编译这个文件，并传递一个ZIP格式的文件做为参数：<br />
            <br />
            prompt&gt; java UnZip2 somefile.zip<br />
            <br />
            例程2源码:<br />
            <br />
            UnZip2.java <br />
            <br />
            import java.io.*;<br />
            <br />
            import java.util.*;<br />
            <br />
            import java.util.zip.*;<br />
            <br />
            public class UnZip2 {<br />
            <br />
            static final int BUFFER = 2048;<br />
            <br />
            public static void main (String argv[]) {<br />
            <br />
            try {<br />
            <br />
            BufferedOutputStream dest = null;<br />
            <br />
            BufferedInputStream is = null;<br />
            <br />
            ZipEntry entry;<br />
            <br />
            ZipFile zipfile = new ZipFile(argv[0]);<br />
            <br />
            Enumeration e = zipfile.entries();<br />
            <br />
            while(e.hasMoreElements()) {<br />
            <br />
            entry = (ZipEntry) e.nextElement();<br />
            <br />
            System.out.println("Extracting: " +entry);<br />
            <br />
            is = new BufferedInputStream<br />
            <br />
            (zipfile.getInputStream(entry));<br />
            <br />
            int count;<br />
            <br />
            byte data[] = new byte[BUFFER];<br />
            <br />
            FileOutputStream fos = new <br />
            <br />
            FileOutputStream(entry.getName());<br />
            <br />
            dest = new <br />
            <br />
            BufferedOutputStream(fos, BUFFER);<br />
            <br />
            while ((count = is.read(data, 0, BUFFER)) <br />
            <br />
            != -1) {<br />
            <br />
            dest.write(data, 0, count);<br />
            <br />
            }<br />
            <br />
            dest.flush();<br />
            <br />
            dest.close();<br />
            <br />
            is.close();<br />
            <br />
            }<br />
            <br />
            } catch(Exception e) {<br />
            <br />
            e.printStackTrace();<br />
            <br />
            }}<br />
            <br />
            }<br />
            </span></td>
        </tr>
    </tbody>
</table>
</p>
<span class="top11"><strong>将数据压缩归档入一ZIP文件</strong><br />
<br />
类ZipOutputStream能够用来将数据压缩成一个ZIP文件。ZipOutputStream将数据写入ZIP格式的输出流。下面的步骤与创建一个ZIP文件相关。<br />
<br />
1、第一步是创建一个ZipOutputStream对象，我们将要写入输出流的文件作为参数传给它。下面的代码演示了如何创建一个名为"myfigs.zip"的ZIP文件。<br />
<br />
FileOutputStream dest = new<br />
<br />
FileOutputStream("myfigs.zip");<br />
<br />
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));<br />
<br />
2、一但目标输出流创建后，下一步就是打开数据源文件。在这个例子中，源数据文件是指那些当前目录下的文件。命令list用来得到当前目录下文件列表：<br />
<br />
File f = new File(".");<br />
<br />
String files[] = f.list();<br />
<br />
for (int i=0; i &lt; files.length; i++) {<br />
<br />
System.out.println("Adding: "+files[i]);<br />
<br />
FileInputStream fi = new FileInputStream(files[i]);<br />
<br />
// create zip entry<br />
<br />
// add entries to ZIP file<br />
<br />
}<br />
<br />
注意：这个例程能够压缩当前目录下的所有文件。它不能处理子目录。作为一个练习，你可以修改例程3来处理子目录。<br />
<br />
3、 为读出的数据创建一个ZIP条目列表：<br />
<br />
ZipEntry entry = new ZipEntry(files[i]))<br />
<br />
4、 在你将数据写入ZIP输出流之前，你必须使用putNextEntry方法将ZIP条目列表写入输出流：<br />
<br />
out.putNextEntry(entry);<br />
<br />
5、 将数据写入ZIP文件：<br />
<br />
int count;<br />
<br />
while((count = origin.read(data, 0, BUFFER)) != -1) {<br />
<br />
out.write(data, 0, count);<br />
<br />
}<br />
<br />
6、 最后关闭所有的输入输出流：<br />
<br />
origin.close();<br />
<br />
out.close();
<p>&nbsp;</p>
<p>完整的程序代码如例程3所示。<br />
<br />
例程3源代码:<br />
<br />
Zip.java <br />
<br />
import java.io.*;<br />
<br />
import java.util.zip.*;<br />
<br />
public class Zip {<br />
<br />
static final int BUFFER = 2048;<br />
<br />
public static void main (String argv[]) {<br />
<br />
try {<br />
<br />
BufferedInputStream origin = null;<br />
<br />
FileOutputStream dest = new <br />
<br />
FileOutputStream("c:\zip\myfigs.zip");<br />
<br />
ZipOutputStream out = new ZipOutputStream(new <br />
<br />
BufferedOutputStream(dest));<br />
<br />
//out.setMethod(ZipOutputStream.DEFLATED);<br />
<br />
byte data[] = new byte[BUFFER];<br />
<br />
// get a list of files from current directory<br />
<br />
File f = new File(".");<br />
<br />
String files[] = f.list();<br />
<br />
for (int i=0; i &lt; files.length; i++) {<br />
<br />
System.out.println("Adding: "+files[i]);<br />
<br />
FileInputStream fi = new <br />
<br />
FileInputStream(files[i]);<br />
<br />
origin = new <br />
<br />
BufferedInputStream(fi, BUFFER);<br />
<br />
ZipEntry entry = new ZipEntry(files[i]);<br />
<br />
out.putNextEntry(entry);<br />
<br />
int count;<br />
<br />
while((count = origin.read(data, 0, <br />
<br />
BUFFER)) != -1) {<br />
<br />
out.write(data, 0, count);<br />
<br />
}<br />
<br />
origin.close();<br />
<br />
}<br />
<br />
out.close();<br />
<br />
} catch(Exception e) {<br />
<br />
e.printStackTrace();<br />
<br />
}}<br />
<br />
} <br />
<br />
注意: 条目列表可以以两种方式加入ZIP文件中，一种是压缩方式（DEFLATED），另一种是不压缩方式(STORED),系统默认的存储方式为压缩方式（DEFLATED）。SetMethod方法可以用来设置它的存储方式。例如，设置存储方式为DEFLATED（压缩）应该这样做： out.setMethod(ZipOutputStream.DEFLATED) 设置存储方式为（不压缩）应该这样做： out.setMethod(ZipOutputStream.STORED)。<br />
<br />
<strong>ZIP文件属性</strong><br />
<br />
类ZipEntry描述了存储在ZIP文件中的压缩文件。类中包含有多种方法可以用来设置和获得ZIP条目的信息。类ZipEntry是被ZipFile和ZipInputStream使用来读取ZIP文件，ZipOutputStream来写入ZIP文件的。ZipEntry中最有用的一些方法显示在下面的表格2中，并且有相应的描述。<br />
<br />
表格 2: 类ZipEntry中一些有用的方法<br />
<br />
方法签名 描述 <br />
<br />
public String getComment() 返回条目的注释, 没有返回null <br />
<br />
public long getCompressedSize() 返回条目压缩后的大小, 未知返回-1 <br />
<br />
public int getMethod() 返回条目的压缩方式,没有指定返回 -1 <br />
<br />
public String getName() 返回条目的名称 <br />
<br />
public long getSize() 返回未被压缩的条目的大小，未知返回-1 <br />
<br />
public long getTime() 返回条目的修改时间, 没有指定返回-1 <br />
<br />
public void setComment(String c) 设置条目的注释 <br />
<br />
public void setMethod(int method) 设置条目的压缩方式 <br />
<br />
public void setSize(long size) 设置没有压缩的条目的大小 <br />
<br />
public void setTime(long time) 设置条目的修改时间 <br />
<br />
<strong>求和校验</strong><br />
<br />
java.util.zip包中另外一些比较重要的类是Adler32和CRC32，它们实现了java.util.zip.Checksum接口，并估算了压缩数据的校验和（checksum）。众所周知，在运算速度方面，Adler32算法比CRC32算法要有一定的优势；但在数据可信度方面，CRC32算法则要更胜一筹。正所谓，"鱼与熊掌，不可兼得。"，大家只好在不同的场合下，加以取舍了。GetValue方法可以用来获得当前的checksum值，reset方法能够重新设置checksum为其缺省的值。<br />
<br />
求和校验一般用来校验文件和信息是否正确的传送。举个例子，假设你想创建一个ZIP文件，然后将其传送到远程计算机上。当到达远程计算机后，你就可以使用checksum检验在传输过程中文件是否发生错误。为了演示如何创建checksums，我们修改了例程1和例程3，在例程4和例程5中使用了两个新类，一个是CheckedInputStream，另一个是CheckedOutputStream。（大家注意：这两段代码在压缩与解压缩过程中，使用了同一种算法，求数据的checksum值。）<br />
<br />
例程4源代码:<br />
<br />
Zip.java <br />
<br />
import java.io.*;<br />
<br />
import java.util.zip.*;<br />
<br />
public class Zip {<br />
<br />
static final int BUFFER = 2048;<br />
<br />
public static void main (String argv[]) {<br />
<br />
try {<br />
<br />
BufferedInputStream origin = null;<br />
<br />
FileOutputStream dest = new <br />
<br />
FileOutputStream("c:\zip\myfigs.zip");<br />
<br />
CheckedOutputStream checksum = new <br />
<br />
CheckedOutputStream(dest, new Adler32());<br />
<br />
ZipOutputStream out = new <br />
<br />
ZipOutputStream(new <br />
<br />
BufferedOutputStream(checksum));<br />
<br />
//out.setMethod(ZipOutputStream.DEFLATED);<br />
<br />
byte data[] = new byte[BUFFER];<br />
<br />
// get a list of files from current directory<br />
<br />
File f = new File(".");<br />
<br />
String files[] = f.list();<br />
<br />
for (int i=0; i &lt; files.length; i++) {<br />
<br />
System.out.println("Adding: "+files[i]);<br />
<br />
FileInputStream fi = new <br />
<br />
FileInputStream(files[i]);<br />
<br />
origin = new <br />
<br />
BufferedInputStream(fi, BUFFER);<br />
<br />
ZipEntry entry = new ZipEntry(files[i]);<br />
<br />
out.putNextEntry(entry);<br />
<br />
int count;<br />
<br />
while((count = origin.read(data, 0, <br />
<br />
BUFFER)) != -1) {<br />
<br />
out.write(data, 0, count);<br />
<br />
}<br />
<br />
origin.close();<br />
<br />
}<br />
<br />
out.close();<br />
<br />
System.out.println("checksum: <br />
<br />
"+checksum.getChecksum().getValue());<br />
<br />
} catch(Exception e) {<br />
<br />
e.printStackTrace();<br />
<br />
}}<br />
<br />
} <br />
<br />
例程5源代码:<br />
<br />
UnZip.java <br />
<br />
import java.io.*;<br />
<br />
import java.util.zip.*;<br />
<br />
public class UnZip {<br />
<br />
public static void main (String argv[]) {<br />
<br />
try {<br />
<br />
final int BUFFER = 2048;<br />
<br />
BufferedOutputStream dest = null;<br />
<br />
FileInputStream fis = new <br />
<br />
FileInputStream(argv[0]);<br />
<br />
CheckedInputStream checksum = new <br />
<br />
CheckedInputStream(fis, new Adler32());<br />
<br />
ZipInputStream zis = new <br />
<br />
ZipInputStream(new <br />
<br />
BufferedInputStream(checksum));<br />
<br />
ZipEntry entry;<br />
<br />
while((entry = zis.getNextEntry()) != null) {<br />
<br />
System.out.println("Extracting: " +entry);<br />
<br />
int count;<br />
<br />
byte data[] = new byte[BUFFER];<br />
<br />
// write the files to the disk<br />
<br />
FileOutputStream fos = new <br />
<br />
FileOutputStream(entry.getName());<br />
<br />
dest = new BufferedOutputStream(fos, <br />
<br />
BUFFER);<br />
<br />
while ((count = zis.read(data, 0, <br />
<br />
BUFFER)) != -1) {<br />
<br />
dest.write(data, 0, count);<br />
<br />
}<br />
<br />
dest.flush();<br />
<br />
dest.close();<br />
<br />
}<br />
<br />
zis.close();<br />
<br />
System.out.println("Checksum: <br />
<br />
"+checksum.getChecksum().getValue());<br />
<br />
} catch(Exception e) {<br />
<br />
e.printStackTrace();<br />
<br />
}<br />
<br />
}}<br />
<br />
测试例程4和5，编译类文件并运行类Zip来创建一个压缩档案（程序会计算出checksum值并显示在屏幕上），然后运行UnZip类来解压缩这个档案（屏幕上同样会打印出一个checksum值）。两个值必须完全相同，否则说明出错了。Checksums在数据校验方面非常有用。例如，你可以创建一个ZIP文件，然后连同checksum值一同传递给你的朋友。你的朋友解压缩文件后，将生成的checksum值与你提供的作一比较，如果相同则说明在传递过程中没有发生错误。</span></p>
<span class="top11"><strong>压缩对象</strong><br />
<br />
我们已经看到如何将文件中的数据压缩并将其归档。但如果你想压缩的数据不在文件中时，应该怎么办呢？假设有这样一个例子，你通过套接字（socket）来传递一个大对象。为了提高应用程序的性能，你可能在通过网络开始传递前将数据压缩，然后在目的地将其解压缩。另外一个例子，我们假设你想将一个对象用压缩格式存储在磁碟上，ZIP格式是基于记录方式的，不适合这项工作。GZIP更适合用来实现这种对单一数据流的操作。现在，我们来示例一下，如果在写入磁碟前将数据压缩，并在读出时将数据解压缩。示例程序6是一个在单一JVM（java虚拟机）实现了Serializable接口的简单类，我们想要串行化该类的实例。<br />
<br />
例程6源代码:<br />
<br />
Employee.java <br />
<br />
import java.io.*;<br />
<br />
public class Employee implements Serializable {<br />
<br />
String name;<br />
<br />
int age;<br />
<br />
int salary;<br />
<br />
public Employee(String name, int age, int salary) {<br />
<br />
this.name = name;<br />
<br />
this.age = age;<br />
<br />
this.salary = salary;<br />
<br />
}<br />
<br />
public void print() {<br />
<br />
System.out.println("Record for: "+name);<br />
<br />
System.out.println("Name: "+name);<br />
<br />
System.out.println("Age: "+age);<br />
<br />
System.out.println("Salary: "+salary);<br />
<br />
}<br />
<br />
}<br />
<br />
现在，写另外一个类来创建两个从Employee类实例化而来的对象。示例程序7从Employee类创建了两个对象（sarah和sam）。然后将它们的状态以压缩的格式存储在一个文件中。<br />
<br />
示例程序7源代码：<br />
<br />
SaveEmployee.java <br />
<br />
import java.io.*;<br />
<br />
import java.util.zip.*;<br />
<br />
public class SaveEmployee {<br />
<br />
public static void main(String argv[]) throws <br />
<br />
Exception {<br />
<br />
// create some objects<br />
<br />
Employee sarah = new Employee("S. Jordan", 28, <br />
<br />
56000);<br />
<br />
Employee sam = new Employee("S. McDonald", 29, <br />
<br />
58000);<br />
<br />
// serialize the objects sarah and sam<br />
<br />
FileOutputStream fos = new <br />
<br />
FileOutputStream("db");<br />
<br />
GZIPOutputStream gz = new GZIPOutputStream(fos);<br />
<br />
ObjectOutputStream oos = new <br />
<br />
ObjectOutputStream(gz);<br />
<br />
oos.writeObject(sarah);<br />
<br />
oos.writeObject(sam);<br />
<br />
oos.flush();<br />
<br />
oos.close();<br />
<br />
fos.close();<br />
<br />
}}<br />
<br />
现在，示例程序8中的ReadEmpolyee类是用来重新构建两个对象的状态。一但构建成功，就调用print方法将其打印出来。<br />
<br />
示例程序8源代码:<br />
<br />
ReadEmployee.java <br />
<br />
import java.io.*;<br />
<br />
import java.util.zip.*;<br />
<br />
public class ReadEmployee {<br />
<br />
public static void main(String argv[]) throws <br />
<br />
Exception{<br />
<br />
//deserialize objects sarah and sam<br />
<br />
FileInputStream fis = new FileInputStream("db");<br />
<br />
GZIPInputStream gs = new GZIPInputStream(fis);<br />
<br />
ObjectInputStream ois = new ObjectInputStream(gs);<br />
<br />
Employee sarah = (Employee) ois.readObject();<br />
<br />
Employee sam = (Employee) ois.readObject();<br />
<br />
//print the records after reconstruction of state<br />
<br />
sarah.print();<br />
<br />
sam.print();<br />
<br />
ois.close();<br />
<br />
fis.close();<br />
<br />
}<br />
<br />
}<br />
<br />
同样的思想可以用于在网络间通过（socket）传输的大对象。下面的代码段示例了如何在客户/服务器之间实现大对象的压缩：<br />
<br />
// write to client<br />
<br />
GZIPOutputStream gzipout = new <br />
<br />
GZIPOutputStream(socket.getOutputStream());<br />
<br />
ObjectOutputStream oos = new <br />
<br />
ObjectOutputStream(gzipout);<br />
<br />
oos.writeObject(obj);<br />
<br />
gzipos.finish();<br />
<br />
下面的代码段显示了客户端从服务器端接收到数据后，如何将其解压:<br />
<br />
// read from server<br />
<br />
Socket socket = new Socket(remoteServerIP, PORT);<br />
<br />
GZIPInputStream gzipin = new <br />
<br />
GZIPInputStream(socket.getInputStream());<br />
<br />
ObjectInputStream ois = new ObjectInputStream(gzipin);<br />
<br />
Object o = ois.readObject();<br />
<br />
<strong>对JAR文件进行操作</strong><br />
<br />
Java档案文件（JAR）格式是基于标准的ZIP文件格式，并附有可选择的文件清单列表。如果你想要在你我的应用程序中创建JAR文件或从JAR文件中解压缩文件，可以使用java.util.jar包，它提供了读写JAR文件的类。使用java.util.jar包提供的类与本文所讲述的java.util.zip包十分相似。所以你应该能够重新编写本文的源代码，如果你想使用java.util.jar包的话。<br />
<br />
<strong>结束语</strong><br />
<br />
本文讨论了你可以在应用程序中使用的数据压缩与解压的应用程序接口，本文的示例程序演示了如何使用java.util.zip包来压缩数据与解压缩数据。现在你可以利用这个工具在你的应用程序中实现数据的压缩与解压了。<br />
<br />
本文也说明了如何在络传输中实现数据的压缩与解压缩，以减少网络阻塞和增强你的客户/服务器模式应用程序的性能。在网络传输中实现数据的压缩，只有当传输的数据量达到成百上千字节时，你才会感觉到程序性能的提升，如果仅仅是传递一个字符串对象，对应用程序是没什么影响的。</span>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/141627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-31 09:52 <a href="http://www.blogjava.net/WshmAndLily/articles/141627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pop3Bean接收邮件</title><link>http://www.blogjava.net/WshmAndLily/articles/138268.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 21 Aug 2007 00:55:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/138268.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/138268.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/138268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/138268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/138268.html</trackback:ping><description><![CDATA[<p>package com.semovy.test;</p>
<p>//package com.IEthing.util;</p>
<p>import java.io.BufferedReader;<br>import java.io.BufferedWriter;<br>import java.io.ByteArrayOutputStream;<br>import java.io.File;<br>import java.io.FileInputStream;<br>import java.io.FileNotFoundException;<br>import java.io.FileWriter;<br>import java.io.IOException;<br>import java.io.InputStream;<br>import java.io.InputStreamReader;<br>import java.io.Reader;<br>import java.io.StringReader;<br>import java.text.SimpleDateFormat;<br>import java.util.Date;</p>
<p>import javax.mail.BodyPart;<br>import javax.mail.Flags;<br>import javax.mail.Folder;<br>import javax.mail.Message;<br>import javax.mail.MessagingException;<br>import javax.mail.Multipart;<br>import javax.mail.Part;<br>import javax.mail.Session;<br>import javax.mail.Store;<br>import javax.mail.internet.InternetAddress;<br>import javax.mail.internet.MimeMessage;<br>import javax.mail.internet.MimeUtility;</p>
<p>/**<br>&nbsp;* @author David update by tegger<br>&nbsp;* <br>&nbsp;* TODO To change the template for this generated type comment go to Window -<br>&nbsp;* Preferences - Java - Code Style - Code Templates<br>&nbsp;*/<br>public class Pop3Bean {</p>
<p>&nbsp;private int mailCounter; // 邮件计数</p>
<p>&nbsp;private int mailIndex; // 邮件编号，即邮件在messages数组中的位置</p>
<p>&nbsp;private int mailDownErrorCounter; // 正在下载邮件时，出错的计数器</p>
<p>&nbsp;private boolean[] recordFailure; // 记录下载出错的邮件的序号</p>
<p>&nbsp;private int totalRetryTimes; // 总共重试次数</p>
<p>&nbsp;private int retryTimeCounter; // 记下重试的次数</p>
<p>&nbsp;private boolean otherError; // 若是在邮件正式下载之前出错，则置该值为true</p>
<p>&nbsp;private String extension = ".eml"; // 文件扩展名</p>
<p>&nbsp;private Store store;</p>
<p>&nbsp;private Folder folder;</p>
<p>&nbsp;private Message[] messages;</p>
<p>&nbsp;private Message message;</p>
<p>&nbsp;private Part part;</p>
<p>&nbsp;private String emlName;</p>
<p>&nbsp;private String attachName;</p>
<p>&nbsp;private int allMessageCount;</p>
<p>&nbsp;private int messageCount;</p>
<p>&nbsp;private String dateformat; // 默认的日前显示格式</p>
<p>&nbsp;// private String propFile =<br>&nbsp;// MailConstants.PROPS_FILE_NAME;//用这个接口类的好处是更改配置文件路径的时候不需要更改每个类</p>
<p>&nbsp;private String protocol = "pop3"; // 服务协议</p>
<p>&nbsp;private String mailHost; // 服务器地址</p>
<p>&nbsp;private String userName; // 用户名</p>
<p>&nbsp;private String password; // 密码</p>
<p>&nbsp;private String saveAttachPath; // 附件下载后的存放目录</p>
<p>&nbsp;private String saveEmlPath = "E:\\"; // 保存eml文件的路径</p>
<p>&nbsp;public Pop3Bean() throws IOException {<br>&nbsp;&nbsp;/*<br>&nbsp;&nbsp; * FileProperties fp = new FileProperties(propFile); fp.load(); protocol =<br>&nbsp;&nbsp; * fp.getProperty(MailConstants.RECV_PROTO); mailHost =<br>&nbsp;&nbsp; * fp.getProperty(MailConstants.RECV_HOST); userName =<br>&nbsp;&nbsp; * fp.getProperty(MailConstants.RECV_USER); password =<br>&nbsp;&nbsp; * fp.getProperty(MailConstants.RECV_PASS); saveAttachPath =<br>&nbsp;&nbsp; * fp.getProperty(MailConstants.RECV_ATTACH); saveEmlPath =<br>&nbsp;&nbsp; * fp.getProperty(MailConstants.RECV_ROOT); dateformat =<br>&nbsp;&nbsp; * fp.getProperty("mail.receive.dtfmat"); extension =<br>&nbsp;&nbsp; * fp.getProperty("mail.receive.extension"); totalRetryTimes = Integer<br>&nbsp;&nbsp; * .parseInt(fp.getProperty("mail.receive.retry"));<br>&nbsp;&nbsp; */<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置邮件主机<br>&nbsp; */<br>&nbsp;public void setMailHost(String mailHost) {<br>&nbsp;&nbsp;this.mailHost = mailHost;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获取邮件主机<br>&nbsp; */<br>&nbsp;public String getMailHost() {<br>&nbsp;&nbsp;return this.mailHost;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置邮件帐号<br>&nbsp; */<br>&nbsp;public void setUserName(String userName) {<br>&nbsp;&nbsp;this.userName = userName;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获取邮件帐号<br>&nbsp; */<br>&nbsp;public String getUserName() {<br>&nbsp;&nbsp;return this.userName;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置邮件密码<br>&nbsp; */<br>&nbsp;public void setPassword(String password) {<br>&nbsp;&nbsp;this.password = password;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置Store<br>&nbsp; */<br>&nbsp;public void setStore(Store store) {<br>&nbsp;&nbsp;this.store = store;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置邮箱文件夹<br>&nbsp; */<br>&nbsp;public void setFolder(Folder folder) {<br>&nbsp;&nbsp;this.folder = folder;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置messages数组<br>&nbsp; */<br>&nbsp;public void setMessages(Message[] messages) {<br>&nbsp;&nbsp;this.messages = messages;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置message<br>&nbsp; */<br>&nbsp;public void setMessage(Message message) {<br>&nbsp;&nbsp;this.message = message;<br>&nbsp;}</p>
<p>&nbsp;public void setCurMessage(int i) {<br>&nbsp;&nbsp;this.message = this.messages[i];<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获取message<br>&nbsp; */<br>&nbsp;public Message getMessage() {<br>&nbsp;&nbsp;return this.message;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获取folder中的message数量<br>&nbsp; * <br>&nbsp; * @throws MessagingException<br>&nbsp; */<br>&nbsp;public int getAllMessageCount() throws MessagingException {<br>&nbsp;&nbsp;this.allMessageCount = folder.getMessageCount();<br>&nbsp;&nbsp;return allMessageCount;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置allMessageCount<br>&nbsp; * <br>&nbsp; * @throws MessagingException<br>&nbsp; */<br>&nbsp;private void setAllMessageCount() throws MessagingException {<br>&nbsp;&nbsp;this.allMessageCount = this.folder.getMessageCount();<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获取messages中message的数量<br>&nbsp; * <br>&nbsp; * @return<br>&nbsp; */<br>&nbsp;public int getMessageCount() {<br>&nbsp;&nbsp;this.messageCount = this.messages.length;<br>&nbsp;&nbsp;return messageCount;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得folder中新邮件的数量<br>&nbsp; * <br>&nbsp; * @return<br>&nbsp; * @throws MessagingException<br>&nbsp; */<br>&nbsp;public int getNewMessageCount() throws MessagingException {<br>&nbsp;&nbsp;return this.folder.getNewMessageCount();<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得folder中未读邮件的数量<br>&nbsp; * <br>&nbsp; * @return<br>&nbsp; * @throws MessagingException<br>&nbsp; */<br>&nbsp;public int getUnreadMessageCount() throws MessagingException {<br>&nbsp;&nbsp;return this.folder.getUnreadMessageCount();<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获取Part<br>&nbsp; */<br>&nbsp;public Part getPart() {<br>&nbsp;&nbsp;return (Part) message;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置Part<br>&nbsp; */<br>&nbsp;public void setPart(Part part) {<br>&nbsp;&nbsp;this.part = part;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置附件存放路径<br>&nbsp; */</p>
<p>&nbsp;public void setAttachPath(String attachPath) {<br>&nbsp;&nbsp;this.saveAttachPath = attachPath;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得附件存放路径<br>&nbsp; */</p>
<p>&nbsp;public String getAttachPath() {<br>&nbsp;&nbsp;return saveAttachPath;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置eml存放路径<br>&nbsp; */</p>
<p>&nbsp;public void setEmlPath(String emlPath) {<br>&nbsp;&nbsp;this.saveEmlPath = emlPath;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得eml存放路径<br>&nbsp; */</p>
<p>&nbsp;public String getEmlPath() {<br>&nbsp;&nbsp;return saveEmlPath;<br>&nbsp;}</p>
<p>&nbsp;public void setEmlName(String emlName) {<br>&nbsp;&nbsp;this.emlName = emlName;<br>&nbsp;}</p>
<p>&nbsp;public String getEmlName() {<br>&nbsp;&nbsp;return emlName;<br>&nbsp;}</p>
<p>&nbsp;public void setAttachName(String attachName) {<br>&nbsp;&nbsp;this.attachName = attachName;<br>&nbsp;}</p>
<p>&nbsp;public String getAttachName() {<br>&nbsp;&nbsp;return attachName;<br>&nbsp;}</p>
<p>&nbsp;public void setExtension(String extension) {<br>&nbsp;&nbsp;this.extension = extension;<br>&nbsp;}</p>
<p>&nbsp;public String getExtension() {<br>&nbsp;&nbsp;return extension;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 设置日期显示格式<br>&nbsp; */</p>
<p>&nbsp;public void setDateFormat(String format) throws Exception {<br>&nbsp;&nbsp;this.dateformat = format;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获取日期显示格式<br>&nbsp; */<br>&nbsp;public String getDateFormat(String format) throws Exception {<br>&nbsp;&nbsp;return this.dateformat;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得发件人的地址和姓名<br>&nbsp; * <br>&nbsp; * @throws Exception<br>&nbsp; */<br>&nbsp;public String getFrom() throws Exception {<br>&nbsp;&nbsp;return getFrom(this.message);<br>&nbsp;}</p>
<p>&nbsp;public String getFrom(Message mimeMessage) throws Exception {<br>&nbsp;&nbsp;InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();<br>&nbsp;&nbsp;String from = address[0].getAddress();<br>&nbsp;&nbsp;if (from == null)<br>&nbsp;&nbsp;&nbsp;from = "";<br>&nbsp;&nbsp;String personal = address[0].getPersonal();<br>&nbsp;&nbsp;if (personal == null)<br>&nbsp;&nbsp;&nbsp;personal = "";<br>&nbsp;&nbsp;String fromaddr = personal + "&lt;" + from + "&gt;";<br>&nbsp;&nbsp;return fromaddr;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得邮件的收件人，抄送，和密送的地址和姓名，根据所传递的参数的不同 * "to"----收件人 "cc"---抄送人地址<br>&nbsp; * "bcc"---密送人地址<br>&nbsp; */<br>&nbsp;public String getTOAddress() throws Exception {<br>&nbsp;&nbsp;return getMailAddress("TO", this.message);<br>&nbsp;}</p>
<p>&nbsp;public String getCCAddress() throws Exception {<br>&nbsp;&nbsp;return getMailAddress("CC", this.message);<br>&nbsp;}</p>
<p>&nbsp;public String getBCCAddress() throws Exception {<br>&nbsp;&nbsp;return getMailAddress("BCC", this.message);<br>&nbsp;}</p>
<p>&nbsp;public String getTOAddress(Message mimeMessage) throws Exception {<br>&nbsp;&nbsp;return getMailAddress("TO", mimeMessage);<br>&nbsp;}</p>
<p>&nbsp;public String getCCAddress(Message mimeMessage) throws Exception {<br>&nbsp;&nbsp;return getMailAddress("CC", mimeMessage);<br>&nbsp;}</p>
<p>&nbsp;public String getBCCAddress(Message mimeMessage) throws Exception {<br>&nbsp;&nbsp;return getMailAddress("BCC", mimeMessage);<br>&nbsp;}</p>
<p>&nbsp;public String getMailAddress(String type) throws Exception {<br>&nbsp;&nbsp;return getMailAddress(type, this.message);<br>&nbsp;}</p>
<p>&nbsp;public String getMailAddress(String type, Message mimeMessage)<br>&nbsp;&nbsp;&nbsp;throws Exception {<br>&nbsp;&nbsp;String mailaddr = "";<br>&nbsp;&nbsp;String addtype = type.toUpperCase();<br>&nbsp;&nbsp;InternetAddress[] address = null;<br>&nbsp;&nbsp;if (addtype.equals("TO") || addtype.equals("CC")<br>&nbsp;&nbsp;&nbsp;&nbsp;|| addtype.equals("BCC")) {<br>&nbsp;&nbsp;&nbsp;if (addtype.equals("TO")) {<br>&nbsp;&nbsp;&nbsp;&nbsp;address = (InternetAddress[]) mimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getRecipients(Message.RecipientType.TO);<br>&nbsp;&nbsp;&nbsp;} else if (addtype.equals("CC")) {<br>&nbsp;&nbsp;&nbsp;&nbsp;address = (InternetAddress[]) mimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getRecipients(Message.RecipientType.CC);<br>&nbsp;&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;&nbsp;address = (InternetAddress[]) mimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getRecipients(Message.RecipientType.BCC);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;if (address != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; address.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String email = address[i].getAddress();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (email == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email = MimeUtility.decodeText(email);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String personal = address[i].getPersonal();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (personal == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personal = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;personal = MimeUtility.decodeText(personal);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String compositeto = personal + "&lt;" + email + "&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailaddr += "," + compositeto;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;mailaddr = mailaddr.substring(1);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;throw new Exception("Error emailaddr type!");<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return mailaddr;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得邮件主题<br>&nbsp; */<br>&nbsp;public String getSubject() throws MessagingException {<br>&nbsp;&nbsp;return getSubject(this.message);<br>&nbsp;}</p>
<p>&nbsp;public String getSubject(Message mimeMessage) throws MessagingException {<br>&nbsp;&nbsp;String subject = "";<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;subject = MimeUtility.decodeText(mimeMessage.getSubject());<br>&nbsp;&nbsp;&nbsp;if (subject == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;subject = "";<br>&nbsp;&nbsp;} catch (Exception exce) {<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return subject;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得邮件发送日期<br>&nbsp; */<br>&nbsp;public String getSentDate() throws Exception {<br>&nbsp;&nbsp;return getSentDate(this.message);<br>&nbsp;}</p>
<p>&nbsp;public String getSentDate(Message mimeMessage) throws Exception {<br>&nbsp;&nbsp;Date sentdate = mimeMessage.getSentDate();<br>&nbsp;&nbsp;SimpleDateFormat format = new SimpleDateFormat(dateformat);<br>&nbsp;&nbsp;return format.format(sentdate);<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 判断此邮件是否需要回执，如果需要回执返回"true",否则返回"false"<br>&nbsp; */<br>&nbsp;public boolean getReplySign() throws MessagingException {<br>&nbsp;&nbsp;return getReplySign(this.message);<br>&nbsp;}</p>
<p>&nbsp;public boolean getReplySign(Message mimeMessage) throws MessagingException {<br>&nbsp;&nbsp;boolean replysign = false;<br>&nbsp;&nbsp;String needreply[] = mimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;.getHeader("Disposition-Notification-To");<br>&nbsp;&nbsp;if (needreply != null) {<br>&nbsp;&nbsp;&nbsp;replysign = true;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return replysign;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得此邮件的Message-ID<br>&nbsp; */<br>&nbsp;public String getMessageId() throws MessagingException {<br>&nbsp;&nbsp;return getMessageId(this.message);<br>&nbsp;}</p>
<p>&nbsp;public String getMessageId(Message mimeMessage) throws MessagingException {<br>&nbsp;&nbsp;return ((MimeMessage) mimeMessage).getMessageID();<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 初始化出错邮件数组<br>&nbsp; * <br>&nbsp; */<br>&nbsp;private void setRecordFailure() {<br>&nbsp;&nbsp;this.recordFailure = new boolean[getMessageCount()];<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 返回出错数组<br>&nbsp; * <br>&nbsp; * @return<br>&nbsp; */<br>&nbsp;public boolean[] getRecordFailure() {<br>&nbsp;&nbsp;return this.recordFailure;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 判断此邮件是否已读，如果未读返回返回false,反之返回true<br>&nbsp; */<br>&nbsp;public boolean isNew() throws MessagingException {<br>&nbsp;&nbsp;return isNew(this.message);<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 判断此邮件是否已读，如果未读返回返回false,反之返回true<br>&nbsp; */<br>&nbsp;public boolean isNew(Message mimeMessage) throws MessagingException {<br>&nbsp;&nbsp;boolean isnew = false;<br>&nbsp;&nbsp;Flags flags = mimeMessage.getFlags();<br>&nbsp;&nbsp;Flags.Flag[] flag = flags.getSystemFlags();<br>&nbsp;&nbsp;for (int i = 0; i &lt; flag.length; i++) {<br>&nbsp;&nbsp;&nbsp;if (flag[i] == Flags.Flag.SEEN) {<br>&nbsp;&nbsp;&nbsp;&nbsp;isnew = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return isnew;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 判断此邮件是否包含附件<br>&nbsp; */<br>&nbsp;public boolean isContainAttach() throws Exception {<br>&nbsp;&nbsp;return isContainAttach(this.part);<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 判断此邮件是否包含附件<br>&nbsp; */<br>&nbsp;public boolean isContainAttach(Part part) throws Exception {<br>&nbsp;&nbsp;boolean attachflag = false;<br>&nbsp;&nbsp;String contentType = part.getContentType();<br>&nbsp;&nbsp;if (part.isMimeType("multipart/*")) {<br>&nbsp;&nbsp;&nbsp;Multipart mp = (Multipart) part.getContent();<br>&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; mp.getCount(); i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;BodyPart mpart = mp.getBodyPart(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;String disposition = mpart.getDisposition();<br>&nbsp;&nbsp;&nbsp;&nbsp;if ((disposition != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; ((disposition.equals(Part.ATTACHMENT)) || (disposition<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.equals(Part.INLINE))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachflag = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;else if (mpart.isMimeType("multipart/*")) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachflag = isContainAttach((Part) mpart);<br>&nbsp;&nbsp;&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String contype = mpart.getContentType();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (contype.toLowerCase().indexOf("application") != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachflag = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (contype.toLowerCase().indexOf("name") != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attachflag = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;} else if (part.isMimeType("message/rfc822")) {<br>&nbsp;&nbsp;&nbsp;attachflag = isContainAttach((Part) part.getContent());<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return attachflag;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 连到server，创建folder对象，创建message对象<br>&nbsp; */<br>&nbsp;public void getConn() {<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;this.getStoreFromServer();<br>&nbsp;&nbsp;&nbsp;this.getFolderFromStore();<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;otherError = true;<br>&nbsp;&nbsp;&nbsp;mailDownErrorCounter++;<br>&nbsp;&nbsp;&nbsp;System.out.print(e.getLocalizedMessage());<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 建立Store连接<br>&nbsp; */<br>&nbsp;private Store getStoreFromServer() throws Exception {<br>&nbsp;&nbsp;// 创建session<br>&nbsp;&nbsp;Session session = Session.getDefaultInstance(System.getProperties(),<br>&nbsp;&nbsp;&nbsp;&nbsp;null);<br>&nbsp;&nbsp;// session.setDebug(true);</p>
<p>&nbsp;&nbsp;// 创建store,建立连接<br>&nbsp;&nbsp;Store store = session.getStore(protocol);<br>&nbsp;&nbsp;System.out.println("connecting");<br>&nbsp;&nbsp;store.connect(mailHost, userName, password);<br>&nbsp;&nbsp;System.out.println("connected successfully");<br>&nbsp;&nbsp;setStore(store);<br>&nbsp;&nbsp;return store;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 打开INBox文件夹<br>&nbsp; */<br>&nbsp;private Folder getFolderFromStore() {<br>&nbsp;&nbsp;// 打开邮件相应文件夹<br>&nbsp;&nbsp;Folder getFolder;<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;getFolder = store.getFolder("INBOX");<br>&nbsp;&nbsp;&nbsp;getFolder.open(Folder.READ_ONLY);<br>&nbsp;&nbsp;&nbsp;setFolder(getFolder);<br>&nbsp;&nbsp;&nbsp;return getFolder;<br>&nbsp;&nbsp;} catch (MessagingException e) {<br>&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;System.err.println("获取Folder失败！");<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return null;<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 从folder中提取所有的messages<br>&nbsp; * <br>&nbsp; * @throws MessagingException<br>&nbsp; */<br>&nbsp;public void getAllMessages() throws MessagingException {<br>&nbsp;&nbsp;// 从邮件文件夹获取邮件信息<br>&nbsp;&nbsp;Message[] messages = folder.getMessages();<br>&nbsp;&nbsp;setMessages(messages);<br>&nbsp;&nbsp;setRecordFailure(); // 初始化出错数组<br>&nbsp;&nbsp;// setMessageCount();<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得messageNums数组指定的message<br>&nbsp; * <br>&nbsp; * @param messageNums<br>&nbsp; * @throws MessagingException<br>&nbsp; */<br>&nbsp;public void getMessages(int[] messageNums) throws MessagingException {<br>&nbsp;&nbsp;Message[] messages = folder.getMessages(messageNums);<br>&nbsp;&nbsp;setMessages(messages);<br>&nbsp;&nbsp;setRecordFailure(); // 初始化出错数组<br>&nbsp;&nbsp;// setMessageCount();<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得start和end之间的message<br>&nbsp; * <br>&nbsp; * @param start<br>&nbsp; * @param end<br>&nbsp; * @throws MessagingException<br>&nbsp; */<br>&nbsp;public void getMessages(int start, int end) throws MessagingException {<br>&nbsp;&nbsp;Message[] messages = folder.getMessages(start, end);<br>&nbsp;&nbsp;setMessages(messages);<br>&nbsp;&nbsp;setRecordFailure(); // 初始化出错数组<br>&nbsp;&nbsp;// setMessageCount();<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 关闭连接<br>&nbsp; */<br>&nbsp;public void closeConnection() {<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;messages = null;<br>&nbsp;&nbsp;&nbsp;message = null;<br>&nbsp;&nbsp;&nbsp;if (folder.isOpen())<br>&nbsp;&nbsp;&nbsp;&nbsp;folder.close(true);<br>&nbsp;&nbsp;&nbsp;store.close();<br>&nbsp;&nbsp;&nbsp;System.out.println("close");<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;System.out.println("关闭和邮件服务器之间连接时出错！");<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得当前邮件的基本方法 Pop3Bean内部应该调用这个方法 以便在调用函数中加入重试机制<br>&nbsp; * <br>&nbsp; * @throws MessagingException<br>&nbsp; * @throws MessagingException<br>&nbsp; * <br>&nbsp; */<br>&nbsp;public void getMail() throws Throwable { // 抛出异常，用以重掷<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;saveMessageAs(message);<br>&nbsp;&nbsp;&nbsp;parseMessage(message);<br>&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;System.err.println("保存邮件出错，检查保存路径");<br>&nbsp;&nbsp;&nbsp;throw new IOException("保存邮件出错，检查保存路径");<br>&nbsp;&nbsp;} catch (MessagingException e) {<br>&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;System.err.println("邮件转换出错");<br>&nbsp;&nbsp;&nbsp;throw new MessagingException("邮件转换出错");<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;System.err.println("未知错误");<br>&nbsp;&nbsp;&nbsp;otherError = true;<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;throw new Exception("未知错误");<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获得指定的邮件<br>&nbsp; * <br>&nbsp; * @param index<br>&nbsp; */<br>&nbsp;public void getMail(int index) {<br>&nbsp;&nbsp;mailDownErrorCounter = 0; // 邮件下载出错计数器置零<br>&nbsp;&nbsp;try { // 获取邮件下载之前的错误<br>&nbsp;&nbsp;&nbsp;setMessage(messages[index]); // 设置当前message<br>&nbsp;&nbsp;&nbsp;System.out.println("正在获取第" + index + "封邮件. . .");<br>&nbsp;&nbsp;&nbsp;getMail(); // 获取当前message<br>&nbsp;&nbsp;&nbsp;System.out.println("成功获取第" + index + "封邮件");<br>&nbsp;&nbsp;} catch (Throwable e) { // 获得重掷异常<br>&nbsp;&nbsp;&nbsp;recordFailure[index] = true;<br>&nbsp;&nbsp;&nbsp;mailDownErrorCounter++;<br>&nbsp;&nbsp;&nbsp;System.err.println("下载第" + index + "封邮件时出错");<br>&nbsp;&nbsp;&nbsp;retry();<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 获取messages中的所有邮件<br>&nbsp; */<br>&nbsp;public void getAllMail() {<br>&nbsp;&nbsp;int mailArrayLength; // 将要下载的邮件的数量。若是重试时，则为还未下载的邮件数量</p>
<p>&nbsp;&nbsp;mailArrayLength = getMessageCount();</p>
<p>&nbsp;&nbsp;System.out.println("一共有邮件" + mailArrayLength + "封");</p>
<p>&nbsp;&nbsp;mailDownErrorCounter = 0; // 邮件下载出错计数器置零<br>&nbsp;&nbsp;mailCounter = 0;<br>&nbsp;&nbsp;for (int index = 0; index &lt; mailArrayLength; index++) {<br>&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;setMessage(messages[index]); // 设置当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("正在获取第" + index + "封邮件. . .");<br>&nbsp;&nbsp;&nbsp;&nbsp;getMail(); // 获取当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("成功获取第" + index + "封邮件");<br>&nbsp;&nbsp;&nbsp;&nbsp;mailCounter++;<br>&nbsp;&nbsp;&nbsp;} catch (Throwable e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;otherError = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;recordFailure[index] = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;mailDownErrorCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("下载第" + index + "封邮件时出错");<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;System.out.println("成功下载" + mailCounter + "封邮件");<br>&nbsp;&nbsp;mailCounter = 0;<br>&nbsp;&nbsp;if (mailDownErrorCounter != 0)<br>&nbsp;&nbsp;&nbsp;retry();<br>&nbsp;}</p>
<p>&nbsp;/**<br>&nbsp; * 保存邮件源文件<br>&nbsp; */</p>
<p>&nbsp;public void saveMessageAs(Message message) {<br>&nbsp;&nbsp;String oriFileName;<br>&nbsp;&nbsp;String fileExtend;</p>
<p>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;oriFileName = getInfoBetweenBrackets(getMessageId(message)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.toString());<br>&nbsp;&nbsp;&nbsp;// 设置文件后缀名。若是附件则设法取得其文件后缀名作为将要保存文件的后缀名，若是正文部分则用.htm做后缀名<br>&nbsp;&nbsp;&nbsp;String emlName = oriFileName;<br>&nbsp;&nbsp;&nbsp;String fileNameWidthExtension = getEmlPath() + oriFileName<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ getExtension();<br>&nbsp;&nbsp;&nbsp;File storeFile = new File(fileNameWidthExtension);<br>&nbsp;&nbsp;&nbsp;for (int i = 0; storeFile.exists(); i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;emlName = oriFileName + i;<br>&nbsp;&nbsp;&nbsp;&nbsp;fileNameWidthExtension = getEmlPath() + emlName<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ getExtension();<br>&nbsp;&nbsp;&nbsp;&nbsp;storeFile = new File(fileNameWidthExtension);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;setEmlName(emlName);<br>&nbsp;&nbsp;&nbsp;System.out.println("storefile's path: " + fileNameWidthExtension);<br>&nbsp;&nbsp;&nbsp;ByteArrayOutputStream baos = new ByteArrayOutputStream();<br>&nbsp;&nbsp;&nbsp;message.writeTo(baos);<br>&nbsp;&nbsp;&nbsp;StringReader in = new StringReader(baos.toString());<br>&nbsp;&nbsp;&nbsp;saveFile(fileNameWidthExtension, in);<br>&nbsp;&nbsp;} catch (MessagingException e) {<br>&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;/*<br>&nbsp; * 解析邮件<br>&nbsp; */<br>&nbsp;public void parseMessage(Message message) throws IOException,<br>&nbsp;&nbsp;&nbsp;MessagingException {<br>&nbsp;&nbsp;Object content = message.getContent();<br>&nbsp;&nbsp;if (content instanceof Multipart) {<br>&nbsp;&nbsp;&nbsp;handleMultipart((Multipart) content);<br>&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;handlePart(message);<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;/*<br>&nbsp; * 解析Multipart<br>&nbsp; */<br>&nbsp;public void handleMultipart(Multipart multipart) throws MessagingException,<br>&nbsp;&nbsp;&nbsp;IOException {<br>&nbsp;&nbsp;for (int i = 0, n = multipart.getCount(); i &lt; n; i++) {<br>&nbsp;&nbsp;&nbsp;handlePart(multipart.getBodyPart(i));<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;/*<br>&nbsp; * 解析指定part,从中提取文件<br>&nbsp; */<br>&nbsp;public void handlePart(Part part) throws MessagingException, IOException {<br>&nbsp;&nbsp;String disposition = part.getDisposition(); // Find attachment<br>&nbsp;&nbsp;String contentType = part.getContentType();<br>&nbsp;&nbsp;String str;<br>&nbsp;&nbsp;InputStreamReader sbis = new InputStreamReader(part.getInputStream());<br>&nbsp;&nbsp;if (disposition == null) { // When just body<br>&nbsp;&nbsp;&nbsp;System.out.println("Null: " + contentType);<br>&nbsp;&nbsp;&nbsp;// Check if plain<br>&nbsp;&nbsp;&nbsp;if ((contentType.length() &gt;= 9)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; (contentType.toLowerCase().substring(0, 9)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.equals("text/plai"))) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(getAttachPath() + getEmlName() + ".txt");<br>&nbsp;&nbsp;&nbsp;&nbsp;saveFile(getAttachPath() + getEmlName() + ".txt", sbis);<br>&nbsp;&nbsp;&nbsp;} else if ((contentType.length() &gt;= 8) // Check if html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; (contentType.toLowerCase().substring(0, 8)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.equals("text/htm"))) {<br>&nbsp;&nbsp;&nbsp;&nbsp;saveFile(getAttachPath() + getEmlName() + ".html", sbis);<br>&nbsp;&nbsp;&nbsp;} else if ((contentType.length() &gt;= 9) // Check if html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; (contentType.toLowerCase().substring(0, 9)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.equals("image/gif"))) {<br>&nbsp;&nbsp;&nbsp;&nbsp;saveFile(getAttachPath() + getEmlName() + ".gif", sbis);<br>&nbsp;&nbsp;&nbsp;} else if ((contentType.length() &gt;= 10)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; contentType.toLowerCase().substring(0, 10).equals(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"multipart/")) { // Check if multipart<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("multipart body: " + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;Multipart mp = (Multipart) (part.getContent());<br>&nbsp;&nbsp;&nbsp;&nbsp;handleMultipart(mp);<br>&nbsp;&nbsp;&nbsp;} else { // Unknown type<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Other body: " + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;saveFile(getAttachPath() + getEmlName() + ".txt", sbis);<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;} else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) {<br>&nbsp;&nbsp;&nbsp;System.out.println("Attachment: " + part.getFileName() + " : "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ contentType);<br>&nbsp;&nbsp;&nbsp;// outToFile.println("Attachment: " + part.getFileName() + " : "<br>&nbsp;&nbsp;&nbsp;// + contentType);<br>&nbsp;&nbsp;&nbsp;saveFile(getAttachPath() + part.getFileName(), sbis);<br>&nbsp;&nbsp;} else if (disposition.equalsIgnoreCase(Part.INLINE)) {<br>&nbsp;&nbsp;&nbsp;System.out.println("Inline: " + part.getFileName() + " : "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ contentType);<br>&nbsp;&nbsp;&nbsp;// outToFile.println("Inline: " + part.getFileName() + " : "<br>&nbsp;&nbsp;&nbsp;// + contentType);<br>&nbsp;&nbsp;&nbsp;saveFile(getAttachPath() + part.getFileName(), sbis);<br>&nbsp;&nbsp;} else { // Should never happen<br>&nbsp;&nbsp;&nbsp;System.out.println("Other: " + disposition);<br>&nbsp;&nbsp;&nbsp;// outToFile.println("Other: " + disposition);<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;public void saveFile(String fileName, Reader input) throws IOException {<br>&nbsp;&nbsp;if (fileName == null) {<br>&nbsp;&nbsp;&nbsp;fileName = File.createTempFile(getAttachPath() + "xx", ".out")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getName();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;// Do no overwrite existing file<br>&nbsp;&nbsp;File file = new File(fileName);<br>&nbsp;&nbsp;int lastDot = fileName.lastIndexOf(".");<br>&nbsp;&nbsp;String extension = fileName.substring(lastDot);<br>&nbsp;&nbsp;String fullFileName = fileName;<br>&nbsp;&nbsp;fileName = fileName.substring(0, lastDot);<br>&nbsp;&nbsp;for (int i = 0; file.exists(); i++) {<br>&nbsp;&nbsp;&nbsp;file = new File(fileName + i + extension);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;FileWriter fos = new FileWriter(file);<br>&nbsp;&nbsp;BufferedWriter bos = new BufferedWriter(fos);<br>&nbsp;&nbsp;BufferedReader bis = new BufferedReader(input);<br>&nbsp;&nbsp;int aByte;<br>&nbsp;&nbsp;while ((aByte = bis.read()) != -1) {<br>&nbsp;&nbsp;&nbsp;bos.write(aByte);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;bos.flush();<br>&nbsp;&nbsp;bos.close();<br>&nbsp;&nbsp;bis.close();<br>&nbsp;}</p>
<p>&nbsp;public void readEmlFile(String fileName) throws MessagingException {<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;// TODO readEmlFile<br>&nbsp;&nbsp;&nbsp;InputStream fis = new FileInputStream(fileName);<br>&nbsp;&nbsp;&nbsp;Object emlObj = (Object) fis;<br>&nbsp;&nbsp;&nbsp;Session mailSession = Session.getDefaultInstance(System<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getProperties(), null);<br>&nbsp;&nbsp;&nbsp;MimeMessage msg = new MimeMessage(mailSession, fis);<br>&nbsp;&nbsp;&nbsp;message = msg;</p>
<p>&nbsp;&nbsp;} catch (FileNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;private String getInfoBetweenBrackets(String str) throws Exception {<br>&nbsp;&nbsp;int i, j; // 用于标识字符串中的"&lt;"和"&gt;"的位置<br>&nbsp;&nbsp;if (str == null) {<br>&nbsp;&nbsp;&nbsp;str = "error";<br>&nbsp;&nbsp;&nbsp;return str;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;i = str.lastIndexOf("&lt;");<br>&nbsp;&nbsp;j = str.lastIndexOf("&gt;");<br>&nbsp;&nbsp;if (i != -1 &amp;&amp; j != -1)<br>&nbsp;&nbsp;&nbsp;str = str.substring(i + 1, j);<br>&nbsp;&nbsp;return str;<br>&nbsp;}</p>
<p>&nbsp;// 当有邮件无法下载时进行重试<br>&nbsp;private void retry() {<br>&nbsp;&nbsp;mailCounter = 0;<br>&nbsp;&nbsp;while (retryTimeCounter &lt; totalRetryTimes &amp;&amp; mailDownErrorCounter != 0) {<br>&nbsp;&nbsp;&nbsp;if (!store.isConnected() || !folder.isOpen()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("与服务器连接断开，请重新连接");<br>&nbsp;&nbsp;&nbsp;&nbsp;closeConnection();<br>&nbsp;&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;System.out.println("第" + (retryTimeCounter + 1) + "次重试");</p>
<p>&nbsp;&nbsp;&nbsp;mailDownErrorCounter = 0; // 邮件下载出错计数器置零</p>
<p>&nbsp;&nbsp;&nbsp;for (int index = 0; index &lt; getMessageCount(); index++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;if (recordFailure[index]) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMessage(messages[index]); // 设置当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("正在获取第" + index + "封邮件. . .");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getMail(); // 获取当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("成功获取第" + index + "封邮件");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recordFailure[index] = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Throwable e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherError = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recordFailure[index] = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailDownErrorCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("重新下载第" + index + "封邮件时出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;retryTimeCounter++;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;System.out.println("成功下载" + mailCounter + "封邮件");<br>&nbsp;&nbsp;mailCounter = 0; // 将邮件计数置零<br>&nbsp;&nbsp;mailDownErrorCounter = 0; // 下载错误数量归零<br>&nbsp;}</p>
<p>&nbsp;/*public static void main(String[] args) throws Throwable {</p>
<p>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;Pop3Bean mail;<br>&nbsp;&nbsp;&nbsp;mail = new Pop3Bean();<br>&nbsp;&nbsp;&nbsp;mail.setUserName("superman_wshm");<br>&nbsp;&nbsp;&nbsp;mail.setMailHost("pop3.126.com");<br>&nbsp;&nbsp;&nbsp;mail.setPassword("wshmtt78");<br>&nbsp;&nbsp;&nbsp;mail.setAttachPath("e:/");<br>&nbsp;&nbsp;&nbsp;mail.setExtension(".eml");<br>&nbsp;&nbsp;&nbsp;mail.setDateFormat("yyyydddd");</p>
<p>&nbsp;&nbsp;&nbsp;mail.getConn();<br>&nbsp;&nbsp;&nbsp;System.out.println("Count of messages in folder: "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ mail.getAllMessageCount());<br>&nbsp;&nbsp;&nbsp;System.out.println("Count of new messages in folder: "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ mail.getNewMessageCount());<br>&nbsp;&nbsp;&nbsp;System.out.println("Count of unread messages in folder: "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ mail.getUnreadMessageCount());<br>&nbsp;&nbsp;&nbsp;mail.getAllMessages();<br>&nbsp;&nbsp;&nbsp;System.out.println("Count of loaded messages: "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ mail.getMessageCount());<br>&nbsp;&nbsp;&nbsp;mail.getAllMail();<br>&nbsp;&nbsp;&nbsp;mail.setCurMessage(0);<br>&nbsp;&nbsp;&nbsp;System.out.println(mail.getSubject());<br>&nbsp;&nbsp;&nbsp;mail.closeConnection();<br>&nbsp;&nbsp;&nbsp;// ReadEml mail = new<br>&nbsp;&nbsp;&nbsp;// ReadEml("H:\\My_Soft_Works\\java\\jteam\\jmail\\received\\41C95D0F.008CD1.01099.eml");</p>
<p>&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;System.out.println("出现未预料的错误！");<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;}*/<br>}<br></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/138268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-21 08:55 <a href="http://www.blogjava.net/WshmAndLily/articles/138268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个利用JMF控制摄像头拍照的程序[转]</title><link>http://www.blogjava.net/WshmAndLily/articles/136950.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 15 Aug 2007 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/136950.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/136950.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/136950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/136950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/136950.html</trackback:ping><description><![CDATA[<strong>一个利用JMF控制摄像头拍照的程序<br><br></strong>以前为客户写了一个利用JMF控制摄像头拍照的程序，主要是为了将纸质资料转向电子化，挺有意思的。利用了JMF、http隧道通讯，十六进制字符转化和Applet数字签名证书，下面附上摄像头控制源代码，Servlet程序和数字证书的制作有时间再发吧！<br><br>/**<br>*<br>*/<br>package com.etong.util.webVideo;<br>import javax.swing.*;<br>import java.io.*;<br>import java.net.MalformedURLException;<br>import java.net.URL;<br>import java.net.URLConnection;<br>import java.text.SimpleDateFormat;<br>import java.util.ArrayList;<br>import javax.media.*;<br>import javax.media.format.*;<br>import javax.media.util.*;<br>import javax.media.control.*;<br>import java.applet.Applet;<br>import java.awt.*;<br>import java.awt.image.*;<br>import java.awt.event.*;<br>import jmapps.util.*;<br>import com.sun.image.codec.jpeg.*;<br>import javax.media.protocol.DataSource;<br>import java.applet.AppletContext;<br>public class WebCang extends JApplet implements ActionListener {<br>&nbsp; &nbsp; public static Player player = null;<br>&nbsp; &nbsp; private CaptureDeviceInfo di = null;<br>&nbsp; &nbsp; private MediaLocator ml = null;<br>&nbsp; &nbsp; String insid = null;<br>&nbsp; &nbsp; String taxpayerid = null;<br>&nbsp; &nbsp; String affID = null;<br>&nbsp; &nbsp; String affname = null;<br>&nbsp; &nbsp; String wfid = null;<br>&nbsp; &nbsp; String username = null;<br>&nbsp; &nbsp; String aid = null;<br>&nbsp; &nbsp; String tid = null;<br>&nbsp; &nbsp; /**<br>&nbsp; &nbsp;&nbsp;&nbsp;* 按钮<br>&nbsp; &nbsp;&nbsp;&nbsp;*/<br>&nbsp; &nbsp; private JButton capture = null;<br>&nbsp; &nbsp; /**<br>&nbsp; &nbsp;&nbsp;&nbsp;* 按钮<br>&nbsp; &nbsp;&nbsp;&nbsp;*/<br>&nbsp; &nbsp; private JButton save = null;<br>&nbsp; &nbsp; private JTextField num = null;<br>&nbsp; &nbsp; private Buffer buf = null;<br>&nbsp; &nbsp; private Image img = null;<br>&nbsp; &nbsp; // private VideoFormat vf = null;<br>&nbsp; &nbsp; private BufferToImage btoi = null;<br>&nbsp; &nbsp; private ImagePanel imgpanel = null;<br>&nbsp; &nbsp; /**<br>&nbsp; &nbsp;&nbsp;&nbsp;* 选取x,y,width,height默值<br>&nbsp; &nbsp;&nbsp;&nbsp;*/<br>&nbsp; &nbsp; private int rectX;<br>&nbsp; &nbsp; private int rectY;<br>&nbsp; &nbsp; private int rectWidth = 320;<br>&nbsp; &nbsp; private int rectHeight = 240;<br>&nbsp; &nbsp; private int imgWidth = 320;<br>&nbsp; &nbsp; private int imgHeight = 240;<br><br>&nbsp; &nbsp; /**<br>&nbsp; &nbsp;&nbsp;&nbsp;* 默媳募<br>&nbsp; &nbsp;&nbsp;&nbsp;*/<br>&nbsp; &nbsp; private String fname = "工作流附件程序";<br>&nbsp; &nbsp; public void init() {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;insid = this.getParameter("insid");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;taxpayerid = this.getParameter("taxpayerid");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;affID = this.getParameter("affID");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;affname = this.getParameter("affname");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;wfid = this.getParameter("wfid");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;username = this.getParameter("username");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;aid = this.getParameter("aid");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;tid = this.getParameter("tid");<br><br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;setLayout(new BorderLayout());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;setSize(320, 240);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;imgpanel = new ImagePanel();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;imgpanel.addMouseMotionListener(imgpanel);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;capture = new JButton("拍照");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;capture.addActionListener(this);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;save = new JButton("上传该附件");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;save.addActionListener(this);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//num = new JTextField();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;String str1 = "vfw:Logitech USB Video Camera:0";<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;String str2 = "vfw:Microsoft WDM Image Capture (Win32):0";<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//从驱动管理器中获取驱动,一般使用MicroOS默认的驱动，str1为罗技的摄像头驱动<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;di = CaptureDeviceManager.getDevice(str2);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//获得本地媒体源<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ml = di.getLocator();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//通过获取的本地源建立播放者对象<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;DataSource dataSource;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//player对象可以使用Manager.createRealizedPlayer(di.getLocator())直接构造，<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//player = Manager.createRealizedPlayer(di.getLocator());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;dataSource = JMFUtils.createCaptureDataSource(null, null, str2,<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;di.getFormats()[4]);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//如果自行设置格式应当使用DataSource对象构建，其中DataSource对象位置为javax.media.protocol.DataSource;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;player = Manager.createRealizedPlayer(dataSource);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//播放者开始播放<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;player.start();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Panel panelx2 = new Panel(new GridLayout(1, 2));<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Component comp;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;if ((comp = player.getVisualComponent()) != null) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //增加播放源在窗口上<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; panelx2.add(comp);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; comp.setSize(new Dimension(320, 240));<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Panel panelx = new Panel(new GridLayout(1, 5));<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Panel panel1 = new Panel(new BorderLayout());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panelx.add(new Panel());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panelx.add(capture);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panelx.add(new Panel());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panel1.add(new Label("222222---"+username), BorderLayout.WEST);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//panel1.add(num, BorderLayout.CENTER);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panelx.add(save);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panelx.add(new Panel());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panel1.add(panelx2, BorderLayout.NORTH);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panel1.add(panelx, BorderLayout.SOUTH);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;add(panel1, BorderLayout.CENTER);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;panelx2.add(imgpanel);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//add(panelx2,BorderLayout.NORTH);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; public static void main(String[] args) throws ClassNotFoundException {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;URL url = new URL(<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;"http://webserver:7001/Workflow/servlet/WebCang");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;URLConnection urlConn = url.openConnection();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;urlConn.setUseCaches(false);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;urlConn.setDefaultUseCaches(false);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (MalformedURLException e1) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;e1.printStackTrace();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; /**<br>&nbsp; &nbsp;&nbsp;&nbsp;* 乇头<br>&nbsp; &nbsp;&nbsp;&nbsp;*<br>&nbsp; &nbsp;&nbsp;&nbsp;*/<br>&nbsp; &nbsp; public static void playerclose() {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;player.close();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;player.deallocate();<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; /**<br>&nbsp; &nbsp;&nbsp;&nbsp;*<br>&nbsp; &nbsp;&nbsp;&nbsp;*/<br>&nbsp; &nbsp; public void actionPerformed(ActionEvent e) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;JComponent c = (JComponent) e.getSource();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if (c == capture) { // 抓取当前frame<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;FrameGrabbingControl fgc = (FrameGrabbingControl) player<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;.getControl(<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;"javax.media.control.FrameGrabbingControl");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;buf = fgc.grabFrame(); // 转化流格式<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;btoi = new BufferToImage((VideoFormat) buf.getFormat());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;img = btoi.createImage(buf); // 显示抓取图片<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;imgpanel.setImage(img); // 设置imgpanel图片属性<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} else if (c == save) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;if (img != null) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //fname = !num.getText().equals("") ? num.getText() : "temp";<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; fname = "test";<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;saveJPG(img, "c:\\load\\WorkflowPhoto\\" , fname + ".jpg");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //WebCangFile.saveJPG(img,"f:/"+ fname + ".jpg");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp; }<br>//为图片增加声明<br>&nbsp; &nbsp; public void creatMark(String imagePath, String userName) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ImageIcon imgIcon = new ImageIcon(imagePath);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Image theImg = imgIcon.getImage();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int width = theImg.getWidth(null);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int height = theImg.getHeight(null) + 30;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;BufferedImage bimage = new BufferedImage(width, height,<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;BufferedImage.TYPE_INT_BGR);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Graphics2D g = bimage.createGraphics();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// 设置填充背景为白色<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;g.setBackground(Color.DARK_GRAY);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;g.clearRect(0, 0, width, height);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// 设置字体颜色<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;g.setColor(Color.white);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// 绘制指定图像的当前可用部分<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;g.drawImage(theImg, 0, 15, null);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;SimpleDateFormat formatter_time = new SimpleDateFormat(<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;"yyyy-MM-dd hh:mm:ss");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;String up_time = formatter_time.format(new java.util.Date());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// 使用该图形上下文的当前字体和颜色，绘制由指定的字符串给出的文本<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;g.drawString(("本电子图片由" + userName + "于:" + up_time +<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;"上传，版权归属国家税务局所有."), 10, 15); // 添加文字<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// 撤消该图形的上下文并释放它所使用的任何系统资源。在 dispose 方法被调用后， Graphics 对象将不能被使用<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;g.dispose();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;// 图片输出<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;FileOutputStream image_out = new FileOutputStream(imagePath); // "f:/deploy/Workflow/aa.jpg"<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(image_out);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;param.setQuality(50f, true);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;encoder.encode(bimage, param);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;image_out.close();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; /**<br>&nbsp; &nbsp;&nbsp; &nbsp;* 将byte数组转换为表示16进制值的字符串<br>&nbsp; &nbsp;&nbsp; &nbsp;* 和public static String hexStr2ByteArr(String strIn)<br>&nbsp; &nbsp;&nbsp; &nbsp;* 互为可逆的转换过程<br>&nbsp; &nbsp;&nbsp; &nbsp;* @param bytes 需要转换的byte数组<br>&nbsp; &nbsp;&nbsp; &nbsp;* @return 转换后的字符串<br>&nbsp; &nbsp;&nbsp; &nbsp;* @throws Exception 本方法不处理任何异常，所有异常全部抛出<br>&nbsp; &nbsp;&nbsp; &nbsp;* @author &lt;a href="mailto:c_r_zhu@hotmail.com"&gt;PeterZhu&lt;/a&gt;<br>&nbsp; &nbsp;&nbsp; &nbsp;*/<br>&nbsp; &nbsp;&nbsp;&nbsp;public static final String encodeHex(byte[] bytes) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;StringBuffer buf = new StringBuffer(bytes.length * 2);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int i;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;for (i = 0; i &lt; bytes.length; i++) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; if (((int) bytes[i] &amp; 0xff) &lt; 0x10) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;buf.append("0");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; buf.append(Long.toString((int) bytes[i] &amp; 0xff, 16));<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;return buf.toString();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br>&nbsp; &nbsp;&nbsp;&nbsp;/**<br>&nbsp; &nbsp;&nbsp; &nbsp;* 将表示16进制值的字符串转换为byte数组，<br>&nbsp; &nbsp;&nbsp; &nbsp;* 和public static String encodeHex(byte[] arrB)<br>&nbsp; &nbsp;&nbsp; &nbsp;* 互为可逆的转换过程<br>&nbsp; &nbsp;&nbsp; &nbsp;* @param strIn 需要转换的字符串<br>&nbsp; &nbsp;&nbsp; &nbsp;* @return 转换后的byte数组<br>&nbsp; &nbsp;&nbsp; &nbsp;* @throws Exception 本方法不处理任何异常，所有异常全部抛出<br>&nbsp; &nbsp;&nbsp; &nbsp;* @author &lt;a href="mailto:c_r_zhu@hotmail.com"&gt;PeterZhu&lt;/a&gt;<br>&nbsp; &nbsp;&nbsp; &nbsp;*/<br>&nbsp; &nbsp;&nbsp;&nbsp;public static byte[] hexStr2ByteArr(String strIn)<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;throws Exception<br>&nbsp; &nbsp;&nbsp;&nbsp;{<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;byte[] arrB = strIn.getBytes();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;int iLen = arrB.length;<br>&nbsp; &nbsp;//两个字符表示一个字节，所以字节数组长度是字符串长度除以2<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;byte[] arrOut = new byte[iLen / 2];<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;for (int i = 0; i &lt; iLen; i = i + 2)<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;{<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; String strTmp = new String(arrB, i, 2);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;return arrOut;<br>&nbsp; &nbsp;&nbsp;&nbsp;}<br><br>&nbsp; &nbsp; /**<br>&nbsp; &nbsp;&nbsp;&nbsp;* 图<br>&nbsp; &nbsp;&nbsp;&nbsp;*<br>&nbsp; &nbsp;&nbsp;&nbsp;* @param img<br>&nbsp; &nbsp;&nbsp;&nbsp;* @param s<br>&nbsp; &nbsp;&nbsp;&nbsp;*/<br>&nbsp; &nbsp; public void saveJPG(Image img, String s,String filename) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;BufferedImage bi = (BufferedImage) createImage(img.getWidth(null),<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; img.getHeight(null));<br>&nbsp; &nbsp;&nbsp; &nbsp; File filedir = new File(s);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if (!filedir.exists()) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;filedir.mkdirs(); //新建目录<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;System.out.println("ghf----" + img.getWidth(null) + "&nbsp; &nbsp; hgf----" +<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;img.getHeight(null));<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Graphics2D g2 = bi.createGraphics();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;g2.drawImage(img, null, null);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//图像输出,保存部分<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;File f = new File(s+filename);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if (f.exists()){<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f.delete();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;FileOutputStream out = null;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;out = new FileOutputStream(f);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (java.io.FileNotFoundException io) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println("File Not Found");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;param.setQuality(1f, false);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;encoder.setJPEGEncodeParam(param);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;encoder.encode(bi);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;out.close();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;creatMark(s+filename, username);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (java.io.IOException io) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println("IOException");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/*AppletContext ac = getAppletContext();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;ac.showDocument(new URL(<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;"http://webserver:7001/Workflow/custom/public/affiliatedInfo_upload_main.jsp?"<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ "ls_workflow_type=affupload&amp;"<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ "ls_wfid=b120&amp;"<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ "li_insid=134020000006559&amp;"<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ "ls_taxpayerID=340211790123101&amp;"<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ "ls_affID=FB-0001&amp;"<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ "ls_affName=aaaaaaaaaaaaa&amp;"<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ "path=" + s));<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (MalformedURLException ex) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;ex.printStackTrace();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}*/<br>&nbsp; &nbsp; String filestr ="" ;<br>&nbsp; &nbsp; File file = new File(s+filename);<br>&nbsp; &nbsp; FileInputStream fin = null;<br>&nbsp; &nbsp; try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;fin = new FileInputStream(file);<br>&nbsp; &nbsp; } catch (FileNotFoundException ex) {<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; byte[] byt = new byte[4096];<br>&nbsp; &nbsp; int bb;<br>&nbsp; &nbsp; try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;while ((bb = fin.read(byt, 0, 4096)) != -1) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;filestr = filestr + encodeHex(byt);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp; } catch (IOException ex1) {<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;try {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;java.net.URL url = new java.net.URL(<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;"http://webserver:7001/Workflow/servlet/WebCang_servlet?insid="<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ insid +"&amp;affID="<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ affID +"&amp;affName="<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+ affname +"&amp;filestr="<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;+filestr);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;java.net.URLConnection con = url.openConnection();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;con.setUseCaches(true);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;con.setDoOutput(true);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;con.setDoInput(true);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//con.setRequestProperty("Content-type", "application/octest-stream");<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/*FileInputStream fin = null;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;File file = new File(s);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;fin = new FileInputStream(file);<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println("fin.available()------------"+fin.available());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;DataOutputStream dataout = new DataOutputStream(con.getOutputStream());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;int bytesRead = 0;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;byte[] buffer = new byte[8192];<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;while ((bytesRead = fin.read(buffer, 0, 8192)) != -1) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; dataout.write(buffer, 0, bytesRead); //将文件写入Stream<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}*/<br>&nbsp; &nbsp;&nbsp;&nbsp;DataOutputStream dataout = new DataOutputStream(con.getOutputStream());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;dataout.flush();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;dataout.close();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;System.out.println(dataout.size());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;DataInputStream in = new DataInputStream(con.getInputStream());<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;in.close();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;e.printStackTrace();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br>&nbsp; &nbsp; }<br>}<br>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/136950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-15 16:10 <a href="http://www.blogjava.net/WshmAndLily/articles/136950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA实现断点续传 </title><link>http://www.blogjava.net/WshmAndLily/articles/135829.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 10 Aug 2007 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/135829.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/135829.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/135829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/135829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/135829.html</trackback:ping><description><![CDATA[断点续传的原理&nbsp;<br>其实断点续传的原理很简单，就是在Http的请求上和一般的下载有所不同而已。<br>打个比方，浏览器请求服务器上的一个文时，所发出的请求如下：<br>假设服务器域名为wwww.sjtu.edu.cn，文件名为down.zip。<br>GET&nbsp;/down.zip&nbsp;HTTP/1.1<br>Accept:&nbsp;image/gif,&nbsp;image/x-xbitmap,&nbsp;image/jpeg,&nbsp;image/pjpeg,&nbsp;application/vnd.ms-<br>excel,&nbsp;application/msword,&nbsp;application/vnd.ms-powerpoint,&nbsp;*/*<br>Accept-Language:&nbsp;zh-cn<br>Accept-Encoding:&nbsp;gzip,&nbsp;deflate<br>User-Agent:&nbsp;Mozilla/4.0&nbsp;(compatible;&nbsp;MSIE&nbsp;5.01;&nbsp;Windows&nbsp;NT&nbsp;5.0)<br>Connection:&nbsp;Keep-Alive<br><br><br>服务器收到请求后，按要求寻找请求的文件，提取文件的信息，然后返回给浏览器，返回信息如下：<br><br><br>200<br>Content-Length=106786028<br>Accept-Ranges=bytes<br>Date=Mon,&nbsp;30&nbsp;Apr&nbsp;2001&nbsp;12:56:11&nbsp;GMT<br>ETag=W/"02ca57e173c11:95b"<br>Content-Type=application/octet-stream<br>Server=Microsoft-IIS/5.0<br>Last-Modified=Mon,&nbsp;30&nbsp;Apr&nbsp;2001&nbsp;12:56:11&nbsp;GMT<br><br><br>所谓断点续传，也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给<br>Web服务器的时候要多加一条信息--从哪里开始。<br>下面是用自己编的一个"浏览器"来传递请求信息给Web服务器，要求从2000070字节开始。<br>GET&nbsp;/down.zip&nbsp;HTTP/1.0<br>User-Agent:&nbsp;NetFox<br>RANGE:&nbsp;bytes=2000070-<br>Accept:&nbsp;text/html,&nbsp;image/gif,&nbsp;image/jpeg,&nbsp;*;&nbsp;q=.2,&nbsp;*/*;&nbsp;q=.2<br><br><br>仔细看一下就会发现多了一行RANGE:&nbsp;bytes=2000070-<br>这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传，前面的字节不用传了。<br>服务器收到这个请求以后，返回的信息如下：<br>206<br>Content-Length=106786028<br>Content-Range=bytes&nbsp;2000070-106786027/106786028<br>Date=Mon,&nbsp;30&nbsp;Apr&nbsp;2001&nbsp;12:55:20&nbsp;GMT<br>ETag=W/"02ca57e173c11:95b"<br>Content-Type=application/octet-stream<br>Server=Microsoft-IIS/5.0<br>Last-Modified=Mon,&nbsp;30&nbsp;Apr&nbsp;2001&nbsp;12:55:20&nbsp;GMT<br><br><br>和前面服务器返回的信息比较一下，就会发现增加了一行：<br>Content-Range=bytes&nbsp;2000070-106786027/106786028<br>返回的代码也改为206了，而不再是200了。<br><br><br>知道了以上原理，就可以进行断点续传的编程了。<br><br><br>(二)Java实现断点续传的关键几点&nbsp;<br><br><br>(1)用什么方法实现提交RANGE:&nbsp;bytes=2000070-。<br>当然用最原始的Socket是肯定能完成的，不过那样太费事了，其实Java的net包中提供了这种功能。代码如下：<br>URL&nbsp;url&nbsp;=&nbsp;new&nbsp;URL("http://www.sjtu.edu.cn/down.zip");<br>HttpURLConnection&nbsp;httpConnection&nbsp;=&nbsp;(HttpURLConnection)url.openConnection<br><br><br>();<br>//设置User-Agent<br>httpConnection.setRequestProperty("User-Agent","NetFox");<br>//设置断点续传的开始位置<br>httpConnection.setRequestProperty("RANGE","bytes=2000070");<br>//获得输入流<br>InputStream&nbsp;input&nbsp;=&nbsp;httpConnection.getInputStream();<br><br><br>从输入流中取出的字节流就是down.zip文件从2000070开始的字节流。<br>大家看，其实断点续传用Java实现起来还是很简单的吧。<br>接下来要做的事就是怎么保存获得的流到文件中去了。<br><br><br>保存文件采用的方法。<br>我采用的是IO包中的RandAccessFile类。<br>操作相当简单，假设从2000070处开始保存文件，代码如下：<br>RandomAccess&nbsp;oSavedFile&nbsp;=&nbsp;new&nbsp;RandomAccessFile("down.zip","rw");<br>long&nbsp;nPos&nbsp;=&nbsp;2000070;<br>//定位文件指针到nPos位置<br>oSavedFile.seek(nPos);<br>byte[]&nbsp;b&nbsp;=&nbsp;new&nbsp;byte[1024];<br>int&nbsp;nRead;<br>//从输入流中读入字节流，然后写到文件中<br>while((nRead=input.read(b,0,1024))&nbsp;&gt;&nbsp;0)<br>{<br>oSavedFile.write(b,0,nRead);<br>}<br><br>怎么样，也很简单吧。<br>接下来要做的就是整合成一个完整的程序了。包括一系列的线程控制等等。<br><br><br><br>(三)断点续传内核的实现<br>主要用了6个类，包括一个测试类。<br>SiteFileFetch.java负责整个文件的抓取，控制内部线程(FileSplitterFetch类)。<br>FileSplitterFetch.java负责部分文件的抓取。<br>FileAccess.java负责文件的存储。<br>SiteInfoBean.java要抓取的文件的信息，如文件保存的目录，名字，抓取文件的URL等。<br>Utility.java工具类，放一些简单的方法。<br>TestMethod.java测试类。<br><br><br>下面是源程序：&nbsp;<br>/*<br>**SiteFileFetch.java<br>*/<br>package&nbsp;NetFox;<br>import&nbsp;java.io.*;<br>import&nbsp;java.net.*;<br><br><br>public&nbsp;class&nbsp;SiteFileFetch&nbsp;extends&nbsp;Thread&nbsp;{<br><br><br>SiteInfoBean&nbsp;siteInfoBean&nbsp;=&nbsp;null;&nbsp;//文件信息Bean<br>long[]&nbsp;nStartPos;&nbsp;//开始位置<br>long[]&nbsp;nEndPos;&nbsp;//结束位置<br>FileSplitterFetch[]&nbsp;fileSplitterFetch;&nbsp;//子线程对象<br>long&nbsp;nFileLength;&nbsp;//文件长度<br>boolean&nbsp;bFirst&nbsp;=&nbsp;true;&nbsp;//是否第一次取文件<br>boolean&nbsp;bStop&nbsp;=&nbsp;false;&nbsp;//停止标志<br>File&nbsp;tmpFile;&nbsp;//文件下载的临时信息<br>DataOutputStream&nbsp;output;&nbsp;//输出到文件的输出流<br><br><br>public&nbsp;SiteFileFetch(SiteInfoBean&nbsp;bean)&nbsp;throws&nbsp;IOException<br>{<br>siteInfoBean&nbsp;=&nbsp;bean;<br>//tmpFile&nbsp;=&nbsp;File.createTempFile&nbsp;("zhong","1111",new&nbsp;File(bean.getSFilePath()));<br>tmpFile&nbsp;=&nbsp;new&nbsp;File(bean.getSFilePath()+File.separator&nbsp;+&nbsp;bean.getSFileName()+".info");<br>if(tmpFile.exists&nbsp;())<br>{<br>bFirst&nbsp;=&nbsp;false;<br>read_nPos();<br>}<br>else<br>{<br>nStartPos&nbsp;=&nbsp;new&nbsp;long[bean.getNSplitter()];<br>nEndPos&nbsp;=&nbsp;new&nbsp;long[bean.getNSplitter()];<br>}<br><br><br><br>}<br><br><br>public&nbsp;void&nbsp;run()<br>{<br>//获得文件长度<br>//分割文件<br>//实例FileSplitterFetch<br>//启动FileSplitterFetch线程<br>//等待子线程返回<br>try{<br>if(bFirst)<br>{<br>nFileLength&nbsp;=&nbsp;getFileSize();<br>if(nFileLength&nbsp;==&nbsp;-1)<br>{<br>System.err.println("File&nbsp;Length&nbsp;is&nbsp;not&nbsp;known!");<br>}<br>else&nbsp;if(nFileLength&nbsp;==&nbsp;-2)<br>{<br>System.err.println("File&nbsp;is&nbsp;not&nbsp;access!");<br>}<br>else<br>{<br>for(int&nbsp;i=0;i&lt;nStartPos.length;i++)<br>{<br>nStartPos[i]&nbsp;=&nbsp;(long)(i*(nFileLength/nStartPos.length));<br>}<br>for(int&nbsp;i=0;i&lt;nEndPos.length-1;i++)<br>{<br>nEndPos[i]&nbsp;=&nbsp;nStartPos[i+1];<br>}<br>nEndPos[nEndPos.length-1]&nbsp;=&nbsp;nFileLength;<br>}<br>}<br><br><br>//启动子线程<br>fileSplitterFetch&nbsp;=&nbsp;new&nbsp;FileSplitterFetch[nStartPos.length];<br>for(int&nbsp;i=0;i&lt;nStartPos.length;i++)<br>{<br>fileSplitterFetch[i]&nbsp;=&nbsp;new&nbsp;FileSplitterFetch(siteInfoBean.getSSiteURL(),<br>siteInfoBean.getSFilePath()&nbsp;+&nbsp;File.separator&nbsp;+&nbsp;siteInfoBean.getSFileName(),<br>nStartPos[i],nEndPos[i],i);<br>Utility.log("Thread&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;,&nbsp;nStartPos&nbsp;=&nbsp;"&nbsp;+&nbsp;nStartPos[i]&nbsp;+&nbsp;",&nbsp;nEndPos&nbsp;=&nbsp;"&nbsp;+&nbsp;nEndPos[i]);<br>fileSplitterFetch[i].start();<br>}<br>//&nbsp;fileSplitterFetch[nPos.length-1]&nbsp;=&nbsp;new&nbsp;FileSplitterFetch(siteInfoBean.getSSiteURL(),<br>siteInfoBean.getSFilePath()&nbsp;+&nbsp;File.separator&nbsp;+&nbsp;siteInfoBean.getSFileName(),nPos[nPos.length-1],nFileLength,nPos.length-1);<br>//&nbsp;Utility.log("Thread&nbsp;"&nbsp;+&nbsp;(nPos.length-1)&nbsp;+&nbsp;"&nbsp;,&nbsp;nStartPos&nbsp;=&nbsp;"&nbsp;+&nbsp;nPos[nPos.length-1]&nbsp;+&nbsp;",<br>nEndPos&nbsp;=&nbsp;"&nbsp;+&nbsp;nFileLength);<br>//&nbsp;fileSplitterFetch[nPos.length-1].start();<br><br><br>//等待子线程结束<br>//int&nbsp;count&nbsp;=&nbsp;0;<br>//是否结束while循环<br>boolean&nbsp;breakWhile&nbsp;=&nbsp;false;<br><br><br>while(!bStop)<br>{<br>write_nPos();<br>Utility.sleep(500);<br>breakWhile&nbsp;=&nbsp;true;<br><br><br>for(int&nbsp;i=0;i&lt;nStartPos.length;i++)<br>{<br>if(!fileSplitterFetch[i].bDownOver)<br>{<br>breakWhile&nbsp;=&nbsp;false;<br>break;<br>}<br>}<br>if(breakWhile)<br>break;<br><br><br>//count++;<br>//if(count&gt;4)<br>//&nbsp;siteStop();<br>}<br><br><br>System.err.println("文件下载结束！");<br>}<br>catch(Exception&nbsp;e){e.printStackTrace&nbsp;();}<br>}<br><br><br>//获得文件长度<br>public&nbsp;long&nbsp;getFileSize()<br>{<br>int&nbsp;nFileLength&nbsp;=&nbsp;-1;<br>try{<br>URL&nbsp;url&nbsp;=&nbsp;new&nbsp;URL(siteInfoBean.getSSiteURL());<br>HttpURLConnection&nbsp;httpConnection&nbsp;=&nbsp;(HttpURLConnection)url.openConnection&nbsp;();<br>httpConnection.setRequestProperty("User-Agent","NetFox");<br><br><br>int&nbsp;responseCode=httpConnection.getResponseCode();<br>if(responseCode&gt;=400)<br>{<br>processErrorCode(responseCode);<br>return&nbsp;-2;&nbsp;//-2&nbsp;represent&nbsp;access&nbsp;is&nbsp;error<br>}<br><br><br>String&nbsp;sHeader;<br><br><br>for(int&nbsp;i=1;;i++)<br>{<br>//DataInputStream&nbsp;in&nbsp;=&nbsp;new&nbsp;DataInputStream(httpConnection.getInputStream&nbsp;());<br>//Utility.log(in.readLine());<br>sHeader=httpConnection.getHeaderFieldKey(i);<br>if(sHeader!=null)<br>{<br>if(sHeader.equals("Content-Length"))<br>{<br>nFileLength&nbsp;=&nbsp;Integer.parseInt(httpConnection.getHeaderField(sHeader));<br>break;<br>}<br>}<br>else<br>break;<br>}<br>}<br>catch(IOException&nbsp;e){e.printStackTrace&nbsp;();}<br>catch(Exception&nbsp;e){e.printStackTrace&nbsp;();}<br><br><br>Utility.log(nFileLength);<br><br><br>return&nbsp;nFileLength;<br>}<br><br><br>//保存下载信息（文件指针位置）<br>private&nbsp;void&nbsp;write_nPos()<br>{<br>try{<br>output&nbsp;=&nbsp;new&nbsp;DataOutputStream(new&nbsp;FileOutputStream(tmpFile));<br>output.writeInt(nStartPos.length);<br>for(int&nbsp;i=0;i&lt;nStartPos.length;i++)<br>{<br>//&nbsp;output.writeLong(nPos[i]);<br>output.writeLong(fileSplitterFetch[i].nStartPos);<br>output.writeLong(fileSplitterFetch[i].nEndPos);<br>}<br>output.close();<br>}<br>catch(IOException&nbsp;e){e.printStackTrace&nbsp;();}<br>catch(Exception&nbsp;e){e.printStackTrace&nbsp;();}<br>}<br><br><br>//读取保存的下载信息（文件指针位置）<br>private&nbsp;void&nbsp;read_nPos()<br>{<br>try{<br>DataInputStream&nbsp;input&nbsp;=&nbsp;new&nbsp;DataInputStream(new&nbsp;FileInputStream(tmpFile));<br>int&nbsp;nCount&nbsp;=&nbsp;input.readInt();<br>nStartPos&nbsp;=&nbsp;new&nbsp;long[nCount];<br>nEndPos&nbsp;=&nbsp;new&nbsp;long[nCount];<br>for(int&nbsp;i=0;i&lt;nStartPos.length;i++)<br>{<br>nStartPos[i]&nbsp;=&nbsp;input.readLong();<br>nEndPos[i]&nbsp;=&nbsp;input.readLong();<br>}<br>input.close();<br>}<br>catch(IOException&nbsp;e){e.printStackTrace&nbsp;();}<br>catch(Exception&nbsp;e){e.printStackTrace&nbsp;();}<br>}<br><br><br>private&nbsp;void&nbsp;processErrorCode(int&nbsp;nErrorCode)<br>{<br>System.err.println("Error&nbsp;Code&nbsp;:&nbsp;"&nbsp;+&nbsp;nErrorCode);<br>}<br><br><br>//停止文件下载<br>public&nbsp;void&nbsp;siteStop()<br>{<br>bStop&nbsp;=&nbsp;true;<br>for(int&nbsp;i=0;i&lt;nStartPos.length;i++)<br>fileSplitterFetch[i].splitterStop();<br><br><br>}<br>}<br>/*<br>**FileSplitterFetch.java<br>*/<br>package&nbsp;NetFox;<br><br><br>import&nbsp;java.io.*;<br>import&nbsp;java.net.*;<br><br><br>public&nbsp;class&nbsp;FileSplitterFetch&nbsp;extends&nbsp;Thread&nbsp;{<br><br><br>String&nbsp;sURL;&nbsp;//File&nbsp;URL<br>long&nbsp;nStartPos;&nbsp;//File&nbsp;Snippet&nbsp;Start&nbsp;Position<br>long&nbsp;nEndPos;&nbsp;//File&nbsp;Snippet&nbsp;End&nbsp;Position<br>int&nbsp;nThreadID;&nbsp;//Thread's&nbsp;ID<br>boolean&nbsp;bDownOver&nbsp;=&nbsp;false;&nbsp;//Downing&nbsp;is&nbsp;over<br>boolean&nbsp;bStop&nbsp;=&nbsp;false;&nbsp;//Stop&nbsp;identical<br>FileAccessI&nbsp;fileAccessI&nbsp;=&nbsp;null;&nbsp;//File&nbsp;Access&nbsp;interface<br><br><br>public&nbsp;FileSplitterFetch(String&nbsp;sURL,String&nbsp;sName,long&nbsp;nStart,long&nbsp;nEnd,int&nbsp;id)&nbsp;throws&nbsp;IOException<br>{<br>this.sURL&nbsp;=&nbsp;sURL;<br>this.nStartPos&nbsp;=&nbsp;nStart;<br>this.nEndPos&nbsp;=&nbsp;nEnd;<br>nThreadID&nbsp;=&nbsp;id;<br>fileAccessI&nbsp;=&nbsp;new&nbsp;FileAccessI(sName,nStartPos);<br>}<br><br><br>public&nbsp;void&nbsp;run()<br>{<br>while(nStartPos&nbsp;&lt;&nbsp;nEndPos&nbsp;&amp;&amp;&nbsp;!bStop)<br>{<br><br><br>try{<br>URL&nbsp;url&nbsp;=&nbsp;new&nbsp;url(/sURL);<br>HttpURLConnection&nbsp;httpConnection&nbsp;=&nbsp;(HttpURLConnection)url.openConnection&nbsp;();<br>httpConnection.setRequestProperty("User-Agent","NetFox");<br>String&nbsp;sProperty&nbsp;=&nbsp;"bytes="+nStartPos+"-";<br>httpConnection.setRequestProperty("RANGE",sProperty);<br>Utility.log(sProperty);<br><br><br>InputStream&nbsp;input&nbsp;=&nbsp;httpConnection.getInputStream();<br>//logResponseHead(httpConnection);<br><br><br>byte[]&nbsp;b&nbsp;=&nbsp;new&nbsp;byte[1024];<br>int&nbsp;nRead;<br>while((nRead=input.read(b,0,1024))&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;nStartPos&nbsp;&lt;&nbsp;nEndPos&nbsp;&amp;&amp;&nbsp;!bStop)<br>{<br>nStartPos&nbsp;+=&nbsp;fileAccessI.write(b,0,nRead);<br>//if(nThreadID&nbsp;==&nbsp;1)<br>//&nbsp;Utility.log("nStartPos&nbsp;=&nbsp;"&nbsp;+&nbsp;nStartPos&nbsp;+&nbsp;",&nbsp;nEndPos&nbsp;=&nbsp;"&nbsp;+&nbsp;nEndPos);<br>}<br><br><br>Utility.log("Thread&nbsp;"&nbsp;+&nbsp;nThreadID&nbsp;+&nbsp;"&nbsp;is&nbsp;over!");<br>bDownOver&nbsp;=&nbsp;true;<br>//nPos&nbsp;=&nbsp;fileAccessI.write&nbsp;(b,0,nRead);<br>}<br>catch(Exception&nbsp;e){e.printStackTrace&nbsp;();}<br>}<br>}<br><br><br>//打印回应的头信息<br>public&nbsp;void&nbsp;logResponseHead(HttpURLConnection&nbsp;con)<br>{<br>for(int&nbsp;i=1;;i++)<br>{<br>String&nbsp;header=con.getHeaderFieldKey(i);<br>if(header!=null)<br>//responseHeaders.put(header,httpConnection.getHeaderField(header));<br>Utility.log(header+"&nbsp;:&nbsp;"+con.getHeaderField(header));<br>else<br>break;<br>}<br>}<br><br><br>public&nbsp;void&nbsp;splitterStop()<br>{<br>bStop&nbsp;=&nbsp;true;<br>}<br><br><br>}<br><br><br>/*<br>**FileAccess.java<br>*/<br>package&nbsp;NetFox;<br>import&nbsp;java.io.*;<br><br><br>public&nbsp;class&nbsp;FileAccessI&nbsp;implements&nbsp;Serializable{<br><br><br>RandomAccessFile&nbsp;oSavedFile;<br>long&nbsp;nPos;<br><br><br>public&nbsp;FileAccessI()&nbsp;throws&nbsp;IOException<br>{<br>this("",0);<br>}<br><br><br>public&nbsp;FileAccessI(String&nbsp;sName,long&nbsp;nPos)&nbsp;throws&nbsp;IOException<br>{<br>oSavedFile&nbsp;=&nbsp;new&nbsp;RandomAccessFile(sName,"rw");<br>this.nPos&nbsp;=&nbsp;nPos;<br>oSavedFile.seek(nPos);<br>}<br><br><br>public&nbsp;synchronized&nbsp;int&nbsp;write(byte[]&nbsp;b,int&nbsp;nStart,int&nbsp;nLen)<br>{<br>int&nbsp;n&nbsp;=&nbsp;-1;<br>try{<br>oSavedFile.write(b,nStart,nLen);<br>n&nbsp;=&nbsp;nLen;<br>}<br>catch(IOException&nbsp;e)<br>{<br>e.printStackTrace&nbsp;();<br>}<br><br><br>return&nbsp;n;<br>}<br><br><br>}<br><br><br>/*<br>**SiteInfoBean.java<br>*/<br>package&nbsp;NetFox;<br><br><br>public&nbsp;class&nbsp;SiteInfoBean&nbsp;{<br><br><br>private&nbsp;String&nbsp;sSiteURL;&nbsp;//Site's&nbsp;URL<br>private&nbsp;String&nbsp;sFilePath;&nbsp;//Saved&nbsp;File's&nbsp;Path<br>private&nbsp;String&nbsp;sFileName;&nbsp;//Saved&nbsp;File's&nbsp;Name<br>private&nbsp;int&nbsp;nSplitter;&nbsp;//Count&nbsp;of&nbsp;Splited&nbsp;Downloading&nbsp;File<br><br><br>public&nbsp;SiteInfoBean()<br>{<br>//default&nbsp;value&nbsp;of&nbsp;nSplitter&nbsp;is&nbsp;5<br>this("","","",5);<br>}<br><br><br>public&nbsp;SiteInfoBean(String&nbsp;sURL,String&nbsp;sPath,String&nbsp;sName,int&nbsp;nSpiltter)<br>{<br>sSiteURL=&nbsp;sURL;<br>sFilePath&nbsp;=&nbsp;sPath;<br>sFileName&nbsp;=&nbsp;sName;<br>this.nSplitter&nbsp;=&nbsp;nSpiltter;<br><br><br>}<br><br><br>public&nbsp;String&nbsp;getSSiteURL()<br>{<br>return&nbsp;sSiteURL;<br>}<br><br><br>public&nbsp;void&nbsp;setSSiteURL(String&nbsp;value)<br>{<br>sSiteURL&nbsp;=&nbsp;value;<br>}<br><br><br>public&nbsp;String&nbsp;getSFilePath()<br>{<br>return&nbsp;sFilePath;<br>}<br><br><br>public&nbsp;void&nbsp;setSFilePath(String&nbsp;value)<br>{<br>sFilePath&nbsp;=&nbsp;value;<br>}<br><br><br>public&nbsp;String&nbsp;getSFileName()<br>{<br>return&nbsp;sFileName;<br>}<br><br><br>public&nbsp;void&nbsp;setSFileName(String&nbsp;value)<br>{<br>sFileName&nbsp;=&nbsp;value;<br>}<br><br><br>public&nbsp;int&nbsp;getNSplitter()<br>{<br>return&nbsp;nSplitter;<br>}<br><br><br>public&nbsp;void&nbsp;setNSplitter(int&nbsp;nCount)<br>{<br>nSplitter&nbsp;=&nbsp;nCount;<br>}<br>}<br><br><br>/*<br>**Utility.java<br>*/<br>package&nbsp;NetFox;<br><br><br>public&nbsp;class&nbsp;Utility&nbsp;{<br><br><br>public&nbsp;Utility()<br>{<br><br><br>}<br><br><br>public&nbsp;static&nbsp;void&nbsp;sleep(int&nbsp;nSecond)<br>{<br>try{<br>Thread.sleep(nSecond);<br>}<br>catch(Exception&nbsp;e)<br>{<br>e.printStackTrace&nbsp;();<br>}<br>}<br><br><br>public&nbsp;static&nbsp;void&nbsp;log(String&nbsp;sMsg)<br>{<br>System.err.println(sMsg);<br>}<br><br><br>public&nbsp;static&nbsp;void&nbsp;log(int&nbsp;sMsg)<br>{<br>System.err.println(sMsg);<br>}<br>}<br><br><br>/*<br>**TestMethod.java<br>*/<br>package&nbsp;NetFox;<br><br><br>public&nbsp;class&nbsp;TestMethod&nbsp;{<br><br><br>public&nbsp;TestMethod()<br>{&nbsp;///xx/weblogic60b2_win.exe<br>try{<br>SiteInfoBean&nbsp;bean&nbsp;=&nbsp;new&nbsp;SiteInfoBean("http://localhost/xx/weblogic60b2_win.exe","L:\\temp","weblogic60b2_win.exe",5);<br>//SiteInfoBean&nbsp;bean&nbsp;=&nbsp;new&nbsp;SiteInfoBean("http://localhost:8080/down.zip","L:\\temp","weblogic60b2_win.exe",5);<br>SiteFileFetch&nbsp;fileFetch&nbsp;=&nbsp;new&nbsp;SiteFileFetch(bean);<br>fileFetch.start();<br>}<br>catch(Exception&nbsp;e){e.printStackTrace&nbsp;();}<br><br><br>}<br><br><br>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)<br>{<br>new&nbsp;TestMethod();<br>}<br>}
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/135829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-10 14:27 <a href="http://www.blogjava.net/WshmAndLily/articles/135829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java备份mysql</title><link>http://www.blogjava.net/WshmAndLily/articles/135022.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 07 Aug 2007 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/135022.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/135022.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/135022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/135022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/135022.html</trackback:ping><description><![CDATA[首先，设置mysql的环境变量（在path中添加%MYSQL_HOME%\bin），重启电脑。<br>完整代码：<br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; &nbsp;* @param args<br>&nbsp;&nbsp;&nbsp; &nbsp;*/<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* 备份和导入是一个互逆的过程。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* 备份：程序调用mysql的备份命令，读出控制台输入流信息，写入.sql文件；<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* 导入：程序调用mysql的导入命令，把从.sql文件中读出的信息写入控制台的输出流<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;* 注意：此时定向符"&gt;"和"&lt;"是不能用的<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;*/<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; backup();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; load();<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; &nbsp;* 备份检验一个sql文件是否可以做导入文件用的一个判断方法：把该sql文件分别用记事本和ultra<br>&nbsp;&nbsp;&nbsp; &nbsp;* edit打开，如果看到的中文均正常没有乱码，则可以用来做导入的源文件（不管sql文件的编码格式如何，也不管db的编码格式如何）<br>&nbsp;&nbsp;&nbsp; &nbsp;*/<br>&nbsp;&nbsp;&nbsp; public static void backup() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Runtime rt = Runtime.getRuntime();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 调用 mysql 的 cmd:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Process child = rt<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .exec("mysqldump -u root --set-charset=utf8 bjse act_obj");// 设置导出编码为utf8。这里必须是utf8<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 把进程执行中的控制台输出信息写入.sql文件，即生成了备份文件。注：如果不对控制台信息进行读出，则会导致进程堵塞无法运行<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InputStream in = child.getInputStream();// 控制台的输出信息作为输入流<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InputStreamReader xx = new InputStreamReader(in, "utf8");// 设置输出流编码为utf8。这里必须是utf8，否则从流中读入的是乱码<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String inStr;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer("");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String outStr;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 组合控制台输出信息字符串<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BufferedReader br = new BufferedReader(xx);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ((inStr = br.readLine()) != null) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sb.append(inStr + "\r\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; outStr = sb.toString();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 要用来做导入用的sql目标文件：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FileOutputStream fout = new FileOutputStream(<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "e:/mysql-5.0.27-win32/bin/bjse22.sql");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OutputStreamWriter writer = new OutputStreamWriter(fout, "utf8");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; writer.write(outStr);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 注：这里如果用缓冲方式写入文件的话，会导致中文乱码，用flush()方法则可以避免<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; writer.flush();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 别忘记关闭输入输出流<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; in.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xx.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; br.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; writer.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fout.close();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("/* Output OK! */");<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; &nbsp;* 导入<br>&nbsp;&nbsp;&nbsp; &nbsp;*<br>&nbsp;&nbsp;&nbsp; &nbsp;*/<br>&nbsp;&nbsp;&nbsp; public static void load() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String fPath = "e:/mysql-5.0.27-win32/bin/bjse22.sql";<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Runtime rt = Runtime.getRuntime();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 调用 mysql 的 cmd:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Process child = rt.exec("mysql -u root bjse ");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OutputStream out = child.getOutputStream();//控制台的输入信息作为输出流<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String inStr;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer("");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String outStr;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BufferedReader br = new BufferedReader(new InputStreamReader(<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new FileInputStream(fPath), "utf8"));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while ((inStr = br.readLine()) != null) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sb.append(inStr + "\r\n");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; outStr = sb.toString();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; writer.write(outStr);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 注：这里如果用缓冲方式写入文件的话，会导致中文乱码，用flush()方法则可以避免<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; writer.flush();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 别忘记关闭输入输出流<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; out.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; br.close();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; writer.close();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("/* Load OK! */");<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; }<br>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/135022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-07 17:50 <a href="http://www.blogjava.net/WshmAndLily/articles/135022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JAVA API函数实现数据的压缩与解压缩[转载]semovy</title><link>http://www.blogjava.net/WshmAndLily/articles/133349.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 30 Jul 2007 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/133349.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/133349.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/133349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/133349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/133349.html</trackback:ping><description><![CDATA[<p><strong>数据压缩概述</strong><br><br>文件中数据冗余的最简单的类型是"字符的复制"。让我们先来看下面一个字符串：<br><br>JJJJJJAAAAVVVVAAAAAA</p>
<p>这个字符串可以用更简洁的方式来编码，那就是通过替换每一个重复的字符串为单个的实例字符加上记录重复次数的数字来表示,上面的字符串可以被编码为下面的形式：6J4A4V6A</p>
<p>在这里，"6J"意味着6个字符J，"4A"意味着4个字符A，以此类推。这种字符串压缩方式称为"行程长度编码"方式，简称RLE。<br><br>再举一个例子，考虑一下矩形图像的存储。一个单色位图，可以被存储为下面这种形式。<br><br>另外一种方式是将图像存为一个图元文件：<br><br>Rectangle 11, 3, 20, 5<br><br>上面的表示方法是讲矩形的起始坐标是（11，3），宽度是20，高度是5。<br><br>上述的矩形图像可以使用RLE编码方式压缩，通过对相同位记数表示如下：<br><br>0, 40<br><br>0, 40<br><br>0,10 1,20 0,10<br><br>0,10 1,1 0,18 1,1 0,10<br><br>0,10 1,1 0,18 1,1 0,10<br><br>0,10 1,1 0,18 1,1 0,10<br><br>0,10 1,20 0,10<br><br>0,40<br><br>上面第一行是讲图像的第一行由40个0组成。第三行是讲图像的第三行是由10个0加上20个1再加上10个0组成，其它行以此类推。<br><br>大家注意，RLE方法需要将其表示的文件与编码文件分开。所以，这种方法不能应用于所有的文件。其它的压缩技术包括变长编码（也被称为哈夫曼编码），还有其它的方法。要想了解更详细的信息，请参考有关数据和图像压缩技术方面的图书，一定会有收获的。<br><br>数据压缩有很多益处。不管怎么说，最主要的好处就是减少存储方面的需求。同样的，对于数据通信来讲，压缩数据在媒体中的将导致信息传输数据的提升。数据的压缩能够通过软件在现有的硬件设备上实现或者通过带有压缩技术的特殊的硬件设备来实现。<br><br>ZIP VS GZIP</p>
<p>如果你是在Windows系统下工作，你可能会对工具WinZip很熟悉，是用来创建压缩档案和解开压缩档案的。而在UNIX平台上，会有一些不同,命令tar用来创建一个档案文件（并不压缩），其它的程序（gzip或compress）用来创建一个压缩档案。<br><br>WinZip和PkZip之类的工具同时扮演着归档和压缩两个角色。他们将文件压缩并将其归档。另一方面，gzip并不将文件归档。所以，在UNIX平台上，命令tar通常用来创建一个档案文件，然后命令gzip来将档案文件压缩。<br><br><strong>Java.util.zip包</strong><br><br>Java提供了java.util.zip包用来兼容ZIP格式的数据压缩。它提供了一系列的类用来读取，创建，修改ZIP和GZIP格式的文件。它还提供了工具类来计算任意输入流的数目，这可以用来验证输入数据的有效性。该包提供了一个接口，十四个类，和两个异常处理类，如表1所示。<br><br>表1: java.util.zip包<br><br>条目 类型 描述 <br><br>Checksum 接口 被类Adler32和CRC32实现的接口 <br><br>Adler32 类 使用Alder32算法来计算Checksum数目 <br><br>CheckedInputStream 类 一个输入流，保存着被读取数据的Checksum <br><br>CheckedOutputStream 类 一个输出流，保存着被读取数据的Checksum <br><br>CRC32 类 使用CRC32算法来计算Checksum数目 <br><br>Deflater 类 使用ZLIB压缩类，支持通常的压缩方式 <br><br>DeflaterOutputStream 类 一个输出过滤流，用来压缩Deflater格式数据 <br><br>GZIPInputStream 类 一个输入过滤流，读取GZIP格式压缩数据 <br><br>GZIPOutputStream 类 一个输出过滤流，读取GZIP格式压缩数据 <br><br>Inflater 类 使用ZLIB压缩类，支持通常的解压方式 <br><br>InlfaterInputStream 类 一个输入过滤流，用来解压Inlfater格式的压缩数据 <br><br>ZipEntry 类 存储ZIP条目 <br><br>ZipFile 类 从ZIP文件中读取ZIP条目 <br><br>ZipInputStream 类 一个输入过滤流，用来读取ZIP格式文件中的文件 <br><br>ZipOutputStream 类 一个输出过滤流，用来向ZIP格式文件口写入文件 <br><br>DataFormatException 异常类 抛出一个数据格式错误 <br><br>ZipException 异常类 抛出一个ZIP文件 <br><br>注意：ZLIB压缩类最初是作为可移植的网络图像文件格式（PNG）标准的一部分开发的，是不受专利保护的。<br><br><strong>从ZIP文件中解压缩和提取数据</strong><br><br>java.util.zip包提供了数据压缩与解压缩所需要的类。ZIP文件的解压缩实质上就是从输入流中读取数据。Java.util.zip包提供了类ZipInputStream来读取ZIP文件。ZipInputStream流的创建与其它输入流的创建没什么两样。举个例子，下面的代码段创建了一个输入流来读取ZIP格式的文件：<br><br>FileInputStream fis = new FileInputStream("figs.zip");<br><br>ZipInputStream zin = new ZipInputStream(new BufferedInputStream(fis));<br><br>ZIP输入流打开后，你可以使用getNextEntry方法来读取ZIP文件中的条目数，该方法返回一个ZipEntry对象。如果到达文件的尾部，getNextEntry返回null：<br><br>ZipEntry entry;<br><br>while((entry = zin.getNextEntry()) != null) {<br><br>// extract data<br><br>// open output streams<br><br>}<br><br>现在，你应该建立一个输出流，如下所示：<br><br>int BUFFER = 2048;<br><br>FileOutputStream fos = new FileOutputStream(entry.getName());<br><br>BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);<br><br>注意：在这段代码中我们用BufferedOutputStream代替了ZIPOutputStream。ZIPOutputStream和GZIPOutputStream使用内置的512字节缓冲。当缓冲区的大小大于512字节时，使用BufferedOutputStream才是正确的（例子中设置为2048）。ZIPOutputStream不允许你设置缓冲区的大小，GZIPOutputStream也是一样，但创建 GZIPOutputStream 对象时可以通过构造函数的参数指定内置的缓冲尺寸。<br><br>这段代码中，使用ZIP内含的条目名称创建一个文件输出流。可以使用entry.getName来得到它的返回句柄。接着读出被压缩的源数据，然后写入输出流：<br><br>while ((count = zin.read(data, 0, BUFFER)) != -1) {<br><br>//System.out.write(x);<br><br>dest.write(data, 0, count);<br><br>}<br><br>最后，不要忘记关闭输入和输出流：<br><br>dest.flush();<br><br>dest.close();<br><br>zin.close();<br><br>例程1的源程序UnZip.java显示如何解压缩并从ZIP档案中将文件释放出来。测试这个例子，编译这个类，并运行它，传给它一个ZIP格式的文件作为参数：<br><br>prompt&gt; java UnZip somefile.zip<br><br>注意：somefile.zip应该是一个ZIP压缩档案，可以用任何一种ZIP压缩工具来创建，例如WinZip。<br><span class=top11>例程1源代码:<br><br>UnZip.java<br><br>import java.io.*;<br><br>import java.util.zip.*;<br><br>public class UnZip {<br><br>static final int BUFFER = 2048;<br><br>public static void main (String argv[]) {<br><br>try {<br><br>BufferedOutputStream dest = null;<br><br>FileInputStream fis = new <br><br>FileInputStream(argv[0]);<br><br>ZipInputStream zis = new <br><br>ZipInputStream(new BufferedInputStream(fis));<br><br>ZipEntry entry;<br><br>while((entry = zis.getNextEntry()) != null) {<br><br>System.out.println("Extracting: " +entry);<br><br>int count;<br><br>byte data[] = new byte[BUFFER];<br><br>// write the files to the disk<br><br>FileOutputStream fos = new <br><br>FileOutputStream(entry.getName());<br><br>dest = new <br><br>BufferedOutputStream(fos, BUFFER);<br><br>while ((count = zis.read(data, 0, BUFFER)) <br><br>!= -1) {<br><br>dest.write(data, 0, count);<br><br>}<br><br>dest.flush();<br><br>dest.close();<br><br>}<br><br>zis.close();<br><br>} catch(Exception e) {<br><br>e.printStackTrace();<br><br>}}<br><br>}<br><br>有一点值得大家注意，类ZipInputStream读出ZIP文件序列（简单地说就是读出这个ZIP文件压缩了多少文件），而类ZipFile使用内嵌的随机文件访问机制读出其中的文件内容，所以不必顺序的读出ZIP压缩文件序列。<br><br>注意：ZIPInputStream和ZipFile之间另外一个基本的不同点在于高速缓冲的使用方面。当文件使用ZipInputStream和FileInputStream流读出的时候，ZIP条目不使用高速缓冲。然而，如果使用ZipFile（文件名）来打开文件，它将使用内嵌的高速缓冲，所以如果ZipFile（文件名）被重复调用的话，文件只被打开一次。缓冲值在第二次打开进使用。如果你工作在UNIX系统下，这是什么作用都没有的，因为使用ZipFile打开的所有ZIP文件都在内存中存在映射，所以使用ZipFile的性能优于ZipInputStream。然而，如果同一ZIP文件的内容在程序执行期间经常改变，或是重载的话，使用ZipInputStream就成为你的首选了。<br><br>下面显示了使用类ZipFile来解压一个ZIP文件的过程：<br><br>通过指定一个被读取的ZIP文件，或者是文件名，或者是一个文件对象来创建一个ZipFile对象：<br><br>ZipFile zipfile = new ZipFile("figs.zip");<br><br>使用entries方法，返回一个枚举对象，循环获得文件的ZIP条目对象：<br><br>while(e.hasMoreElements()) {<br><br>entry = (ZipEntry) e.nextElement();<br><br>// read contents and save them<br><br>}<br><br>ZIP条目作为参数传递给getInputStream方法，可以读取ZIP文件中指定条目的内容，能过其返回的输入流（InputStram）对象可以方便的读出ZIP条目的内容：<br><br>is = new BufferedInputStream(zipfile.getInputStream(entry));<br><br>获取ZIP条目的文件名，创建输出流，并保存:<br><br>byte data[] = new byte[BUFFER];<br><br>FileOutputStream fos = new FileOutputStream(entry.getName());<br><br>dest = new BufferedOutputStream(fos, BUFFER);<br><br>while ((count = is.read(data, 0, BUFFER)) != -1) {<br><br>dest.write(data, 0, count);<br><br>}<br><br>最后关闭所有的输入输出流 dest.flush();<br><br>dest.close();<br><br>is.close();<br><br>完整的程序代码如例程2所示。再次编译这个文件，并传递一个ZIP格式的文件做为参数：<br><br>prompt&gt; java UnZip2 somefile.zip<br><br>例程2源码:<br><br>UnZip2.java <br><br>import java.io.*;<br><br>import java.util.*;<br><br>import java.util.zip.*;<br><br>public class UnZip2 {<br><br>static final int BUFFER = 2048;<br><br>public static void main (String argv[]) {<br><br>try {<br><br>BufferedOutputStream dest = null;<br><br>BufferedInputStream is = null;<br><br>ZipEntry entry;<br><br>ZipFile zipfile = new ZipFile(argv[0]);<br><br>Enumeration e = zipfile.entries();<br><br>while(e.hasMoreElements()) {<br><br>entry = (ZipEntry) e.nextElement();<br><br>System.out.println("Extracting: " +entry);<br><br>is = new BufferedInputStream<br><br>(zipfile.getInputStream(entry));<br><br>int count;<br><br>byte data[] = new byte[BUFFER];<br><br>FileOutputStream fos = new <br><br>FileOutputStream(entry.getName());<br><br>dest = new <br><br>BufferedOutputStream(fos, BUFFER);<br><br>while ((count = is.read(data, 0, BUFFER)) <br><br>!= -1) {<br><br>dest.write(data, 0, count);<br><br>}<br><br>dest.flush();<br><br>dest.close();<br><br>is.close();<br><br>}<br><br>} catch(Exception e) {<br><br>e.printStackTrace();<br><br>}}<br><br>}<br><span class=top11><strong>将数据压缩归档入一ZIP文件</strong><br><br>类ZipOutputStream能够用来将数据压缩成一个ZIP文件。ZipOutputStream将数据写入ZIP格式的输出流。下面的步骤与创建一个ZIP文件相关。<br><br>1、第一步是创建一个ZipOutputStream对象，我们将要写入输出流的文件作为参数传给它。下面的代码演示了如何创建一个名为"myfigs.zip"的ZIP文件。<br><br>FileOutputStream dest = new<br><br>FileOutputStream("myfigs.zip");<br><br>ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));<br><br>2、一但目标输出流创建后，下一步就是打开数据源文件。在这个例子中，源数据文件是指那些当前目录下的文件。命令list用来得到当前目录下文件列表：<br><br>File f = new File(".");<br><br>String files[] = f.list();<br><br>for (int i=0; i &lt; files.length; i++) {<br><br>System.out.println("Adding: "+files[i]);<br><br>FileInputStream fi = new FileInputStream(files[i]);<br><br>// create zip entry<br><br>// add entries to ZIP file<br><br>}<br><br>注意：这个例程能够压缩当前目录下的所有文件。它不能处理子目录。作为一个练习，你可以修改例程3来处理子目录。<br><br>3、 为读出的数据创建一个ZIP条目列表：<br><br>ZipEntry entry = new ZipEntry(files[i]))<br><br>4、 在你将数据写入ZIP输出流之前，你必须使用putNextEntry方法将ZIP条目列表写入输出流：<br><br>out.putNextEntry(entry);<br><br>5、 将数据写入ZIP文件：<br><br>int count;<br><br>while((count = origin.read(data, 0, BUFFER)) != -1) {<br><br>out.write(data, 0, count);<br><br>}<br><br>6、 最后关闭所有的输入输出流：<br><br>origin.close();<br><br>out.close(); </p>
<p>&#160;</p>
<p>完整的程序代码如例程3所示。<br><br>例程3源代码:<br><br>Zip.java <br><br>import java.io.*;<br><br>import java.util.zip.*;<br><br>public class Zip {<br><br>static final int BUFFER = 2048;<br><br>public static void main (String argv[]) {<br><br>try {<br><br>BufferedInputStream origin = null;<br><br>FileOutputStream dest = new <br><br>FileOutputStream("c:\zip\myfigs.zip");<br><br>ZipOutputStream out = new ZipOutputStream(new <br><br>BufferedOutputStream(dest));<br><br>//out.setMethod(ZipOutputStream.DEFLATED);<br><br>byte data[] = new byte[BUFFER];<br><br>// get a list of files from current directory<br><br>File f = new File(".");<br><br>String files[] = f.list();<br><br>for (int i=0; i &lt; files.length; i++) {<br><br>System.out.println("Adding: "+files[i]);<br><br>FileInputStream fi = new <br><br>FileInputStream(files[i]);<br><br>origin = new <br><br>BufferedInputStream(fi, BUFFER);<br><br>ZipEntry entry = new ZipEntry(files[i]);<br><br>out.putNextEntry(entry);<br><br>int count;<br><br>while((count = origin.read(data, 0, <br><br>BUFFER)) != -1) {<br><br>out.write(data, 0, count);<br><br>}<br><br>origin.close();<br><br>}<br><br>out.close();<br><br>} catch(Exception e) {<br><br>e.printStackTrace();<br><br>}}<br><br>} <br><br>注意: 条目列表可以以两种方式加入ZIP文件中，一种是压缩方式（DEFLATED），另一种是不压缩方式(STORED),系统默认的存储方式为压缩方式（DEFLATED）。SetMethod方法可以用来设置它的存储方式。例如，设置存储方式为DEFLATED（压缩）应该这样做： out.setMethod(ZipOutputStream.DEFLATED) 设置存储方式为（不压缩）应该这样做： out.setMethod(ZipOutputStream.STORED)。<br><br><strong>ZIP文件属性</strong><br><br>类ZipEntry描述了存储在ZIP文件中的压缩文件。类中包含有多种方法可以用来设置和获得ZIP条目的信息。类ZipEntry是被ZipFile和ZipInputStream使用来读取ZIP文件，ZipOutputStream来写入ZIP文件的。ZipEntry中最有用的一些方法显示在下面的表格2中，并且有相应的描述。<br><br>表格 2: 类ZipEntry中一些有用的方法<br><br>方法签名 描述 <br><br>public String getComment() 返回条目的注释, 没有返回null <br><br>public long getCompressedSize() 返回条目压缩后的大小, 未知返回-1 <br><br>public int getMethod() 返回条目的压缩方式,没有指定返回 -1 <br><br>public String getName() 返回条目的名称 <br><br>public long getSize() 返回未被压缩的条目的大小，未知返回-1 <br><br>public long getTime() 返回条目的修改时间, 没有指定返回-1 <br><br>public void setComment(String c) 设置条目的注释 <br><br>public void setMethod(int method) 设置条目的压缩方式 <br><br>public void setSize(long size) 设置没有压缩的条目的大小 <br><br>public void setTime(long time) 设置条目的修改时间 <br><br><strong>求和校验</strong><br><br>java.util.zip包中另外一些比较重要的类是Adler32和CRC32，它们实现了java.util.zip.Checksum接口，并估算了压缩数据的校验和（checksum）。众所周知，在运算速度方面，Adler32算法比CRC32算法要有一定的优势；但在数据可信度方面，CRC32算法则要更胜一筹。正所谓，"鱼与熊掌，不可兼得。"，大家只好在不同的场合下，加以取舍了。GetValue方法可以用来获得当前的checksum值，reset方法能够重新设置checksum为其缺省的值。<br><br>求和校验一般用来校验文件和信息是否正确的传送。举个例子，假设你想创建一个ZIP文件，然后将其传送到远程计算机上。当到达远程计算机后，你就可以使用checksum检验在传输过程中文件是否发生错误。为了演示如何创建checksums，我们修改了例程1和例程3，在例程4和例程5中使用了两个新类，一个是CheckedInputStream，另一个是CheckedOutputStream。（大家注意：这两段代码在压缩与解压缩过程中，使用了同一种算法，求数据的checksum值。）<br><br>例程4源代码:<br><br>Zip.java <br><br>import java.io.*;<br><br>import java.util.zip.*;<br><br>public class Zip {<br><br>static final int BUFFER = 2048;<br><br>public static void main (String argv[]) {<br><br>try {<br><br>BufferedInputStream origin = null;<br><br>FileOutputStream dest = new <br><br>FileOutputStream("c:\zip\myfigs.zip");<br><br>CheckedOutputStream checksum = new <br><br>CheckedOutputStream(dest, new Adler32());<br><br>ZipOutputStream out = new <br><br>ZipOutputStream(new <br><br>BufferedOutputStream(checksum));<br><br>//out.setMethod(ZipOutputStream.DEFLATED);<br><br>byte data[] = new byte[BUFFER];<br><br>// get a list of files from current directory<br><br>File f = new File(".");<br><br>String files[] = f.list();<br><br>for (int i=0; i &lt; files.length; i++) {<br><br>System.out.println("Adding: "+files[i]);<br><br>FileInputStream fi = new <br><br>FileInputStream(files[i]);<br><br>origin = new <br><br>BufferedInputStream(fi, BUFFER);<br><br>ZipEntry entry = new ZipEntry(files[i]);<br><br>out.putNextEntry(entry);<br><br>int count;<br><br>while((count = origin.read(data, 0, <br><br>BUFFER)) != -1) {<br><br>out.write(data, 0, count);<br><br>}<br><br>origin.close();<br><br>}<br><br>out.close();<br><br>System.out.println("checksum: <br><br>"+checksum.getChecksum().getValue());<br><br>} catch(Exception e) {<br><br>e.printStackTrace();<br><br>}}<br><br>} <br><br>例程5源代码:<br><br>UnZip.java <br><br>import java.io.*;<br><br>import java.util.zip.*;<br><br>public class UnZip {<br><br>public static void main (String argv[]) {<br><br>try {<br><br>final int BUFFER = 2048;<br><br>BufferedOutputStream dest = null;<br><br>FileInputStream fis = new <br><br>FileInputStream(argv[0]);<br><br>CheckedInputStream checksum = new <br><br>CheckedInputStream(fis, new Adler32());<br><br>ZipInputStream zis = new <br><br>ZipInputStream(new <br><br>BufferedInputStream(checksum));<br><br>ZipEntry entry;<br><br>while((entry = zis.getNextEntry()) != null) {<br><br>System.out.println("Extracting: " +entry);<br><br>int count;<br><br>byte data[] = new byte[BUFFER];<br><br>// write the files to the disk<br><br>FileOutputStream fos = new <br><br>FileOutputStream(entry.getName());<br><br>dest = new BufferedOutputStream(fos, <br><br>BUFFER);<br><br>while ((count = zis.read(data, 0, <br><br>BUFFER)) != -1) {<br><br>dest.write(data, 0, count);<br><br>}<br><br>dest.flush();<br><br>dest.close();<br><br>}<br><br>zis.close();<br><br>System.out.println("Checksum: <br><br>"+checksum.getChecksum().getValue());<br><br>} catch(Exception e) {<br><br>e.printStackTrace();<br><br>}<br><br>}}<br><br>测试例程4和5，编译类文件并运行类Zip来创建一个压缩档案（程序会计算出checksum值并显示在屏幕上），然后运行UnZip类来解压缩这个档案（屏幕上同样会打印出一个checksum值）。两个值必须完全相同，否则说明出错了。Checksums在数据校验方面非常有用。例如，你可以创建一个ZIP文件，然后连同checksum值一同传递给你的朋友。你的朋友解压缩文件后，将生成的checksum值与你提供的作一比较，如果相同则说明在传递过程中没有发生错误。</p>
<span class=top11><strong>压缩对象</strong><br><br>我们已经看到如何将文件中的数据压缩并将其归档。但如果你想压缩的数据不在文件中时，应该怎么办呢？假设有这样一个例子，你通过套接字（socket）来传递一个大对象。为了提高应用程序的性能，你可能在通过网络开始传递前将数据压缩，然后在目的地将其解压缩。另外一个例子，我们假设你想将一个对象用压缩格式存储在磁碟上，ZIP格式是基于记录方式的，不适合这项工作。GZIP更适合用来实现这种对单一数据流的操作。现在，我们来示例一下，如果在写入磁碟前将数据压缩，并在读出时将数据解压缩。示例程序6是一个在单一JVM（java虚拟机）实现了Serializable接口的简单类，我们想要串行化该类的实例。<br><br>例程6源代码:<br><br>Employee.java <br><br>import java.io.*;<br><br>public class Employee implements Serializable {<br><br>String name;<br><br>int age;<br><br>int salary;<br><br>public Employee(String name, int age, int salary) {<br><br>this.name = name;<br><br>this.age = age;<br><br>this.salary = salary;<br><br>}<br><br>public void print() {<br><br>System.out.println("Record for: "+name);<br><br>System.out.println("Name: "+name);<br><br>System.out.println("Age: "+age);<br><br>System.out.println("Salary: "+salary);<br><br>}<br><br>}<br><br>现在，写另外一个类来创建两个从Employee类实例化而来的对象。示例程序7从Employee类创建了两个对象（sarah和sam）。然后将它们的状态以压缩的格式存储在一个文件中。<br><br>示例程序7源代码：<br><br>SaveEmployee.java <br><br>import java.io.*;<br><br>import java.util.zip.*;<br><br>public class SaveEmployee {<br><br>public static void main(String argv[]) throws <br><br>Exception {<br><br>// create some objects<br><br>Employee sarah = new Employee("S. Jordan", 28, <br><br>56000);<br><br>Employee sam = new Employee("S. McDonald", 29, <br><br>58000);<br><br>// serialize the objects sarah and sam<br><br>FileOutputStream fos = new <br><br>FileOutputStream("db");<br><br>GZIPOutputStream gz = new GZIPOutputStream(fos);<br><br>ObjectOutputStream oos = new <br><br>ObjectOutputStream(gz);<br><br>oos.writeObject(sarah);<br><br>oos.writeObject(sam);<br><br>oos.flush();<br><br>oos.close();<br><br>fos.close();<br><br>}}<br><br>现在，示例程序8中的ReadEmpolyee类是用来重新构建两个对象的状态。一但构建成功，就调用print方法将其打印出来。<br><br>示例程序8源代码:<br><br>ReadEmployee.java <br><br>import java.io.*;<br><br>import java.util.zip.*;<br><br>public class ReadEmployee {<br><br>public static void main(String argv[]) throws <br><br>Exception{<br><br>//deserialize objects sarah and sam<br><br>FileInputStream fis = new FileInputStream("db");<br><br>GZIPInputStream gs = new GZIPInputStream(fis);<br><br>ObjectInputStream ois = new ObjectInputStream(gs);<br><br>Employee sarah = (Employee) ois.readObject();<br><br>Employee sam = (Employee) ois.readObject();<br><br>//print the records after reconstruction of state<br><br>sarah.print();<br><br>sam.print();<br><br>ois.close();<br><br>fis.close();<br><br>}<br><br>}<br><br>同样的思想可以用于在网络间通过（socket）传输的大对象。下面的代码段示例了如何在客户/服务器之间实现大对象的压缩：<br><br>// write to client<br><br>GZIPOutputStream gzipout = new <br><br>GZIPOutputStream(socket.getOutputStream());<br><br>ObjectOutputStream oos = new <br><br>ObjectOutputStream(gzipout);<br><br>oos.writeObject(obj);<br><br>gzipos.finish();<br><br>下面的代码段显示了客户端从服务器端接收到数据后，如何将其解压:<br><br>// read from server<br><br>Socket socket = new Socket(remoteServerIP, PORT);<br><br>GZIPInputStream gzipin = new <br><br>GZIPInputStream(socket.getInputStream());<br><br>ObjectInputStream ois = new ObjectInputStream(gzipin);<br><br>Object o = ois.readObject();<br><br><strong>对JAR文件进行操作</strong><br><br>Java档案文件（JAR）格式是基于标准的ZIP文件格式，并附有可选择的文件清单列表。如果你想要在你我的应用程序中创建JAR文件或从JAR文件中解压缩文件，可以使用java.util.jar包，它提供了读写JAR文件的类。使用java.util.jar包提供的类与本文所讲述的java.util.zip包十分相似。所以你应该能够重新编写本文的源代码，如果你想使用java.util.jar包的话。<br><br><strong>结束语</strong><br><br>本文讨论了你可以在应用程序中使用的数据压缩与解压的应用程序接口，本文的示例程序演示了如何使用java.util.zip包来压缩数据与解压缩数据。现在你可以利用这个工具在你的应用程序中实现数据的压缩与解压了。<br><br>本文也说明了如何在络传输中实现数据的压缩与解压缩，以减少网络阻塞和增强你的客户/服务器模式应用程序的性能。在网络传输中实现数据的压缩，只有当传输的数据量达到成百上千字节时，你才会感觉到程序性能的提升，如果仅仅是传递一个字符串对象，对应用程序是没什么影响的。
<p>&#160;</p>
<p>本文所演示的代码经本人在Win2000平台下使用Java2SDK1.4.0调试通过。</p>
</span></span></span>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/133349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-07-30 15:50 <a href="http://www.blogjava.net/WshmAndLily/articles/133349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FCKEditor的赋值和取值操作</title><link>http://www.blogjava.net/WshmAndLily/articles/130243.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 14 Jul 2007 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/130243.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/130243.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/130243.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/130243.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/130243.html</trackback:ping><description><![CDATA[1、获取编辑器中HTML内容<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;getEditorHTMLContents(EditorName)<br><img id=Codehighlighter1_43_134_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_43_134_Open_Text.style.display='none'; Codehighlighter1_43_134_Closed_Image.style.display='inline'; Codehighlighter1_43_134_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_43_134_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_43_134_Closed_Text.style.display='none'; Codehighlighter1_43_134_Open_Image.style.display='inline'; Codehighlighter1_43_134_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_43_134_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_43_134_Open_Text style="DISPLAY: inline"><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;oEditor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FCKeditorAPI.GetInstance(EditorName);&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(oEditor.GetXHTML(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">));&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>2、获取编辑器中文字内容（在博客发布时获取无html代码摘要使用）<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;getEditorTextContents(EditorName)<br><img id=Codehighlighter1_43_149_Open_Image onclick="this.style.display='none'; Codehighlighter1_43_149_Open_Text.style.display='none'; Codehighlighter1_43_149_Closed_Image.style.display='inline'; Codehighlighter1_43_149_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_43_149_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_43_149_Closed_Text.style.display='none'; Codehighlighter1_43_149_Open_Image.style.display='inline'; Codehighlighter1_43_149_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_43_149_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_43_149_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;oEditor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FCKeditorAPI.GetInstance(EditorName);&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(oEditor.EditorDocument.body.innerText);&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>3、设置编辑器中内容<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">&nbsp;SetEditorContents(EditorName,&nbsp;ContentStr)<br><img id=Codehighlighter1_51_141_Open_Image onclick="this.style.display='none'; Codehighlighter1_51_141_Open_Text.style.display='none'; Codehighlighter1_51_141_Closed_Image.style.display='inline'; Codehighlighter1_51_141_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_51_141_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_51_141_Closed_Text.style.display='none'; Codehighlighter1_51_141_Open_Image.style.display='inline'; Codehighlighter1_51_141_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_51_141_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_51_141_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;oEditor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;FCKeditorAPI.GetInstance(EditorName)&nbsp;;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;oEditor.SetHTML(ContentStr)&nbsp;;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span></div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/130243.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-07-14 11:09 <a href="http://www.blogjava.net/WshmAndLily/articles/130243.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java/jsp中集成FCKeditor使用</title><link>http://www.blogjava.net/WshmAndLily/articles/117853.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 16 May 2007 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/117853.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/117853.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/117853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/117853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/117853.html</trackback:ping><description><![CDATA[<div id=LastMDatecns!317D097BECD35E7C!242>2007/4/1</div>
<h4 class=TextColor1 id=subjcns!317D097BECD35E7C!242 style="MARGIN-BOTTOM: 0px">Java/jsp中集成FCKeditor使用</h4>
<div class=bvMsg id=msgcns!317D097BECD35E7C!242>
<div>
<p>最近一直在搞FCKeditor在线文本编辑器的裁剪和集成，总结了自己的一些
<p>心得体会，跟大家分享一下自己的经验！
<p>1.jsp/java中引用FCKeditor步骤和具体做法，参见如下的链接：
<p>&nbsp; a.<a href="http://wiki.fckeditor.net/Developer's_Guide/Integration/Javascrīpt" target=_blank><u><font color=#0000ff>jsp页面集成调用说明</font></u></a>；&nbsp;&nbsp; b.<a href="http://wiki.fckeditor.net/Developer's_Guide/Integration/Java" target=_blank><u><font color=#0000ff>后台浏览和上传功能集成指南</font></u></a>；
<p><font color=#ff0000>注意点：</font>配置好jsp页面集成FCKeditor的javascrīpt调用以后，页面将会
<p>显示如下的样子：
<p><a href="http://jysq.net/batch.download.php?aid=12408" target=_blank></a>&nbsp;【文本编辑器样式】
<p>页面上相应的代码如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>&lt;scrīpt type="text/javascrīpt" src="FCKeditor/fckeditor.js"&gt;&lt;/scrīpt&gt;</font></td>
        </tr>
    </tbody>
</table>
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>&lt;textarea name="content" cols="80" rows="4"&gt;<br>&lt;/textarea&gt;<br>&lt;scrīpt type="text/javascrīpt"&gt;<br>&nbsp;&nbsp;var ōFCKeditor = new FCKeditor('content') ;<br>&nbsp;&nbsp;oFCKeditor.BasePath = "FCKeditor/";<br>&nbsp;&nbsp;oFCKeditor.Height = 400;<br>&nbsp;&nbsp;oFCKeditor.ToolbarSet = "Default" ;&nbsp;<br>&nbsp;&nbsp;oFCKeditor.ReplaceTextarea();<br>&lt;/scrīpt&gt;</font></td>
        </tr>
    </tbody>
</table>
<p>如果是要想从数据库读来的文本数据或者是后台来自文件的txt/html
<p>文本数据。只要在
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>&lt;textarea name="content" cols="80" rows="4"&gt;<br>&lt;/textarea&gt;</font></td>
        </tr>
    </tbody>
</table>
<p>中加入自己的显示内容的formbean对应字段即可
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>&lt;textarea name="content" cols="80" rows="4"&gt;</font>
            <p><font color=#0000ff>&lt;c:out value="${&nbsp;contentData}" /&gt;<br>&lt;/textarea&gt;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>这样内容就会被显示在FCKeditor编辑框中了，点击提交按钮以后就可以
<p>在后台的相应java action中得到content参数中的内容就是页面上
<p>FCKeditor中的内容数据了。可以在struts/jsf做使用的哦。
<p>要提醒一点的是由于你给FCKeditor瘦身，所以常会报缺少对象支持
<p>等错误，只要在FCKeditor/editor/lang中加上相应的js语言文件即可
<p>如果加载页面失败（<font color=#ff0000>FCKeditor未定义</font>）还有一个可能就是引用
<p>FCKeditor/fckeditor.js文件路径不对！关于FCKeditor瘦身可以
<p>参考网上文章,我还是摘一些要点从网上：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff><strong>1、</strong>将FCKeditor目录下及子目录下所有以&#8221;_&#8221;下划线开</font>
            <p><font color=#0000ff>头的文件夹删除</font>
            <p><br><font color=#0000ff><strong>2.</strong>FCKeditor根目录下只保留fckconfig.js,&nbsp; </font>
            <p><font color=#0000ff>fckeditor.js, fckstyles.xml, fcktemplates.xml</font>
            <p><font color=#0000ff>其余全部删除</font>
            <p><br><font color=#0000ff><strong>3.</strong>将editor/filemanager/upload目录下文件及文件夹</font>
            <p><font color=#0000ff>清空.</font>
            <p><br><font color=#0000ff><strong>4.</strong>还可以将editor/skins目录下的皮肤文件删除，只留下</font>
            <p><font color=#0000ff>default一套皮肤（如果你不需要换皮肤的话）</font>
            <p><br><font color=#0000ff><strong>5.</strong>还可以将editor/lang目录下文件删除，只保留</font>
            <p><font color=#0000ff>en.js, fcklanguagemanager.js, zh-cn.js, zh.js</font>
            <p><font color=#0000ff>文件</font>
            <p><font color=#0000ff>6.如果你是使用javascrīpt来调用加载FCKeditor，那么</font>
            <p><font color=#0000ff>就不需要在web.xml中配置fckeditor的tag文件。</font>
            <p><font color=#0000ff>7.还有一个问题刚开始使用FCKeditor的人常会遇到</font>
            <p><font color=#0000ff>就怎么控制它的toolbar的大小和元素排列，其实很简单。</font>
            <p><font color=#0000ff>在fckconfig.js中用使用这样的标签[]来划分每行的</font>
            <p><font color=#0000ff>元素的多少，这样就可以控制toolbar的长短和大小了，</font>
            <p><font color=#0000ff>具体示例参看：fckconfig.js中的toolbarset</font>
            <p><font color=#0000ff>["Default"]</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>2.下面再说说fckconfig.js中的一些选项来控制toolbarset中的控件
<p>的功能，实现功能裁剪：
<p>1):取消超链接中的浏览服务器和上传功能，方法如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>FCKConfig.LinkBrowser = true ;</font>
            <p><font color=#0000ff>FCKConfig.LinkUpload = true ;</font>
            <p><font color=#0000ff>改为</font>
            <p><font color=#0000ff>FCKConfig.LinkBrowser =&nbsp;false ;</font>
            <p><font color=#0000ff>FCKConfig.LinkUpload =&nbsp;false ;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>2）：取消图片链接中的浏览服务器和上传功能，方法如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>FCKConfig.ImageUpload = true ;</font>
            <p><font color=#0000ff>FCKConfig.ImageBrowser = true ;</font>
            <p><font color=#0000ff>改为</font>
            <p><font color=#0000ff>FCKConfig.ImageUpload =&nbsp;false ;</font>
            <p><font color=#0000ff>FCKConfig.ImageBrowser =&nbsp;false ;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>3):Dlg Button中取消高级功能，方法如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>FCKConfig.LinkDlgHideAdvanced&nbsp;= false ;</font>
            <p><font color=#0000ff>FCKConfig.ImageDlgHideAdvanced&nbsp;= false ;</font>
            <p><font color=#0000ff>改为</font>
            <p><font color=#0000ff>FCKConfig.ImageDlgHideAdvanced&nbsp;=&nbsp;true ;</font>
            <p><font color=#0000ff>FCKConfig.LinkDlgHideTarget&nbsp;&nbsp;=&nbsp;true ;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>下一篇介绍FCKeditor的上传和浏览服务器功能，以及如何在里面实现动态
<p>超连接，转发到servlet经过filter以后去调用服务器的action
<p>如何实现对应用户浏览自己的图片的列表实现！
<p>&nbsp;
<p>FCKeditor集成java servlet可以实现文件的上传和服务器端列表读取功
<p>能FCKeditor自己提供了两个servlet来分别实现上传文件功能，和读取服
<p>务器端文件列表功能，这两个servlet分别为：
<p><font color=#0000ff>com.fredck.FCKeditor.connector.ConnectorServlet（读取文件列</font>
<p><font color=#0000ff>表）com.fredck.FCKeditor.uploader.SimpleUploaderServlet（实</font>
<p><font color=#0000ff>现</font><font color=#0000ff>文件上传）</font>
<p><font color=#ff0000>1.浏览服务器端文件列表</font>
<p><font color=#000000>web.xml文件中，比如ConnectorServlet中</font><font color=#000000>的</font>配置选项：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>&lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-name&gt;baseDir&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/UserFiles/&lt;/param-value&gt;<br>&nbsp;&nbsp;&lt;/init-param&gt;</font></td>
        </tr>
    </tbody>
</table>
<p>意思在浏览服务器上的baseDir配置指定里面的所有文件极其目录结构列表
<p>如果你的baseDir没有配置，Connector将会自动创建一个默认的文件夹
<p><font color=#ff0000>userFiles</font>，对应的ConnectorServlet中init()方法中代码如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td><font color=#0000ff>baseDir=getInitParameter("baseDir");<br>if(baseDir==null)<br>&nbsp;&nbsp;&nbsp;baseDir="/UserFiles/";</font></td>
        </tr>
    </tbody>
</table>
<p>还想说一下的是，FCKeditor的client调用server的servlet方法采用
<p>的是Ajax思想来实现。当你点击浏览服务器(browser server)的时候
<p>就会触发一个异步的javascrīpt + xmlhttp的调用响应，后台的servlet
<p>会去完成你要请求的事件，然后数据以xml方式返回给client来解析。
<p>很明显，你要实现去数据库或者其他的文件系统请求列表，你只要修改
<p>ConnectorServlet中两个私有方法：<font color=#ff0000>getFolders</font> 和 <font color=#ff0000>getFiles</font>
<p>让它去你指定的地方得到文件列表即可，这样你的文件可以放在任何你
<p>指定目录下。多说一句，很多人都想知道个人blog系统中怎么实现上传
<p>文件以后对应用户浏览自己的列表的，我的做法很简单，建立你用户名
<p>的文件夹，你上传只能上传到你的目录夹，浏览可以通过程序指定浏览
<p>对应用户下的文件夹即可，这个时候你要修改Connectorservlet中的
<p>路径即可！
<p><font color=#ff0000>2.超连接重定位问题</font>
<p>FCKeditor可以插入超连接，实现对文件的预览功能，只要我们稍微改变
<p>我们可以使FCKeditor编辑器支持对任意文件系统下的任意文件的客户端
<p>浏览和下载保存！FCKeditor本来提供的是相对URL超连接，只要我们修改
<p>ConnectorServlet中传递给客户端的地址的时候，把它改写成绝对URL
<p>然后再通过我们自己的filter的servlet实现重定向去一个下载/浏览
<p>文件的struts的action方法就可以实现在客户端对超连接文件的下载和
<p>浏览！说一下具体做法吧：
<p>1):修改ConnectorServlet传递给客户端javascrīpt的路径，代码如下
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>String currentUrl= "http://" + request.getserver +request.getServerPort + request.getContextPath +resourcePath;</font>
            <p><font color=#ff0000>以上代码请在ConnectorServlet的doGet()里面拼装！在</font>
            <p><font color=#ff0000>调用CreateCommonXml（）私有方法的时候参数传入</font>
            <p><font color=#0000ff>myEl.setAttribute("path",currentPath);<br>myEl.setAttribute("url",currentUrl);</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>提醒一下<font color=#0000ff>resourcePath</font><font color=#000000>为在web.xml配置文件中ConnectorServlet中</font>
<p>的一个初始化参数配置，等一下利用filter实现对超连接的重定位就提取
<p>URL中的这个配置参数来判断，配置如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p><font color=#0000ff>&lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-name&gt;resourcePath&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&lt;param-value&gt;/fileSystem/&lt;/param-value&gt;<br>&lt;/init-param&gt;</font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>2）：建立你的filter servlet，实现对URL的截获，对符合要求的
<p>URL进行重定位到你的对应action中去即可
<p>3）：实现你的对应action来实现文件的上传和下载功能即可！
<p>4）：扩展功能－实现对URL的加密，对连接的URL中加上一串字符，最后
<p>几位作为算法校验，对不符合要求的URL连接,filter将会拒绝重定位到
<p>指定action。此外利用自己写的扩展类还可以实现对超连接的文件类型
<p>进行限制，比如你只能超连接JPG|GIF|DOC|TXT|HTML等几种后缀名的
<p>文件，对其他文件即使你指定超连接也让你浏览和下载，这些都可以在
<p>web.xml中通过修改对应servlet的配置文件的初始化参数实现。
<p><font color=#ff0000>3.页面javascrīpt修改</font>
<p>浏览服务器的功能对应的html/javascrīpt相关的文件为：browser.html
<p>和frmresourcelist.html对应你想传递的信息你可以append在文件名的
<p>字符串后面，在<font color=#ff0000>GetFileRowHtml（）</font>的javascrīpt函数中实现对文件
<p>名的截取，这样client只会显示文件名，而你可以得到文件的数据库唯一
<p>标识，任何你想要的信息你都可以通过修改<font color=#ff0000>ConnectorServlet</font>中的私有
<p>方法<font color=#ff0000>getFiles()</font>来实现，只要修改页面frmresurcelist.html中的
<p><font color=#ff0000>GetFileRowHtml（）</font><font color=#000000>中传入变量<font color=#ff0000>fileName</font>即可。你还可以在点击选中</font>
<p>文件的时候实现一个你自己的Ajax调用，一切取决你的项目需要！
<p>4.我不是一个javascrīpt高手，其实如果我对javascrīpt了解多一些
<p>也许对客户端的代码修改以后做出更眩的功能。可以更好的完成对
<p>FCKeditor裁剪。我还发现一个问题，就是FCKeditor2.3自己提供的
<p>textarea控件一直不能获得输入焦点，接受文字输入，如果有高手知道
<p>怎么修改javascrīpt修复这个bug，请也回复我！
<p>&nbsp;
<p><a href="http://www.java99.com/zz/Image/articles/fckeditor_guide2/fckeditor_guide_02.jpg"></a>
<p><font color=#ff0000>5.注意点</font>
<p>无论怎么修改别人的东西，请一定尊重开源精神！
<p>很多人配置好了FCKeditor的上传功能以后常会遇到xmlhttp request
<p>404 error,后面是一串路径，其实就是你的servlet-mapping中的路径
<p>不对，你只要把xmlhttp request errot 404 后面跟的路径，copy到
<p>你的web.xml中对应红色文字的位置，如下：
<p>
<table style="BORDER-RIGHT: #999 1px solid; BORDER-TOP: #999 1px solid; FONT-SIZE: 12px; BORDER-LEFT: #999 1px solid; WIDTH: 80%; BORDER-BOTTOM: #999 1px solid" align=center>
    <tbody>
        <tr>
            <td>
            <p>&lt;servlet-mapping&gt;<br>&lt;servlet-name&gt;Connector&lt;/servlet-name&gt;<br>&lt;url-pattern&gt;
            <p><font color=#ff0000>/FCKeditor/editor/filemanager/browser/default/connectors/jsp/connector</font>
            <p>&lt;/url-pattern&gt;
            <p>&lt;/servlet-mapping&gt;</p>
            </td>
        </tr>
    </tbody>
</table>
<p>别忘了<font color=#ff0000>SimpleUploader的servlet－mapping</font>也要做同样的修改！
<p>还有一个错误就是http 500错误，这个可能是你的URL请求不对，应该和
<p>FCKeditor没关系的! </p>
</div>
</div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/117853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-05-16 15:33 <a href="http://www.blogjava.net/WshmAndLily/articles/117853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用java收邮件- -</title><link>http://www.blogjava.net/WshmAndLily/articles/116945.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 12 May 2007 03:09:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/116945.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/116945.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/116945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/116945.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/116945.html</trackback:ping><description><![CDATA[<h2 class=diaryTitle>用java收邮件- -</h2>
<p>&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;
<p>
<p>收邮件没问题了，缺点就是邮件太多的话，会等好长时间才出来，应用线程方式来收，否则看着象死机了，：），以后再说了</p>
<p>package com.IEthing.util;</p>
<p>import java.io.*;<br>import java.text.*;<br>import java.util.*;</p>
<p>import javax.mail.*;<br>import javax.mail.internet.*;<br>import javax.mail.*;<br>import javax.mail.internet.*;<br>import javax.activation.*;<br>import javax.mail.MessagingException;<br>import javax.mail.Session;<br>import javax.mail.internet.MimeMessage;</p>
<p>import javax.mail.MessagingException;<br>import javax.mail.Session;<br>import javax.mail.internet.MimeMessage;</p>
<p><br>/**<br>&nbsp;* @author David update by tegger<br>&nbsp;*<br>&nbsp;* TODO To change the template for this generated type comment go to Window -<br>&nbsp;* Preferences - Java - Code Style - Code Templates<br>&nbsp;*/<br>public class Pop3Bean {</p>
<p>&nbsp; private int mailCounter; //邮件计数</p>
<p>&nbsp; private int mailIndex; //邮件编号，即邮件在messages数组中的位置</p>
<p>&nbsp; private int mailDownErrorCounter; //正在下载邮件时，出错的计数器</p>
<p>&nbsp; private boolean[] recordFailure; //记录下载出错的邮件的序号</p>
<p>&nbsp; private int totalRetryTimes; //总共重试次数</p>
<p>&nbsp; private int retryTimeCounter; //记下重试的次数</p>
<p>&nbsp; private boolean otherError; //若是在邮件正式下载之前出错，则置该值为true</p>
<p>&nbsp; private String extension=".eml"; //文件扩展名</p>
<p>&nbsp; private Store store;</p>
<p>&nbsp; private Folder folder;</p>
<p>&nbsp; private Message[] messages;</p>
<p>&nbsp; private Message message;</p>
<p>&nbsp; private Part part;</p>
<p>&nbsp; private String emlName;</p>
<p>&nbsp; private String attachName;</p>
<p>&nbsp; private int allMessageCount;</p>
<p>&nbsp; private int messageCount;</p>
<p>&nbsp; private String dateformat; //默认的日前显示格式</p>
<p>&nbsp; //&nbsp; private String propFile = MailConstants.PROPS_FILE_NAME;//用这个接口类的好处是更改配置文件路径的时候不需要更改每个类</p>
<p>&nbsp; private String protocol="pop3"; //服务协议</p>
<p>&nbsp; private String mailHost; //服务器地址</p>
<p>&nbsp; private String userName; //用户名</p>
<p>&nbsp; private String password; //密码</p>
<p>&nbsp; private String saveAttachPath; //附件下载后的存放目录</p>
<p>&nbsp; private String saveEmlPath="E:\\test\\"; //保存eml文件的路径</p>
<p>&nbsp; public Pop3Bean() throws IOException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; /*&nbsp;&nbsp; FileProperties fp = new FileProperties(propFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fp.load();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol = fp.getProperty(MailConstants.RECV_PROTO);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailHost = fp.getProperty(MailConstants.RECV_HOST);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userName = fp.getProperty(MailConstants.RECV_USER);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password = fp.getProperty(MailConstants.RECV_PASS);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveAttachPath = fp.getProperty(MailConstants.RECV_ATTACH);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveEmlPath = fp.getProperty(MailConstants.RECV_ROOT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dateformat = fp.getProperty("mail.receive.dtfmat");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extension = fp.getProperty("mail.receive.extension");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalRetryTimes = Integer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .parseInt(fp.getProperty("mail.receive.retry"));*/<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置邮件主机<br>&nbsp;&nbsp; */<br>&nbsp; public void setMailHost(String mailHost)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.mailHost = mailHost;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获取邮件主机<br>&nbsp;&nbsp; */<br>&nbsp; public String getMailHost()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return this.mailHost;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置邮件帐号<br>&nbsp;&nbsp; */<br>&nbsp; public void setUserName(String userName)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.userName = userName;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获取邮件帐号<br>&nbsp;&nbsp; */<br>&nbsp; public String getUserName()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return this.userName;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置邮件密码<br>&nbsp;&nbsp; */<br>&nbsp; public void setPassword(String password)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.password = password;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置Store<br>&nbsp;&nbsp; */<br>&nbsp; public void setStore(Store store)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.store = store;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置邮箱文件夹<br>&nbsp;&nbsp; */<br>&nbsp; public void setFolder(Folder folder)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.folder = folder;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置messages数组<br>&nbsp;&nbsp; */<br>&nbsp; public void setMessages(Message[] messages)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.messages = messages;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置message<br>&nbsp;&nbsp; */<br>&nbsp; public void setMessage(Message message)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.message = message;<br>&nbsp; }<br>&nbsp;public void setCurMessage(int i)<br>&nbsp;{<br>&nbsp;&nbsp; this.message = this.messages[i];<br>&nbsp;}<br>&nbsp; /**<br>&nbsp;&nbsp; * 获取message<br>&nbsp;&nbsp; */<br>&nbsp; public Message getMessage()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return this.message;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获取folder中的message数量<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; */<br>&nbsp; public int getAllMessageCount() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.allMessageCount = folder.getMessageCount();<br>&nbsp;&nbsp;&nbsp; return allMessageCount;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置allMessageCount<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; */<br>&nbsp; private void setAllMessageCount() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.allMessageCount = this.folder.getMessageCount();<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获取messages中message的数量<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @return<br>&nbsp;&nbsp; */<br>&nbsp; public int getMessageCount()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.messageCount = this.messages.length;<br>&nbsp;&nbsp;&nbsp; return messageCount;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得folder中新邮件的数量<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @return<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; */<br>&nbsp; public int getNewMessageCount() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return this.folder.getNewMessageCount();<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得folder中未读邮件的数量<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @return<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; */<br>&nbsp; public int getUnreadMessageCount() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return this.folder.getUnreadMessageCount();<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获取Part<br>&nbsp;&nbsp; */<br>&nbsp; public Part getPart()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return (Part) message;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置Part<br>&nbsp;&nbsp; */<br>&nbsp; public void setPart(Part part)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.part = part;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置附件存放路径<br>&nbsp;&nbsp; */</p>
<p>&nbsp; public void setAttachPath(String attachPath)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.saveAttachPath = attachPath;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得附件存放路径<br>&nbsp;&nbsp; */</p>
<p>&nbsp; public String getAttachPath()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return saveAttachPath;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置eml存放路径<br>&nbsp;&nbsp; */</p>
<p>&nbsp; public void setEmlPath(String emlPath)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.saveEmlPath = emlPath;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得eml存放路径<br>&nbsp;&nbsp; */</p>
<p>&nbsp; public String getEmlPath()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return saveEmlPath;<br>&nbsp; }</p>
<p>&nbsp; public void setEmlName(String emlName)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.emlName = emlName;<br>&nbsp; }</p>
<p>&nbsp; public String getEmlName()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return emlName;<br>&nbsp; }</p>
<p>&nbsp; public void setAttachName(String attachName)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.attachName = attachName;<br>&nbsp; }</p>
<p>&nbsp; public String getAttachName()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return attachName;<br>&nbsp; }</p>
<p>&nbsp; public void setExtension(String extension)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.extension = extension;<br>&nbsp; }</p>
<p>&nbsp; public String getExtension()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return extension;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 设置日期显示格式<br>&nbsp;&nbsp; */</p>
<p>&nbsp; public void setDateFormat(String format) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.dateformat = format;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获取日期显示格式<br>&nbsp;&nbsp; */<br>&nbsp; public String getDateFormat(String format) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return this.dateformat;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得发件人的地址和姓名<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @throws Exception<br>&nbsp;&nbsp; */<br>&nbsp; public String getFrom() throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getFrom(this.message);<br>&nbsp; }</p>
<p>&nbsp; public String getFrom(Message mimeMessage) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();<br>&nbsp;&nbsp;&nbsp; String from = address[0].getAddress();<br>&nbsp;&nbsp;&nbsp; if (from == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from = "";<br>&nbsp;&nbsp;&nbsp; String personal = address[0].getPersonal();<br>&nbsp;&nbsp;&nbsp; if (personal == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; personal = "";<br>&nbsp;&nbsp;&nbsp; String fromaddr = personal + "&lt;" + from + "&gt;";<br>&nbsp;&nbsp;&nbsp; return fromaddr;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得邮件的收件人，抄送，和密送的地址和姓名，根据所传递的参数的不同 * "to"----收件人 "cc"---抄送人地址<br>&nbsp;&nbsp; * "bcc"---密送人地址<br>&nbsp;&nbsp; */<br>&nbsp; public String getTOAddress() throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getMailAddress("TO", this.message);<br>&nbsp; }</p>
<p>&nbsp; public String getCCAddress() throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getMailAddress("CC", this.message);<br>&nbsp; }</p>
<p>&nbsp; public String getBCCAddress() throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getMailAddress("BCC", this.message);<br>&nbsp; }</p>
<p>&nbsp; public String getTOAddress(Message mimeMessage) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getMailAddress("TO", mimeMessage);<br>&nbsp; }</p>
<p>&nbsp; public String getCCAddress(Message mimeMessage) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getMailAddress("CC", mimeMessage);<br>&nbsp; }</p>
<p>&nbsp; public String getBCCAddress(Message mimeMessage) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getMailAddress("BCC", mimeMessage);<br>&nbsp; }</p>
<p>&nbsp; public String getMailAddress(String type) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getMailAddress(type, this.message);<br>&nbsp; }</p>
<p>&nbsp; public String getMailAddress(String type, Message mimeMessage) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; String mailaddr = "";<br>&nbsp;&nbsp;&nbsp; String addtype = type.toUpperCase();<br>&nbsp;&nbsp;&nbsp; InternetAddress[] address = null;<br>&nbsp;&nbsp;&nbsp; if (addtype.equals("TO") || addtype.equals("CC")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || addtype.equals("BCC"))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (addtype.equals("TO"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address = (InternetAddress[]) mimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getRecipients(Message.RecipientType.TO);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (addtype.equals("CC"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address = (InternetAddress[]) mimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getRecipients(Message.RecipientType.CC);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address = (InternetAddress[]) mimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getRecipients(Message.RecipientType.BCC);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (address != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; address.length; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String email = address[i].getAddress();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (email == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; email = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; email = MimeUtility.decodeText(email);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String personal = address[i].getPersonal();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (personal == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; personal = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; personal = MimeUtility.decodeText(personal);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String compositeto = personal + "&lt;" + email + "&gt;";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailaddr += "," + compositeto;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailaddr = mailaddr.substring(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("Error emailaddr type!");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return mailaddr;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得邮件主题<br>&nbsp;&nbsp; */<br>&nbsp; public String getSubject() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getSubject(this.message);<br>&nbsp; }</p>
<p>&nbsp; public String getSubject(Message mimeMessage) throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; String subject = "";<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subject = MimeUtility.decodeText(mimeMessage.getSubject());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (subject == null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subject = "";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception exce)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return subject;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得邮件发送日期<br>&nbsp;&nbsp; */<br>&nbsp; public String getSentDate() throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getSentDate(this.message);<br>&nbsp; }</p>
<p>&nbsp; public String getSentDate(Message mimeMessage) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; Date sentdate = mimeMessage.getSentDate();<br>&nbsp;&nbsp;&nbsp; SimpleDateFormat format = new SimpleDateFormat(dateformat);<br>&nbsp;&nbsp;&nbsp; return format.format(sentdate);<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 判断此邮件是否需要回执，如果需要回执返回"true",否则返回"false"<br>&nbsp;&nbsp; */<br>&nbsp; public boolean getReplySign() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getReplySign(this.message);<br>&nbsp; }</p>
<p>&nbsp; public boolean getReplySign(Message mimeMessage) throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; boolean replysign = false;<br>&nbsp;&nbsp;&nbsp; String needreply[] = mimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getHeader("Disposition-Notification-To");<br>&nbsp;&nbsp;&nbsp; if (needreply != null)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replysign = true;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return replysign;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得此邮件的Message-ID<br>&nbsp;&nbsp; */<br>&nbsp; public String getMessageId() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return getMessageId(this.message);<br>&nbsp; }</p>
<p>&nbsp; public String getMessageId(Message mimeMessage) throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return ( (MimeMessage) mimeMessage).getMessageID();<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 初始化出错邮件数组<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; */<br>&nbsp; private void setRecordFailure()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; this.recordFailure = new boolean[getMessageCount()];<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 返回出错数组<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @return<br>&nbsp;&nbsp; */<br>&nbsp; public boolean[] getRecordFailure()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return this.recordFailure;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 判断此邮件是否已读，如果未读返回返回false,反之返回true<br>&nbsp;&nbsp; */<br>&nbsp; public boolean isNew() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return isNew(this.message);<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 判断此邮件是否已读，如果未读返回返回false,反之返回true<br>&nbsp;&nbsp; */<br>&nbsp; public boolean isNew(Message mimeMessage) throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; boolean isnew = false;<br>&nbsp;&nbsp;&nbsp; Flags flags = mimeMessage.getFlags();<br>&nbsp;&nbsp;&nbsp; Flags.Flag[] flag = flags.getSystemFlags();<br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; flag.length; i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (flag[i] == Flags.Flag.SEEN)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isnew = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return isnew;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 判断此邮件是否包含附件<br>&nbsp;&nbsp; */<br>&nbsp; public boolean isContainAttach() throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; return isContainAttach(this.part);<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 判断此邮件是否包含附件<br>&nbsp;&nbsp; */<br>&nbsp; public boolean isContainAttach(Part part) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; boolean attachflag = false;<br>&nbsp;&nbsp;&nbsp; String contentType = part.getContentType();<br>&nbsp;&nbsp;&nbsp; if (part.isMimeType("multipart/*"))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Multipart mp = (Multipart) part.getContent();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; mp.getCount(); i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BodyPart mpart = mp.getBodyPart(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String disposition = mpart.getDisposition();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( (disposition != null)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; ( (disposition.equals(Part.ATTACHMENT)) || (disposition<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .equals(Part.INLINE))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachflag = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (mpart.isMimeType("multipart/*"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachflag = isContainAttach( (Part) mpart);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String contype = mpart.getContentType();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (contype.toLowerCase().indexOf("application") != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachflag = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (contype.toLowerCase().indexOf("name") != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachflag = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if (part.isMimeType("message/rfc822"))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachflag = isContainAttach( (Part) part.getContent());<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return attachflag;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 连到server，创建folder对象，创建message对象<br>&nbsp;&nbsp; */<br>&nbsp; public void getConn()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.getStoreFromServer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.getFolderFromStore();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; otherError = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailDownErrorCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(e.getLocalizedMessage());<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 建立Store连接<br>&nbsp;&nbsp; */<br>&nbsp; private Store getStoreFromServer() throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; //创建session<br>&nbsp;&nbsp;&nbsp; Session session = Session.getDefaultInstance(System.getProperties(),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null);<br>&nbsp;&nbsp;&nbsp; //session.setDebug(true);</p>
<p>&nbsp;&nbsp;&nbsp; //创建store,建立连接<br>&nbsp;&nbsp;&nbsp; Store store = session.getStore(protocol);<br>&nbsp;&nbsp;&nbsp; System.out.println("connecting");<br>&nbsp;&nbsp;&nbsp; store.connect(mailHost, userName, password);<br>&nbsp;&nbsp;&nbsp; System.out.println("connected successfully");<br>&nbsp;&nbsp;&nbsp; setStore(store);<br>&nbsp;&nbsp;&nbsp; return store;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 打开INBox文件夹<br>&nbsp;&nbsp; */<br>&nbsp; private Folder getFolderFromStore()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; //打开邮件相应文件夹<br>&nbsp;&nbsp;&nbsp; Folder getFolder;<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getFolder = store.getFolder("INBOX");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getFolder.open(Folder.READ_ONLY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setFolder(getFolder);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return getFolder;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (MessagingException e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("获取Folder失败！");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return null;<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 从folder中提取所有的messages<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; */<br>&nbsp; public void getAllMessages() throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; //从邮件文件夹获取邮件信息<br>&nbsp;&nbsp;&nbsp; Message[] messages = folder.getMessages();<br>&nbsp;&nbsp;&nbsp; setMessages(messages);<br>&nbsp;&nbsp;&nbsp; setRecordFailure(); //初始化出错数组<br>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setMessageCount();<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得messageNums数组指定的message<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @param messageNums<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; */<br>&nbsp; public void getMessages(int[] messageNums) throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; Message[] messages = folder.getMessages(messageNums);<br>&nbsp;&nbsp;&nbsp; setMessages(messages);<br>&nbsp;&nbsp;&nbsp; setRecordFailure(); //初始化出错数组<br>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setMessageCount();<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得start和end之间的message<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @param start<br>&nbsp;&nbsp; * @param end<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; */<br>&nbsp; public void getMessages(int start, int end) throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; Message[] messages = folder.getMessages(start, end);<br>&nbsp;&nbsp;&nbsp; setMessages(messages);<br>&nbsp;&nbsp;&nbsp; setRecordFailure(); //初始化出错数组<br>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setMessageCount();<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 关闭连接<br>&nbsp;&nbsp; */<br>&nbsp; public void closeConnection()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; messages = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (folder.isOpen())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; folder.close(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; store.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("close");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("关闭和邮件服务器之间连接时出错！");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得当前邮件的基本方法 Pop3Bean内部应该调用这个方法 以便在调用函数中加入重试机制<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; * @throws MessagingException<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; */<br>&nbsp; public void getMail() throws Throwable<br>&nbsp; { //抛出异常，用以重掷<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveMessageAs(message);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parseMessage(message);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (IOException e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("保存邮件出错，检查保存路径");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IOException("保存邮件出错，检查保存路径");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (MessagingException e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("邮件转换出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new MessagingException("邮件转换出错");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("未知错误");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; otherError = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("未知错误");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获得指定的邮件<br>&nbsp;&nbsp; *<br>&nbsp;&nbsp; * @param index<br>&nbsp;&nbsp; */<br>&nbsp; public void getMail(int index)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; mailDownErrorCounter = 0; //邮件下载出错计数器置零<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; { //获取邮件下载之前的错误<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setMessage(messages[index]); //设置当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("正在获取第" + index + "封邮件. . .");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getMail(); //获取当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("成功获取第" + index + "封邮件");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Throwable e)<br>&nbsp;&nbsp;&nbsp; { //获得重掷异常<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recordFailure[index] = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailDownErrorCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("下载第" + index + "封邮件时出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retry();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 获取messages中的所有邮件<br>&nbsp;&nbsp; */<br>&nbsp; public void getAllMail()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; int mailArrayLength; //将要下载的邮件的数量。若是重试时，则为还未下载的邮件数量</p>
<p>&nbsp;&nbsp;&nbsp; mailArrayLength = getMessageCount();</p>
<p>&nbsp;&nbsp;&nbsp; System.out.println("一共有邮件" + mailArrayLength + "封");</p>
<p>&nbsp;&nbsp;&nbsp; mailDownErrorCounter = 0; //邮件下载出错计数器置零<br>&nbsp;&nbsp;&nbsp; mailCounter = 0;<br>&nbsp;&nbsp;&nbsp; for (int index = 0; index &lt; mailArrayLength; index++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setMessage(messages[index]); //设置当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("正在获取第" + index + "封邮件. . .");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getMail(); //获取当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("成功获取第" + index + "封邮件");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Throwable e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; otherError = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recordFailure[index] = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailDownErrorCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("下载第" + index + "封邮件时出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; System.out.println("成功下载" + mailCounter + "封邮件");<br>&nbsp;&nbsp;&nbsp; mailCounter = 0;<br>&nbsp;&nbsp;&nbsp; if (mailDownErrorCounter != 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retry();<br>&nbsp; }</p>
<p>&nbsp; /**<br>&nbsp;&nbsp; * 保存邮件源文件<br>&nbsp;&nbsp; */</p>
<p>&nbsp; public void saveMessageAs(Message message)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; String oriFileName;<br>&nbsp;&nbsp;&nbsp; String fileExtend;</p>
<p>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oriFileName = getInfoBetweenBrackets(getMessageId(message)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .toString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置文件后缀名。若是附件则设法取得其文件后缀名作为将要保存文件的后缀名，若是正文部分则用.htm做后缀名<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String emlName = oriFileName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileNameWidthExtension = getEmlPath() + oriFileName<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + getExtension();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File storeFile = new File(fileNameWidthExtension);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; storeFile.exists(); i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emlName = oriFileName + i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileNameWidthExtension = getEmlPath() + emlName<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + getExtension();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; storeFile = new File(fileNameWidthExtension);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setEmlName(emlName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("storefile's path: " + fileNameWidthExtension);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayOutputStream baos = new ByteArrayOutputStream();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message.writeTo(baos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringReader in = new StringReader(baos.toString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFile(fileNameWidthExtension, in);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (MessagingException e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (Exception e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; /*<br>&nbsp;&nbsp; * 解析邮件<br>&nbsp;&nbsp; */<br>&nbsp; public void parseMessage(Message message) throws IOException,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; Object content = message.getContent();<br>&nbsp;&nbsp;&nbsp; if (content instanceof Multipart)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handleMultipart( (Multipart) content);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handlePart(message);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; /*<br>&nbsp;&nbsp; * 解析Multipart<br>&nbsp;&nbsp; */<br>&nbsp; public void handleMultipart(Multipart multipart) throws MessagingException,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IOException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; for (int i = 0, n = multipart.getCount(); i &lt; n; i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handlePart(multipart.getBodyPart(i));<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; /*<br>&nbsp;&nbsp; * 解析指定part,从中提取文件<br>&nbsp;&nbsp; */<br>&nbsp; public void handlePart(Part part) throws MessagingException, IOException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; String disposition = part.getDisposition(); // Find attachment<br>&nbsp;&nbsp;&nbsp; String contentType = part.getContentType();<br>&nbsp;&nbsp;&nbsp; String str;<br>&nbsp;&nbsp;&nbsp; InputStreamReader sbis = new InputStreamReader(part.getInputStream());<br>&nbsp;&nbsp;&nbsp; if (disposition == null)<br>&nbsp;&nbsp;&nbsp; { // When just body<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Null: " + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Check if plain<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( (contentType.length() &gt;= 9)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (contentType.toLowerCase().substring(0, 9)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .equals("text/plai")))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(getAttachPath() + getEmlName() + ".txt");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFile(getAttachPath() + getEmlName() + ".txt", sbis);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( (contentType.length() &gt;= 8) // Check if html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (contentType.toLowerCase().substring(0, 8)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .equals("text/htm")))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFile(getAttachPath() + getEmlName() + ".html", sbis);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( (contentType.length() &gt;= 9) // Check if html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (contentType.toLowerCase().substring(0, 9)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .equals("image/gif")))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFile(getAttachPath() + getEmlName() + ".gif", sbis);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( (contentType.length() &gt;= 10)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; contentType.toLowerCase().substring(0, 10).equals(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "multipart/"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { // Check if multipart<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("multipart body: " + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Multipart mp = (Multipart) (part.getContent());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handleMultipart(mp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { // Unknown type<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Other body: " + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFile(getAttachPath() + getEmlName() + ".txt", sbis);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if (disposition.equalsIgnoreCase(Part.ATTACHMENT))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Attachment: " + part.getFileName() + " : "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //outToFile.println("Attachment: " + part.getFileName() + " : "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFile(getAttachPath() + part.getFileName(), sbis);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if (disposition.equalsIgnoreCase(Part.INLINE))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Inline: " + part.getFileName() + " : "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //outToFile.println("Inline: " + part.getFileName() + " : "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + contentType);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveFile(getAttachPath() + part.getFileName(), sbis);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; { // Should never happen<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Other: " + disposition);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outToFile.println("Other: " + disposition);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; public void saveFile(String fileName, Reader input) throws IOException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; if (fileName == null)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fileName = File.createTempFile(getAttachPath() + "xx", ".out")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getName();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; // Do no overwrite existing file<br>&nbsp;&nbsp;&nbsp; File file = new File(fileName);<br>&nbsp;&nbsp;&nbsp; int lastDot = fileName.lastIndexOf(".");<br>&nbsp;&nbsp;&nbsp; String extension = fileName.substring(lastDot);<br>&nbsp;&nbsp;&nbsp; String fullFileName = fileName;<br>&nbsp;&nbsp;&nbsp; fileName = fileName.substring(0, lastDot);<br>&nbsp;&nbsp;&nbsp; for (int i = 0; file.exists(); i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file = new File(fileName + i + extension);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; FileWriter fos = new FileWriter(file);<br>&nbsp;&nbsp;&nbsp; BufferedWriter bos = new BufferedWriter(fos);<br>&nbsp;&nbsp;&nbsp; BufferedReader bis = new BufferedReader(input);<br>&nbsp;&nbsp;&nbsp; int aByte;<br>&nbsp;&nbsp;&nbsp; while ( (aByte = bis.read()) != -1)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bos.write(aByte);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; bos.flush();<br>&nbsp;&nbsp;&nbsp; bos.close();<br>&nbsp;&nbsp;&nbsp; bis.close();<br>&nbsp; }</p>
<p>&nbsp; public void readEmlFile(String fileName) throws MessagingException<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //TODO readEmlFile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream fis = new FileInputStream(fileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object emlObj = (Object) fis;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session mailSession = Session.getDefaultInstance(System.getProperties(), null);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MimeMessage msg = new MimeMessage(mailSession, fis);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message = msg;</p>
<p>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (FileNotFoundException e)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</p>
<p>&nbsp; private String getInfoBetweenBrackets(String str) throws Exception<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; int i, j; //用于标识字符串中的"&lt;"和"&gt;"的位置<br>&nbsp;&nbsp;&nbsp; if (str == null)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = "error";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return str;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; i = str.lastIndexOf("&lt;");<br>&nbsp;&nbsp;&nbsp; j = str.lastIndexOf("&gt;");<br>&nbsp;&nbsp;&nbsp; if (i != -1 &amp;&amp; j != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = str.substring(i + 1, j);<br>&nbsp;&nbsp;&nbsp; return str;<br>&nbsp; }</p>
<p>&nbsp; //当有邮件无法下载时进行重试<br>&nbsp; private void retry()<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; mailCounter = 0;<br>&nbsp;&nbsp;&nbsp; while (retryTimeCounter &lt; totalRetryTimes &amp;&amp; mailDownErrorCounter != 0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!store.isConnected() || !folder.isOpen())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("与服务器连接断开，请重新连接");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; closeConnection();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("第" + (retryTimeCounter + 1) + "次重试");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailDownErrorCounter = 0; //邮件下载出错计数器置零</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int index = 0; index &lt; getMessageCount(); index++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (recordFailure[index])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setMessage(messages[index]); //设置当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("正在获取第" + index + "封邮件. . .");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getMail(); //获取当前message<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("成功获取第" + index + "封邮件");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recordFailure[index] = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Throwable e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; otherError = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recordFailure[index] = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mailDownErrorCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("重新下载第" + index + "封邮件时出错");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retryTimeCounter++;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; System.out.println("成功下载" + mailCounter + "封邮件");<br>&nbsp;&nbsp;&nbsp; mailCounter = 0; //将邮件计数置零<br>&nbsp;&nbsp;&nbsp; mailDownErrorCounter = 0; //下载错误数量归零<br>&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Throwable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pop3Bean mail;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail = new Pop3Bean();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setUserName("abc");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setMailHost("pop3.sohu.com");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setPassword("***");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setAttachPath("e:/test/");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setExtension(".eml");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setDateFormat("yyyydddd");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.getConn();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Count of messages in folder: " + mail.getAllMessageCount());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Count of new messages in folder: " + mail.getNewMessageCount());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Count of unread messages in folder: " + mail.getUnreadMessageCount());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.getAllMessages();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Count of loaded messages: " + mail.getMessageCount());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.getAllMail();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setCurMessage(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(mail.getSubject());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.closeConnection();<br>&nbsp; //&nbsp;&nbsp; ReadEml mail = new ReadEml("H:\\My_Soft_Works\\java\\jteam\\jmail\\received\\41C95D0F.008CD1.01099.eml");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("出现未预料的错误！");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>
<p><br></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/116945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-05-12 11:09 <a href="http://www.blogjava.net/WshmAndLily/articles/116945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java抽取Word，PDF格式文件的四种武器</title><link>http://www.blogjava.net/WshmAndLily/articles/115697.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Mon, 07 May 2007 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/115697.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/115697.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/115697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/115697.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/115697.html</trackback:ping><description><![CDATA[<p>很多人用java进行文档操作时经常会遇到一个问题，就是如何获得word，excel，pdf等文档的内容？我研究了一下，在这里总结一下抽取word,pdf的几种方法。 <br>1. 用jacob <br>其实jacob是一个bridage，连接java和com或者win32函数的一个中间件，jacob并不能直接抽取word,excel等文件，需要自己写dll哦，不过已经有为你写好的了，就是jacob的作者一并提供了。 <br>jacob jar与dll文件下载： http://danadler.com/jacob/ <br>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath)，就可以写你自己的抽取程序了，下面是一个简单的例子： <br><code>import java.io.File; <br>import com.jacob.com.*; <br>import com.jacob.activeX.*; <br>/** <br>* Title: pdf extraction <br>* Description: email:chris@matrix.org.cn <br>* Copyright: Matrix Copyright (c) 2003 <br>* Company: Matrix.org.cn <br>* @author chris <br>* @version 1.0,who use this example pls remain the declare <br>*/ <br>public class FileExtracter{ <br>public static void main(String[] args) { <br>ActiveXComponent component = new ActiveXComponent("Word.Application"); <br>String inFile = "c:\\test.doc"; <br>String tpFile = "c:\\temp.htm"; <br>String otFile = "c:\\temp.XML"; <br>boolean flag = false; <br>try { <br>component.setProperty("Visible", new Variant(false)); <br>Object wordacc = component.getProperty("document．").toDispatch(); <br>Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, <br>new Object[]{inFile,new Variant(false), new Variant(true)}, <br>new int[1] ).toDispatch(); <br>Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]); <br>Variant f = new Variant(false); <br>Dispatch.call(wordfile, "Close", f); <br>flag = true; <br>} catch (Exception e) { <br>e.printStackTrace(); <br>} finally { <br>component.invoke("Quit", new Variant[] {}); <br>} <br>} <br>} <br></code>2. 用apache的poi来抽取word，excel。 <br>poi是apache的一个项目，不过就算用poi你可能都觉得很烦，不过不要紧，这里提供了更加简单的一个接口给你： <br>下载经过封装后的poi包： http://jakarta.apache.org/poi/ <br>下载之后，放到你的classpath就可以了，下面是如何使用它的一个例子： <br><code>import java.io.*; <br>import org.textmining.text.extraction.WordExtractor; <br>/** <br>*
<p>Title: word extraction </p>
<br>*
<p>Description: email:chris@matrix.org.cn </p>
<br>*
<p>Copyright: Matrix Copyright (c) 2003 </p>
<br>*
<p>Company: Matrix.org.cn </p>
<br>* @author chris <br>* @version 1.0,who use this example pls remain the declare <br>*/ <br><br>public class PdfExtractor { <br>public PdfExtractor() { <br>} <br>public static void main(String args[]) throws Exception <br>{ <br>FileInputStream in = new FileInputStream ("c:\\a.doc"); <br>WordExtractor extractor = new WordExtractor(); <br>String str = extractor.extractText(in); <br>System.out.println("the result length is"+str.length()); <br>System.out.println("the result is"+str); <br>} <br>} <br></code><font face="宋体, MS Song">3. pdfbox-用来抽取pdf文件 <br>但是pdfbox对中文支持还不好，先下载pdfbox： http://www.pdfbox.org/ <br>下面是一个如何使用pdfbox抽取pdf文件的例子： <br></font><code>import org.pdfbox.pdmodel.PDdocument． <br>import org.pdfbox.pdfparser.PDFParser; <br>import java.io.*; <br>import org.pdfbox.util.PDFTextStripper; <br>import java.util.Date; <br>/** <br>*
<p>Title: pdf extraction </p>
<br>*
<p>Description: email:chris@matrix.org.cn </p>
<br>*
<p>Copyright: Matrix Copyright (c) 2003 </p>
<br>*
<p>Company: Matrix.org.cn </p>
<br>* @author chris <br>* @version 1.0,who use this example pls remain the declare <br>*/ <br><br>public class PdfExtracter{ <br><br>public PdfExtracter(){ <br>} <br>public String GetTextFromPdf(String filename) throws Exception <br>{ <br>String temp=null; <br>PDdocument．nbsppdfdocument．null; <br>FileInputStream is=new FileInputStream(filename); <br>PDFParser parser = new PDFParser( is ); <br>parser.parse(); <br>pdfdocument．nbsp= parser.getPDdocument．); <br>ByteArrayOutputStream out = new ByteArrayOutputStream(); <br>OutputStreamWriter writer = new OutputStreamWriter( out ); <br>PDFTextStripper stripper = new PDFTextStripper(); <br>stripper.writeText(pdfdocument．getdocument．), writer ); <br>writer.close(); <br>byte[] contents = out.toByteArray(); <br><br>String ts=new String(contents); <br>System.out.println("the string length is"+contents.length+"\n"); <br>return ts; <br>} <br>public static void main(String args[]) <br>{ <br>PdfExtracter pf=new PdfExtracter(); <br>PDdocument．nbsppdfdocument．nbsp= null; <br><br>try{ <br>String ts=pf.GetTextFromPdf("c:\\a.pdf"); <br>System.out.println(ts); <br>} <br>catch(Exception e) <br>{ <br>e.printStackTrace(); <br>} <br>} <br><br>} <br></code><font face="宋体, MS Song">4. 抽取支持中文的pdf文件－xpdf <br>xpdf是一个开源项目，我们可以调用他的本地方法来实现抽取中文pdf文件。 <br>下载xpdf函数包： http://www.foolabs.com/xpdf/ <br>同时需要下载支持中文的补丁包，按照readme放好中文的patch，就可以开始写调用本地方法的java程序了。 <br>下面是一个如何调用的例子： <br></font><code>import java.io.*; <br>/** <br>*
<p>Title: pdf extraction </p>
<br>*
<p>Description: email:chris@matrix.org.cn </p>
<br>*
<p>Copyright: Matrix Copyright (c) 2003 </p>
<br>*
<p>Company: Matrix.org.cn </p>
<br>* @author chris <br>* @version 1.0,who use this example pls remain the declare <br>*/ <br><br><br>public class PdfWin { <br>public PdfWin() { <br>} <br>public static void main(String args[]) throws Exception <br>{ <br>String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe"; <br>String filename="c:\\a.pdf"; <br>String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"}; <br>Process p = Runtime.getRuntime().exec(cmd); <br>BufferedInputStream bis = new BufferedInputStream(p.getInputStream()); <br>InputStreamReader reader = new InputStreamReader(bis, "UTF-8"); <br>StringWriter out = new StringWriter(); <br>char [] buf = new char[10000]; <br>int len; <br>while((len = reader.read(buf))&gt;= 0) { <br>//out.write(buf, 0, len); <br>System.out.println("the length is"+len); <br>} <br>reader.close(); <br>String ts=new String(buf); <br>System.out.println("the str is"+ts); <br>} <br>}<br></code>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/115697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-05-07 14:28 <a href="http://www.blogjava.net/WshmAndLily/articles/115697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gif图片处理源码</title><link>http://www.blogjava.net/WshmAndLily/articles/94076.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Tue, 16 Jan 2007 00:34:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/94076.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/94076.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/94076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/94076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/94076.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 包括四个类AnimatedGifEncoder.java ,GifDecoder.java , LZWEncoder.java , NeuQuant.java//AnimatedGifEncoder.java     package ip.gif.neuquantAnimation;          import java.awt.*;     import java.awt.image.Buf...&nbsp;&nbsp;<a href='http://www.blogjava.net/WshmAndLily/articles/94076.html'>阅读全文</a><img src ="http://www.blogjava.net/WshmAndLily/aggbug/94076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-01-16 08:34 <a href="http://www.blogjava.net/WshmAndLily/articles/94076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA.图片文件格式转换和线性缩放 </title><link>http://www.blogjava.net/WshmAndLily/articles/93337.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 12 Jan 2007 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/93337.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/93337.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/93337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/93337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/93337.html</trackback:ping><description><![CDATA[
		<div style="FONT-SIZE: 12px">图片文件格式转换最核心的问题就是要解决各种图片格式的编码和解码，推荐用jimi包，可从<a href="http://java.sun.com/products/jimi/" target="_blank">http://java.sun.com/products/jimi/</a>下载该包及其源码和demo。<br /><br />　　需要注意的是：jimi提供了对几乎所有图片格式的解码支持，但是为提供gif和tif/tiff格式的编码api，gif编码问题在网上可以找到县相关的源码，tiff好像jai:<a href="http://java.sun.com/products/java-media/jai/index.jsp" target="_blank">http://java.sun.com/products/java-media/jai/index.jsp</a>提供了它的编码，不过我没有用jai，暂时用jpeg编码代替了。<br /><br />　　察看jimi的源码，在com.sun.jimi.core中是jimi的核心处理api。<br /><br />public void toJPG(String source, String dest, int quality) {<br /><br />if (dest == null || dest.trim().equals(""))<br />　dest = source;<br /><br />if (!dest.toLowerCase().trim().endsWith("jpg")) {<br />　dest += ".jpg";<br />　System.out.println("Overriding to JPG, output file: " + dest);<br />}<br />if (quality &lt; 0 || quality &gt; 100 || (quality + "") == null<br />|| (quality + "").equals("")) {<br />　System.out.println("quality must between ’0’ and ’100’");<br />　System.out.println("set to DEFAULT value:’75’");<br />　quality = 75;<br /><br />}<br />try {<br />　JPGOptions options = new JPGOptions();<br />　options.setQuality(quality);<br />　ImageProducer image = Jimi.getImageProducer(source);<br />　JimiWriter writer = Jimi.createJimiWriter(dest);<br />　writer.setSource(image);<br />　// 加入属性设置，非必要<br />　// /*<br />　writer.setOptions(options);<br />　// */<br />　writer.putImage(dest);<br />} catch (JimiException je) {<br />　System.err.println("Error: " + je);<br />}<br />} <br />在进行格式转换时，并不需要关心原图的格式，只要要转换的图片格式在jimi的解码格式范围内，就可以完全透明的进行decode过程：<br /><br />ImageProducer image = Jimi.getImageProducer(source); <br /><br />　　实际的解码只需要以行代码，就这么简单。<br /><br />　　编码过程最简单的也只需要很少的代码：<br /><br />JimiWriter writer = Jimi.createJimiWriter(dest);<br />writer.setSource(image);<br />// 加入属性设置，非必要<br />// /*<br />writer.setOptions(options);<br />// */<br />writer.putImage(dest); <br /><br />　　以上代码就完成了图片编码到输出到os生成转换后文件的全过程。<br /><br />　　上面代码中的 writer.setOptions(options)是用来对输出文件的属性进行相关的设置，每种格式的属性都不一样，com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法，可以方便的进行设置：<br /><br />　　com.sun.jimi.core.options.*中针对每种图片编码格式的相关属性提供了getter和setter方法，可以方便的进行设置：<br /><br />JPGOptions options = new JPGOptions();<br />options.setQuality(quality); <br /><br />　　格式转换就这么简单。<br /><br />　　jimi不支持的encode格式的解决<br /><br />/**<br />* <br />* @param source<br />* @param dest<br />* @throws JimiException<br />*/<br />public void toGIF(String source, String dest) throws JimiException {<br />　if (dest == null || dest.trim().equals(""))<br />　　dest = source;<br />　// 1:转换为jpg<br />　if (!dest.toLowerCase().trim().endsWith("jpg")) {<br />　　dest += ".jpg";<br />　}<br />　toJPG(source, dest, 75);<br /><br />　BufferedImage file_in = null;<br />　File file = new File(dest);<br />　try {<br />　　file_in = javax.imageio.ImageIO.read(file);<br />　} catch (IOException e) {<br />　　e.printStackTrace();<br />　}<br /><br />　int end = dest.lastIndexOf(".");<br />　file.deleteOnExit();<br />　// output *.gif<br />　file.renameTo(new File(dest.substring(0, end) + ".gif"));<br />　// jpg to gif<br />　AnimatedGifEncoder e = new AnimatedGifEncoder();<br />　e.start(dest);<br />　e.addFrame(file_in);<br />　e.finish();<br />　<br />} <br />这里用到了AnimatedGifEncoder 类，是我在网上搜索到的，对gif编码提供了一个实现，虽然还有待晚善的地方，不过单作格式转关已经够用了：）<br /><br />AnimatedGifEncoder e = new AnimatedGifEncoder();<br />e.start(dest);<br />e.addFrame(file_in);<br />e.finish(); <br /><br />　　需要注意的是：AnimatedGifEncoder 不能对所有格式的图片正确的识别，所以先要将其他格式转为jpg格式（最简单的方法是用imageIO）<br /><br />BufferedImage file_in = null;<br />File file = new File(dest);<br />try {<br />　file_in = javax.imageio.ImageIO.read(file);<br />} catch (IOException e) {<br />　e.printStackTrace();<br />} <br /><br />　　这样直接放入BufferedImage中就ok了<br /><br />e.addFrame(file_in); <br /><br />　　实际的编码过程在上面这句完成。<br /><br />int end = dest.lastIndexOf(".");<br />file.deleteOnExit();<br />// output *.gif<br />file.renameTo(new File(dest.substring(0, end) + ".gif")); <br /><br />　　最后，在完成之前别忘了用上面几句消灭证据哟：）<br /><br />　　当然这种方法其实并不好，最彻底的方法是修改AnimatedGifEncoder，不过做人涅要厚道一点，毕竟是人家写的代码嘛，如果有兴趣的朋友可以讨论一下。<br /><br />　　格式转换解决了，缩放功能也就不算是问题了，以下代码同时实现了格式转关和线性缩放：<br /><br />/**<br />* <br />* @param img<br />* @param dest<br />* @throws JimiException<br />*/<br />public void toTIF(Image img, String dest) throws JimiException {<br />　if (!dest.toLowerCase().trim().endsWith("tif")) {<br />　　dest += ".tif";<br />　　System.out.println("Overriding to TIF, output file: " + dest);<br />　}<br />　dest = dest.substring(0, dest.lastIndexOf(".")) + ".jpg";<br />　JimiWriter writer = Jimi.createJimiWriter(dest);<br />　writer.setSource(img);<br />　dest = dest.substring(0, dest.lastIndexOf(".")) + ".tif";<br />　writer.putImage(dest);<br />}<br /><br />/**<br />* 线性改变图片尺寸(可同时改变图片格式)<br />* <br />* @param source<br />* 源文件完整路径<br />* @param desc<br />* 目标文件完整路径<br />* @param ins<br />* 放大/缩小比率<br />* @throws JimiException<br />* @throws IOException<br />*/<br />public void changeDimension(String source, String desc, double ins)<br />throws JimiException, IOException {<br />　String temp = desc;<br />　File _file = null;<br />　if (desc == null || desc.trim().equals(""))<br />　　desc = source;<br />　if (!desc.toLowerCase().trim().endsWith("jpg")) {<br />　　temp = desc.trim() + ".jpg";<br />　}<br />　this.toJPG(source, temp, 75);<br />　_file = new File(temp); // 读入文件<br /><br />　Image src = javax.imageio.ImageIO.read(_file); // 构造Image对象<br />　double wideth = (double) src.getWidth(null); // 得到源图宽<br />　double height = (double) src.getHeight(null); // 得到源图长<br />　int iWideth = (int) (wideth * ins);<br />　int iHeight = (int) (height * ins);<br />　BufferedImage tag = new BufferedImage(iWideth, iHeight,<br />　BufferedImage.TYPE_INT_RGB);<br />　tag.getGraphics().drawImage(src, 0, 0, iWideth, iHeight, null); // 绘制缩小后的图<br /><br />　if (!temp.trim().equals(desc))<br />　　_file.deleteOnExit();<br /><br />　if (desc.toLowerCase().trim().endsWith("gif")) {<br />　　AnimatedGifEncoder e = new AnimatedGifEncoder();<br />　　e.start(desc);<br />　　e.addFrame(tag);<br />　　e.finish();<br />　} else if (desc.toLowerCase().trim().endsWith("tif") || desc.toLowerCase().trim().endsWith("tiff")) {<br />　　this.toTIF(tag, desc);<br />　} else {<br />　　JimiWriter writer = Jimi.createJimiWriter(desc);<br />　　writer.setSource(tag);<br />　　writer.putImage(desc);<br />　}<br />} <br /><br />　　BufferedImage的构造函数中的参数类型为int，所以以上代码在改变图象尺寸时稍有偏差，不过简单演示一下还是可以的。<br /><br />　　jimi的example中可以找到很多单项图片处理功能的demo，有时间可以研究一下，会有不少收获的。</div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/93337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-01-12 09:47 <a href="http://www.blogjava.net/WshmAndLily/articles/93337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java如何操作Word, Excel, PDF文档？</title><link>http://www.blogjava.net/WshmAndLily/articles/75233.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 15 Oct 2006 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/75233.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/75233.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/75233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/75233.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/75233.html</trackback:ping><description><![CDATA[Java Excel API 文档<br /><br />1、一个jacob操作Word的例子，其他操作excel，pdf的sample里都有<br />         <br />         import java.io.File;<br />　　import com.jacob.com.*;<br />　　import com.jacob.activeX.*;<br />　　public class WordTest {<br />　　<br />　　　public static void main(String[] args) {<br />　　　　　WordBean word=new WordBean();<br />　　　　　word.openWord(true);<br />　　　　　word.createNewDocument();<br />　　　　　word.insertText("Hello word.");<br />　　　}<br />　　}<br /><br />　　import com.jacob.activeX.*;<br />　　import com.jacob.com.*;<br />　　public class WordBean extends java.awt.Panel<br />　　{<br />　　　private ActiveXComponent MsWordApp = null;<br />　　　private Dispatch document = null;<br />　　　public WordBean()<br />　　　{<br />　　　　　super();<br />　　　}<br />　　　public void openWord(boolean makeVisible)<br />　　　{<br />　　//Open Word if we've not done it already<br />　　　　　if (MsWordApp == null)<br />　　　　　{<br />　　　　　　　MsWordApp = new ActiveXComponent("Word.Application");<br />　　　　　}<br />　　//Set the visible property as required.<br />　　　　　Dispatch.put(MsWordApp, "Visible",<br />　　　　　　　　　　　 new Variant(makeVisible));<br />　　　}<br />　　　public void createNewDocument()<br />　　　{<br />　　//Find the Documents collection object maintained by Word<br />　　　　　Dispatch documents =<br />　　　　　　　　　Dispatch.get(MsWordApp,"Documents").toDispatch();<br />　　//Call the Add method of the Documents collection to create<br />　　//a new document to edit<br />　　　　　document = Dispatch.call(documents,"Add").toDispatch();<br />　　　}<br />　　　public void insertText(String textToInsert)<br />　　　{<br />　　// Get the current selection within Word at the moment. If<br />　　// a new document has just been created then this will be at<br />　　// the top of the new doc<br />　　　　　Dispatch selection =<br />　　　　　　　　　Dispatch.get(MsWordApp,"Selection").toDispatch();<br />　　//Put the specified text at the insertion point<br />　　　　　Dispatch.put(selection,"Text",textToInsert);<br />　　　}<br />　　　public void saveFileAs(String filename)<br />　　　{<br />　　　　　Dispatch.call(document,"SaveAs",filename);<br />　　　}<br />　　　public void printFile()<br />　　　{<br />　　//Just print the current document to the default printer<br />　　　　　Dispatch.call(document,"PrintOut");<br />　　　}<br />　　　public void closeDocument()<br />　　　{<br />　　// Close the document without saving changes<br />　　// 0 = wdDoNotSaveChanges<br />　　// -1 = wdSaveChanges<br />　　// -2 = wdPromptToSaveChanges<br />　　　　　Dispatch.call(document, "Close", new Variant(0));<br />　　　　　document = null;<br />　　　}<br />　　　public void closeWord()<br />　　　{<br />　　　　　Dispatch.call(MsWordApp,"Quit");<br />　　　　　MsWordApp = null;<br />　　　　　document = null;<br />　　　}<br />　　}<br /><br />　2、 Java Excel 操作excel
<p>　　从Excel文件读取数据表</p><p>　　Java Excel API 既可以从本地文件系统的一个文件(.xls)，也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术 语：工作薄)，下面的代码片段举例说明了应该如何操作：(完整代码见ExcelReading.java)</p><p class="code">import java.io.*;<br />import jxl.*;<br />… … … …<br />try<br />{<br />//构建Workbook对象, 只读Workbook对象<br />//直接从本地文件创建Workbook<br />//从输入流创建Workbook<br />  InputStream is = new FileInputStream(sourcefile);<br />  jxl.Workbook rwb = Workbook.getWorkbook(is);<br />}<br />catch (Exception e)<br />{<br />e.printStackTrace();<br />}</p><p>　　一旦创建了Workbook，我们就可以通过它来访问Excel Sheet(术语：工作表)。参考下面的代码片段：</p><p class="code">//获取第一张Sheet表<br />Sheet rs = rwb.getSheet(0);</p><p>　　我们既可能通过Sheet的名称来访问它，也可以通过下标来访问它。如果通过下标来访问的话，要注意的一点是下标从0开始，就像数组一样。</p><p>　　一旦得到了Sheet，我们就可以通过它来访问Excel Cell(术语：单元格)。参考下面的代码片段：</p><p class="code">//获取第一行，第一列的值<br />Cell c00 = rs.getCell(0, 0);<br />String strc00 = c00.getContents();<br /><br />//获取第一行，第二列的值<br />Cell c10 = rs.getCell(1, 0);<br />String strc10 = c10.getContents();<br /><br />//获取第二行，第二列的值<br />Cell c11 = rs.getCell(1, 1);<br />String strc11 = c11.getContents();<br /><br />System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());<br />System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());<br />System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());</p><p>　　如果仅仅是取得Cell的值，我们可以方便地通过getContents()方法，它可以将任何类型的Cell值都作为一个字符串返回。示例代码中 Cell(0, 0)是文本型，Cell(1, 0)是数字型，Cell(1,1)是日期型，通过getContents()，三种类型的返回值都是字符型。</p><p>　　如果有需要知道Cell内容的确切类型，API也提供了一系列的方法。参考下面的代码片段：</p><p class="code">String strc00 = null;<br />double strc10 = 0.00;<br />Date strc11 = null;<br /><br />Cell c00 = rs.getCell(0, 0);<br />Cell c10 = rs.getCell(1, 0);<br />Cell c11 = rs.getCell(1, 1);<br /><br />if(c00.getType() == CellType.LABEL)<br />{<br />LabelCell labelc00 = (LabelCell)c00;<br />strc00 = labelc00.getString();<br />}<br />if(c10.getType() == CellType.NUMBER)<br />{<br />NmberCell numc10 = (NumberCell)c10;<br />strc10 = numc10.getValue();<br />}<br />if(c11.getType() == CellType.DATE)<br />{<br />DateCell datec11 = (DateCell)c11;<br />strc11 = datec11.getDate();<br />}<br /><br />System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());<br />System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());<br />System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());</p><p>　　在得到Cell对象后，通过getType()方法可以获得该单元格的类型，然后与API提供的基本类型相匹配，强制转换成相应的类型，最后调用相应的取 值方法getXXX()，就可以得到确定类型的值。API提供了以下基本类型，与Excel的数据格式相对应：<br /><br />当你完成对Excel电子表格数据的处理后，一定要使用close()方法来关闭先前创建的对象，以释放读取数据表的过程中所占用的内存空间，在读取大量数据时显得尤为重要。参考如下代码片段：</p><p class="code">//操作完成时，关闭对象，释放占用的内存空间<br />rwb.close();<br /><br />　　Java Excel API提供了许多访问Excel数据表的方法，在这里我只简要地介绍几个常用的方法，其它的方法请参考附录中的Java Excel API Document。</p><p>　　Workbook类提供的方法</p><p>　　1. int getNumberOfSheets()</p><p>　　获得工作薄（Workbook）中工作表（Sheet）的个数，示例：</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />int sheets = rwb.getNumberOfSheets();</p><p>　　2. Sheet[] getSheets()</p><p>　　返回工作薄（Workbook）中工作表（Sheet）对象数组，示例：</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />Sheet[] sheets = rwb.getSheets();</p><p>　　3. String getVersion()</p><p>　　返回正在使用的API的版本号，好像是没什么太大的作用。</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />String apiVersion = rwb.getVersion();</p><p>　　Sheet接口提供的方法</p><p>　　1) String getName()</p><p>　　获取Sheet的名称，示例：</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />jxl.Sheet rs = rwb.getSheet(0);<br />String sheetName = rs.getName();</p><p>　　2) int getColumns()</p><p>　　获取Sheet表中所包含的总列数，示例：</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />jxl.Sheet rs = rwb.getSheet(0);<br />int rsColumns = rs.getColumns();</p><p>　　3) Cell[] getColumn(int column)</p><p>　　获取某一列的所有单元格，返回的是单元格对象数组，示例：</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />jxl.Sheet rs = rwb.getSheet(0);<br />Cell[] cell = rs.getColumn(0);</p><p>　　4) int getRows()</p><p>　　获取Sheet表中所包含的总行数，示例：</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />jxl.Sheet rs = rwb.getSheet(0);<br />int rsRows = rs.getRows();</p><p>　　5) Cell[] getRow(int row)</p><p>　　获取某一行的所有单元格，返回的是单元格对象数组，示例：</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />jxl.Sheet rs = rwb.getSheet(0);<br />Cell[] cell = rs.getRow(0);</p><p>　　6) Cell getCell(int column, int row)</p><p>　　获取指定单元格的对象引用，需要注意的是它的两个参数，第一个是列数，第二个是行数，这与通常的行、列组合有些不同。</p><p class="code">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));<br />jxl.Sheet rs = rwb.getSheet(0);<br />Cell cell = rs.getCell(0, 0);<br /><br />2 生成新的Excel工作薄</p><p>　　下面的代码主要是向大家介绍如何生成简单的Excel工作表，在这里单元格的内容是不带任何修饰的(如：字体，颜色等等)，所有的内容都作为字符串写入。(完整代码见ExcelWriting.java)</p><p>　　与读取Excel工作表相似，首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象，这里要注意的是，只能通过API 提供的工厂方法来创建Workbook，而不能使用WritableWorkbook的构造函数，因为类WritableWorkbook的构造函数为 protected类型。示例代码片段如下：</p><p class="code">import java.io.*;<br />import jxl.*;<br />import jxl.write.*;<br />… … … …<br />try<br />{<br />//构建Workbook对象, 只读Workbook对象<br />//Method 1：创建可写入的Excel工作薄<br />  jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));<br /><br />//Method 2：将WritableWorkbook直接写入到输出流<br />/*<br />  OutputStream os = new FileOutputStream(targetfile);<br />  jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);<br />*/<br />}<br />catch (Exception e)<br />{<br />e.printStackTrace();<br />}</p><p>　　API 提供了两种方式来处理可写入的输出流，一种是直接生成本地文件，如果文件名不带全路径的话，缺省的文件会定位在当前目录，如果文件名带有全路径的 话，则生成的Excel文件则会定位在相应的目录；另外一种是将Excel对象直接写入到输出流，例如：用户通过浏览器来访问Web服务器，如果HTTP 头设置正确的话，浏览器自动调用客户端的Excel应用程序，来显示动态生成的Excel电子表格。</p><p>　　接下来就是要创建工作表，创建工作表的方法与创建工作薄的方法几乎一样，同样是通过工厂模式方法获得相应的对象，该方法需要两个参数，一个是工作表的名称，另一个是工作表在工作薄中的位置，参考下面的代码片段：</p><p class="code">//创建Excel工作表<br />jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);</p><p>　　"这锅也支好了，材料也准备齐全了，可以开始下锅了！"，现在要做的只是实例化API所提供的Excel基本数据类型，并将它们添加到工作表中就可以了，参考下面的代码片段：</p><p class="code">//1.添加Label对象<br />jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");<br />ws.addCell(labelC);<br /><br />//添加带有字型Formatting的对象<br />jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);<br />jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);<br />jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);<br />ws.addCell(labelCF);<br /><br />//添加带有字体颜色Formatting的对象<br />jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,<br />UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);<br />jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);<br />jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);<br />ws.addCell(labelCF);<br /><br />//2.添加Number对象<br />jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);<br />ws.addCell(labelN);<br /><br />//添加带有formatting的Number对象<br />jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");<br />jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);<br />jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);<br />ws.addCell(labelNF);<br /><br />//3.添加Boolean对象<br />jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);<br />ws.addCell(labelB);<br /><br />//4.添加DateTime对象<br />jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());<br />ws.addCell(labelDT);<br /><br />//添加带有formatting的DateFormat对象<br />jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");<br />jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);<br />jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);<br />ws.addCell(labelDTF);</p><p>　　这里有两点大家要引起大家的注意。第一点，在构造单元格时，单元格在工作表中的位置就已经确定了。一旦创建后，单元格的位置是不能够变更的，尽管单元格的 内容是可以改变的。第二点，单元格的定位是按照下面这样的规律(column, row)，而且下标都是从0开始，例如，A1被存储在(0, 0)，B1 被存储在(1, 0)。</p><p>　　最后，不要忘记关闭打开的Excel工作薄对象，以释放占用的内存，参见下面的代码片段：</p><p class="code">//写入Exel工作表<br />wwb.write();<br /><br />//关闭Excel工作薄对象<br />wwb.close();</p><p>　　这可能与读取Excel文件的操作有少少不同，在关闭Excel对象之前，你必须要先调用write()方法，因为先前的操作都是存储在缓存中的，所以要通过该方法将操作的内容保存在文件中。如果你先关闭了Excel对象，那么只能得到一张空的工作薄了。<br /><br />3. 拷贝、更新Excel工作薄</p><p>　　接下来简要介绍一下如何更新一个已经存在的工作薄，主要是下面二步操作，第一步是构造只读的Excel工作薄，第二步是利用已经创建的Excel工作薄创建新的可写入的Excel工作薄，参考下面的代码片段：(完整代码见ExcelModifying.java)</p><p class="code">//创建只读的Excel工作薄的对象<br />jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));<br /><br />//创建可写入的Excel工作薄对象<br />jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile), rw);<br /><br />//读取第一张工作表<br />jxl.write.WritableSheet ws = wwb.getSheet(0);<br /><br />//获得第一个单元格对象<br />jxl.write.WritableCell wc = ws.getWritableCell(0, 0);<br /><br />//判断单元格的类型, 做出相应的转化<br />if(wc.getType() == CellType.LABEL)<br />{<br />Label l = (Label)wc;<br />  l.setString("The value has been modified.");<br />}<br /><br />//写入Excel对象<br />wwb.write();<br /><br />//关闭可写入的Excel对象<br />wwb.close();<br /><br />//关闭只读的Excel对象<br />rw.close();</p><p>　　之所以使用这种方式构建Excel对象，完全是因为效率的原因，因为上面的示例才是API的主要应用。为了提高性能，在读取工作表时，与数据相关的一些输 出信息，所有的格式信息，如：字体、颜色等等，是不被处理的，因为我们的目的是获得行数据的值，既使没有了修饰，也不会对行数据的值产生什么影响。唯一的 不利之处就是，在内存中会同时保存两个同样的工作表，这样当工作表体积比较大时，会占用相当大的内存，但现在好像内存的大小并不是什么关键因素了。</p><p>　　一旦获得了可写入的工作表对象，我们就可以对单元格对象进行更新的操作了，在这里我们不必调用API提供的add()方法，因为单元格已经于工作表当中，所以我们只需要调用相应的setXXX()方法，就可以完成更新的操作了。</p><p>　　尽单元格原有的格式化修饰是不能去掉的，我们还是可以将新的单元格修饰加上去，以使单元格的内容以不同的形式表现。</p><p>　　新生成的工作表对象是可写入的，我们除了更新原有的单元格外，还可以添加新的单元格到工作表中，这与示例2的操作是完全一样的。</p><p>　　最后，不要忘记调用write()方法，将更新的内容写入到文件中，然后关闭工作薄对象，这里有两个工作薄对象要关闭，一个是只读的，另外一个是可写入的。</p><img src ="http://www.blogjava.net/WshmAndLily/aggbug/75233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2006-10-15 11:03 <a href="http://www.blogjava.net/WshmAndLily/articles/75233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>