??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-cn Fri, 17 Nov 2017 07:37:54 GMT Fri, 17 Nov 2017 07:37:54 GMT 60 利用jmtp库读取手机文?/title> http://m.tkk7.com/amplifier/archive/2017/11/17/432903.htmlamp@java amp@java Fri, 17 Nov 2017 06:54:00 GMT http://m.tkk7.com/amplifier/archive/2017/11/17/432903.html http://m.tkk7.com/amplifier/comments/432903.html http://m.tkk7.com/amplifier/archive/2017/11/17/432903.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/432903.html http://m.tkk7.com/amplifier/services/trackbacks/432903.html
但是要把手机上的东西传到电脑没那么单了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里解释得比较清楚:https://en.wikipedia.org/wiki/Media_Transfer_Protocol Q简单点说就是:
1、不是以块设备的形式讉KQ跟U盘不同;
2、只能单U程讉KQ不能同时进行多个操作,只能一个接一个;
3、控制权在设备上Q对外展C的内容p备决定;
4、默认不能直接对文gq行部分修改Q只能复制过来修改完再复制回去,但Android对协议做了扩展,能够修改部分文g内容Q?br />
5、在Linux上有些Y件能够把它挂载ؓ文gpȝQ这样其他Y件就能像讉K普通文件系l一栯问了Q但是Windows下似乎没有?br />
不过有h开发了一个在Windows下通过JNI实现的Java库jmtpQ项目托在Google CodeQ被墙了Q但是GitHub有hfork了一个,可以下蝲下来Q我下蝲的是https://github.com/reindahl/jmtp
里面包含了C++的代码和Java的代码,以及两个已经~译好的dll文gQ分别用于Win32和Win64Q把其中一个dll文g攑֜工程目录下,再把Java源代码加入工E中卛_使用Q文档比较简陋,但是看test目录下的MtpTest.javaQ基本可以摸到如何用了Q这个协议比较简单,其实没什么功能,我要的只是把文g复制到电脑上?br />
ҎMtpTest.javaQ稍微修改一下,做个递归复制卛_把手Z的所有文件复制到电脑上:
package test;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.rmi.server.SocketSecurityException;
import java.util.ArrayList;
import jmtp.PortableDevice;
import jmtp.PortableDeviceFolderObject;
import jmtp.PortableDeviceManager;
import jmtp.PortableDeviceObject;
import jmtp.PortableDeviceStorageObject;
public class TestApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList < PortableDeviceStorageObject > devices = new ArrayList <> ();
PortableDeviceManager manager = new PortableDeviceManager();
for (PortableDevice device : manager) {
System.out.println(device);
device.open();
// Iterate over deviceObjects
for (PortableDeviceObject object : device.getRootObjects()) {
String storageName = object.getName();
System.out.println(storageName);
// If the object is a storage object
if (object instanceof PortableDeviceStorageObject) {
PortableDeviceStorageObject storage = (PortableDeviceStorageObject) object;
System.out.println(storage.getChildObjects().length);
for (PortableDeviceObject child : storage.getChildObjects()) {
copyall(child, " E:\\手机备䆾\\ " + object.getName());
}
}
}
device.close();
System.out.println(size);
}
}
public static void copyall(PortableDeviceObject obj,String path) {
if (obj instanceof PortableDeviceFolderObject) {
String objName = obj.getName();
if (objName.contains( " : " )) {
objName = objName.replace( ' : ' , ' Q?/span>' );
}
String newPath = path + " \\ " + objName;
System.out.println( " 创徏文g夹: " + newPath);
File file = new File(newPath);
if(!file.exists()) {
file.mkdirs();
}
for (PortableDeviceObject subObj:((PortableDeviceFolderObject) obj).getChildObjects()) {
copyall(subObj,newPath);
}
}
else {
if (obj.getName().contains( " : " ))
return ;
System.out.println( " 开始复制文件到Q?/span>" + path + " \\ " + obj.getName());
File file = new File(path);
obj.copy(file.toPath());
System.out.println( " 文g复制完成Q?/span>" );
}
}
}
其中发现有点问题Q?br />1、Android讑֤文g名里是可以包含冒P:Q的Q但Windows是不可以的,所以复制到q些文g的时候会有问题,于是遇到目录名这样就把它改ؓ中文的冒PQ)Q但是遇到文件名q样׃行了Q因个库的copy函数只需要指定目标目录,不需要指定目标文件名Q所以这些文件只能放弃; 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重新插拔一下手机数据线又没问题了; 4、ؓ了避免复制了半天l果发现不完_又要重来Q最好在复制前先l计一下文件大,看看跟手Z看到的占用存储空间是不是一_对于MTP讑֤上的文gQ可以通过getSize函数得到大小Q把上面复制操作改ؓ大小累加卛_Q速度比复制快一些,不过׃文件太多,也不会快很多?br /> 把手机里的文件复制到电脑后,通过一些简单的分析Q发现有很多其实是垃圾来的,也可以ؓ手机I间清理提供参考,因ؓ在电脑上分析h比在手机上方便一些。例如一些视频APP的缓存,居然过1GQ占用了宝贵的内部存储空_之前一直都没发玎ͼ通过电脑里的按文件大搜索才发现?img src ="http://m.tkk7.com/amplifier/aggbug/432903.html" width = "1" height = "1" /> ]]> 用httpclient和正则表辑ּ完成一些无聊的重复性Q?/title> http://m.tkk7.com/amplifier/archive/2016/01/12/429014.htmlamp@java amp@java Tue, 12 Jan 2016 07:54:00 GMT http://m.tkk7.com/amplifier/archive/2016/01/12/429014.html http://m.tkk7.com/amplifier/comments/429014.html http://m.tkk7.com/amplifier/archive/2016/01/12/429014.html#Feedback 1 http://m.tkk7.com/amplifier/comments/commentRss/429014.html http://m.tkk7.com/amplifier/services/trackbacks/429014.html 1、从其他信息pȝ的数据库导出用户信息Q也可以直接从其他信息系l的界面把所有用户信息复制下来放在一个文本文仉Q反正就是准备好数据源; 2、在需要录入用户信息的pȝ中,用h工操作的方式dpȝQƈ录入一个用P同时用Wireshark抓包Q查看整个过E要提交一些什么样的表单数据; 3、在E序中用httpclient提交同样的数据,完成dQƈ从第1步的数据源中d用户信息Q然后@环提交录入用h需的数据,完成用户的录入; 4、新pȝ没有默认的用戯Ԍ是需要一个个修改的,是根据用LID来确定当前修改的用户Qƈ且提交一个角色ID来进行设定,因此需要首先获取用LIDQ然后根据该ID来提交角色IDQ而用户ID是通过用户列表面获取到的Q因此还需要通过正则表达式来获取所有用LIDQ然后@环提交角色IDQ完成角色设定?br /> ׃不少旉才搞定,有几个地斚w要注意: 1、如果表单数据不包含中文Q直接把表单的Name和Value加在HttpPost的URL?后面卛_Q不需要专门徏立NameValuePairQ如下所C:HttpPost httppost = new HttpPost( " http://1.1.1.1/test/adduser?userid=abc&username=efg " ); httpclient.execute(httppost);
但是Q如果表单数据包含中文,例如姓名Q用q种方式提交的表单数据会出现qQ即佉K过URLEncoderq行~码后再发也不行Q必d立NameValuePairQ再加到HttpPost的Entity里面Q如下所C:HttpPost httppost = new HttpPost( " http://1.1.1.1/test/adduser?userid=abc " ); List < NameValuePair > nvps = new ArrayList < NameValuePair > (); nvps.add( new BasicNameValuePair( " username " , " 张三 " )); httppost.setEntity( new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); httpclient.execute(httppost);
2、用于网内Ҏ扄正则表达式的使用方式一般ؓQ?br />Pattern p = Pattern.compile( " .*?abc(whattoget)123.*?"); Matcher m = p.matcher(line); if (m.matches()){ String whattoget = m.group( 1 ); }
" .*?abc(whattoget)123.*?" 是一个正则表辑ּ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 />
]]> 如何让线E暂停,又能随时唤醒Q?/title> http://m.tkk7.com/amplifier/archive/2015/03/10/423348.htmlamp@java amp@java Tue, 10 Mar 2015 08:52:00 GMT http://m.tkk7.com/amplifier/archive/2015/03/10/423348.html http://m.tkk7.com/amplifier/comments/423348.html http://m.tkk7.com/amplifier/archive/2015/03/10/423348.html#Feedback 2 http://m.tkk7.com/amplifier/comments/commentRss/423348.html http://m.tkk7.com/amplifier/services/trackbacks/423348.html
以前我都是通过停止标记和用Thread.sleep(time)来完成的Q后台线E的每次循环都要查停止标讎ͼ如果发现停止标记已设定,׃再@环,退出线E,在线E内部,如果需要暂停,执行Thread.sleep(time)。通过把线E的setDaemon(true)ҎQ还可以让线E作为后台线E,当图形界面关闭后Q线E也自动退出?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>的提醒,Thread的interrupt()q没有标Cؓq期Q可以按照他的说法来操作Q更为简单?/span>
怎么让线E能暂停Q又能随时叫醒呢Q原来Java里最原始的对象Objectp带此功能?br />
每个Object都有wait(time)和notify()ҎQ前者就是让拥有该Obejct的线E处于暂停状态,后者则让线E马上唤醒,通过q两个方法,p够满上q的所有要求?br />
首先Q徏立一个同步对象:
Object syncObj = new Object();
然后在线E中需要暂停的地方Q调用该对象的wait(time)ҎQ?br />
synchronized (syncObj) {
syncObj.wait(60*1000);
}
在图形界面的按钮监听事g中,对该对象执行notify()ҎQ?br />
button_1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
thread.setStop(true);
synchronized (syncObj) {
syncObj.notify();
}
//Z{待U程退出,q可以加上以下语句:
thread.join();
}
});
]]> Eclipse导出的可执行JAR文g启动非常?/title> http://m.tkk7.com/amplifier/archive/2015/03/10/423344.htmlamp@java amp@java Tue, 10 Mar 2015 07:07:00 GMT http://m.tkk7.com/amplifier/archive/2015/03/10/423344.html http://m.tkk7.com/amplifier/comments/423344.html http://m.tkk7.com/amplifier/archive/2015/03/10/423344.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/423344.html http://m.tkk7.com/amplifier/services/trackbacks/423344.html 可以选择把所有类库打包进去,也就是Jar里面q包含一堆JarQ?br /> q可以生成ant脚本Q?br /> 生成的jar文gQ可以直接通过java -jar xx.jar启动Q简单快捗?br /> 然而,q样导出来的可执行jarQ启动速度却非常慢Q这跟包的大有兟뀂有个项目导出来的包?0MBQ结果启动需要近一分钟Q在性能差的电脑上,甚至要几分钟Q就是你执行完命令后Q没有Q何界面显C,但是查看d理器发现javaq程的CPU占用率在动Q说明正在努力启动,q了一D|间之后界面突然显C出来,直让人崩溃。可是在Eclipse里面q行Q却是一点就开?br /> 我开始尝试羃导出的包。但是Eclipse的导出对话框q没有提供需要打包哪些库的选项Q都是默认把所有库都打包进去,但是它可以生成ant脚本Q可以通过~辑ant脚本的方式来减少不必要的库。经q多ơ尝试,l于?0MB的包~成?7MBQ启动速度快了一些,但是依然需要半分钟以上?br /> 后来觉得Q能不能不打包直接运行呢Q于是把导出来的包用压羃软g解压Q再把里面包含的jar包l解压,最后得C堆没有压~的class文gQ再通过指定classpath的方式,直接q行E序入口classQ发现启动速度和在Eclipse里面一P一点就开?br /> 打包的好处是部v单,只需要一个文Ӟ但带来的~点实在不能忍,打散的方式部|v来稍微难一点,但是启动速度够快Q对普通用h_q个才是最重要的?br /> 当然Q还有一U方式是像Eclipse那样Q启动时昄一个图片,底下一个进度条昄启动q度Q不q这样也加大了工作量Q而且每次都要{那q度条,实际上也很烦?img src ="http://m.tkk7.com/amplifier/aggbug/423344.html" width = "1" height = "1" /> ]]> 用JavaVC替换JMFq接摄像?/title> http://m.tkk7.com/amplifier/archive/2015/02/15/422936.htmlamp@java amp@java Sun, 15 Feb 2015 03:41:00 GMT http://m.tkk7.com/amplifier/archive/2015/02/15/422936.html http://m.tkk7.com/amplifier/comments/422936.html http://m.tkk7.com/amplifier/archive/2015/02/15/422936.html#Feedback 7 http://m.tkk7.com/amplifier/comments/commentRss/422936.html http://m.tkk7.com/amplifier/services/trackbacks/422936.html 阅读全文 ]]> JMF找不到摄像头的解x?/title> http://m.tkk7.com/amplifier/archive/2014/07/01/415330.htmlamp@java amp@java Tue, 01 Jul 2014 02:33:00 GMT http://m.tkk7.com/amplifier/archive/2014/07/01/415330.html http://m.tkk7.com/amplifier/comments/415330.html http://m.tkk7.com/amplifier/archive/2014/07/01/415330.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/415330.html http://m.tkk7.com/amplifier/services/trackbacks/415330.html 不过q代久远的东西,虽然q能用,但可能会遇到一些奇怪的问题Q折腾了两个月,发现了两个比较大的问题: W一个是在Windows 7 x64上提C摄像头初始化失败的问题。这个问题很奇怪,电脑刚开机的时候可以顺利找Cơ摄像头q正常操作,但是W二ơ就会提C摄像头初始化失败。有人提出的解决Ҏ是安装一个叫ManyCamera的程序,q个E序可以把一个摄像头供多个程序同时用,其实q于中间加了一层{换,效果会有点差别,免费版还会加上水华ͼ要求比较高的人可能会不爽Q但是目前找不到其他办法?br /> W二个是在程序中找不到摄像头Q不光找不到摄像_其他媒体讑֤通通找不到Q用以下语句: vector = CaptureDeviceManager.getDeviceList ( null )
按照文档说明是返回所有媒体设备,但每ơvector都是null?br />在Eclipse中运行又能正常,导出成jar之后q行׃找不到摄像头?br />原因在于找不到jmf.properities文gQ该文g包含所有检到的媒体设备的信息Q?strong>最单的解决Ҏ是把JMF安装目录下lib子目录中的jmf.properties文g复制到最后运行的jar所在的目录Q不q如果摄像头改过的话Q重新检后要把新的文g复制到jar目录Q因为检到的媒体设备信息都会存攑֜JMF安装目录里面的jmf.properties文g里?br /> 虽然问题解决了,但是q是不明白ؓ何在Eclipse中可以正常运行,导出jar后运行却找不到摄像头Q即使把JMF所有jar和lib目录都加入系l的CLASSPATH环境变量里还是不行?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 /> ]]> Android手机用来做电脑摄像头 http://m.tkk7.com/amplifier/archive/2014/06/05/414431.htmlamp@java amp@java Thu, 05 Jun 2014 07:35:00 GMT http://m.tkk7.com/amplifier/archive/2014/06/05/414431.html http://m.tkk7.com/amplifier/comments/414431.html http://m.tkk7.com/amplifier/archive/2014/06/05/414431.html#Feedback 4 http://m.tkk7.com/amplifier/comments/commentRss/414431.html http://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/ ]]>Java的位操作 http://m.tkk7.com/amplifier/archive/2012/04/08/373574.htmlamp@java amp@java Sun, 08 Apr 2012 08:56:00 GMT http://m.tkk7.com/amplifier/archive/2012/04/08/373574.html http://m.tkk7.com/amplifier/comments/373574.html http://m.tkk7.com/amplifier/archive/2012/04/08/373574.html#Feedback 2 http://m.tkk7.com/amplifier/comments/commentRss/373574.html http://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的值应该这栯: 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>i = ( a & 0xff ) << 24 | ( b & 0xff ) << 16 | ( b & 0xff ) << 8 | ( b & 0xff )
׃<<的优先高于|Q所以省了一些括受最高字节可以不?xffq行与操作,因ؓ它{换成int后左边增加的3个字节都在左U?4位时被去掉了Q?/span>i = 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>a = (short)( (out[ 0 ] & 0xff ) << 4 | ( out[ 1 ] & 0xf0 ) >> 4 ); b = (short)((out[ 1 ] & 0x0f ) << 8 | ( out[ 2 ] & 0xff ));
]]> 用JAVA做一个便宜好用的二维码扫描器 http://m.tkk7.com/amplifier/archive/2009/04/02/263567.htmlamp@java amp@java Thu, 02 Apr 2009 08:22:00 GMT http://m.tkk7.com/amplifier/archive/2009/04/02/263567.html http://m.tkk7.com/amplifier/comments/263567.html http://m.tkk7.com/amplifier/archive/2009/04/02/263567.html#Feedback 13 http://m.tkk7.com/amplifier/comments/commentRss/263567.html http://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 />
]]>使用NOKIA MMS LIBRARY发送中国移动彩?/title> http://m.tkk7.com/amplifier/archive/2008/06/17/208620.htmlamp@java amp@java Tue, 17 Jun 2008 06:35:00 GMT http://m.tkk7.com/amplifier/archive/2008/06/17/208620.html http://m.tkk7.com/amplifier/comments/208620.html http://m.tkk7.com/amplifier/archive/2008/06/17/208620.html#Feedback 11 http://m.tkk7.com/amplifier/comments/commentRss/208620.html http://m.tkk7.com/amplifier/services/trackbacks/208620.html 阅读全文 ]]> Java的线E重?/title> http://m.tkk7.com/amplifier/archive/2008/04/22/194710.htmlamp@java amp@java Tue, 22 Apr 2008 02:56:00 GMT http://m.tkk7.com/amplifier/archive/2008/04/22/194710.html http://m.tkk7.com/amplifier/comments/194710.html http://m.tkk7.com/amplifier/archive/2008/04/22/194710.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/194710.html http://m.tkk7.com/amplifier/services/trackbacks/194710.html
Z实现某个U程对象?#8220;重启”功能Q可以在它的run()Ҏ的最外层加上一个@环语句:
1 public void run(){
2 while ( ! stop){
3 // do something
4 }
5 }
q样Q只要stop不ؓtrueQrun()Ҏ׃会结束,不断?#8220;重启”?br />
如果run()Ҏ里面q有一个@环,那么p两个停止标志Q?br />
1 public void run(){
2 while ( ! stop){
3 // do something
4 while ( ! stop && ! restart){
5 // do other thing
6 }
7 }
8 }
9
q样Q如果需?#8220;重启”U程Q只要把restart设ؓtrue卛_Q如果要退出线E,只要把stop设ؓtrue卛_?
]]> 通过E序发送彩信——利用Now SMS/MMS和Apache HttpClient http://m.tkk7.com/amplifier/archive/2007/10/01/150047.htmlamp@java amp@java Mon, 01 Oct 2007 06:22:00 GMT http://m.tkk7.com/amplifier/archive/2007/10/01/150047.html http://m.tkk7.com/amplifier/comments/150047.html http://m.tkk7.com/amplifier/archive/2007/10/01/150047.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/150047.html http://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?
]]> 用Now SMS/MMS 发送中国移动彩?/title> http://m.tkk7.com/amplifier/archive/2007/09/18/146235.htmlamp@java amp@java Tue, 18 Sep 2007 11:32:00 GMT http://m.tkk7.com/amplifier/archive/2007/09/18/146235.html http://m.tkk7.com/amplifier/comments/146235.html http://m.tkk7.com/amplifier/archive/2007/09/18/146235.html#Feedback 18 http://m.tkk7.com/amplifier/comments/commentRss/146235.html http://m.tkk7.com/amplifier/services/trackbacks/146235.html Now SMS/MMS是一个强大的短信/彩信发送服务器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。方法如下:
在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 />
之后打开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>
感谢Q?a target="_blank">http://blog.csdn.net/phiger/archive/2006/12/19/1449176.aspx
官方文档Q?a >http://www.nowsms.com/documentation/ProductDocumentation/mms_notifications_and_content/Connecting_to_operator_MMSC.htm#SendingMMSMessages
]]> 如何判断Socket已断开 http://m.tkk7.com/amplifier/archive/2007/04/12/110131.htmlamp@java amp@java Thu, 12 Apr 2007 04:21:00 GMT http://m.tkk7.com/amplifier/archive/2007/04/12/110131.html http://m.tkk7.com/amplifier/comments/110131.html http://m.tkk7.com/amplifier/archive/2007/04/12/110131.html#Feedback 8 http://m.tkk7.com/amplifier/comments/commentRss/110131.html http://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>
]]> Java控制台程序如何在用户关闭时执行清理代?/title> http://m.tkk7.com/amplifier/archive/2007/04/12/110085.htmlamp@java amp@java Thu, 12 Apr 2007 02:08:00 GMT http://m.tkk7.com/amplifier/archive/2007/04/12/110085.html http://m.tkk7.com/amplifier/comments/110085.html http://m.tkk7.com/amplifier/archive/2007/04/12/110085.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/110085.html http://m.tkk7.com/amplifier/services/trackbacks/110085.html Runtime.getRuntime().addShutdownHook (Thread hook) Ҏ可以l当前的q程注册一个清理线E,当进E退出的时候,会执行线E中的代码?br> 1、ؓ了统一清理U程的实玎ͼ可以做一个Destroyable接口Q实现此接口的类都有一个destroy()ҎQ里面包含了该类的清理过E,例如关闭数据库连接、关闭Socketq接{?br>Destroyable接口的代码:
1 package net.blogjava.amplifier; 2 3 /** 4 * 建立此接口的目的是ؓ了实现程序退出时的清?br> 5 * 在Java控制台程序中Q用户可以通过关闭命o行窗口或按下Ctrl+C来结束程序的q行 6 * q时候应该保证资源能够被正确释放Q例如数据库的连接、Socket的连接应该关?br> 7 * 实现了本接口的类的实例引用可以由一个ShutdownHookU程来操?br> 8 * 此线E在虚拟机退出时执行Q详见Runtime.addShutdownHook()Ҏ 9 * @author amplifier 10 * 11 */ 12 public interface Destroyable { 13 /** 14 * 实现本接口的c需要实现此ҎQ方法中包含该类的清理代码, 15 * 例如关闭数据库连接、关闭Socketq接{?br> 16 * 17 */ 18 void destroy(); 19 }
2、徏立一个承于Thread的类ShutdownHookQ里面的一个域是Destroyable实现cȝ引用Q在该类的构造函C可以传入该Destroyable实现cR?br>ShutdownHook的代码:
1 package net.blogjava.amplifier; 2 3 public class ShutdownHook extends Thread { 4 5 private Destroyable desObj; 6 7 public ShutdownHook(Destroyable desObj){ 8 this .desObj = desObj; 9 } 10 11 @Override 12 public void run() { 13 if ( this .desObj != null ){ 14 try { 15 this .desObj.destroy(); 16 } 17 catch (Exception e) { 18 } 19 } 20 } 21 22 /** *//** 23 * @param args 24 */ 25 public static void main(String[] args) { 26 27 28 } 29 30 }
3、在main()Ҏ中注册ShutdownHook?br>
1 public static void main(String[] args){ 2 DestroyableImpl di = new DestroyableImpl(); 3 ShutdownHook sh = new ShutdownHook(di); 4 Runtime.getRuntime().addShutdownHook(sh); 5 Runtime.getRuntime().addShutdownHook( new Thread(){ 6 public void run(){ 7 System.out.println( " 正在退?#8230;… " ); 8 } 9 }); 10 di.otherMethod(); 11 }
]]> 如何让部|在Tomcat的某个应用在Tomcat启动时自动启?/title> http://m.tkk7.com/amplifier/archive/2007/03/19/104827.htmlamp@java amp@java Mon, 19 Mar 2007 13:59:00 GMT http://m.tkk7.com/amplifier/archive/2007/03/19/104827.html http://m.tkk7.com/amplifier/comments/104827.html http://m.tkk7.com/amplifier/archive/2007/03/19/104827.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/104827.html http://m.tkk7.com/amplifier/services/trackbacks/104827.html < Host ></ Host > 之间加入一?br />< Context docBase ="应用的根" path ="应用E序相对webapps的目? reloadable ="当配|修Ҏ是否需要自动重新加载,是则为trueQ否则ؓfalse" ></ Context >
Ҏ备忘Q?img src ="http://m.tkk7.com/amplifier/aggbug/104827.html" width = "1" height = "1" /> ]]> BIRT初体?/title> http://m.tkk7.com/amplifier/archive/2007/01/09/92738.htmlamp@java amp@java Tue, 09 Jan 2007 12:55:00 GMT http://m.tkk7.com/amplifier/archive/2007/01/09/92738.html http://m.tkk7.com/amplifier/comments/92738.html http://m.tkk7.com/amplifier/archive/2007/01/09/92738.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/92738.html http://m.tkk7.com/amplifier/services/trackbacks/92738.html 记录下一些东西: 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 /> q要研究一下怎样通过E序控制报表的生成?br /> 本文Z人备忘录?img src ="http://m.tkk7.com/amplifier/aggbug/92738.html" width = "1" height = "1" /> ]]> Eclipse启动参数解决占用CPU 100%Q必Z立即结束”的问题 http://m.tkk7.com/amplifier/archive/2006/11/02/78619.htmlamp@java amp@java Thu, 02 Nov 2006 03:02:00 GMT http://m.tkk7.com/amplifier/archive/2006/11/02/78619.html http://m.tkk7.com/amplifier/comments/78619.html http://m.tkk7.com/amplifier/archive/2006/11/02/78619.html#Feedback 2 http://m.tkk7.com/amplifier/comments/commentRss/78619.html http://m.tkk7.com/amplifier/services/trackbacks/78619.html P4 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 ]]> 通过Socket发送Unicode不可打印字符 http://m.tkk7.com/amplifier/archive/2006/11/02/78613.htmlamp@java amp@java Thu, 02 Nov 2006 02:39:00 GMT http://m.tkk7.com/amplifier/archive/2006/11/02/78613.html http://m.tkk7.com/amplifier/comments/78613.html http://m.tkk7.com/amplifier/archive/2006/11/02/78613.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/78613.html http://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();
]]>短信q_开发笔?4 Q多U程Q? http://m.tkk7.com/amplifier/archive/2006/10/25/77242.htmlamp@java amp@java Wed, 25 Oct 2006 09:34:00 GMT http://m.tkk7.com/amplifier/archive/2006/10/25/77242.html http://m.tkk7.com/amplifier/comments/77242.html http://m.tkk7.com/amplifier/archive/2006/10/25/77242.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/77242.html http://m.tkk7.com/amplifier/services/trackbacks/77242.html q样会带来一个问题,发送线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" /> ]]> 短信q_开发笔?3 Q图形界面) http://m.tkk7.com/amplifier/archive/2006/10/21/76538.htmlamp@java amp@java Sat, 21 Oct 2006 06:42:00 GMT http://m.tkk7.com/amplifier/archive/2006/10/21/76538.html http://m.tkk7.com/amplifier/comments/76538.html http://m.tkk7.com/amplifier/archive/2006/10/21/76538.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/76538.html http://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>
]]> 短信q_开发笔?2 QMMS相关材料Q?/title> http://m.tkk7.com/amplifier/archive/2006/10/09/74036.htmlamp@java amp@java Mon, 09 Oct 2006 04:26:00 GMT http://m.tkk7.com/amplifier/archive/2006/10/09/74036.html http://m.tkk7.com/amplifier/comments/74036.html http://m.tkk7.com/amplifier/archive/2006/10/09/74036.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/74036.html http://m.tkk7.com/amplifier/services/trackbacks/74036.html 怎样才能像发短信一样通过串口q接MODEM发送彩信?gq没有相关的解决ҎQ现有的都是整套的Y件?br />http://blog.csdn.net/sealedxlmg/archive/2005/01/01/237054.aspx ]]> 短信q_开发笔?1 http://m.tkk7.com/amplifier/archive/2006/10/09/73927.htmlamp@java amp@java Sun, 08 Oct 2006 16:12:00 GMT http://m.tkk7.com/amplifier/archive/2006/10/09/73927.html http://m.tkk7.com/amplifier/comments/73927.html http://m.tkk7.com/amplifier/archive/2006/10/09/73927.html#Feedback 0 http://m.tkk7.com/amplifier/comments/commentRss/73927.html http://m.tkk7.com/amplifier/services/trackbacks/73927.html Modem型号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有的可以工作在多种速率
]]> 让老手机变成短信^?AT指o的应?/title> http://m.tkk7.com/amplifier/archive/2006/05/19/46967.htmlamp@java amp@java Fri, 19 May 2006 01:28:00 GMT http://m.tkk7.com/amplifier/archive/2006/05/19/46967.html http://m.tkk7.com/amplifier/comments/46967.html http://m.tkk7.com/amplifier/archive/2006/05/19/46967.html#Feedback 2 http://m.tkk7.com/amplifier/comments/commentRss/46967.html http://m.tkk7.com/amplifier/services/trackbacks/46967.html 以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 />
短信内容的格式有两种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是一个很好的PDU~解码控件?br />
与短信相关的AT指oQ?br />
AT 指o
??
AT+CMGC
Send an SMS commandQ发Z条短消息命oQ?/td>
AT+CMGD
Delete SMS messageQ删除SIM卡内存的短消息)
AT+CMGF
Select SMS message formateQ选择短消息信息格式:0-PDU;1-文本Q?/td>
AT+CMGL
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"-全部的)
AT+CMGR
Read SMS messageQ读短消息)
AT+CMGS
Send SMS messageQ发送短消息。在PDU格式下,该D|ؓPDU长度Q例?0Q在Text格式下,该D|ؓ目标手机L字符Ԍ例如"8613888888888"。注意,在PDU模式下,手机L需要加?6开_否则不能发送。)
AT+CMGW
Write SMS message to memoryQ向SIM内存中写入待发的短消息)
AT+CMSS
Send SMS message from storageQ从SIN|M内存中发送短消息Q?
AT+CNMI
New SMS message indicationsQ设|是否显C新收到的短信,一般设?,1,0,0,0Q手机收到新的短信后会给PC发一条消息,包含了该短信在内存中的烦引号Q通过该烦引号可以读短信Q?/td>
AT+CPMS
Preferred SMS message storageQ选择短消息内存)
AT+CSCA
SMS service center addressQ短消息中心地址Q?/td>
AT+CSCB
Select cell broadcast messagesQ选择蜂窝q播消息Q?
AT+CSMP
Set SMS text mode parametersQ设|短消息文本模式参数Q?
AT+CSMS
Select Message ServiceQ选择短消息服务)
知道q些之后Q就可以通过~程来操作手机。在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后支持Linux和Solarisq_了,Windowsq_的只支持?.0Q?8q出的,不过在XP下还能用,google一下就可以下蝲刎ͼ例如Q?a >http://mdubuc.freeshell.org/Jolt/javacomm20-win32.zip。也可以用开源的Rxtx 实现串口通信?br />
如果不想直接操作AT指oQ还可以使用开源的SMSLib 包,该包装了与短信相关的所有AT指oQ也实现了PDU~解码功能,使用h十分方便?
]]>
վ֩ģ壺
ƷŮ߹ۿ |
vƬƵ߹ۿƵ |
Ʒ۲ӰԺ |
AVۺɫһ |
͵͵ĸ |
ԴWWW |
av벻߹ۿ |
hƵ߹ۿ |
ѧһëƬ |
ɫɫwww˿ |
ŷ պ ۺ |
ַ߹ۿ |
һ
|
2019Ļѿ |
Ʒ˳Ƶapp |
Ʒ岻 |
һëƬaѲɫӰ |
պëƬƵ |
˳ɵӰվþ |
Ļ߹ۿƬ |
avƬ߹ۿ |
aƵ |
ձ㽶Ƶ |
Ʒվ |
ɫƵ |
Ʒһ |
ĻƵ߿ |
ۺ |
˳77777߲վ
˳77777߹ۿ
|
ƷŮþþ |
Ʒm߹ۿ |
պһƬѹۿ |
ĻmvƵ7 |
պƷһAVۿ |
һվ |
һëƬѹۿ |
24СʱձӰѿ |
ҹAVһ |
Ůֱһ |
a˾Ʒ |
鶹ƷƵ |