??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲JLZZJLZZ少妇,亚洲精品无码专区久久久,久久久久亚洲AV成人无码网站http://m.tkk7.com/amplifier/category/7854.htmlamplifier's java blog <br> <script type="text/javascript"><!-- google_ad_client = "ca-pub-5575070670019942"; /* blogjava */ google_ad_slot = "7055672771"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>zh-cnFri, 17 Nov 2017 07:37:54 GMTFri, 17 Nov 2017 07:37:54 GMT60利用jmtp库读取手机文?/title><link>http://m.tkk7.com/amplifier/archive/2017/11/17/432903.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Fri, 17 Nov 2017 06:54:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2017/11/17/432903.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/432903.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2017/11/17/432903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/432903.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/432903.html</trackback:ping><description><![CDATA[ 每次换手机,把旧手机的数据迁Ud新手机就是个很麻烦的事情Q幸好最q华为的“手机克隆”APP来强大,居然能够把微信的聊天记录包括囄原封不动地迁Ud新手ZQ以前用微信自带的聊天记录{Ud能只能{UL字信息,囄视频全部丢失Q不知道现在的怎么栗手机克隆还能把SD卡的内容也{U过来,基本满了需要?br /> 但是要把手机上的东西传到电脑没那么单了Q现在已l没有了以前的大定w存储模式Q只能选择MTP模式Q这U模式其实不是一个完整的文gpȝQ有很多限制Q所以一些传l的软gd不到Q例如FastCopy是用不了的,用Windows自带的文件管理器来复Ӟ开始计时间就要等很久Q中间出了个错就前功弃Q还有通过手机上的APP讉K电脑׃n的方式,在手Z复制也可以,但是同样会莫名其妙卡死,FTP同理Q折腾了好久Q还是觉得自己动手比较好?br /> MTP协议在维基百U里解释得比较清楚:<a >https://en.wikipedia.org/wiki/Media_Transfer_Protocol</a> Q简单点说就是:<br /> 1、不是以块设备的形式讉KQ跟U盘不同;<br /> 2、只能单U程讉KQ不能同时进行多个操作,只能一个接一个;<br /> 3、控制权在设备上Q对外展C的内容p备决定;<br /> 4、默认不能直接对文gq行部分修改Q只能复制过来修改完再复制回去,但Android对协议做了扩展,能够修改部分文g内容Q?br /> 5、在Linux上有些Y件能够把它挂载ؓ文gpȝQ这样其他Y件就能像讉K普通文件系l一栯问了Q但是Windows下似乎没有?br /> <br /> 不过有h开发了一个在Windows下通过JNI实现的Java库jmtpQ项目托在Google CodeQ被墙了Q但是GitHub有hfork了一个,可以下蝲下来Q我下蝲的是<a >https://github.com/reindahl/jmtp</a><br /> 里面包含了C++的代码和Java的代码,以及两个已经~译好的dll文gQ分别用于Win32和Win64Q把其中一个dll文g攑֜工程目录下,再把Java源代码加入工E中卛_使用Q文档比较简陋,但是看test目录下的MtpTest.javaQ基本可以摸到如何用了Q这个协议比较简单,其实没什么功能,我要的只是把文g复制到电脑上?br /> ҎMtpTest.javaQ稍微修改一下,做个递归复制卛_把手Z的所有文件复制到电脑上:<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: #0000FF; ">package</span><span style="color: #000000; "> test;<br /> <br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.File;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.FileWriter;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.io.IOException;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.math.BigInteger;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.nio.file.Files;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.nio.file.Path;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.nio.file.Paths;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.rmi.server.SocketSecurityException;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> java.util.ArrayList;<br /> <br /> <br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> jmtp.PortableDevice;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> jmtp.PortableDeviceFolderObject;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> jmtp.PortableDeviceManager;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> jmtp.PortableDeviceObject;<br /> </span><span style="color: #0000FF; ">import</span><span style="color: #000000; "> jmtp.PortableDeviceStorageObject;<br /> <br /> <br /> </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> TestApp {<br /> <br />     </span><span style="color: #000000; "><br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> main(String[] args) {<br />         </span><span style="color: #008000; ">//</span><span style="color: #008000; "> TODO Auto-generated method stub</span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">        <br />         ArrayList</span><span style="color: #000000; "><</span><span style="color: #000000; ">PortableDeviceStorageObject</span><span style="color: #000000; ">></span><span style="color: #000000; "> devices </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> ArrayList</span><span style="color: #000000; "><></span><span style="color: #000000; ">();<br /> <br />         PortableDeviceManager manager </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> PortableDeviceManager();<br /> <br />         </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (PortableDevice device : manager) {<br />             System.out.println(device);<br />             device.open();<br />             <br />             </span><span style="color: #008000; ">//</span><span style="color: #008000; "> Iterate over deviceObjects</span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (PortableDeviceObject object : device.getRootObjects()) {<br />                 String storageName</span><span style="color: #000000; ">=</span><span style="color: #000000; ">object.getName();<br />                 System.out.println(storageName);<br /> </span><span style="color: #000000; "><br />                 </span><span style="color: #008000; ">//</span><span style="color: #008000; "> If the object is a storage object</span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">                </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (object </span><span style="color: #0000FF; ">instanceof</span><span style="color: #000000; "> PortableDeviceStorageObject) {<br />                     PortableDeviceStorageObject storage </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (PortableDeviceStorageObject) object;<br />                     System.out.println(storage.getChildObjects().length);<br />                     </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (PortableDeviceObject child : storage.getChildObjects()) {<br />                             copyall(child,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">E:\\手机备䆾\\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">object.getName());<br />                     }<br />                 }<br />             }<br /> <br />             device.close();<br />             System.out.println(size);<br />         }<br /> <br />   </span><span style="color: #000000; ">   <br />     }<br />     <br />     </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> copyall(PortableDeviceObject obj,String path) {<br /> </span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(obj </span><span style="color: #0000FF; ">instanceof</span><span style="color: #000000; "> PortableDeviceFolderObject) {<br />            </span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">            String objName</span><span style="color: #000000; ">=</span><span style="color: #000000; ">obj.getName();<br />             </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(objName.contains(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)) {<br />                 objName</span><span style="color: #000000; ">=</span><span style="color: #000000; ">objName.replace(</span><span style="color: #000000; ">'</span><span style="color: #000000; ">:</span><span style="color: #000000; ">'</span><span style="color: #000000; ">, </span><span style="color: #000000; ">'</span><span style="color: #000000; ">Q?/span><span style="color: #000000; ">'</span><span style="color: #000000; ">);<br />             }<br />             String newPath </span><span style="color: #000000; ">=</span><span style="color: #000000; "> path</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">objName;<br />             System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">创徏文g夹:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">newPath);<br />             <br /> </span><span style="color: #008000; "></span><span>           </span><span> File file = new File(newPath);<br /> </span><span style="color: #008000; "></span><span>            if(!file.exists()) {<br /> </span><span style="color: #008000; "></span><span>                file.mkdirs();<br /> </span><span style="color: #008000; "></span><span>            }</span><span style="color: #008000; "><br /> </span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(PortableDeviceObject subObj:((PortableDeviceFolderObject) obj).getChildObjects()) {              </span><span style="color: #000000; "><br />                 copyall(subObj,newPath);<br />             }<br />         }<br />         </span><span style="color: #0000FF; ">else</span><span style="color: #000000; "> {</span><span style="color: #000000; ">       <br />             </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(obj.getName().contains(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br />                 </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />             System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">开始复制文件到Q?/span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">path</span><span style="color: #000000; ">+</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">obj.getName());<br />             File file </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> File(path);<br /> </span><span>            </span><span style="color: #008000; "></span><span>obj.copy(file.toPath());</span><span style="color: #008000; "></span><span style="color: #000000;">          </span><span style="color: #000000; ">            <br />             System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">文g复制完成Q?/span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />         }<br />     }</span><span style="color: #000000; "><br /> }</span></div> 其中发现有点问题Q?br />1、Android讑֤文g名里是可以包含冒P:Q的Q但Windows是不可以的,所以复制到q些文g的时候会有问题,于是遇到目录名这样就把它改ؓ中文的冒PQ)Q但是遇到文件名q样׃行了Q因个库的copy函数只需要指定目标目录,不需要指定目标文件名Q所以这些文件只能放弃;<br />2、Android手机的MTP协议是由“媒体存储”q个pȝAPP控制的,有时候手Z可以看到的文Ӟ通过MTP讉K却怎么也看不到Q重启手Z不行Q应该就是这个APP没有更新数据Q需要把它的pȝ数据清除掉,{它重徏完重新访问就可以看到了,不过q个重徏旉非常长,可以查看它数据占用的I间Q刚清除之后会发现它占用的空间会不断增长Q到了不增长的时候就是重建完了,可以正常访问了Q?br />3、这个库有时候还有点bugQ有一ơ发现它d到的文g和文件夹都没有了最后一?后面的部分,所以L卡住Q重新插拔一下手机数据线又没问题了;<br />4、ؓ了避免复制了半天l果发现不完_又要重来Q最好在复制前先l计一下文件大,看看跟手Z看到的占用存储空间是不是一_对于MTP讑֤上的文gQ可以通过getSize函数得到大小Q把上面复制操作改ؓ大小累加卛_Q速度比复制快一些,不过׃文件太多,也不会快很多?br /><br />把手机里的文件复制到电脑后,通过一些简单的分析Q发现有很多其实是垃圾来的,也可以ؓ手机I间清理提供参考,因ؓ在电脑上分析h比在手机上方便一些。例如一些视频APP的缓存,居然过1GQ占用了宝贵的内部存储空_之前一直都没发玎ͼ通过电脑里的按文件大搜索才发现?img src ="http://m.tkk7.com/amplifier/aggbug/432903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2017-11-17 14:54 <a href="http://m.tkk7.com/amplifier/archive/2017/11/17/432903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用httpclient和正则表辑ּ完成一些无聊的重复性Q?/title><link>http://m.tkk7.com/amplifier/archive/2016/01/12/429014.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Tue, 12 Jan 2016 07:54:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2016/01/12/429014.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/429014.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2016/01/12/429014.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/429014.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/429014.html</trackback:ping><description><![CDATA[最q新部v了一个信息系l,厂家居然没有升ҎQ所有数据都要重新输入,包括用户、角色等都要重新配置Q真是操蛋。要是一个个录入直是日狗了,q些用户在其他信息系l早已存在,但是每个都复制粘贴提交一遍也不是办法Q于是就想用E序自动完成q些操作。步骤如下:<br />1、从其他信息pȝ的数据库导出用户信息Q也可以直接从其他信息系l的界面把所有用户信息复制下来放在一个文本文仉Q反正就是准备好数据源;<br />2、在需要录入用户信息的pȝ中,用h工操作的方式dpȝQƈ录入一个用P同时用Wireshark抓包Q查看整个过E要提交一些什么样的表单数据;<br />3、在E序中用httpclient提交同样的数据,完成dQƈ从第1步的数据源中d用户信息Q然后@环提交录入用h需的数据,完成用户的录入;<br />4、新pȝ没有默认的用戯Ԍ是需要一个个修改的,是根据用LID来确定当前修改的用户Qƈ且提交一个角色ID来进行设定,因此需要首先获取用LIDQ然后根据该ID来提交角色IDQ而用户ID是通过用户列表面获取到的Q因此还需要通过正则表达式来获取所有用LIDQ然后@环提交角色IDQ完成角色设定?br /><br />׃不少旉才搞定,有几个地斚w要注意:<br />1、如果表单数据不包含中文Q直接把表单的Name和Value加在HttpPost的URL?后面卛_Q不需要专门徏立NameValuePairQ如下所C:<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: #000000; ">HttpPost httppost </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> HttpPost(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http://1.1.1.1/test/adduser?userid=abc&username=efg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />httpclient.execute(httppost);</span></div><br />但是Q如果表单数据包含中文,例如姓名Q用q种方式提交的表单数据会出现qQ即佉K过URLEncoderq行~码后再发也不行Q必d立NameValuePairQ再加到HttpPost的Entity里面Q如下所C:<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: #000000; ">HttpPost httppost </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> HttpPost(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">http://1.1.1.1/test/adduser?userid=abc</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />List</span><span style="color: #000000; "><</span><span style="color: #000000; ">NameValuePair</span><span style="color: #000000; ">></span><span style="color: #000000; "> nvps </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> ArrayList</span><span style="color: #000000; "><</span><span style="color: #000000; ">NameValuePair</span><span style="color: #000000; ">></span><span style="color: #000000; ">();<br />nvps.add(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> BasicNameValuePair(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">username</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">张三</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />httppost.setEntity(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> UrlEncodedFormEntity(nvps, HTTP.UTF_8));<br />httpclient.execute(httppost);</span></div><br />2、用于网内Ҏ扄正则表达式的使用方式一般ؓQ?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: #000000; ">Pattern p </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Pattern.compile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.*?abc(whattoget)123.*?");</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">Matcher m </span><span style="color: #000000; ">=</span><span style="color: #000000; "> p.matcher(line);<br /></span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m.matches()){<br />     String whattoget </span><span style="color: #000000; ">=</span><span style="color: #000000; "> m.group(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />}</span></div><div><span style="color: #000000; "></span><div><span style="color: #000000; ">"</span><span style="color: #000000; ">.*?abc(whattoget)123.*?"</span><span style="color: #000000; ">是一个正则表辑ּQ如果用于匹配一行的时候,׃要查扄内容是在行中_所以前后需要加?*?Q表C前后可以是L字符Q也可以什么都没有Q而表辑ּ中间?whattoget)pCZ个groupQ编号ؓ1Q编号ؓ0的group是整个匹配的字符Ԍ扑ֈ之后提取group(1)卛_得到惌的内宏V?br />试正则表达式是一很ȝ的工作,不过有个很好的Y件可以完成此工作QRegexBuddyQ支持各U语a的正则表辑ּ的调试?br />学习正则表达式的宝典是《Mastering Regular Expression》?br /></span></div></div><img src ="http://m.tkk7.com/amplifier/aggbug/429014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2016-01-12 15:54 <a href="http://m.tkk7.com/amplifier/archive/2016/01/12/429014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何让线E暂停,又能随时唤醒Q?/title><link>http://m.tkk7.com/amplifier/archive/2015/03/10/423348.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Tue, 10 Mar 2015 08:52:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2015/03/10/423348.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/423348.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2015/03/10/423348.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/423348.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/423348.html</trackback:ping><description><![CDATA[做GUIE序的时候,通常有个后台工作U程在努力工作,但是中间又需要一些暂停,而关闭程序的时候,必须立即l束那个U程Q退出程序,也有的时候需要停止后台线E,但不关闭E序。例如,做一个目录监控程序,发现目录中有文g的时候,执行一定的操作Q执行完之后没有文g了,p暂停一下,q几U或几分钟再ơ检,q时候就要对U程q行暂停操作Q如果在暂停的时候,用户要关闭程序,必马上停止线E,如果用户需要暂停检,按下某个按钮后,需要让U程马上停止Q但再次按下某个按钮Q线E又必须马上开始?br /> <br /> 以前我都是通过停止标记和用Thread.sleep(time)来完成的Q后台线E的每次循环都要查停止标讎ͼ如果发现停止标记已设定,׃再@环,退出线E,在线E内部,如果需要暂停,执行Thread.sleep(time)。通过把线E的setDaemon(true)ҎQ还可以让线E作为后台线E,当图形界面关闭后Q线E也自动退出?br /> <br /> 但是Q这U方式有个问题,如果我需要在囑Ş界面上点L钮来停止U程Q但q不退出程序,而点L钮的时候线E正处于sleep状态,对它没有Q何办法,只能让它醒过来再操作Q如果sleep的时间比较长Q例?分钟Q那么点L钮之后,用户最多要{?分钟才能把线E停下来?span style="text-decoration: line-through;">当然QThread对象有个interruptҎQ但是已l被标记期,一般不使用了?/span><span style="color: red;">感谢评论?/span><a style="color: red;" id="AjaxHolder_Comments_CommentList_ctl00_NameLink" target="_blank">watchzerg</a><span style="color: red;"></span><span style="color: red;">的提醒,Thread的interrupt()q没有标Cؓq期Q可以按照他的说法来操作Q更为简单?/span><br style="color: red;" /> <br /> 怎么让线E能暂停Q又能随时叫醒呢Q原来Java里最原始的对象Objectp带此功能?br /> <br /> 每个Object都有wait(time)和notify()ҎQ前者就是让拥有该Obejct的线E处于暂停状态,后者则让线E马上唤醒,通过q两个方法,p够满上q的所有要求?br /> <br /> 首先Q徏立一个同步对象:<br /> Object syncObj = new Object();<br /> <br /> 然后在线E中需要暂停的地方Q调用该对象的wait(time)ҎQ?br /> <div>synchronized (syncObj) {<br />        syncObj.wait(60*1000);<br /> }<br /> <br /> 在图形界面的按钮监听事g中,对该对象执行notify()ҎQ?br />         button_1.addSelectionListener(new SelectionAdapter() {<br />             @Override<br />             public void widgetSelected(SelectionEvent e) {<br /> <br />                 thread.setStop(true); <div>                synchronized (syncObj) {<br />                         syncObj.notify();<br />                  }<br />                 //Z{待U程退出,q可以加上以下语句:<br />                 thread.join();</div> <br />             }<br />         });<br /> <br /> </div><img src ="http://m.tkk7.com/amplifier/aggbug/423348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2015-03-10 16:52 <a href="http://m.tkk7.com/amplifier/archive/2015/03/10/423348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse导出的可执行JAR文g启动非常?/title><link>http://m.tkk7.com/amplifier/archive/2015/03/10/423344.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Tue, 10 Mar 2015 07:07:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2015/03/10/423344.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/423344.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2015/03/10/423344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/423344.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/423344.html</trackback:ping><description><![CDATA[Eclipse有个功能是把整个项目打包成一个可执行的Jar文gQ里面包含了所有项目引用了的库Q如果电脑上安装了JREQ直接双d可以启动Q看h很方便,如下图所C:<br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/amplifier/导出1.JPG" height="547" width="626" /><br />可以选择把所有类库打包进去,也就是Jar里面q包含一堆JarQ?br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/amplifier/导出2.JPG" height="110" width="450" /><br />q可以生成ant脚本Q?br /><img alt="" src="http://m.tkk7.com/images/blogjava_net/amplifier/ant.JPG" height="50" width="141" /><br /><br />生成的jar文gQ可以直接通过java -jar xx.jar启动Q简单快捗?br /><br /><br />然而,q样导出来的可执行jarQ启动速度却非常慢Q这跟包的大有兟뀂有个项目导出来的包?0MBQ结果启动需要近一分钟Q在性能差的电脑上,甚至要几分钟Q就是你执行完命令后Q没有Q何界面显C,但是查看d理器发现javaq程的CPU占用率在动Q说明正在努力启动,q了一D|间之后界面突然显C出来,直让人崩溃。可是在Eclipse里面q行Q却是一点就开?br /><br />我开始尝试羃导出的包。但是Eclipse的导出对话框q没有提供需要打包哪些库的选项Q都是默认把所有库都打包进去,但是它可以生成ant脚本Q可以通过~辑ant脚本的方式来减少不必要的库。经q多ơ尝试,l于?0MB的包~成?7MBQ启动速度快了一些,但是依然需要半分钟以上?br /><br />后来觉得Q能不能不打包直接运行呢Q于是把导出来的包用压羃软g解压Q再把里面包含的jar包l解压,最后得C堆没有压~的class文gQ再通过指定classpath的方式,直接q行E序入口classQ发现启动速度和在Eclipse里面一P一点就开?br /><br />打包的好处是部v单,只需要一个文Ӟ但带来的~点实在不能忍,打散的方式部|v来稍微难一点,但是启动速度够快Q对普通用h_q个才是最重要的?br /><br />当然Q还有一U方式是像Eclipse那样Q启动时昄一个图片,底下一个进度条昄启动q度Q不q这样也加大了工作量Q而且每次都要{那q度条,实际上也很烦?img src ="http://m.tkk7.com/amplifier/aggbug/423344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2015-03-10 15:07 <a href="http://m.tkk7.com/amplifier/archive/2015/03/10/423344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JavaVC替换JMFq接摄像?/title><link>http://m.tkk7.com/amplifier/archive/2015/02/15/422936.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Sun, 15 Feb 2015 03:41:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2015/02/15/422936.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/422936.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2015/02/15/422936.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/422936.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/422936.html</trackback:ping><description><![CDATA[     摘要: JMF太老了Q各U问题得不到解决QOracle也没再升U过Q如果能扑ֈC西,最好能把它扔掉。最qOpenCV比较火,q有人用Java装了OpenCVQ成立了JavaCV目Q通过攚wVideoInputq个ZC语言的项目,能够用Java来调用摄像头QJMF可以扔掉了。如果想试Q非常简单,把那些编译好的jar文g攑օBuild Path卛_Q如果是在Windows X86环境下,则只需要把?..  <a href='http://m.tkk7.com/amplifier/archive/2015/02/15/422936.html'>阅读全文</a><img src ="http://m.tkk7.com/amplifier/aggbug/422936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2015-02-15 11:41 <a href="http://m.tkk7.com/amplifier/archive/2015/02/15/422936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMF找不到摄像头的解x?/title><link>http://m.tkk7.com/amplifier/archive/2014/07/01/415330.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Tue, 01 Jul 2014 02:33:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2014/07/01/415330.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/415330.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2014/07/01/415330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/415330.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/415330.html</trackback:ping><description><![CDATA[JMFQJava Media FrameworkQ是Javaq_使用摄像头、麦克风{媒体设备的应用E序框架Q但C2.1.1e׃再更斎ͼ在Windows 7 X64上还能正常运行,只是安装的界面让你感觉回CWindows98的时代?br /><br /><br />不过q代久远的东西,虽然q能用,但可能会遇到一些奇怪的问题Q折腾了两个月,发现了两个比较大的问题:<br /><br />W一个是在Windows 7 x64上提C摄像头初始化失败的问题。这个问题很奇怪,电脑刚开机的时候可以顺利找Cơ摄像头q正常操作,但是W二ơ就会提C摄像头初始化失败。有人提出的解决Ҏ是安装一个叫ManyCamera的程序,q个E序可以把一个摄像头供多个程序同时用,其实q于中间加了一层{换,效果会有点差别,免费版还会加上水华ͼ要求比较高的人可能会不爽Q但是目前找不到其他办法?br /><br />W二个是在程序中找不到摄像头Q不光找不到摄像_其他媒体讑֤通通找不到Q用以下语句:<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; "></span> <span style="color: #000000; ">vector </span><span style="color: #000000; ">=</span><span style="color: #000000; "> CaptureDeviceManager.getDeviceList ( </span><span style="color: #0000FF; ">null</span><span style="color: #000000; "> )</span></div>按照文档说明是返回所有媒体设备,但每ơvector都是null?br />在Eclipse中运行又能正常,导出成jar之后q行׃找不到摄像头?br />原因在于找不到jmf.properities文gQ该文g包含所有检到的媒体设备的信息Q?strong>最单的解决Ҏ是把JMF安装目录下lib子目录中的jmf.properties文g复制到最后运行的jar所在的目录</strong>Q不q如果摄像头改过的话Q重新检后要把新的文g复制到jar目录Q因为检到的媒体设备信息都会存攑֜JMF安装目录里面的jmf.properties文g里?br /><div><br />StackOverflow里面有个人对q个问题解释得比较清楚:<br /><a target="_blank" >http://stackoverflow.com/questions/8768142/java-capturedevicemanagergetdevicelist-is-empty</a></div><br /><br />虽然问题解决了,但是q是不明白ؓ何在Eclipse中可以正常运行,导出jar后运行却找不到摄像头Q即使把JMF所有jar和lib目录都加入系l的CLASSPATH环境变量里还是不行?br /><br /><br />另外QJMF安装E序会自动把它的jar和lib目录加入pȝ?CLASSPATH%环境变量Q但是如果你卸蝲了再重新安装到其他目录,q不会改?CLASSPATH%的|需要手动修攏V不q这个环境变量似乎没啥用处?br />最好不要把JMF安装到默认的Program Files目录Q可能会q行不了Q安装到短目录会比较保险Q它gq是只认Dos时代?.3目录l构Q但偏偏又默认安装到Program Files里面?br /><img src ="http://m.tkk7.com/amplifier/aggbug/415330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2014-07-01 10:33 <a href="http://m.tkk7.com/amplifier/archive/2014/07/01/415330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android手机用来做电脑摄像头http://m.tkk7.com/amplifier/archive/2014/06/05/414431.htmlamp@javaamp@javaThu, 05 Jun 2014 07:35:00 GMThttp://m.tkk7.com/amplifier/archive/2014/06/05/414431.htmlhttp://m.tkk7.com/amplifier/comments/414431.htmlhttp://m.tkk7.com/amplifier/archive/2014/06/05/414431.html#Feedback4http://m.tkk7.com/amplifier/comments/commentRss/414431.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/414431.html
我是在做一个电脑二l码识别器的时候,因ؓ原来的摄像头太差Q从而想到用一台淘汰的Android手机来代ѝ?br />
q类应用应该不少Q我首先扑ֈ的是一个叫DraoidCam的应用,装好之后发现免费版没法调整分辨率Q于是放弃之?br />
然后又找C一个国内做的免费YӞ叫魅Ԍ非常单,支持USB和WiFiq接方式Q如果是USBq接的话Q打开USB调试模式之后Q运行电脑的客户端,手机上就自动装上了Appq且自动q行Q可以调整分辨率Q不q最高只?40*480Q率不?0Q不q已l能够满x的需求了?br />
然后可以像普通PC摄像头一样用了Q在JMF里面也能扑ֈQ于是就可以被Java调用了。经试Q效果比原来的PC摄像头好多了?br />
软g主页Q?a target="_blank" >http://www.libfetion.org/meise/

amp@java 2014-06-05 15:35 发表评论
]]>
Java的位操作http://m.tkk7.com/amplifier/archive/2012/04/08/373574.htmlamp@javaamp@javaSun, 08 Apr 2012 08:56:00 GMThttp://m.tkk7.com/amplifier/archive/2012/04/08/373574.htmlhttp://m.tkk7.com/amplifier/comments/373574.htmlhttp://m.tkk7.com/amplifier/archive/2012/04/08/373574.html#Feedback2http://m.tkk7.com/amplifier/comments/commentRss/373574.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/373574.html当读写二q制文gQ或者要把非标准长度的整C标准长度的整C相{换时Q就要用到大量的位操作,虽然看v来很单,实际上里面却有很多细节很Ҏ出错?/span>

首先QJava有些标准跟C/C++是不同的Q?/span>

1、Java采用高字节在前的方式d数据Q例如要把一?字节的int数值写入文件时Q它是按照从高字节到低字节的序写入的,d的时候也是这栯出来?/span>
而C/C++则采用^台相关的方式Q在Windowsq_采用低字节在前的方式Q在Linux/Unixq_则采用高字节在前的方式?/span>
如果Java要读取C/C++创徏的二q制文gQ就要注意这个问题,最好先搞清楚原来的文g是采用哪U方式创建的。网l通信也要注意?/span>

2、Java没有无符hQ无论byte,short,int,long都是有符h敎ͼ而C/C++有个unsigned关键字可以设|一个数gؓ无符h?/span>

3、Java的整数基本数据类型就是byte,short,int,longq几个,长度分别?,2,4,8字节QC/C++可以用typedef定义各种数据cd?/span>

W二QJava是采用补码来存放整数的?/strong>
有时候觉得补码的定义有些奇怪,实际上可以这L解:

把一个整C0一直往上加1Q加到溢出就变成了负数的最|然后再l加1Q最后又能回?Q实际上是一个轮回?/span>
例如一个bytecd的整敎ͼ一共有8位,能表C?56个数|采用补码的话数D围就?128~127Q表C方法如下:
0        0000 0000
1        0000 0001
.
.
126    0111 1110
127    0111 1111
-128   1000 0000
-127   1000 0001
.
.
-1       1111 1111
0         0000 0000

W三、不同长度的整数转换?/span>
如果是从较短的数转成较长的数Q很单,如果是正数就在高字节?Q如果是负数在高字节补1?
例如byte?27转ؓshort?27Q?/span>
byte:0111 1111
short:0000 0000 0111 0111
byte?127转ؓshort?127
byte:1000 0001
short:1111 1111 1000 0001
如果是从较长的数转成较短的数Q实际上是把高位都截断了,所以{出来的数值可能完全不是一回事了?/span>
例如short?56转ؓbyteQ?/span>
short:0000 0001 0000 0000
byte: 0000 0000
?56变成?
short?255转成byte:
short:1111 1111 0000 0001
byte:0000 0001
?255变成?

W四、位q算操作W及它们的优先
Java的位q算操作W包括:~非,|按位或,&按位与,^按位异或Q?lt;<左移Q?gt;>右移Q?gt;>>右移左侧?
各种q算W的优先U如下表所C:
优先U?/span>
q算W?/span>
l合?/span>
1
() [] .
从左到右
2
! +(? -(? ~ ++ --
从右向左
3
* / %
从左向右
4
+(? -(?
从左向右
5
<< >> >>>
从左向右
6
< <= > >= instanceof
从左向右
7
== !=
从左向右
8
&(按位?
从左向右
9
^
从左向右
10
|
从左向右
11
&&
从左向右
12
||
从左向右
13
?:
从右向左
14
= += -= *= /= %= &= |= ^= ~= <<= >>= >>>=
从右向左
Ҏ该表可以看到Q位q算操作W的优先U各有不同,分别为:
1、~
2?gt;> << >>>
3?amp;
4、^
5、|
另外需要特别注意的是,除了~Q其他位q算操作的优先都低于加减,所以要记得以下语句是返?2而不?Q?/span>
1<<2+3
q有是&、^、|的优先都是低于逻辑操作W的Q因此下面的语句会编译出错,q好Java不像C那样Ҏ有大?的值都认ؓ是真Q否则下面的语句也能~译通过Q但可能与你的意图不太一P可能调试半天才发现?/span>
if(3&1>0)
如果C清楚Q还是按照你的意囑֊上括h保险?/span>

W五、字节数l与整数之间的{?/span>
Z把一个整数存入文Ӟ或者从文g中读取一个整敎ͼ需要经常在字节数组和整C间{换,q个q程要用到大量的位运?/span>
首先需要记住的是,在参与所有运前QJava都会把byte、shortcd的值都转换成intQ然后再对{换后的intq行操作。例如下面的语句会编译出错:
byte a=10,b=20,c;
c=a+b;

因ؓa和b在相加前都被转成了intQ最后得到的l果是个intcd的|如果要赋lbytecd的cQ必L式地q行cd转换Q即把第二句改ؓQ?/span>
c=(byte)(a+b)

q一点很关键Q因为对于一个最高位?的bytecd的整敎ͼ负数Q,在运之前它会被强制转换成intcdQ根据上面所说的W三点,其实是往前面的三个高字节补上1Q这样一来,它在参与位运的q程中,׃仅仅是它本n?个bit参与了,实际上连?个字节的24个bitQ均?Q也参与了。例如有一个整数i=1082163328Q它的二q制表示为:
01000000 10000000 10000000 10000000
分ؓ4个字节存储,除了W一个字节是正数外,其余3个字节均数。假如用a代表最高字节的|用b代表其他三个字节的|如果按照通常的理解,你可能会q样得到i的|
i=(a<<24)+(b<<16)+(b<<8)+b

如果a和b都是正数Q上面的{式是成立的Q但是在q个例子里,却是错的Q因Z式中的a和b都已l被强制转换成了intcd再参加运,实际?/span>
a=00000000 00000000 00000000 01000000
b=11111111 11111111 11111111 10000000
i=01000000 00000000 00000000 00000000+11111111 10000000 00000000 00000000+11111111 11111111 10000000 00000000+11111111 11111111 11111111 10000000
最后得到的l果?065320320Q不是原来的g?/span>
Z不让byte在强制{换成int的过E加入了我们不想要的高位1Q我们需要把它跟0xffq行与操作,i的值应该这栯:
= ( ( a& 0xff ) << 24 ) +( ( b & 0xff ) << 16 ) + ( ( b & 0xff ) << 8 ) + ( b & 0xff )

注意Q因?amp;?lt;<的优先都低?Q所以上面的括号是不能少的。不q由于跟0xff与操作之后,其余24位都变成?Q因此可以把+改ؓ|操作Q因ZQ何g0q行或操作都得到本nQ?/span>
= ( a & 0xff ) << 24 | ( b & 0xff ) << 16 | ( b & 0xff ) << 8 | ( b & 0xff )

׃<<的优先高于|Q所以省了一些括受最高字节可以不?xffq行与操作,因ؓ它{换成int后左边增加的3个字节都在左U?4位时被去掉了Q?/span>
= a << 24 | ( b & 0xff ) << 16 | ( b & 0xff ) << 8 | ( b & 0xff )


把int转ؓ字节数组的时候比较简单,直接右移截断卛_Q?/span>
byte[] b = new byte[4];
b[0= (byte) (i >> 24);
b[1= (byte) (i >> 16);
b[2= (byte) (i >> 8);
b[3= (byte) i;


W六、非标准长度整数的存储和d
假如有两个变量,他们的值可以用12个bit来表C,如果我们?6bit的shortcd来表CZ个变量,那么两个变量需?个字节,而实际上它们只需?个字节就能表C出来,如果存储I间比较有限Q写入文件时可以把它们存攑֜3个字节里面,但是dq程需要进行{换?/span>
在内存里Q它们都是标准的数据cdQ?/span>
short a,b;

写入文gӞ我们用第一个字节和W二个字节的前半部分来表CaQ把W二个字节的后半部分和第三个字节来表CbQ即Q?/span>
1Qxxxx xxxx
2Qxxxx yyyy
3Qyyyy yyyy
x和y都表CZ个bitQ分别用来存放a和b。写入时先把a和b转ؓ字节数组Q?/span>
byte[] out = new byte[3];
out[
0= (byte) ( a >> 4 );//把a的高8位放在第一个字?/span>
out[1= (byte) ( a << 4 );//先把a左移四位Q在双补上4?Q第二个字节的高4位就是a的低4位了Q第二个字节的高4位已l生成,?位还?
out[1|= (byte) ( b >> 8 & 0x0f );//b右移8位,q与0x0fq行与操作,实际上就只保留了b的高4位,q且是在字节的低4位上Q跟W二步得到的字节q行或操作,q成了W二个字?/span>
out[2= (byte) b;//把b的高4位截断就得到了低8?/span>
然后再把q个字节数组写入文gQ就可以?个字节表CZ个整C?/span>
dQ?/span>
=(short)( (out[0& 0xff<< 4 | ( out[1& 0xf0 )>>4);
= (short)((out[1& 0x0f<< 8 | ( out[2& 0xff));


amp@java 2012-04-08 16:56 发表评论
]]>
用JAVA做一个便宜好用的二维码扫描器http://m.tkk7.com/amplifier/archive/2009/04/02/263567.htmlamp@javaamp@javaThu, 02 Apr 2009 08:22:00 GMThttp://m.tkk7.com/amplifier/archive/2009/04/02/263567.htmlhttp://m.tkk7.com/amplifier/comments/263567.htmlhttp://m.tkk7.com/amplifier/archive/2009/04/02/263567.html#Feedback13http://m.tkk7.com/amplifier/comments/commentRss/263567.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/263567.html二维条Ş码比普通的条Ş码能保存更多的信息,已经应用到很多领域里面。例如手机电qQ就是一个嵌在彩信里面的二维码图像。南航也推出了网上办理登机牌业务Q办理完成之后往手机发送一条包含二l码的彩信,C机场可以通过自助讑֤扫描二维码,打印L牌?br />然而,专业的二l码扫描讑֤h十分昂贵Q最便宜的都?000元以上,到淘宝上搜搜q道了。借助Java和一个开源的库,我们却可以通过普通的|络摄像头实现相同的效果Q成本只需要几十块?br />Open Source QR Code Library是一个开源的QR CodeQ二l条形码的一U)生成和读取的库,官方|站为:http://qrcode.sourceforge.jp/Q里面包含了生成和读取QR Code的所有代码,其中有个jmfexamplep实现通过摄像头读取QR CodeQ经q本人尝试,几十块的普通摄像头效果已经不错了,一ơ读取几癑֭节都没问题?br />使用q个库的步骤如下Q?br />1、到其官方网站下载回来;
2、到sun的网站下载JMF包ƈ安装Q?br />3、插上摄像头Q打开我的电脑Q查看是否出现“USB视频讑֤”,然后打开Q看摄像头工作是否正?br />4、运行JMF里面的JMF RegistryE序Q点几ZDetect Capture Devices”,查找视频讑֤Q查扑ֈ之后会在左边的列表里出现“vfw:Microsoft WDM Image Capture (Win32):0”类似的讑֤Q点d会在双出现其详l信息,我的摄像头是q样的:
Name = vfw:Microsoft WDM Image Capture (Win32):0

Locator = vfw://0

Output Formats---->

0. javax.media.format.YUVFormat
  YUV Video Format: Size = java.awt.Dimension[width=640,height=480] MaxDataLength = 614400 DataType = class [B yuvType = 32 StrideY = 1280 StrideUV = 1280 OffsetY = 0 OffsetU = 1 OffsetV = 3

1. javax.media.format.YUVFormat
  YUV Video Format: Size = java.awt.Dimension[width=160,height=120] MaxDataLength = 38400 DataType = class [B yuvType = 32 StrideY = 320 StrideUV = 320 OffsetY = 0 OffsetU = 1 OffsetV = 3

2. javax.media.format.YUVFormat
  YUV Video Format: Size = java.awt.Dimension[width=176,height=144] MaxDataLength = 50688 DataType = class [B yuvType = 32 StrideY = 352 StrideUV = 352 OffsetY = 0 OffsetU = 1 OffsetV = 3

3. javax.media.format.YUVFormat
  YUV Video Format: Size = java.awt.Dimension[width=320,height=240] MaxDataLength = 153600 DataType = class [B yuvType = 32 StrideY = 640 StrideUV = 640 OffsetY = 0 OffsetU = 1 OffsetV = 3

4. javax.media.format.YUVFormat
  YUV Video Format: Size = java.awt.Dimension[width=352,height=288] MaxDataLength = 202752 DataType = class [B yuvType = 32 StrideY = 704 StrideUV = 704 OffsetY = 0 OffsetU = 1 OffsetV = 3

注意Q其中Output Formats都是javax.media.format.YUVFormatQ而QR Code Library里默认的讑֤不是q种格式的,所以需要对源码作一定的修改?br />
5、用Eclipse打开QR Code Library的源码,作出一些适当的修改:
如果摄像头是上面所说的只支持YUV格式Q则需要修改jp.sourceforge.qrcode.example.jmf.camDataSource.javaQ把setMainSource函数里的
VideoFormat vidformat = new VideoFormat(VideoFormat.RGB);
修改?br />VideoFormat vidformat = new VideoFormat(VideoFormat.YUV);
否则永远也找不到摄像头?br />
6、把JMF包里的jmf.jar攑ֈClasspath?br />7、执行jp.sourceforge.qrcode.example.jmf.jmfexampleQ搞?br />
当然Q由于源码开攄Q只要符合许可,你想怎么攚w行,可以把它嵌入到某个应用程序里面,q个E序具有了扫描QR Code的功能了?br />



amp@java 2009-04-02 16:22 发表评论
]]>
使用NOKIA MMS LIBRARY发送中国移动彩?/title><link>http://m.tkk7.com/amplifier/archive/2008/06/17/208620.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Tue, 17 Jun 2008 06:35:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2008/06/17/208620.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/208620.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2008/06/17/208620.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/208620.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/208620.html</trackback:ping><description><![CDATA[     摘要: Nokia MMS Library是一个开放源代码的Java MMS开发包Q里面包含了源码、文档、示例程序等Q很Ҏp学会。下面是用这个包发送彩信的ҎQ?1、电脑通过GPRS/EDGE MODEM或手接移动梦|,注意Q必LUd梦网QCMWAPQ,不是互联|(CMNETQ,如果手动拨号Q一般是?99***1#?99***2#Q拨通之后打开命o行窗口,telnet 10.0.0.172...  <a href='http://m.tkk7.com/amplifier/archive/2008/06/17/208620.html'>阅读全文</a><img src ="http://m.tkk7.com/amplifier/aggbug/208620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2008-06-17 14:35 <a href="http://m.tkk7.com/amplifier/archive/2008/06/17/208620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的线E重?/title><link>http://m.tkk7.com/amplifier/archive/2008/04/22/194710.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Tue, 22 Apr 2008 02:56:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2008/04/22/194710.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/194710.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2008/04/22/194710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/194710.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/194710.html</trackback:ping><description><![CDATA[刚刚才知道,原来Java的线E是不能重启的,也就是说Q当U程的run()Ҏ执行到最后一行,退Z后,q个U程q束了Q不能再通过start()Ҏ重启启动q个U程Q只能重新构造一个线E对象,再调用其start()Ҏ来启动,但这个对象和原来那个对象已经不同了?br /> Z实现某个U程对象?#8220;重启”功能Q可以在它的run()Ҏ的最外层加上一个@环语句:<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"><span style="color: #008080">1</span> <span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> run(){<br /> </span><span style="color: #008080">2</span> <span style="color: #000000">  </span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">stop){<br /> </span><span style="color: #008080">3</span> <span style="color: #000000">    </span><span style="color: #008000">//</span><span style="color: #008000">do something</span><span style="color: #008000"><br /> </span><span style="color: #008080">4</span> <span style="color: #000000">  }<br /> </span><span style="color: #008080">5</span> <span style="color: #000000">}</span></div> <br /> q样Q只要stop不ؓtrueQrun()Ҏ׃会结束,不断?#8220;重启”?br /> 如果run()Ҏ里面q有一个@环,那么p两个停止标志Q?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"><span style="color: #008080">1</span> <span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> run(){<br /> </span><span style="color: #008080">2</span> <span style="color: #000000">  </span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">stop){<br /> </span><span style="color: #008080">3</span> <span style="color: #000000">    </span><span style="color: #008000">//</span><span style="color: #008000">do something</span><span style="color: #008000"><br /> </span><span style="color: #008080">4</span> <span style="color: #000000">    </span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">stop </span><span style="color: #000000">&&</span><span style="color: #000000"> </span><span style="color: #000000">!</span><span style="color: #000000">restart){<br /> </span><span style="color: #008080">5</span> <span style="color: #000000">      </span><span style="color: #008000">//</span><span style="color: #008000">do other thing</span><span style="color: #008000"><br /> </span><span style="color: #008080">6</span> <span style="color: #000000">    }<br /> </span><span style="color: #008080">7</span> <span style="color: #000000">  }<br /> </span><span style="color: #008080">8</span> <span style="color: #000000">}<br /> </span><span style="color: #008080">9</span> </div> q样Q如果需?#8220;重启”U程Q只要把restart设ؓtrue卛_Q如果要退出线E,只要把stop设ؓtrue卛_? <img src ="http://m.tkk7.com/amplifier/aggbug/194710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2008-04-22 10:56 <a href="http://m.tkk7.com/amplifier/archive/2008/04/22/194710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过E序发送彩信——利用Now SMS/MMS和Apache HttpClienthttp://m.tkk7.com/amplifier/archive/2007/10/01/150047.htmlamp@javaamp@javaMon, 01 Oct 2007 06:22:00 GMThttp://m.tkk7.com/amplifier/archive/2007/10/01/150047.htmlhttp://m.tkk7.com/amplifier/comments/150047.htmlhttp://m.tkk7.com/amplifier/archive/2007/10/01/150047.html#Feedback0http://m.tkk7.com/amplifier/comments/commentRss/150047.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/150047.html Now SMS/MMS提供了一个Web界面用于发送彩信,通过Apache HttpClientQ我们可以模拟浏览器的行为向web服务器提交表单,发送彩信。Now SMS/MMS的Web界面提供了很多选项Q但发送纯文字彩信的话我们只需要填写接收者,主题Q可选)Q内容即可,把对应的表单内容POST到当前页面,p发送一条彩信。(待箋Q?

amp@java 2007-10-01 14:22 发表评论
]]>
用Now SMS/MMS 发送中国移动彩?/title><link>http://m.tkk7.com/amplifier/archive/2007/09/18/146235.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Tue, 18 Sep 2007 11:32:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2007/09/18/146235.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/146235.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2007/09/18/146235.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/146235.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/146235.html</trackback:ping><description><![CDATA[<a target="_blank">Now SMS/MMS</a>是一个强大的短信/彩信发送服务器Q它内置了彩信中心,在某些运营商的网l内可以通过普通的短信猫发送彩信,而不需要用支持GPRS的短信猫Q也是说系l本w就h了运营商的彩信中心的功能。然而,在中国移动的|络内是不能实现q种方式发送彩信的Q必通过Ud梦网的彩信中心{发?br /> 彩信的发送其实是两个q程Q?br /> 1、向目标手机发送一条普通的提醒短信Q其中包含了发送者号码、彩信的URL{信息,该URL指向彩信中心的某个web目录下的某个彩信文gQ?br /> 2、目标手机接收到q条提醒短信后,d发vGPRSq接Q根据短信中的URL向彩信中心提取该彩信Qƈ昄出来?br /> Now SMS/MMS 自带的彩信中心其实就是一个支持手接的web服务器,它把制作好的彩信攑֜某个web目录下,手机q接时就可以下蝲?br /> 然而,实践证明Q如果用中国移动的SIM卡,无论使用的是什么短信猫Q都不能通过pȝ自带的彩信中心发送彩信?br /> 要设|成通过Ud公司的彩信中心发送彩信,必须把系l的默认讄——用自带的MMSCQ彩信中心)——改Z用移动公司的MMSC。方法如下:<br /> 在Now SMS/MMS Gateway配置E序中选择MMSC RoutingQ然后点击Add按钮Q在弹出的对话框中徏立一个新的MMSC配置Q其中Acount Name和Account Description可以随便填,只是用来识别配置名称Q因为系l可以设|多个MMSC?span style="color: #ff0000">Default Sender Address必须留空Q否则发送很难成功(有极部分能够发送成功)。Allow Sender Address Override前的复选框也必ȝI。Route messages to this account for recipient phone number(s)不用填(q是一个掩码,只有W合要求的号码才用这个\由,按照官方文档的说法,不填的话是不会用q个路由的,但实际上把它设成默认路由的话Q即使不填也会用q个Q也许填?861*,1*会好些,表示中国的手机都用这个发Q。Route messages to VASP via选择MM1Q之后会出现更多的输入框Q点击Look up Operator SeetingsQ出C个选择q营商的对话框,很幸q,中国Ud在里面,选择China - China MobileQ然后OK卛_Q系l自动把适合中国Ud的内容填了进厅R但是Network Connection和Modem Used两个下拉列表q没选好。这里必M用对应的GPRS猫的调制解调器(在控刉?电话和调制解调器选项-调制解调?dQ按照提CZ步步p扑ֈGPRS猫,看好哪个调制解调器对应哪个端口,从而知道哪个调制解调器对应哪个GPRS猫)。填好这些东西后点击Test Connection可以连接,成功可以了Q检时间比较长Q要耐心{待。填好之后点击OKQ在MMSC Routing标签里的Additional Routes里面p看到刚才的那个配|名Uͼ然后在Default Route里面选择刚才的配|名UC为默认\由就可以了?br /> <span style="color: #000000">之后打开MMSC标签Q配|自带的MMSC。虽然我们用的是中国移动的MMSCQ但通过web发送彩信时Q必d发送到pȝ自带的MMSCQ再转发到移动的MMSCQ所以必Lpȝ的MMSC也配|好。这里就是普通web服务器的配置Q还有SMTP的配|,可选)Q把端口和IP选好后,q要注意Local Host Name or IP Address里要填入一个本机的IPQ如果在仅在内网使用Q可以直接填本机IPQ外|的情况没有研究q,看看说明书先Q。其他默认的可以了?br /> 再打开Web标签,把Web服务器配|好?br /> 打开览器,输入http://服务器IP:web服务器端?Q就能看到发送各U短信、彩信的链接Q然后就可以发送彩信进行测试了。如果发送不成功Q可以打开Serial #标签,把底下的三个Debug选项都勾上,再发送一下,然后在Now SMS/MMS 的安装目录下扑ֈMMSCDEBUG.LOG{几个LOG文g查看I竟是什么问题。文件太大会D发送失败,pȝ不会自动查的。文件大的上限q不清楚Q但过100KBgp定不行?br /> 今天搞了一天这个东西,l于能正常发送彩信了。在q里备忘一下。慢慢再作深入研I?/span></span> <br /> <br /> 感谢Q?a target="_blank">http://blog.csdn.net/phiger/archive/2006/12/19/1449176.aspx </a><br /> <br /> 官方文档Q?a >http://www.nowsms.com/documentation/ProductDocumentation/mms_notifications_and_content/Connecting_to_operator_MMSC.htm#SendingMMSMessages</a> <img src ="http://m.tkk7.com/amplifier/aggbug/146235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2007-09-18 19:32 <a href="http://m.tkk7.com/amplifier/archive/2007/09/18/146235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何判断Socket已断开http://m.tkk7.com/amplifier/archive/2007/04/12/110131.htmlamp@javaamp@javaThu, 12 Apr 2007 04:21:00 GMThttp://m.tkk7.com/amplifier/archive/2007/04/12/110131.htmlhttp://m.tkk7.com/amplifier/comments/110131.htmlhttp://m.tkk7.com/amplifier/archive/2007/04/12/110131.html#Feedback8http://m.tkk7.com/amplifier/comments/commentRss/110131.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/110131.html打开了连接服务器的一个Socket后,隔了一D|间没用,Socket׃自动关闭Qؓ什么?Q,q时候如果获取该Socket的OutputStreamQƈ往里面写东西,在flush的时候就会出玎ͼ
java.net.SocketException: Software caused connection abort: socket write error
的异常。因此,如果隔了一D|间没有用某个SocketQ需要重C用它的时候,p先判断它I竟是否q在q接当中Q一共尝试了Socket的三个方法:
1?a >isClosed()
2?a >isOutputShutdown()
3?a >isConnected()
发现前两个都没用Q即使已l断开了,q回的还是falseQ只有第三个可以解决问题?br>具体原因未知?br>
2007-4-19更新Q?br>W三个也解决不了问题Q还会出现同L异常Q目前的解决Ҏ是catch SocketExceptionQ不socket的状态如何,都把它关闭了重新再连Q但是SocketException的种cL很多Q不一定是因ؓSocket已关闭,所以这U方法有点粗鲁,但找不到更好的方法?/font>



amp@java 2007-04-12 12:21 发表评论
]]>
Java控制台程序如何在用户关闭时执行清理代?/title><link>http://m.tkk7.com/amplifier/archive/2007/04/12/110085.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Thu, 12 Apr 2007 02:08:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2007/04/12/110085.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/110085.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2007/04/12/110085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/110085.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/110085.html</trackback:ping><description><![CDATA[通过<br>Runtime.getRuntime().<strong>addShutdownHook</strong>(<font color=#0000ff>Thread</font> hook)<br>Ҏ可以l当前的q程注册一个清理线E,当进E退出的时候,会执行线E中的代码?br><br>1、ؓ了统一清理U程的实玎ͼ可以做一个Destroyable接口Q实现此接口的类都有一个destroy()ҎQ里面包含了该类的清理过E,例如关闭数据库连接、关闭Socketq接{?br>Destroyable接口的代码:<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" twffan="done"><span style="COLOR: #008080" twffan="done"> 1</span> <span style="COLOR: #0000ff" twffan="done">package</span><span style="COLOR: #000000" twffan="done"> net.blogjava.amplifier;<br></span><span style="COLOR: #008080" twffan="done"> 2</span> <span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done"> 3</span> <span style="COLOR: #000000" twffan="done"></span><span style="COLOR: #008000" twffan="done">/**</span><span style="COLOR: #008000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done"> 4</span> <span style="COLOR: #008000" twffan="done"> * 建立此接口的目的是ؓ了实现程序退出时的清?br></span><span style="COLOR: #008080" twffan="done"> 5</span> <span style="COLOR: #008000" twffan="done"> * 在Java控制台程序中Q用户可以通过关闭命o行窗口或按下Ctrl+C来结束程序的q行<br></span><span style="COLOR: #008080" twffan="done"> 6</span> <span style="COLOR: #008000" twffan="done"> * q时候应该保证资源能够被正确释放Q例如数据库的连接、Socket的连接应该关?br></span><span style="COLOR: #008080" twffan="done"> 7</span> <span style="COLOR: #008000" twffan="done"> * 实现了本接口的类的实例引用可以由一个ShutdownHookU程来操?br></span><span style="COLOR: #008080" twffan="done"> 8</span> <span style="COLOR: #008000" twffan="done"> * 此线E在虚拟机退出时执行Q详见Runtime.addShutdownHook()Ҏ<br></span><span style="COLOR: #008080" twffan="done"> 9</span> <span style="COLOR: #008000" twffan="done"> * </span><span style="COLOR: #808080" twffan="done">@author</span><span style="COLOR: #008000" twffan="done"> amplifier<br></span><span style="COLOR: #008080" twffan="done">10</span> <span style="COLOR: #008000" twffan="done"> *<br></span><span style="COLOR: #008080" twffan="done">11</span> <span style="COLOR: #008000" twffan="done"> </span><span style="COLOR: #008000" twffan="done">*/</span><span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done">12</span> <span style="COLOR: #000000" twffan="done"></span><span style="COLOR: #0000ff" twffan="done">public</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">interface</span><span style="COLOR: #000000" twffan="done"> Destroyable {<br></span><span style="COLOR: #008080" twffan="done">13</span> <span style="COLOR: #000000" twffan="done">    </span><span style="COLOR: #008000" twffan="done">/**</span><span style="COLOR: #008000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done">14</span> <span style="COLOR: #008000" twffan="done">     * 实现本接口的c需要实现此ҎQ方法中包含该类的清理代码,<br></span><span style="COLOR: #008080" twffan="done">15</span> <span style="COLOR: #008000" twffan="done">     * 例如关闭数据库连接、关闭Socketq接{?br></span><span style="COLOR: #008080" twffan="done">16</span> <span style="COLOR: #008000" twffan="done">     *<br></span><span style="COLOR: #008080" twffan="done">17</span> <span style="COLOR: #008000" twffan="done">     </span><span style="COLOR: #008000" twffan="done">*/</span><span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done">18</span> <span style="COLOR: #000000" twffan="done">    </span><span style="COLOR: #0000ff" twffan="done">void</span><span style="COLOR: #000000" twffan="done"> destroy();<br></span><span style="COLOR: #008080" twffan="done">19</span> <span style="COLOR: #000000" twffan="done">}</span></div> <br>2、徏立一个承于Thread的类ShutdownHookQ里面的一个域是Destroyable实现cȝ引用Q在该类的构造函C可以传入该Destroyable实现cR?br>ShutdownHook的代码:<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" twffan="done"><span style="COLOR: #008080" twffan="done"> 1</span> <span style="COLOR: #0000ff" twffan="done">package</span><span style="COLOR: #000000" twffan="done"> net.blogjava.amplifier;<br></span><span style="COLOR: #008080" twffan="done"> 2</span> <span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done"> 3</span> <span style="COLOR: #000000" twffan="done"></span><span style="COLOR: #0000ff" twffan="done">public</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">class</span><span style="COLOR: #000000" twffan="done"> ShutdownHook </span><span style="COLOR: #0000ff" twffan="done">extends</span><span style="COLOR: #000000" twffan="done"> Thread {<br></span><span style="COLOR: #008080" twffan="done"> 4</span> <span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done"> 5</span> <span style="COLOR: #000000" twffan="done">    </span><span style="COLOR: #0000ff" twffan="done">private</span><span style="COLOR: #000000" twffan="done"> Destroyable desObj;<br></span><span style="COLOR: #008080" twffan="done"> 6</span> <span style="COLOR: #000000" twffan="done">    <br></span><span style="COLOR: #008080" twffan="done"> 7</span> <span style="COLOR: #000000" twffan="done">    </span><span style="COLOR: #0000ff" twffan="done">public</span><span style="COLOR: #000000" twffan="done"> ShutdownHook(Destroyable desObj){<br></span><span style="COLOR: #008080" twffan="done"> 8</span> <span style="COLOR: #000000" twffan="done">        </span><span style="COLOR: #0000ff" twffan="done">this</span><span style="COLOR: #000000" twffan="done">.desObj </span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done"> desObj;<br></span><span style="COLOR: #008080" twffan="done"> 9</span> <span style="COLOR: #000000" twffan="done">            }<br></span><span style="COLOR: #008080" twffan="done">10</span> <span style="COLOR: #000000" twffan="done">    <br></span><span style="COLOR: #008080" twffan="done">11</span> <span style="COLOR: #000000" twffan="done">    @Override<br></span><span style="COLOR: #008080" twffan="done">12</span> <span style="COLOR: #000000" twffan="done">    </span><span style="COLOR: #0000ff" twffan="done">public</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">void</span><span style="COLOR: #000000" twffan="done"> run() {<br></span><span style="COLOR: #008080" twffan="done">13</span> <span style="COLOR: #000000" twffan="done">        </span><span style="COLOR: #0000ff" twffan="done">if</span><span style="COLOR: #000000" twffan="done">(</span><span style="COLOR: #0000ff" twffan="done">this</span><span style="COLOR: #000000" twffan="done">.desObj</span><span style="COLOR: #000000" twffan="done">!=</span><span style="COLOR: #0000ff" twffan="done">null</span><span style="COLOR: #000000" twffan="done">){<br></span><span style="COLOR: #008080" twffan="done">14</span> <span style="COLOR: #000000" twffan="done">            </span><span style="COLOR: #0000ff" twffan="done">try</span><span style="COLOR: #000000" twffan="done">{<br></span><span style="COLOR: #008080" twffan="done">15</span> <span style="COLOR: #000000" twffan="done">                </span><span style="COLOR: #0000ff" twffan="done">this</span><span style="COLOR: #000000" twffan="done">.desObj.destroy();<br></span><span style="COLOR: #008080" twffan="done">16</span> <span style="COLOR: #000000" twffan="done">            }<br></span><span style="COLOR: #008080" twffan="done">17</span> <span style="COLOR: #000000" twffan="done">            </span><span style="COLOR: #0000ff" twffan="done">catch</span><span style="COLOR: #000000" twffan="done"> (Exception e) {<br></span><span style="COLOR: #008080" twffan="done">18</span> <span style="COLOR: #000000" twffan="done">            }<br></span><span style="COLOR: #008080" twffan="done">19</span> <span style="COLOR: #000000" twffan="done">        }<br></span><span style="COLOR: #008080" twffan="done">20</span> <span style="COLOR: #000000" twffan="done">    }<br></span><span style="COLOR: #008080" twffan="done">21</span> <span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done">22</span> <span style="COLOR: #000000" twffan="done">    </span><span style="COLOR: #008000" twffan="done">/**</span><span style="COLOR: #008000" twffan="done"> </span><span style="COLOR: #008000" twffan="done">*//**</span><span style="COLOR: #008000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done">23</span> <span style="COLOR: #008000" twffan="done">     * </span><span style="COLOR: #808080" twffan="done">@param</span><span style="COLOR: #008000" twffan="done"> args<br></span><span style="COLOR: #008080" twffan="done">24</span> <span style="COLOR: #008000" twffan="done">     </span><span style="COLOR: #008000" twffan="done">*/</span><span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done">25</span> <span style="COLOR: #000000" twffan="done">    </span><span style="COLOR: #0000ff" twffan="done">public</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">static</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">void</span><span style="COLOR: #000000" twffan="done"> main(String[] args) {<br></span><span style="COLOR: #008080" twffan="done">26</span> <span style="COLOR: #000000" twffan="done">    <br></span><span style="COLOR: #008080" twffan="done">27</span> <span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done">28</span> <span style="COLOR: #000000" twffan="done">    }<br></span><span style="COLOR: #008080" twffan="done">29</span> <span style="COLOR: #000000" twffan="done"><br></span><span style="COLOR: #008080" twffan="done">30</span> <span style="COLOR: #000000" twffan="done">}</span></div> <br>3、在main()Ҏ中注册ShutdownHook?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" twffan="done"><span style="COLOR: #008080" twffan="done"> 1</span> <span style="COLOR: #000000" twffan="done">    </span><span style="COLOR: #0000ff" twffan="done">public</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">static</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">void</span><span style="COLOR: #000000" twffan="done"> main(String[] args){<br></span><span style="COLOR: #008080" twffan="done"> 2</span> <span style="COLOR: #000000" twffan="done">        DestroyableImpl di </span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">new</span><span style="COLOR: #000000" twffan="done"> DestroyableImpl();<br></span><span style="COLOR: #008080" twffan="done"> 3</span> <span style="COLOR: #000000" twffan="done">        ShutdownHook sh </span><span style="COLOR: #000000" twffan="done">=</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">new</span><span style="COLOR: #000000" twffan="done"> ShutdownHook(di);<br></span><span style="COLOR: #008080" twffan="done"> 4</span> <span style="COLOR: #000000" twffan="done">        Runtime.getRuntime().addShutdownHook(sh);<br></span><span style="COLOR: #008080" twffan="done"> 5</span> <span style="COLOR: #000000" twffan="done">        Runtime.getRuntime().addShutdownHook(</span><span style="COLOR: #0000ff" twffan="done">new</span><span style="COLOR: #000000" twffan="done"> Thread(){<br></span><span style="COLOR: #008080" twffan="done"> 6</span> <span style="COLOR: #000000" twffan="done">            </span><span style="COLOR: #0000ff" twffan="done">public</span><span style="COLOR: #000000" twffan="done"> </span><span style="COLOR: #0000ff" twffan="done">void</span><span style="COLOR: #000000" twffan="done"> run(){<br></span><span style="COLOR: #008080" twffan="done"> 7</span> <span style="COLOR: #000000" twffan="done">                System.out.println(</span><span style="COLOR: #000000" twffan="done">"</span><span style="COLOR: #000000" twffan="done">正在退?#8230;…</span><span style="COLOR: #000000" twffan="done">"</span><span style="COLOR: #000000" twffan="done">);<br></span><span style="COLOR: #008080" twffan="done"> 8</span> <span style="COLOR: #000000" twffan="done">            }<br></span><span style="COLOR: #008080" twffan="done"> 9</span> <span style="COLOR: #000000" twffan="done">        });<br></span><span style="COLOR: #008080" twffan="done">10</span> <span style="COLOR: #000000" twffan="done">        di.otherMethod();<br></span><span style="COLOR: #008080" twffan="done">11</span> <span style="COLOR: #000000" twffan="done">    }</span></div> <img src ="http://m.tkk7.com/amplifier/aggbug/110085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2007-04-12 10:08 <a href="http://m.tkk7.com/amplifier/archive/2007/04/12/110085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何让部|在Tomcat的某个应用在Tomcat启动时自动启?/title><link>http://m.tkk7.com/amplifier/archive/2007/03/19/104827.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Mon, 19 Mar 2007 13:59:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2007/03/19/104827.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/104827.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2007/03/19/104827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/104827.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/104827.html</trackback:ping><description><![CDATA[在Tomcat 5.5.20里,把一个war包丢在Tomcat的webapps目录下,启动Tomcat后ƈ不会自动启动那个应用Q需要进入Tomcat managerQ手动启动那个应用。ؓ了实现应用的自动启动Q需要在Tomcat的conf/server.xml里的 <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">Host</span><span style="COLOR: #0000ff">></</span><span style="COLOR: #800000">Host</span><span style="COLOR: #0000ff">></span></div>之间加入一?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"><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">Context </span><span style="COLOR: #ff0000">docBase</span><span style="COLOR: #0000ff">="应用的根"</span><span style="COLOR: #ff0000"> path</span><span style="COLOR: #0000ff">="应用E序相对webapps的目?</span><span style="COLOR: #ff0000"> reloadable</span><span style="COLOR: #0000ff">="当配|修Ҏ是否需要自动重新加载,是则为trueQ否则ؓfalse"</span><span style="COLOR: #0000ff">></</span><span style="COLOR: #800000">Context</span><span style="COLOR: #0000ff">></span></div><br />Ҏ备忘Q?img src ="http://m.tkk7.com/amplifier/aggbug/104827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2007-03-19 21:59 <a href="http://m.tkk7.com/amplifier/archive/2007/03/19/104827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BIRT初体?/title><link>http://m.tkk7.com/amplifier/archive/2007/01/09/92738.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Tue, 09 Jan 2007 12:55:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2007/01/09/92738.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/92738.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2007/01/09/92738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/92738.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/92738.html</trackback:ping><description><![CDATA[从来没做q报表,H然要用刎ͼ急忙之中惌v了Eclipse里面有个报表插gQ上eclipse.org查看Q知道它叫BIRT。下载,安装Q不能运行,但在about里面看到q个插g已加载。再回官方网站一看,原来q需要EMF,GEFQ依ơ下回来装上Q可以用了。打开帮助里的指南Q一步一步做了个表格式的报表Q感觉还是比较简单的。但我的目标是要做图形报表,q且可以E序控制。研I了两天Q有了初步的了解Q做Z一个简单的q图,也能接受一些参CQ但E序控制q没头AQ也不知道从何处入手Q文档里面只有APIQ没有用说明,也没有找到相关的书籍?br />记录下一些东西:<br />1、BIRT需要下载iText才能生成PDF报表Q而且iText的版本必跟|站上的要求严格一_例如要求1.3的不能用1.3.1的,因ؓ插g配置文g里写明是iText-1.3.jarQ如果下?.3.1版本的,也必L文g名改?.3才行。同时还需要iTextAsian.jar?br />2、BIRT支持Web查看。其实在Eclipse里面预览是通过本地web服务器查看的。可以把报表发布到tomcat里?br />3、BIRT支持参数化报表,可以Ҏ用户的输入生成相应的报表Q但q不是什么地斚w可以用参敎ͼq是要编E才能保证灵zL。例如SQL查询里不支持表名作ؓ参数Q其实是数据库本w不支持Q。图里的标题也不能用参数?br />4、图形里的日期格式化不够灉|Q还需要编E的支持?br /><br />q要研究一下怎样通过E序控制报表的生成?br /><br />本文Z人备忘录?img src ="http://m.tkk7.com/amplifier/aggbug/92738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2007-01-09 20:55 <a href="http://m.tkk7.com/amplifier/archive/2007/01/09/92738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse启动参数解决占用CPU 100%Q必Z立即结束”的问题http://m.tkk7.com/amplifier/archive/2006/11/02/78619.htmlamp@javaamp@javaThu, 02 Nov 2006 03:02:00 GMThttp://m.tkk7.com/amplifier/archive/2006/11/02/78619.htmlhttp://m.tkk7.com/amplifier/comments/78619.htmlhttp://m.tkk7.com/amplifier/archive/2006/11/02/78619.html#Feedback2http://m.tkk7.com/amplifier/comments/commentRss/78619.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/78619.htmlP4 2.8 GHz 线E,内存 1G

症状Q?br />使用EclipseӞ点击某个按钮或图标甚x在输入代码时Q整个程序突然失d应,菜单栏变白,除了关闭按钮Q其他地斚w没反应,在Q务管理器中发现javaw.exe占用CPU50%Q相当于单CPU100%Q,内存占用200多MQ且CPU和内存占用数值均停止不动Q机器风扇开始蘪鸣,再等半天q是q个样子。点几Z关闭”按钮出现“立即结束”对话框Q只能很无奈地强行退出,有时一天碰?0多次Q基本失d用性?br />
L解决ҎQ?br />癑ֺ、google搜烦Q一般的解决Ҏ是,调整启动参数-Xms -XmxQ增大堆内存Q然而,在上q机器上讄?Xms512m -Xmx512mQ仍然没效,到失d应的时候占用的内存依然?00多M?br />看来q个问题需要自p决了。用命o行方式启动eclipseQ?br />java -Xms512m -Xmx512m -jar startup.jar
到失d应的时候,发现命o行里打印出java.lang.OutOfMemoryError: PermGen spaceQ打开workspace/.metadata/.log文gQ发现很多这L字符Ԍ把这D话贴到搜烦引擎上,发现很多q种问题Q不q一般出现在TomcatQWeblogic{Web应用E序上,没有人报告过会出现在Eclipse上。解x案是增加启动参数Q?br />-XX:MaxNewSize=256m -XX:MaxPermSize=256m
于是在eclipse.ini里把启动参数改ؓQ?br />
-Xms512m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

启动EclipseQ用了几天,都没再出现失d应的症状?br />
关于MaxPermSize的文章:
CFMX JVM Tuning - The difference between MaxPermSize and Heap Size

amp@java 2006-11-02 11:02 发表评论
]]>
通过Socket发送Unicode不可打印字符http://m.tkk7.com/amplifier/archive/2006/11/02/78613.htmlamp@javaamp@javaThu, 02 Nov 2006 02:39:00 GMThttp://m.tkk7.com/amplifier/archive/2006/11/02/78613.htmlhttp://m.tkk7.com/amplifier/comments/78613.htmlhttp://m.tkk7.com/amplifier/archive/2006/11/02/78613.html#Feedback0http://m.tkk7.com/amplifier/comments/commentRss/78613.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/78613.html
刚才的大意是Q?br />利用socket发送字W串ӞZ区分字符串的起始、结束与中间各个部分的间隔,需要一些特D字W作为分隔符Q但普通可打印字符有可能出现在要发送的字符串中Q不能作为分隔符Q所以只能用不可打印字W。Java使用的是Unicode~码Q可通过\uxxxx来表C编码ؓxxxx的字W。例如:\u0129,\u0130,\u0131都是不可打印字符。但是,通过socket发送和接收字符串时Q需要指定编码,否则会用操作系l的默认~码。在发送端Q通过OutputStream的write()函数写出要发送的字符串的BytesQ这些bytes要通过String.getBytes(~码名称)来获得,例如~码名称? UTF-16BEQ则Q?br />
1 socket.getOutputStream.write(str.getBytes("UTF-16BE"));

读socket的时候,通过InputStreamReader的read()函数来一个个字符地读取,q时候如果不指定~码Q用的也是操作pȝ的默认编码,例如中文的GB18030Q这时候有些Unicode字符没有对应的GB18030~码Q读出来的就都是?受所以必dInputStreamReader的构造函C指定字符~码Q例如:

1 InputStreamReader isr = new InputStreamReader(socket.getInputStream(),"UTF-16BE");
2 char c =  (char)isr.read();


amp@java 2006-11-02 10:39 发表评论
]]>
短信q_开发笔?4 Q多U程Q?http://m.tkk7.com/amplifier/archive/2006/10/25/77242.htmlamp@javaamp@javaWed, 25 Oct 2006 09:34:00 GMThttp://m.tkk7.com/amplifier/archive/2006/10/25/77242.htmlhttp://m.tkk7.com/amplifier/comments/77242.htmlhttp://m.tkk7.com/amplifier/archive/2006/10/25/77242.html#Feedback0http://m.tkk7.com/amplifier/comments/commentRss/77242.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/77242.htmlq样会带来一个问题,发送线E发送短信需要一定的旉Q可能某条待发信息已l在队列里了Q但查询U程q不知道Ql把该信息入列,所以发送线E在发送某条短信前要检查数据库Q看是否已经发送过Q如果发送过Q则不再发送?img src ="http://m.tkk7.com/amplifier/aggbug/77242.html" width = "1" height = "1" />

amp@java 2006-10-25 17:34 发表评论
]]>
短信q_开发笔?3 Q图形界面)http://m.tkk7.com/amplifier/archive/2006/10/21/76538.htmlamp@javaamp@javaSat, 21 Oct 2006 06:42:00 GMThttp://m.tkk7.com/amplifier/archive/2006/10/21/76538.htmlhttp://m.tkk7.com/amplifier/comments/76538.htmlhttp://m.tkk7.com/amplifier/archive/2006/10/21/76538.html#Feedback0http://m.tkk7.com/amplifier/comments/commentRss/76538.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/76538.html做好核心部分Q只完成了一半,剩下的图形界面设计还需要一个O长的q程?br />SWT做图形界面是个繁琐的q程Q虽然可以用VE、SWT Designer帮助布局Q设|一些属性,d一些事Ӟ但里面的逻辑却是要自己先惛_?br />以“设|”页面ؓ例,Z讄各模块的参数Q需要考虑很多问题Q?br />1、哪些是立即生效Q哪些是重启才能生效Q?br />2、什么时候哪个widget需要被DisableQ什么时候需要被EnableQ?br />3、怎么验证用户输入的东西是W合逻辑的?
…?br />q需要把囑Ş界面、确定前的旉|类、内存中的配|类、硬盘上的配|文件结合v来,什么时候给哪个赋|什么时候从哪个获得值都要考虑清楚Q同Ӟ在程序运行过E中q需要不断读取内存中的配|类Q获得运行时参数Q必M证线E之间不发生冲突?/p>

amp@java 2006-10-21 14:42 发表评论
]]>
短信q_开发笔?2 QMMS相关材料Q?/title><link>http://m.tkk7.com/amplifier/archive/2006/10/09/74036.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Mon, 09 Oct 2006 04:26:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2006/10/09/74036.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/74036.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2006/10/09/74036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/74036.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/74036.html</trackback:ping><description><![CDATA[支持GPRS的MODEM可以q上互联|,p支持MMSQ彩信)的发送,但实际上MMS的机制与SMS相差很大Qƈ不是几个AT指op搞定的。而且MMS没有l一的标准,各个厂家的规格有所不同Q运营商使用的标准也不同?br />怎样才能像发短信一样通过串口q接MODEM发送彩信?gq没有相关的解决ҎQ现有的都是整套的Y件?br /><a >http://blog.csdn.net/sealedxlmg/archive/2005/01/01/237054.aspx</a><img src ="http://m.tkk7.com/amplifier/aggbug/74036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2006-10-09 12:26 <a href="http://m.tkk7.com/amplifier/archive/2006/10/09/74036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>短信q_开发笔?1http://m.tkk7.com/amplifier/archive/2006/10/09/73927.htmlamp@javaamp@javaSun, 08 Oct 2006 16:12:00 GMThttp://m.tkk7.com/amplifier/archive/2006/10/09/73927.htmlhttp://m.tkk7.com/amplifier/comments/73927.htmlhttp://m.tkk7.com/amplifier/archive/2006/10/09/73927.html#Feedback0http://m.tkk7.com/amplifier/comments/commentRss/73927.htmlhttp://m.tkk7.com/amplifier/services/trackbacks/73927.htmlModem型号QWavecom Fastrack M1206BQ支持GPRSQ详l文档地址http://www.wavecom.com/modules/movie/scenes/search/index.php?fuseAction=searchPopup&article_identity=WMPuSupportHardFirmwaresM1206B&rubric_identity=WMPuSupportHardFirmwares&part=long

短信存储器:SMQ普通短信)QSRQ信息报告)Q移动动感地带各20条,联通UP新势力各100?br />
串口速率Q有的只能工作在9600bpsQ有的可以工作在多种速率



amp@java 2006-10-09 00:12 发表评论
]]>
让老手机变成短信^?AT指o的应?/title><link>http://m.tkk7.com/amplifier/archive/2006/05/19/46967.html</link><dc:creator>amp@java</dc:creator><author>amp@java</author><pubDate>Fri, 19 May 2006 01:28:00 GMT</pubDate><guid>http://m.tkk7.com/amplifier/archive/2006/05/19/46967.html</guid><wfw:comment>http://m.tkk7.com/amplifier/comments/46967.html</wfw:comment><comments>http://m.tkk7.com/amplifier/archive/2006/05/19/46967.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/amplifier/comments/commentRss/46967.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/amplifier/services/trackbacks/46967.html</trackback:ping><description><![CDATA[<p>以NOKIA8250Z。通过8250的红外与PCq接之后Q会产生一个虚拟串口,q个串口的序号可能在每台电脑上都不一栗利用这个串口,可以对手机q行一pd操作Q包括发送、接收短信。通过E序操作串口Q就可以把这部手机做成短信^台?br /> 在Windows中,打开l端Q在手机未连接之前,查看q接可用的串口列表Q然后连接手机,再查看列表,多出来的那个串口是与手机通信的串口。通过该串口连接手机,可以用AT指o来操作它?br /> 输入AT回RQ出现OKQ就说明q个串口是支持AT指o的,有可能是手机Q也有可能是普通的MODEM?br /> 输入AT+CGMI回RQ出现手机厂商信息,例如NOKIAQ就说明q是手机Q下面就可以q行一pd的操作了?br /> AT指o有几个实用的规则Q?br /> 1.输入AT指o然后?#8220;?”Q就能列指o的当前状态,例如输入AT+CSCS?Q就能列出当前手Z用的字符集,例如Q?CSCS: "PCCP437"?br /> 2.输入AT指o然后?#8220;=?”Q就能列指o的可选|也就是手机所能支持的所有|例如输入AT+CSCS=?Q就能列出手支持的所有字W集Q例如:+CSCS: ("GSM","HEX","IRA","PCCP437","PCDN","8859-1")Q可以通过AT+CSCS="HEX"来设|手机的字符集ؓHEX?br /> <br /> <br /> 短信内容的格式有两种Q一U是textQ一U是PDUQtext格式比较单,但不能发送特D的短信Q例如免提短信,发送中文短信也会ؕ码。PDU格式则可以发送各UŞ式(免提Q闪烁)和字W集的短信,不过PDU不够直观Q需要通过E序来编码解码,例如发送到8613000000000的短?#8220;中文信息”的PDU~码为:0011000D91683100000000F00008A70C4E2D65874FE1606F000D000AQ其长度?7。在PDU格式下,短信内容q包含了目标LQ而在text格式下,目标L和短信内Ҏ分开的?a >锐方SMS控g</a>是一个很好的PDU~解码控件?br /> <br /> 与短信相关的AT指oQ?br /> </p> <table border="1" cellspacing="0" width="100%"> <tbody> <tr> <td width="11%">AT 指o</td> <td width="89%">??</td> </tr> <tr> <td width="11%">AT+CMGC</td> <td width="89%">Send an SMS commandQ发Z条短消息命oQ?/td> </tr> <tr> <td width="11%">AT+CMGD</td> <td width="89%">Delete SMS messageQ删除SIM卡内存的短消息) </td> </tr> <tr> <td width="11%">AT+CMGF</td> <td width="89%">Select SMS message formateQ选择短消息信息格式:0-PDU;1-文本Q?/td> </tr> <tr> <td width="11%">AT+CMGL</td> <td width="89%">List SMS message from preferred storeQ列出SIM卡中的短消息Q在PDU模式下,该gؓ数字Q在text模式下,该gؓ字符丌ӀPDU/textQ?/"REC UNREAD"-未读Q?/"REC READ"-已读Q?/"STO UNSENT"-待发Q?/"STO SENT"-已发Q?/"ALL"-全部的)</td> </tr> <tr> <td width="11%">AT+CMGR</td> <td width="89%">Read SMS messageQ读短消息)</td> </tr> <tr> <td width="11%">AT+CMGS</td> <td width="89%">Send SMS messageQ发送短消息。在PDU格式下,该D|ؓPDU长度Q例?0Q在Text格式下,该D|ؓ目标手机L字符Ԍ例如"8613888888888"。注意,在PDU模式下,手机L需要加?6开_否则不能发送。) </td> </tr> <tr> <td width="11%">AT+CMGW</td> <td width="89%">Write SMS message to memoryQ向SIM内存中写入待发的短消息)</td> </tr> <tr> <td width="11%">AT+CMSS</td> <td width="89%">Send SMS message from storageQ从SIN|M内存中发送短消息Q?</td> </tr> <tr> <td width="11%">AT+CNMI</td> <td width="89%">New SMS message indicationsQ设|是否显C新收到的短信,一般设?,1,0,0,0Q手机收到新的短信后会给PC发一条消息,包含了该短信在内存中的烦引号Q通过该烦引号可以读短信Q?/td> </tr> <tr> <td width="11%">AT+CPMS</td> <td width="89%">Preferred SMS message storageQ选择短消息内存)</td> </tr> <tr> <td width="11%">AT+CSCA </td> <td width="89%">SMS service center addressQ短消息中心地址Q?/td> </tr> <tr> <td width="11%">AT+CSCB</td> <td width="89%">Select cell broadcast messagesQ选择蜂窝q播消息Q?</td> </tr> <tr> <td width="11%">AT+CSMP</td> <td width="89%">Set SMS text mode parametersQ设|短消息文本模式参数Q?</td> </tr> <tr> <td width="11%">AT+CSMS</td> <td width="89%">Select Message ServiceQ选择短消息服务)</td> </tr> </tbody> </table> <br /> 知道q些之后Q就可以通过~程来操作手机。在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后支持Linux和Solarisq_了,Windowsq_的只支持?.0Q?8q出的,不过在XP下还能用,google一下就可以下蝲刎ͼ例如Q?a >http://mdubuc.freeshell.org/Jolt/javacomm20-win32.zip</a>。也可以用开源的<a >Rxtx</a>实现串口通信?br /> 如果不想直接操作AT指oQ还可以使用开源的<a >SMSLib</a>包,该包装了与短信相关的所有AT指oQ也实现了PDU~解码功能,使用h十分方便? <img src ="http://m.tkk7.com/amplifier/aggbug/46967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/amplifier/" target="_blank">amp@java</a> 2006-05-19 09:28 <a href="http://m.tkk7.com/amplifier/archive/2006/05/19/46967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://av56cc.com" target="_blank">޾ƷŮ߹ۿ</a>| <a href="http://tv695.com" target="_blank">vƬƵ߹ۿƵ</a>| <a href="http://456jjj.com" target="_blank">Ʒ۲ӰԺ</a>| <a href="http://uiui6.com" target="_blank">AVۺɫһ</a>| <a href="http://www676617.com" target="_blank">͵͵ĸ</a>| <a href="http://fsbj168.com" target="_blank">ԴWWW</a>| <a href="http://phlinhng.com" target="_blank">av벻߹ۿ</a>| <a href="http://htsp777.com" target="_blank">hƵ߹ۿ</a>| <a href="http://xyjxnhcl.com" target="_blank">ѧһëƬ</a>| <a href="http://tedegold.com" target="_blank">ɫɫwww˿</a>| <a href="http://hnmeiankj.com" target="_blank"> ŷ պ ۺ</a>| <a href="http://wwwfac286.com" target="_blank">ַ߹ۿ</a>| <a href="http://yiuuu.com" target="_blank">һ </a>| <a href="http://lai228.com" target="_blank">2019Ļѿ</a>| <a href="http://16lds.com" target="_blank">Ʒ˳Ƶapp</a>| <a href="http://6wss.com" target="_blank">޾Ʒ岻</a>| <a href="http://zhaosaohuo.com" target="_blank">һëƬaѲɫӰ</a>| <a href="http://902578.com" target="_blank">պëƬƵ</a>| <a href="http://222xx8.com" target="_blank">˳ɵӰվþ</a>| <a href="http://sh-shule.com" target="_blank">Ļ߹ۿƬ</a>| <a href="http://9haolc.com" target="_blank">avƬ߹ۿ</a>| <a href="http://cxljdz.com" target="_blank">aƵ</a>| <a href="http://8k4c.com" target="_blank">ձ㽶Ƶ</a>| <a href="http://liulian88.com" target="_blank">Ʒվ</a>| <a href="http://zgxxx.com" target="_blank">ɫƵ</a>| <a href="http://zjszbwzl.com" target="_blank">Ʒһ</a>| <a href="http://dehaichem.com" target="_blank">ĻƵ߿</a>| <a href="http://331927.com" target="_blank">޹ۺ</a>| <a href="http://zzz134.com" target="_blank">˳77777߲վ ˳77777߹ۿ </a>| <a href="http://lzlcp.com" target="_blank">޾ƷŮþþ</a>| <a href="http://tzkanglong.com" target="_blank">޾Ʒm߹ۿ</a>| <a href="http://wwwpaogou123.com" target="_blank">պһƬѹۿ</a>| <a href="http://7766ks.com" target="_blank">ĻmvƵ7</a>| <a href="http://selaohu.com" target="_blank">պƷһAVۿ</a>| <a href="http://19b1.com" target="_blank">һվ</a>| <a href="http://guoyit.com" target="_blank">һëƬѹۿ</a>| <a href="http://www-66409b.com" target="_blank">24СʱձӰѿ</a>| <a href="http://342030.com" target="_blank">ҹAVһ</a>| <a href="http://zqsplc.com" target="_blank">޹Ůֱһ</a>| <a href="http://www678678.com" target="_blank">޹a˾Ʒ</a>| <a href="http://njyadi.com" target="_blank">鶹ƷƵ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>