﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小码哥-文章分类-Java语言学习</title><link>http://www.blogjava.net/canvas/category/31286.html</link><description>谁谓河广，一苇杭之</description><language>zh-cn</language><lastBuildDate>Sat, 27 Oct 2012 15:44:52 GMT</lastBuildDate><pubDate>Sat, 27 Oct 2012 15:44:52 GMT</pubDate><ttl>60</ttl><item><title>Java程序如何限速(控制下载和上传速度)</title><link>http://www.blogjava.net/canvas/articles/bandwidthlimiter.html</link><dc:creator>Barrie</dc:creator><author>Barrie</author><pubDate>Thu, 18 Oct 2012 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/bandwidthlimiter.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/389824.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/bandwidthlimiter.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/389824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/389824.html</trackback:ping><description><![CDATA[<div>好久没有在这里写点东西了，要养成书写记录的习惯。<br /><br />这里简单的讨论一下java设计网络程序中如何控制上传和下载速度，我们常见的FTP，HTTP，BT等协议都是TCP的，但是现在流行的utorrent却基于UDP实现了自己UTP协议(UDP+拥塞控制)，不管使用什么协议，站在I/O的角度来说，限速的控制思路都是一样的。<br />
<br />
思路很简单，如下：<br />
<br />
1.假设下载或者上传速度上限是m (KB/s),那么发送一个固定的字节数据(假设是n字节)的时间花费是：n/m；<br />
2.假设现在要发送n字节的数据，那么理论所需的时间应该是n/m，而在实际情况下，发送n字节的数据只花费了t秒，那么发送该发送线程就应该睡眠n/m-t秒，这样就基本实现了速度的控制。<br />
<br />
代码以TCP为例<br />
速度控制<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.actiontec.net.bandwidth;<br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Le<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;BandwidthLimiter&nbsp;{<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;KB&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Long&nbsp;KB&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1024l</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;The&nbsp;smallest&nbsp;count&nbsp;chunk&nbsp;length&nbsp;in&nbsp;bytes&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;Long&nbsp;CHUNK_LENGTH&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1024l</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;How&nbsp;many&nbsp;bytes&nbsp;will&nbsp;be&nbsp;sent&nbsp;or&nbsp;receive&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;bytesWillBeSentOrReceive&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;When&nbsp;the&nbsp;last&nbsp;piece&nbsp;was&nbsp;sent&nbsp;or&nbsp;receive&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;lastPieceSentOrReceiveTick&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;System.nanoTime();<br />
</span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Default&nbsp;rate&nbsp;is&nbsp;1024KB/s&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;maxRate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1024</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Time&nbsp;cost&nbsp;for&nbsp;sending&nbsp;CHUNK_LENGTH&nbsp;bytes&nbsp;in&nbsp;nanoseconds&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;timeCostPerChunk&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1000000000l</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;CHUNK_LENGTH)<br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.maxRate&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;KB);<br />
</span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Initialize&nbsp;a&nbsp;BandwidthLimiter&nbsp;object&nbsp;with&nbsp;a&nbsp;certain&nbsp;rate.<br />
</span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;maxRate<br />
</span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;download&nbsp;or&nbsp;upload&nbsp;speed&nbsp;in&nbsp;KBytes<br />
</span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;BandwidthLimiter(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;maxRate)&nbsp;{<br />
</span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.setMaxRate(maxRate);<br />
</span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Set&nbsp;the&nbsp;max&nbsp;upload&nbsp;or&nbsp;download&nbsp;rate&nbsp;in&nbsp;KB/s.&nbsp;maxRate&nbsp;must&nbsp;be&nbsp;grater&nbsp;than<br />
</span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;0.&nbsp;If&nbsp;maxRate&nbsp;is&nbsp;zero,&nbsp;it&nbsp;means&nbsp;there&nbsp;is&nbsp;no&nbsp;bandwidth&nbsp;limit.<br />
</span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;maxRate<br />
</span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;maxRate&nbsp;is&nbsp;zero,&nbsp;it&nbsp;means&nbsp;there&nbsp;is&nbsp;no&nbsp;bandwidth&nbsp;limit.<br />
</span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;IllegalArgumentException<br />
</span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setMaxRate(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;maxRate)<br />
</span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IllegalArgumentException&nbsp;{<br />
</span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(maxRate&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalArgumentException(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">maxRate&nbsp;can&nbsp;not&nbsp;less&nbsp;than&nbsp;0</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.maxRate&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;maxRate&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;:&nbsp;maxRate;<br />
</span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(maxRate&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.timeCostPerChunk&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.timeCostPerChunk&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">1000000000l</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;CHUNK_LENGTH)<br />
</span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.maxRate&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;KB);<br />
</span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Next&nbsp;1&nbsp;byte&nbsp;should&nbsp;do&nbsp;bandwidth&nbsp;limit.<br />
</span><span style="color: #008080; ">62</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">63</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;limitNextBytes()&nbsp;{<br />
</span><span style="color: #008080; ">64</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.limitNextBytes(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Next&nbsp;len&nbsp;bytes&nbsp;should&nbsp;do&nbsp;bandwidth&nbsp;limit<br />
</span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080; ">70</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;len<br />
</span><span style="color: #008080; ">71</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">72</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">synchronized</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;limitNextBytes(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len)&nbsp;{<br />
</span><span style="color: #008080; ">73</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bytesWillBeSentOrReceive&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;len;<br />
</span><span style="color: #008080; ">74</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">75</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;We&nbsp;have&nbsp;sent&nbsp;CHUNK_LENGTH&nbsp;bytes&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bytesWillBeSentOrReceive&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;CHUNK_LENGTH)&nbsp;{<br />
</span><span style="color: #008080; ">77</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;nowTick&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;System.nanoTime();<br />
</span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;missedTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.timeCostPerChunk<br />
</span><span style="color: #008080; ">79</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(nowTick&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.lastPieceSentOrReceiveTick);<br />
</span><span style="color: #008080; ">80</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(missedTime&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">81</span>&nbsp;<span style="color: #000000; ">&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 />
</span><span style="color: #008080; ">82</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(missedTime&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1000000</span><span style="color: #000000; ">,<br />
</span><span style="color: #008080; ">83</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&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;(missedTime&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1000000</span><span style="color: #000000; ">));<br />
</span><span style="color: #008080; ">84</span>&nbsp;<span style="color: #000000; ">&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;(InterruptedException&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080; ">85</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
</span><span style="color: #008080; ">86</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">87</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">88</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bytesWillBeSentOrReceive&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;CHUNK_LENGTH;<br />
</span><span style="color: #008080; ">89</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.lastPieceSentOrReceiveTick&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;nowTick<br />
</span><span style="color: #008080; ">90</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(missedTime&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;missedTime&nbsp;:&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">91</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">92</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">93</span>&nbsp;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">94</span>&nbsp;<span style="color: #000000; "></span></div>
</div>
<div><br />下载控制<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.actiontec.net.bandwidth;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.IOException;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.InputStream;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Le<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;DownloadLimiter&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;InputStream&nbsp;{<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;InputStream&nbsp;is&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;BandwidthLimiter&nbsp;bandwidthLimiter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;DownloadLimiter(InputStream&nbsp;is,&nbsp;BandwidthLimiter&nbsp;bandwidthLimiter)<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.is&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;is;<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bandwidthLimiter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bandwidthLimiter;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;read()&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException&nbsp;{<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bandwidthLimiter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bandwidthLimiter.limitNextBytes();<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.is.read();<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;read(</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">&nbsp;b[],&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;off,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bandwidthLimiter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bandwidthLimiter.limitNextBytes(len);<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.is.read(b,&nbsp;off,&nbsp;len);<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">}</span></div><br /><div>同样，上传控制</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">package</span><span style="color: #000000; ">&nbsp;com.actiontec.net.bandwidth;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.IOException;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;java.io.OutputStream;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Le<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;UploadLimiter&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;OutputStream&nbsp;{<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;OutputStream&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; ">;<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;BandwidthLimiter&nbsp;bandwidthLimiter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;UploadLimiter(OutputStream&nbsp;os,&nbsp;BandwidthLimiter&nbsp;bandwidthLimiter)<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.os&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;os;<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.bandwidthLimiter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;bandwidthLimiter;<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;write(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;b)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException&nbsp;{<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bandwidthLimiter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bandwidthLimiter.limitNextBytes();<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.os.write(b);<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;write(</span><span style="color: #0000FF; ">byte</span><span style="color: #000000; ">[]&nbsp;b,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;off,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException&nbsp;{<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(bandwidthLimiter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bandwidthLimiter.limitNextBytes(len);<br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.os.write(b,&nbsp;off,&nbsp;len);<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">}</span></div><br /><div>对于一个TCP socket</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">ServerSocket&nbsp;socket&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ServerSocket();<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">其它初始化略</span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">从socket中以一定的速率读数据<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">```java</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">DownloadLimiter&nbsp;dl&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DownloadLimiter(socket.getInputStream(),&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BandwidthLimiter(</span><span style="color: #000000; ">6250</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">is&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DataInputStream(dl);<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">读数据</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;is.readInt();<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">ByteBuffer&nbsp;buffer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ByteBuffer.allocate(</span><span style="color: #000000; ">4</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;len);<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">buffer.putInt(len);<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">is.readFully(buffer.array(),&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,&nbsp;buffer.remaining());<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">```<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">以一定的速率写数据到socket<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">```java</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">UploadLimiter&nbsp;ul&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;UploadLimiter(socket.getOutputStream(),&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BandwidthLimiter(</span><span style="color: #000000; ">6250</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">ul.write(<img src="http://www.blogjava.net/Images/dot.gif" alt="" />);<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">```</span></div><br /><div>在多线程环境下也可以使用上述的方法。最后附图是任务管理器的网络利用率图6250KB/s（也就是50000kb/s,附图中网络利用率也在5%左右，所以应该这个做法还算准确）<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/canvas/1.PNG" height="442" width="661" /></div></div><img src ="http://www.blogjava.net/canvas/aggbug/389824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">Barrie</a> 2012-10-18 16:34 <a href="http://www.blogjava.net/canvas/articles/bandwidthlimiter.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>openlayers小结(有参考项目代码)</title><link>http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html</link><dc:creator>Barrie</dc:creator><author>Barrie</author><pubDate>Mon, 11 Oct 2010 12:42:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/333731.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/333731.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/333731.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近一段时间里，又做了一个跟openlayers相关的项目，但是到目前为止，我对openlayers还是不怎么了解，做东西也只是参考了openlayers的例子，以及自己的一些对openlayers用法的一些猜测。openlayers是一个用js实现的GIS前端框架，我的js目前还是打酱油的水平，要是没有jquery，那就基本写不了几行js代码了。js那是相当的强大，再加上VML\SVG、HTML...&nbsp;&nbsp;<a href='http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html'>阅读全文</a><img src ="http://www.blogjava.net/canvas/aggbug/333731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">Barrie</a> 2010-10-11 20:42 <a href="http://www.blogjava.net/canvas/articles/how_to_do_with_openlayers.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>appengine支持Java了</title><link>http://www.blogjava.net/canvas/articles/AppEngineJavaOverview.html</link><dc:creator>Barrie</dc:creator><author>Barrie</author><pubDate>Wed, 08 Apr 2009 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/AppEngineJavaOverview.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/264452.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/AppEngineJavaOverview.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/264452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/264452.html</trackback:ping><description><![CDATA[刚刚登录appengine的时候才发现开始支持java了。<br />
上午的时候还没有。<br />
<br />
对java的比较熟悉，但是还是喜欢比较简洁的python<br />
<br />
<a href="http://code.google.com/intl/zh-CN/appengine/docs/java/overview.html">http://code.google.com/intl/zh-CN/appengine/docs/java/overview.html</a><br />
<br />
<a href="http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html">http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language-on-app.html</a><br />
<br />
这是注册试用后google appengine给发的邮件:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Hello</span><span style="color: #000000;">,</span><span style="color: #000000;"><br />
<br />
Thanks&nbsp;for&nbsp;signing&nbsp;up&nbsp;to&nbsp;try&nbsp;Google&nbsp;App&nbsp;Engine&nbsp;for&nbsp;Java!&nbsp;&nbsp;Your&nbsp;account&nbsp;has&nbsp;now<br />
been&nbsp;activated</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;so&nbsp;you&nbsp;can&nbsp;begin&nbsp;building&nbsp;applications&nbsp;with&nbsp;our&nbsp;new&nbsp;Java<br />
runtime.<br />
<br />
Please&nbsp;note&nbsp;that&nbsp;this&nbsp;is&nbsp;still&nbsp;an&nbsp;early&nbsp;look&nbsp;at&nbsp;our&nbsp;support&nbsp;for&nbsp;the&nbsp;Java<br />
language&nbsp;and&nbsp;you&nbsp;may&nbsp;encounter&nbsp;issues&nbsp;during&nbsp;development.&nbsp;We&nbsp;look&nbsp;forward&nbsp;to<br />
hearing&nbsp;your&nbsp;feedback!&nbsp;To&nbsp;learn&nbsp;more</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;please&nbsp;visit:<br />
<br />
http://code.google.com/appengine/docs/java/overview.html<br />
<br />
To&nbsp;start&nbsp;creating&nbsp;applications&nbsp;with&nbsp;Google&nbsp;App&nbsp;Engine</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;simply&nbsp;follow&nbsp;this&nbsp;link<br />
(you&nbsp;may&nbsp;need&nbsp;to&nbsp;sign&nbsp;in&nbsp;with&nbsp;your&nbsp;burgundy.loh@gmail.com&nbsp;Google&nbsp;Account)&nbsp;and<br />
verify&nbsp;your&nbsp;account&nbsp;with&nbsp;a&nbsp;mobile&nbsp;phone&nbsp;number&nbsp;if&nbsp;you&nbsp;have&nbsp;not&nbsp;already&nbsp;done&nbsp;so:<br />
<br />
http://appengine.google.com/<br />
<br />
If&nbsp;you&nbsp;are&nbsp;having&nbsp;trouble&nbsp;verifying&nbsp;your&nbsp;account&nbsp;via&nbsp;SMS&nbsp;please&nbsp;fill<br />
out&nbsp;the&nbsp;following&nbsp;form&nbsp;and&nbsp;your&nbsp;account&nbsp;will&nbsp;be&nbsp;reviewed&nbsp;and&nbsp;enabled<br />
as&nbsp;soon&nbsp;as&nbsp;possible:<br />
<br />
http://appengine.google.com/waitlist/sms_issues<br />
<br />
Thanks!<br />
The&nbsp;Google&nbsp;App&nbsp;Engine&nbsp;Team<br />
<br />
Java&nbsp;is&nbsp;a&nbsp;registered&nbsp;trademark&nbsp;of&nbsp;Sun&nbsp;Microsystems</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;Inc.</span></div>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/canvas/aggbug/264452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">Barrie</a> 2009-04-08 14:40 <a href="http://www.blogjava.net/canvas/articles/AppEngineJavaOverview.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中国各城市的经纬度数据(精确到县级城市)</title><link>http://www.blogjava.net/canvas/articles/GS-China.html</link><dc:creator>Barrie</dc:creator><author>Barrie</author><pubDate>Thu, 12 Mar 2009 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/GS-China.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/259355.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/GS-China.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/259355.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/259355.html</trackback:ping><description><![CDATA[经纬度数据收集自
<a href="http://samuel.lamost.org/" target="_blank">维北有斗-天文爱好者的乐园</a><br />
编写这篇博文有几个目的：<br />
首先认识了两个单词<br />
<div style="margin: 0px 0px 5px; color: #808080; line-height: normal;"><span style="font-size: 10.5pt; color: #000000; line-height: normal;"><strong>latitude</strong></span>
&nbsp;<span style="font-size: 10.5pt; line-height: normal; font-family: 'Lingoes Unicode';">[<font color="#009900">lat&#183;i&#183;tude || 'l&#230;tɪtuːd /-tjuːd</font>]</span>
<font color="#c00000">n.</font> &nbsp;纬度; 回旋余地, 自由; 纬度地区</div>
<div style="margin: 0px 0px 5px; color: #808080; line-height: normal;">
<span style="font-size: 10.5pt; color: #000000; line-height: normal;"><strong>longitude</strong></span>
&nbsp;<span style="font-size: 10.5pt; line-height: normal; font-family: 'Lingoes Unicode';">[<font color="#009900">lon&#183;gi&#183;tude || 'lɑndʒɪtuːd /'lɒndʒɪtjuːd</font>]</span>
<font color="#c00000">n.</font> &nbsp;经度; 经线</div>
<br />
1.学习dom4j的简单用法<br />
2.做一个方便使用的全国城市经纬度数据库<br />
3.利用google天气api做一个全面的天气预报服务<br />
4.学习用python编写webservice<br />
<br />
内容：<br />
1.学习dom4j的简单用法<br />
收集了的经纬度都是按照城市分开的单独的htm文件，我已经处理过为符合html4.0标准的html文件了，即所有的标识都是成对的，这里可以下载这些文件<a title="经纬度html包" href="/Files/canvas/jwd.zip">(点击下载经纬度html包)</a><br />
(1)如何使用dom4j读入xml文档<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_174506" onclick="this.style.display='none'; Code_Closed_Text_174506.style.display='none'; Code_Open_Image_174506.style.display='inline'; Code_Open_Text_174506.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" width="11" height="16" /><img id="Code_Open_Image_174506" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_174506.style.display='none'; Code_Closed_Image_174506.style.display='inline'; Code_Closed_Text_174506.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" width="11" height="16" /><span id="Code_Closed_Text_174506" style="border: 1px solid #808080; background-color: #ffffff;">使用dom4j读入xml文档代码片段</span><span id="Code_Open_Text_174506" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">File&nbsp;file&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(</span><span style="color: #000000;">"</span><span style="color: #000000;">G:\\workspace\\test.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">SAXReader&nbsp;reader&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SAXReader();<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">根据实际情况设置编码</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.setEncoding(</span><span style="color: #000000;">"</span><span style="color: #000000;">GBK</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;reader.read(files);<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获得xml文档的根节点</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;doc.getRootElement();</span></span></div>
<br />
(2)如何遍历xml文档的所有结点<br />
这样就读入了这个xml文档，并获得了这个xml文档对象的根结点，由于xml文档是一个树形结构，这样就很容易遍历它所有的结点了。<br />
这里根据自己的需要，测试使用了两种遍历方法，一种是根据树的结构编写递归程序，一种就是直接使用循环，还有都dom4j自带的visitor模式访问也很好用，这里有篇参考文档，可以看看(<a href="http://www.cnblogs.com/eafy/archive/2008/04/11/1148006.html" target="_blank">查看</a>)<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_200042" onclick="this.style.display='none'; Code_Closed_Text_200042.style.display='none'; Code_Open_Image_200042.style.display='inline'; Code_Open_Text_200042.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" width="11" height="16" /><img id="Code_Open_Image_200042" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_200042.style.display='none'; Code_Closed_Image_200042.style.display='inline'; Code_Closed_Text_200042.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" width="11" height="16" /><span id="Code_Closed_Text_200042" style="border: 1px solid #808080; background-color: #ffffff;">使用递归遍历</span><span id="Code_Open_Text_200042" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">
<pre><font face="Courier New">
<font color="#0000ff">public  void </font><font color="#000000">visitAll(</font><font color="#ff0000">Element </font><font color="#000000">root, </font><font color="#ff0000">Element </font><font color="#000000">child){</font>
<font color="#008000">// 枚举所有子节点</font>
<font color="#0000ff">for </font><font color="#000000">( </font><font color="#ff0000">Iterator </font><font color="#000000">i = root.elementIterator(); i.hasNext(); ) {</font>
<font color="#ff0000">Element </font><font color="#000000">element = (</font><font color="#ff0000">Element</font><font color="#000000">) i.next();</font>
<font color="#ff0000">System</font><font color="#000000">.out.println(stringTrim(element.getText()));</font>
<font color="#0000ff">if</font><font color="#000000">(</font><font color="#0000ff">this</font><font color="#000000">.stringTrim(element.getTextTrim()).equals(</font><font color="#ff00ff">""</font><font color="#000000">)){</font>
<font color="#0000ff">return</font><font color="#000000">;</font>
<font color="#000000">} </font>
<font color="#0000ff">else </font><font color="#000000">{</font>
<font color="#ff0000">Element </font><font color="#000000">tmp = child.addElement(</font><font color="#ff00ff">"city"</font><font color="#000000">);</font>
<font color="#000000">visitAll(element, tmp);</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
</font>
</pre>
</span></span></div>
<br />
这里提供的xml文档层数为2，直接循环即可<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_200134" onclick="this.style.display='none'; Code_Closed_Text_200134.style.display='none'; Code_Open_Image_200134.style.display='inline'; Code_Open_Text_200134.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" width="11" height="16" /><img id="Code_Open_Image_200134" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_200134.style.display='none'; Code_Closed_Image_200134.style.display='inline'; Code_Closed_Text_200134.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" width="11" height="16" /><span id="Code_Closed_Text_200134" style="border: 1px solid #808080; background-color: #ffffff;">直接循环遍历</span><span id="Code_Open_Text_200134" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">
<pre><font face="Courier New">
<font color="#0000ff">public  void </font><font color="#000000">visitAll(</font><font color="#ff0000">Element </font><font color="#000000">root, </font><font color="#ff0000">Element </font><font color="#000000">child){</font>
<font color="#008000">// 枚举所有子节点</font>
<font color="#0000ff">for </font><font color="#000000">( </font><font color="#ff0000">Iterator </font><font color="#000000">i = root.elementIterator(); i.hasNext(); ) {</font>
<font color="#ff0000">Element </font><font color="#000000">element = (</font><font color="#ff0000">Element</font><font color="#000000">) i.next();      </font>
<font color="#ff0000">Iterator </font><font color="#000000">j = element.elementIterator();</font>
<font color="#ff0000">Element </font><font color="#000000">tmpElement = (</font><font color="#ff0000">Element</font><font color="#000000">)j.next();</font>
<font color="#0000ff">if</font><font color="#000000">(!(stringTrim(tmpElement.getTextTrim()).equals(</font><font color="#ff00ff">"城市名"</font><font color="#000000">)))</font>
<font color="#000000">{</font>
<font color="#ff0000">Element </font><font color="#000000">tmp = child.addElement(</font><font color="#ff00ff">"city"</font><font color="#000000">);</font>
<font color="#000000">tmp.addAttribute(</font><font color="#ff00ff">"name"</font><font color="#000000">, </font>
<font color="#000000">stringTrim(tmpElement.getTextTrim()).trim());</font>
<font color="#000000">tmpElement = (</font><font color="#ff0000">Element</font><font color="#000000">)j.next();</font>
<font color="#000000">tmp.addAttribute(</font><font color="#ff00ff">"longitude"</font><font color="#000000">, </font>
<font color="#000000">stringTrim(tmpElement.getTextTrim()).trim());</font>
<font color="#000000">tmpElement = (</font><font color="#ff0000">Element</font><font color="#000000">)j.next();</font>
<font color="#000000">tmp.addAttribute(</font><font color="#ff00ff">"latitude"</font><font color="#000000">, </font>
<font color="#000000">stringTrim(tmpElement.getTextTrim()).trim());</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
</font>
</pre>
</span></span></div>
<br />
关于visitor模式的使用，请参看上面给出的参考文档<br />
<br />
(3)创建新的xml文档<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_195853" onclick="this.style.display='none'; Code_Closed_Text_195853.style.display='none'; Code_Open_Image_195853.style.display='inline'; Code_Open_Text_195853.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" width="11" height="16" /><img id="Code_Open_Image_195853" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_195853.style.display='none'; Code_Closed_Image_195853.style.display='inline'; Code_Closed_Text_195853.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" width="11" height="16" /><span id="Code_Closed_Text_195853" style="border: 1px solid #808080; background-color: #ffffff;">创建xml文档</span><span id="Code_Open_Text_195853" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">
<pre><font face="Courier New">
<font color="#0000ff">public void </font><font color="#000000">createXMLFile(</font><font color="#ff0000">String </font><font color="#000000">filename) </font><font color="#0000ff">throws </font><font color="#ff0000">Exception</font><font color="#000000">{</font>
<font color="#008000">//使用辅助方法创建文档对象</font>
<font color="#ff0000">Document </font><font color="#000000">res = DocumentHelper.createDocument();</font>
<font color="#008000">//添加文档跟结点country</font>
<font color="#ff0000">Element </font><font color="#000000">rootElement = res.addElement(</font><font color="#ff00ff">"country"</font><font color="#000000">);</font>
<font color="#008000">//给根节点添加属性name，值为"中国"</font>
<font color="#000000">rootElement.addAttribute(</font><font color="#ff00ff">"name"</font><font color="#000000">, </font><font color="#ff00ff">"中国"</font><font color="#000000">);</font>
<font color="#008000">//打开目录</font>
<font color="#ff0000">File </font><font color="#000000">file = </font><font color="#0000ff">new </font><font color="#ff0000">File</font><font color="#000000">(</font><font color="#ff00ff">"G:\\workspace\\jwd\\jwd"</font><font color="#000000">);</font>
<font color="#008000">//打开目录下所有的xml文档</font>
<font color="#ff0000">File</font><font color="#000000">[] files = file.listFiles();</font>
<font color="#008000">//依次操作每个xml文档</font>
<font color="#0000ff">for</font><font color="#000000">(</font><font color="#0000ff">int </font><font color="#000000">i = </font><font color="#800080">0</font><font color="#000000">; i &lt; files.length; i ++){</font>
<font color="#008000">//获取文件名，去掉文件扩展名</font>
<font color="#ff0000">String</font><font color="#000000">[] name = files[i].getName().split(</font><font color="#ff00ff">"\\."</font><font color="#000000">);</font>
<font color="#008000">//在根结点下添加子节点province</font>
<font color="#ff0000">Element </font><font color="#000000">childElement = rootElement.addElement(</font><font color="#ff00ff">"province"</font><font color="#000000">);</font>
<font color="#008000">//添加属性name，值为文件名</font>
<font color="#000000">childElement.addAttribute(</font><font color="#ff00ff">"name"</font><font color="#000000">, name[</font><font color="#800080">0</font><font color="#000000">].trim());</font>
<font color="#008000">//创建reader</font>
<font color="#000000">SAXReader reader = </font><font color="#0000ff">new </font><font color="#000000">SAXReader();</font>
<font color="#008000">//根据实际情况设置编码</font>
<font color="#000000">reader.setEncoding(</font><font color="#ff00ff">"GBK"</font><font color="#000000">);</font>
<font color="#ff0000">Document </font><font color="#000000">doc = reader.read(files[i]);</font>
<font color="#008000">//获得xml文档的根节点</font>
<font color="#ff0000">Element </font><font color="#000000">root = doc.getRootElement();</font>
<font color="#008000">//遍历所有的结点</font>
<font color="#0000ff">this</font><font color="#000000">.visitAll(root, childElement);</font>
<font color="#000000">}</font>
<font color="#008000">//格式化即将输出的xml，让它看起来整齐点</font>
<font color="#000000">OutputFormat format = OutputFormat.createPrettyPrint();</font>
<font color="#008000">/*将document中的内容写入文件中 */</font>
<font color="#000000">XMLWriter writer = </font><font color="#0000ff">new </font><font color="#000000">XMLWriter(</font><font color="#0000ff">new </font><font color="#ff0000">FileWriter</font><font color="#000000">(</font><font color="#0000ff">new </font><font color="#ff0000">File</font><font color="#000000">(filename)),format);</font>
<font color="#000000">writer.write(res);</font>
<font color="#000000">writer.close(); </font>
<font color="#000000">}</font>
</font>
</pre>
</span></span></div>
<br />
整个合并所有html页为一个xml的代码如下<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_195752" onclick="this.style.display='none'; Code_Closed_Text_195752.style.display='none'; Code_Open_Image_195752.style.display='inline'; Code_Open_Text_195752.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" width="11" height="16" /><img id="Code_Open_Image_195752" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_195752.style.display='none'; Code_Closed_Image_195752.style.display='inline'; Code_Closed_Text_195752.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" width="11" height="16" /><span id="Code_Closed_Text_195752" style="border: 1px solid #808080; background-color: #ffffff;">完整的代码</span><span id="Code_Open_Text_195752" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">
<pre><font face="Courier New">
<font color="#0000ff">import </font><font color="#000000">java.io.</font><font color="#ff0000">File</font><font color="#000000">;</font>
<font color="#0000ff">import </font><font color="#000000">java.io.</font><font color="#ff0000">FileWriter</font><font color="#000000">;</font>
<font color="#0000ff">import </font><font color="#000000">java.util.</font><font color="#ff0000">Iterator</font><font color="#000000">;</font>
<font color="#0000ff">import </font><font color="#000000">org.dom4j.</font><font color="#ff0000">Document</font><font color="#000000">;</font>
<font color="#0000ff">import </font><font color="#000000">org.dom4j.DocumentHelper;</font>
<font color="#0000ff">import </font><font color="#000000">org.dom4j.</font><font color="#ff0000">Element</font><font color="#000000">;</font>
<font color="#0000ff">import </font><font color="#000000">org.dom4j.io.OutputFormat;</font>
<font color="#0000ff">import </font><font color="#000000">org.dom4j.io.SAXReader;</font>
<font color="#0000ff">import </font><font color="#000000">org.dom4j.io.XMLWriter;</font>
<font color="#008000">/**</font>
<font color="#008000"> * @author canvas</font>
<font color="#008000"> *</font>
<font color="#008000"> */</font>
<font color="#0000ff">public class </font><font color="#000000">GIS {</font>
<font color="#0000ff">public void </font><font color="#000000">createXMLFile(</font><font color="#ff0000">String </font><font color="#000000">filename) </font><font color="#0000ff">throws </font><font color="#ff0000">Exception</font><font color="#000000">{</font>
<font color="#008000">//使用辅助方法创建文档对象</font>
<font color="#ff0000">Document </font><font color="#000000">res = DocumentHelper.createDocument();</font>
<font color="#008000">//添加文档跟结点country</font>
<font color="#ff0000">Element </font><font color="#000000">rootElement = res.addElement(</font><font color="#ff00ff">"country"</font><font color="#000000">);</font>
<font color="#008000">//给根节点添加属性name，值为"中国"</font>
<font color="#000000">rootElement.addAttribute(</font><font color="#ff00ff">"name"</font><font color="#000000">, </font><font color="#ff00ff">"中国"</font><font color="#000000">);</font>
<font color="#008000">//打开目录</font>
<font color="#ff0000">File </font><font color="#000000">file = </font><font color="#0000ff">new </font><font color="#ff0000">File</font><font color="#000000">(</font><font color="#ff00ff">"G:\\workspace\\jwd\\jwd"</font><font color="#000000">);</font>
<font color="#008000">//打开目录下所有的xml文档</font>
<font color="#ff0000">File</font><font color="#000000">[] files = file.listFiles();</font>
<font color="#008000">//依次操作每个xml文档</font>
<font color="#0000ff">for</font><font color="#000000">(</font><font color="#0000ff">int </font><font color="#000000">i = </font><font color="#800080">0</font><font color="#000000">; i &lt; files.length; i ++){</font>
<font color="#008000">//获取文件名，去掉文件扩展名</font>
<font color="#ff0000">String</font><font color="#000000">[] name = files[i].getName().split(</font><font color="#ff00ff">"\\."</font><font color="#000000">);</font>
<font color="#008000">//在根结点下添加子节点province</font>
<font color="#ff0000">Element </font><font color="#000000">childElement = rootElement.addElement(</font><font color="#ff00ff">"province"</font><font color="#000000">);</font>
<font color="#008000">//添加属性name，值为文件名</font>
<font color="#000000">childElement.addAttribute(</font><font color="#ff00ff">"name"</font><font color="#000000">, name[</font><font color="#800080">0</font><font color="#000000">].trim());</font>
<font color="#008000">//创建reader</font>
<font color="#000000">SAXReader reader = </font><font color="#0000ff">new </font><font color="#000000">SAXReader();</font>
<font color="#008000">//根据实际情况设置编码</font>
<font color="#000000">reader.setEncoding(</font><font color="#ff00ff">"GBK"</font><font color="#000000">);</font>
<font color="#ff0000">Document </font><font color="#000000">doc = reader.read(files[i]);</font>
<font color="#008000">//获得xml文档的根节点</font>
<font color="#ff0000">Element </font><font color="#000000">root = doc.getRootElement();</font>
<font color="#008000">//遍历所有的结点</font>
<font color="#0000ff">this</font><font color="#000000">.visitAll(root, childElement);</font>
<font color="#000000">}</font>
<font color="#008000">//格式化即将输出的xml，让它看起来整齐点</font>
<font color="#000000">OutputFormat format = OutputFormat.createPrettyPrint();</font>
<font color="#008000">/*将document中的内容写入文件中 */</font>
<font color="#000000">XMLWriter writer = </font><font color="#0000ff">new </font><font color="#000000">XMLWriter(</font><font color="#0000ff">new </font><font color="#ff0000">FileWriter</font><font color="#000000">(</font><font color="#0000ff">new </font><font color="#ff0000">File</font><font color="#000000">(filename)),format);</font>
<font color="#000000">writer.write(res);</font>
<font color="#000000">writer.close(); </font>
<font color="#000000">}</font>
<font color="#0000ff">public  void </font><font color="#000000">visitAll(</font><font color="#ff0000">Element </font><font color="#000000">root, </font><font color="#ff0000">Element </font><font color="#000000">child){</font>
<font color="#008000">// 枚举所有子节点</font>
<font color="#0000ff">for </font><font color="#000000">( </font><font color="#ff0000">Iterator </font><font color="#000000">i = root.elementIterator(); i.hasNext(); ) {</font>
<font color="#ff0000">Element </font><font color="#000000">element = (</font><font color="#ff0000">Element</font><font color="#000000">) i.next();</font>
<font color="#008000">//System.out.println(stringTrim(element.getText()));</font>
<font color="#008000">/*if(this.stringTrim(element.getTextTrim()).equals("")){</font>
<font color="#008000">               return;</font>
<font color="#008000">           } </font>
<font color="#008000">           else {</font>
<font color="#008000">                Element tmp = child.addElement("city");</font>
<font color="#008000">                visitAll(element, tmp);</font>
<font color="#008000">           }*/</font>
<font color="#ff0000">Iterator </font><font color="#000000">j = element.elementIterator();</font>
<font color="#ff0000">Element </font><font color="#000000">tmpElement = (</font><font color="#ff0000">Element</font><font color="#000000">)j.next();</font>
<font color="#0000ff">if</font><font color="#000000">(!(stringTrim(tmpElement.getTextTrim()).equals(</font><font color="#ff00ff">"城市名"</font><font color="#000000">)))</font>
<font color="#000000">{</font>
<font color="#ff0000">Element </font><font color="#000000">tmp = child.addElement(</font><font color="#ff00ff">"city"</font><font color="#000000">);</font>
<font color="#000000">tmp.addAttribute(</font><font color="#ff00ff">"name"</font><font color="#000000">, </font>
<font color="#000000">stringTrim(tmpElement.getTextTrim()).trim());</font>
<font color="#000000">tmpElement = (</font><font color="#ff0000">Element</font><font color="#000000">)j.next();</font>
<font color="#000000">tmp.addAttribute(</font><font color="#ff00ff">"longitude"</font><font color="#000000">, </font>
<font color="#000000">stringTrim(tmpElement.getTextTrim()).trim());</font>
<font color="#000000">tmpElement = (</font><font color="#ff0000">Element</font><font color="#000000">)j.next();</font>
<font color="#000000">tmp.addAttribute(</font><font color="#ff00ff">"latitude"</font><font color="#000000">, </font>
<font color="#000000">stringTrim(tmpElement.getTextTrim()).trim());</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
<font color="#0000ff">public </font><font color="#ff0000">String </font><font color="#000000">stringTrim(</font><font color="#ff0000">String </font><font color="#000000">str){</font>
<font color="#008000">//去掉空格和全角空格</font>
<font color="#ff0000">String</font><font color="#000000">[] tmp = str.split(</font><font color="#ff00ff">"\\s| "</font><font color="#000000">);</font>
<font color="#ff0000">StringBuffer </font><font color="#000000">sb = </font><font color="#0000ff">new </font><font color="#ff0000">StringBuffer</font><font color="#000000">();</font>
<font color="#0000ff">for</font><font color="#000000">(</font><font color="#0000ff">int </font><font color="#000000">i = </font><font color="#800080">0</font><font color="#000000">; i &lt; tmp.length; i ++){</font>
<font color="#000000">sb.append(tmp[i].trim());</font>
<font color="#000000">}</font>
<font color="#0000ff">return </font><font color="#000000">sb.toString();</font>
<font color="#000000">}</font>
<font color="#008000">/**</font>
<font color="#008000">     * @param args</font>
<font color="#008000">     */</font>
<font color="#0000ff">public static void </font><font color="#000000">main(</font><font color="#ff0000">String</font><font color="#000000">[] args) {</font>
<font color="#0000ff">try </font><font color="#000000">{</font>
<font color="#0000ff">new </font><font color="#000000">GIS().createXMLFile(</font><font color="#ff00ff">"d:\\GI-China.xml"</font><font color="#000000">);</font>
<font color="#000000">} </font><font color="#0000ff">catch </font><font color="#000000">(</font><font color="#ff0000">Exception </font><font color="#000000">e) {</font>
<font color="#000000">e.printStackTrace();</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
<font color="#000000">}</font>
</font>
</pre>
</span></span></div>
<br />
2.做一个方便使用的全国城市经纬度数据库<br />
经过上面的操作，一个完整的全国城市经纬度数据库就做好了，只不过它是xml格式的，看起来还不错，<a title="下载这个数据库" href="/Files/canvas/GI-China.zip">下载这个数据库</a><br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_195704" onclick="this.style.display='none'; Code_Closed_Text_195704.style.display='none'; Code_Open_Image_195704.style.display='inline'; Code_Open_Text_195704.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" width="11" height="16" /><img id="Code_Open_Image_195704" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_195704.style.display='none'; Code_Closed_Image_195704.style.display='inline'; Code_Closed_Text_195704.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" width="11" height="16" /><span id="Code_Closed_Text_195704" style="border: 1px solid #808080; background-color: #ffffff;">生成的xml展示</span><span id="Code_Open_Text_195704" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">
<pre><font face="Courier New">
<font color="#0000ff">&lt;?xml </font><font color="#ff0000">version</font><font color="#0000ff">=</font><font color="#ff00ff">"1.0" </font><font color="#ff0000">encoding</font><font color="#0000ff">=</font><font color="#ff00ff">"UTF-8"</font><font color="#800080">?</font><font color="#0000ff">&gt;</font>
<font color="#0000ff">&lt;</font><font color="#808000">country </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"中国"</font><font color="#0000ff">&gt;</font>
<font color="#000000">  </font><font color="#0000ff">&lt;</font><font color="#808000">province </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"上海"</font><font color="#0000ff">&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"上海" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.48" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"31.22"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"嘉定" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.24" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"31.4"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"宝山" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.48" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"31.41"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"川沙" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.7" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"31.19"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"南汇" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.76" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"31.05"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"奉贤" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.46" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"30.92"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"松江" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.24" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"31"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"金山" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.16" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"30.89"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"青浦" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.1" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"31.15"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"崇明" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"121.4" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"31.73"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">  </font><font color="#0000ff">&lt;/</font><font color="#808000">province</font><font color="#0000ff">&gt;</font>
<font color="#000000">  </font><font color="#0000ff">&lt;</font><font color="#808000">province </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"云南"</font><font color="#0000ff">&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"昆明" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"102.73" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"25.04"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"富民" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"102.48" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"25.21"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"晋宁" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"102.58" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"24.68"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"呈贡" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"102.79" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"24.9"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"安宁" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"102.44" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"24.95"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"昭通" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"103.7" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"29.32"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"永善" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"103.63" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"28.22"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"大关" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"103.91" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"27.74"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"彝良" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"104.06" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"27.61"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"鲁甸" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"103.54" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"27.21"</font><font color="#0000ff">/&gt;</font>
<font color="#000000">    </font><font color="#0000ff">&lt;</font><font color="#808000">city </font><font color="#ff0000">name</font><font color="#0000ff">=</font><font color="#ff00ff">"绥江" </font><font color="#800080">longitude</font><font color="#0000ff">=</font><font color="#ff00ff">"103.97" </font><font color="#800080">latitude</font><font color="#0000ff">=</font><font color="#ff00ff">"28.58"</font><font color="#0000ff">/&gt;</font>
</font>
</pre>
</span></span></div>
<br />
3.利用google天气api做一个全面的天气预报服务<br />
google提供的天气api可以有两种方式访问，<br />
一种是<br />
<a href="http://www.google.com/ig/api?hl=zh-cn&amp;weather=,,,30670000,104019996" target="_blank">&nbsp;&nbsp;&nbsp;&nbsp; http://www.google.com/ig/api?hl=zh-cn&amp;weather=,,,30670000,104019996</a> <br />
30670000为纬度，104019996为经度，这个是把上面的xml中的经纬度乘以了10^6(10的六次方)，这个方法有个好处，就是可以根据经纬度获得天气预报，自然预报地区也可变得精确些<br />
另一种是<br />
&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.google.com/ig/api?weather=Beijing" target="_blank">http://www.google.com/ig/api?weather=Beijing</a><br />
这个链接比较简单，但是支持的城市比较少，所以还是使用第一种方式比较好，于是才整理好了所有城市的经纬度<br />
<br />
访问上面的链接，google返回的xml内容看起来是这样的<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><img id="Code_Closed_Image_202556" onclick="this.style.display='none'; Code_Closed_Text_202556.style.display='none'; Code_Open_Image_202556.style.display='inline'; Code_Open_Text_202556.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" width="11" height="16" /><img id="Code_Open_Image_202556" style="display: none;" onclick="this.style.display='none'; Code_Open_Text_202556.style.display='none'; Code_Closed_Image_202556.style.display='inline'; Code_Closed_Text_202556.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" width="11" height="16" /><span id="Code_Closed_Text_202556" style="border: 1px solid #808080; background-color: #ffffff;">google返回的xml</span><span id="Code_Open_Text_202556" style="display: none;"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">xml_api_reply&nbsp;</span><span style="color: #ff0000;">version</span><span style="color: #0000ff;">="1"</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">weather&nbsp;</span><span style="color: #ff0000;">module_id</span><span style="color: #0000ff;">="0"</span><span style="color: #ff0000;">&nbsp;tab_id</span><span style="color: #0000ff;">="0"</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">forecast_information</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">city&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">=""</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">postal_code&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">=""</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">latitude_e6&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="30670000"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">longitude_e6&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="104019996"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">forecast_date&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="2009-03-05"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">current_date_time&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="2009-03-05&nbsp;19:00:00&nbsp;+0000"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">unit_system&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="SI"</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">forecast_information</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">current_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">condition&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="晴"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">temp_f&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="61"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">temp_c&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="16"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">humidity&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="湿度：&nbsp;45%"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">icon&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="/images/weather/sunny.gif"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">wind_condition&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="风向：&nbsp;北、风速：6&nbsp;(公里/小时）"</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">current_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">forecast_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">day_of_week&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="周四"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">low&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="7"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">high&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="16"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">icon&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="/images/weather/mostly_sunny.gif"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">condition&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="以晴为主"</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">forecast_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">forecast_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">day_of_week&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="周五"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">low&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="4"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">high&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="9"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">icon&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="/images/weather/chance_of_rain.gif"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">condition&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="可能有雨"</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">forecast_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">forecast_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">day_of_week&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="周六"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">low&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="5"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">high&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="10"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">icon&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="/images/weather/mostly_sunny.gif"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">condition&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="以晴为主"</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">forecast_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">forecast_conditions</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">day_of_week&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="周日"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">low&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="3"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">high&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="12"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">icon&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="/images/weather/chance_of_rain.gif"</span><span style="color: #0000ff;">/&gt;&lt;</span><span style="color: #800000;">condition&nbsp;</span><span style="color: #ff0000;">data</span><span style="color: #0000ff;">="可能有雨"</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">forecast_conditions</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">weather</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">xml_api_reply</span><span style="color: #0000ff;">&gt;</span></span></div>
<br />
对于返回的xml中的&lt;icon data="/images/weather/cn_cloudy.gif"/&gt;，可以这样构造链接获取google提供的图片<br />
取其中的cn_cloudy.gif，然后放在http://www.google.cn/ig/images/weather/之后，生成的链接是<br />
&nbsp;&nbsp;&nbsp;&nbsp; http://www.google.cn/ig/images/weather/cn_cloudy.png<br />
这样这个天气api就基本构思好了<br />
<br />
4.学习用python编写webservice(待续&#8230;&#8230;)<br />
将这个服务编写为一个webservice，决定使用python去写，所以要学习一下python了<br />
<br />
<br />
<img src ="http://www.blogjava.net/canvas/aggbug/259355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">Barrie</a> 2009-03-12 20:34 <a href="http://www.blogjava.net/canvas/articles/GS-China.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造ICTCLAS JNI For Java</title><link>http://www.blogjava.net/canvas/articles/jni-free-ictclas.html</link><dc:creator>Barrie</dc:creator><author>Barrie</author><pubDate>Tue, 06 May 2008 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/canvas/articles/jni-free-ictclas.html</guid><wfw:comment>http://www.blogjava.net/canvas/comments/198704.html</wfw:comment><comments>http://www.blogjava.net/canvas/articles/jni-free-ictclas.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/canvas/comments/commentRss/198704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/canvas/services/trackbacks/198704.html</trackback:ping><description><![CDATA[<font color="red">声明:ICTCLAS以及我修改ICTCLAS JNI For Java的版权均归原作者所有，未经原作者允许，请勿作其它商业用途</font> <br />
首先下载ICTCLAS Beta版本公开源代码:<a href="http://www.i3s.ac.cn/FreeICTCLAS.zip">点击下载</a> <br />
我使用的是Visual studio 2005开发环境，源码使用VC6开发的，现在把这个工程转移到VS2005下。我使用的方法比较笨，基本上是属于体力+暴力型的，不过自己觉得爽就可以了<br />
在VS2005里新建Win32项目FREEICTCLAS,在application Settings选项里选中Dll和Empty Project,然后新建以下过滤器(New Filter)，并且将原项目的源码及其目录结构copy到现在的win32项目的目录下(过滤器和项目目录示意图)<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 class="hiddenArea" id="Code_Closed_Image1" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text1').style.display='none'; document.getElementById('Code_Open_Image1').style.display='inline'; document.getElementById('Code_Open_Text1').style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" name="Code_Closed_Image1" /> <img class="rd_message" id="Code_Open_Image1" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text1').style.display='none'; document.getElementById('Code_Closed_Image1').style.display='inline'; document.getElementById('Code_Closed_Text1').style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" name="Code_Open_Image1" /> <span id="Code_Closed_Text1" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">示意图(点击前面+号展开)</span> <span id="Code_Open_Text1" style="display: none"><br />
<table border="0">
    <tbody>
        <tr>
            <td width="40">&nbsp;</td>
            <td valign="top"><img alt="" src="http://www.blogjava.net/images/blogjava_net/canvas/newfilter.gif" /></td>
            <td valign="top"><img alt="" src="http://www.blogjava.net/images/blogjava_net/canvas/dirStruct.gif" /></td>
        </tr>
    </tbody>
</table>
</span></div>
<br />
这样这个win32工程基本就建完了。<br />
观察ICTCLAS源代码后编写以下带有native声明的方法的java类，只实现了头两个方法，第三个暂未实现，与ICTCLAS接口基本保持一致<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_142429" onclick="this.style.display='none'; Code_Closed_Text_142429.style.display='none'; Code_Open_Image_142429.style.display='inline'; Code_Open_Text_142429.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_142429" style="display: none" onclick="this.style.display='none'; Code_Open_Text_142429.style.display='none'; Code_Closed_Image_142429.style.display='inline'; Code_Closed_Text_142429.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text_142429" style="border-right: #808080 1px solid; border-top: #808080 1px solid; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">FreeICTCLAS.java(点击+展开)</span><span id="Code_Open_Text_142429" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FreeICTCLAS&nbsp;<br />
<img id="Codehighlighter1_26_630_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_630_Open_Text.style.display='none'; Codehighlighter1_26_630_Closed_Image.style.display='inline'; Codehighlighter1_26_630_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_26_630_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_26_630_Closed_Text.style.display='none'; Codehighlighter1_26_630_Open_Image.style.display='inline'; Codehighlighter1_26_630_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_26_630_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_26_630_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_29_52_Open_Image" onclick="this.style.display='none'; Codehighlighter1_29_52_Open_Text.style.display='none'; Codehighlighter1_29_52_Closed_Image.style.display='inline'; Codehighlighter1_29_52_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_29_52_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_29_52_Closed_Text.style.display='none'; Codehighlighter1_29_52_Open_Image.style.display='inline'; Codehighlighter1_29_52_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_29_52_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_29_52_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;初始化设置取值都是0,1,2<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">native</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;FreeICTCLAS_Init(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;OperateType,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;OutputFormat);<br />
<img id="Codehighlighter1_131_159_Open_Image" onclick="this.style.display='none'; Codehighlighter1_131_159_Open_Text.style.display='none'; Codehighlighter1_131_159_Closed_Image.style.display='inline'; Codehighlighter1_131_159_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_131_159_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_131_159_Closed_Text.style.display='none'; Codehighlighter1_131_159_Open_Image.style.display='inline'; Codehighlighter1_131_159_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_131_159_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_131_159_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;与Free版本中有所不同,返回值为结果<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">native</span><span style="color: #000000">&nbsp;String&nbsp;FreeICTCLAS_ParagraphProcess(String&nbsp;sParagraph);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_235_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_235_258_Open_Text.style.display='none'; Codehighlighter1_235_258_Closed_Image.style.display='inline'; Codehighlighter1_235_258_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_235_258_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_235_258_Closed_Text.style.display='none'; Codehighlighter1_235_258_Open_Image.style.display='inline'; Codehighlighter1_235_258_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_235_258_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_235_258_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;与Free版本中基本保持一致<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">native</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;FreeICTCLAS_FileProcess(String&nbsp;sSourceFilename,&nbsp;String&nbsp;sResultFilename);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)<br />
<img id="Codehighlighter1_398_628_Open_Image" onclick="this.style.display='none'; Codehighlighter1_398_628_Open_Text.style.display='none'; Codehighlighter1_398_628_Closed_Image.style.display='inline'; Codehighlighter1_398_628_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_398_628_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_398_628_Closed_Text.style.display='none'; Codehighlighter1_398_628_Open_Image.style.display='inline'; Codehighlighter1_398_628_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_398_628_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_398_628_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.loadLibrary(</span><span style="color: #000000">"</span><span style="color: #000000">FreeICTCLAS</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS&nbsp;test&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FreeICTCLAS();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.FreeICTCLAS_Init(</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;test.FreeICTCLAS_ParagraphProcess(</span><span style="color: #000000">"</span><span style="color: #000000">与Free版本中有所不同,返回值为结果，和平奥运，绿色奥运，今天天气很是不错啊</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></span></div>
然后在命令行输入Javac FreeICTCLAS.java编译FreeICTCLAS.java<br />
生成FreeICTCLAS.class文件后，再使用javah FreeICTCLAS生成FreeICTCLAS.h，代码如下：<br />
<div title="FreeICTCLAS.h" 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 id="Codehighlighter1_0_52_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_52_Open_Text.style.display='none'; Codehighlighter1_0_52_Closed_Image.style.display='inline'; Codehighlighter1_0_52_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_52_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_0_52_Closed_Text.style.display='none'; Codehighlighter1_0_52_Open_Image.style.display='inline'; Codehighlighter1_0_52_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_52_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_0_52_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;DO&nbsp;NOT&nbsp;EDIT&nbsp;THIS&nbsp;FILE&nbsp;-&nbsp;it&nbsp;is&nbsp;machine&nbsp;generated&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">jni.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_71_104_Open_Image" onclick="this.style.display='none'; Codehighlighter1_71_104_Open_Text.style.display='none'; Codehighlighter1_71_104_Closed_Image.style.display='inline'; Codehighlighter1_71_104_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_71_104_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_71_104_Closed_Text.style.display='none'; Codehighlighter1_71_104_Open_Image.style.display='inline'; Codehighlighter1_71_104_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_71_104_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_71_104_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;Header&nbsp;for&nbsp;class&nbsp;FreeICTCLAS&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#ifndef&nbsp;_Included_FreeICTCLAS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#define&nbsp;_Included_FreeICTCLAS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#ifdef&nbsp;__cplusplus<br />
<img id="Codehighlighter1_197_878_Open_Image" onclick="this.style.display='none'; Codehighlighter1_197_878_Open_Text.style.display='none'; Codehighlighter1_197_878_Closed_Image.style.display='inline'; Codehighlighter1_197_878_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_197_878_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_197_878_Closed_Text.style.display='none'; Codehighlighter1_197_878_Open_Image.style.display='inline'; Codehighlighter1_197_878_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />extern&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_197_878_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_197_878_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />#endif<br />
<img id="Codehighlighter1_206_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_206_288_Open_Text.style.display='none'; Codehighlighter1_206_288_Closed_Image.style.display='inline'; Codehighlighter1_206_288_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_206_288_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_206_288_Closed_Text.style.display='none'; Codehighlighter1_206_288_Open_Image.style.display='inline'; Codehighlighter1_206_288_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span id="Codehighlighter1_206_288_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_206_288_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Method:&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS_Init<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Signature:&nbsp;(II)Z<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />JNIEXPORT&nbsp;jboolean&nbsp;JNICALL&nbsp;Java_FreeICTCLAS_FreeICTCLAS_1Init<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">,&nbsp;jobject,&nbsp;jint,&nbsp;jint);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_388_515_Open_Image" onclick="this.style.display='none'; Codehighlighter1_388_515_Open_Text.style.display='none'; Codehighlighter1_388_515_Closed_Image.style.display='inline'; Codehighlighter1_388_515_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_388_515_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_388_515_Closed_Text.style.display='none'; Codehighlighter1_388_515_Open_Image.style.display='inline'; Codehighlighter1_388_515_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span id="Codehighlighter1_388_515_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_388_515_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Method:&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS_ParagraphProcess<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Signature:&nbsp;(Ljava/lang/String;)Ljava/lang/String;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />JNIEXPORT&nbsp;jstring&nbsp;JNICALL&nbsp;Java_FreeICTCLAS_FreeICTCLAS_1ParagraphProcess<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">,&nbsp;jobject,&nbsp;jstring);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_623_746_Open_Image" onclick="this.style.display='none'; Codehighlighter1_623_746_Open_Text.style.display='none'; Codehighlighter1_623_746_Closed_Image.style.display='inline'; Codehighlighter1_623_746_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_623_746_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_623_746_Closed_Text.style.display='none'; Codehighlighter1_623_746_Open_Image.style.display='inline'; Codehighlighter1_623_746_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span id="Codehighlighter1_623_746_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_623_746_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Method:&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS_FileProcess<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;*&nbsp;Signature:&nbsp;(Ljava/lang/String;Ljava/lang/String;)Z<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />JNIEXPORT&nbsp;jboolean&nbsp;JNICALL&nbsp;Java_FreeICTCLAS_FreeICTCLAS_1FileProcess<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;(JNIEnv&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">,&nbsp;jobject,&nbsp;jstring,&nbsp;jstring);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />#ifdef&nbsp;__cplusplus<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#endif<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#endif<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
将FreeICTCLAS.h拷贝到win32项目所在目录中，再将其添加到项目中，接下来就是编写FreeICTCLAS.cpp实现头文件里方法<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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">FreeICTCLAS.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">util.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">globeVar.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">string.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_105_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_105_183_Open_Text.style.display='none'; Codehighlighter1_105_183_Closed_Image.style.display='inline'; Codehighlighter1_105_183_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_105_183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_105_183_Closed_Text.style.display='none'; Codehighlighter1_105_183_Open_Image.style.display='inline'; Codehighlighter1_105_183_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_105_183_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_105_183_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Method:&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS_Init<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Signature:&nbsp;(II)Z<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JNIEXPORT&nbsp;jboolean&nbsp;JNICALL&nbsp;Java_FreeICTCLAS_FreeICTCLAS_1Init<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(JNIEnv&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">env,&nbsp;jobject&nbsp;obj,&nbsp;jint&nbsp;OperateType,&nbsp;jint&nbsp;OutputFormat)<br />
<img id="Codehighlighter1_311_415_Open_Image" onclick="this.style.display='none'; Codehighlighter1_311_415_Open_Text.style.display='none'; Codehighlighter1_311_415_Closed_Image.style.display='inline'; Codehighlighter1_311_415_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_311_415_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_311_415_Closed_Text.style.display='none'; Codehighlighter1_311_415_Open_Image.style.display='inline'; Codehighlighter1_311_415_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_311_415_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_311_415_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;m_ICTCLAS.m_nOperateType&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;OperateType;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;m_ICTCLAS.m_nOutputFormat&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;OutputFormat;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;JNI_TRUE;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_417_540_Open_Image" onclick="this.style.display='none'; Codehighlighter1_417_540_Open_Text.style.display='none'; Codehighlighter1_417_540_Closed_Image.style.display='inline'; Codehighlighter1_417_540_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_417_540_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_417_540_Closed_Text.style.display='none'; Codehighlighter1_417_540_Open_Image.style.display='inline'; Codehighlighter1_417_540_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_417_540_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_417_540_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Method:&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS_ParagraphProcess<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Signature:&nbsp;(Ljava/lang/String;)Ljava/lang/String;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JNIEXPORT&nbsp;jstring&nbsp;JNICALL&nbsp;Java_FreeICTCLAS_FreeICTCLAS_1ParagraphProcess<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(JNIEnv&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">env,&nbsp;jobject&nbsp;obj,&nbsp;jstring&nbsp;sParagraph)<br />
<img id="Codehighlighter1_662_972_Open_Image" onclick="this.style.display='none'; Codehighlighter1_662_972_Open_Text.style.display='none'; Codehighlighter1_662_972_Closed_Image.style.display='inline'; Codehighlighter1_662_972_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_662_972_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_662_972_Closed_Text.style.display='none'; Codehighlighter1_662_972_Open_Image.style.display='inline'; Codehighlighter1_662_972_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_662_972_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_662_972_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sResult,</span><span style="color: #000000">*</span><span style="color: #000000">sSource;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;sSource&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;jstringTochar(env,&nbsp;sParagraph);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(m_ICTCLAS.m_nOutputFormat</span><span style="color: #000000">!=</span><span style="color: #000000">2</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sResult</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;[(strlen(sSource)</span><span style="color: #000000">+</span><span style="color: #000000">13</span><span style="color: #000000">)</span><span style="color: #000000">*</span><span style="color: #000000">3</span><span style="color: #000000">];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sResult</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;[(strlen(sSource)</span><span style="color: #000000">+</span><span style="color: #000000">13</span><span style="color: #000000">)</span><span style="color: #000000">*</span><span style="color: #000000">50</span><span style="color: #000000">];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">m_ICTCLAS.ParagraphProcessing(sSource,sResult))<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;chartoJstring(env,sResult);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_974_1093_Open_Image" onclick="this.style.display='none'; Codehighlighter1_974_1093_Open_Text.style.display='none'; Codehighlighter1_974_1093_Closed_Image.style.display='inline'; Codehighlighter1_974_1093_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_974_1093_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_974_1093_Closed_Text.style.display='none'; Codehighlighter1_974_1093_Open_Image.style.display='inline'; Codehighlighter1_974_1093_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_974_1093_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_974_1093_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Class:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Method:&nbsp;&nbsp;&nbsp;&nbsp;FreeICTCLAS_FileProcess<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />*&nbsp;Signature:&nbsp;(Ljava/lang/String;Ljava/lang/String;)Z<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />JNIEXPORT&nbsp;jboolean&nbsp;JNICALL&nbsp;Java_FreeICTCLAS_FreeICTCLAS_1FileProcess<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(JNIEnv&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">env,&nbsp;jobject&nbsp;obj,&nbsp;jstring&nbsp;sSourceFilename,&nbsp;jstring&nbsp;sResultFilename)<br />
<img id="Codehighlighter1_1241_1261_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1241_1261_Open_Text.style.display='none'; Codehighlighter1_1241_1261_Closed_Image.style.display='inline'; Codehighlighter1_1241_1261_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1241_1261_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1241_1261_Closed_Text.style.display='none'; Codehighlighter1_1241_1261_Open_Image.style.display='inline'; Codehighlighter1_1241_1261_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_1241_1261_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1241_1261_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;JNI_TRUE;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
编译项目，在release目录中找到FreeICTCLAS.dll，将其拷贝到FreeICTCLAS.class所在的目录中<br />
现在运行java FreeICTCLAS即可看到中文分词的结果啦<br />
<br />
怎么把ICTCLAS JNI for Java添加到eclipse项目中去?下次写吧。<br />
当你看到这句话的时候，你可以直接发邮件向我索要win32项目和eclipse项目&nbsp;<br />
BlogJava后台编辑器不好用，^_^
 <img src ="http://www.blogjava.net/canvas/aggbug/198704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/canvas/" target="_blank">Barrie</a> 2008-05-06 14:40 <a href="http://www.blogjava.net/canvas/articles/jni-free-ictclas.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>