刚刚在Ubuntu8.10下安装了Eclipse,结果在其中运行之前写的那些swing程序一运行就假死在那。所有界面元素都不响应,只能点窗口的关闭按钮强制退出。但自己在终端里用java命令运行则正常。
研究了半天算是找到了问题所在——虚拟机版本。Ubuntu源里默认安装的Eclipse使用的是java-1.5.0-gcj的虚拟机运行java程序。在Eclipse中选择Window-Preferences,在左侧找到Java-Installed JREs,点右侧Search按钮,定位到/usr/lib/jvm即可让Eclipse找到系统中安装的其他JRE,在选择java-6-sun后问题解决。
实现Java中TextField或JTextField输入内容后按回车进行处理,只需在TextField或JTextField上简单地绑定一个ActionListener:
JTextField testField=new JTextField();
testField.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
// 处理焦点在文本框中按回车键的事件
}
});
Java对String的操作提供了两个类StringBuffer和StringBuilder(我是说操作,如果你直接用String对象进行大量的字符串操作,我只能说声佩服)。为什么要提供这样两个类呢?
查阅JDK得知:StringBuilder是在java1.5中新加的类,在使用上与StringBuffer主要的区别只是StringBuilder不是线程安全的,在编写非多线程程序时使用StringBuilder速度能快一些。
与此类似的还有Vector和ArrayList,同样前者是线程安全的,后者是在JDK较新的版本中加入的非线程安全的实现(java1.2时加入的)。
其实只要不是在太大规模和程序上使用,是否线程安全对运行的影响是很难看出来的。而且如果你根本不知线程为何物的话,选择非线程安全的类一般不会有任何问题:)
参考:
- 是 String,StringBuffer还是StringBuilder?
- 精辟的String与StringBuffer(StringBuilder)的区别
上周我们进行了最后一周的课程:操作系统课程设计。
这个名字听起来挺吓人,不过实际上比期中的那个系统软件分析与设计简单多了。老师出的题目不过是让实现一个多线程的演示程序。由于只是个演示用途,也没有限制开发环境。但有一点特殊的是这次课程是分组做的,老师按照学生名单每相邻三个人分为一组,完成同一个任务。我被分到和班里学习最好的两个女生一起完成第一道题:演示对两个缓冲区的put、move、get操作。
说实话,不过是一个简单的演示程序。后面用Java的Lock和Condition实现一个buffer的model,用swing做一个图形界面,再写个controller就可以了。上学期编的那个连连看才花了我四天时间。但现在我要和两个女生合作,这个难度可就高了一个数量级。不过毕竟是团队嘛,如果我什么都不管,自己单干的话确实也不是很好(我一哥们选择了这条路,自己单独完成一道题)。
一周的课设下来,大概花了一半的时间解释和讨论程序的思路和实现方法,一半的时间用在编码上。总算在让大家都基本明白程序是怎么回事的基础上完成了设计。而且体会到了给别人讲解确确实实是提升自己理解能力的非常好的方法。
以下是我自己写的缓冲区类,存放自定义的数据类型Data,这个类型里只包括一个整型的id和Color型的随机颜色信息:
package model;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author riqe
* buffer
*/
public class SynchBuffer {
private Data[] buffers;
private int head;
private int rear;
private Lock bufferLock;
private Condition puttable;
private Condition takable;
public Statistic statistic;
public SynchBuffer(int size){
buffers=new Data[size+1];
head=0;
rear=0;
bufferLock=new ReentrantLock();
puttable=bufferLock.newCondition();
takable=bufferLock.newCondition();
statistic=new Statistic();
}
/**
* Put data into the buffer.
* It will cause the calling thread blocked
* when the buffer is being operated or full.
* @param value data to put into the buffer.
* @param delay millisecond to delay after put the data in.
*/
public void put(Data value,int delay){
bufferLock.lock();
try{
while((head-rear+buffers.length)%buffers.length==1)
puttable.await();
buffers[rear]=value;
rear=(rear+1)%buffers.length;
statistic.addPutCount();
takable.signalAll();
Thread.sleep(delay);
}catch (InterruptedException e) {
}finally{
bufferLock.unlock();
}
}
/**
* Take data out of the buffer.
* It will cause the calling thread blocked
* when the buffer is being operated or empty.
* @param delay millisecond to delay after take the data out
* @return
*/
public Data take(int delay){
Data getValue=null;
bufferLock.lock();
try{
while((buffers.length+head-rear)%buffers.length==0)
takable.await();
getValue=buffers[head];
head=(head+1)%buffers.length;
statistic.addTakeCount();
puttable.signalAll();
Thread.sleep(delay);
}catch (InterruptedException e) {
}finally{
bufferLock.unlock();
}
return getValue;
}
/**
* clear up the buffer.
*/
public void sweep(){
bufferLock.lock();
rear=head;
bufferLock.unlock();
}
}
附上这次的成果,jar文件,安装Java Runtime Environment双击即可运行。
双缓冲操作显示
在中文Windows平台下,Java读取文本文件是以ANSI编码的,这样在打开utf-8编码的中文文件时会乱码,解决方案参考以下文章:
搜斧SearchFull – Java读取UTF-8/UNICODE等字符编码格式的文本文件
其核心为InputStreamReader 类,它负责Java输入中的编码转换。JDK里对其说明为:“It reads bytes and decodes them into characters using a specified charset.”
在遇到输入中文乱码问题的时候,只需要把它套在原有的Reader里,设置好输入源的编码即可正确输入。
最近在用netbeans研究Webwork开发,在被折腾死去活来,差点被气得把电脑从窗口扔出去后,终于用utf-8统一编码,搞定了中文乱码问题。
先声明一下自己使用的环境:WindowsXP + netbeans5.5.1中文版 + Webwork插件 + java1.6 + mysql5.0。使用netbeans内置Tomcat。
中文乱码的问题主要表现在
- jsp中使用webwork的tag,Label中使用中文无法通过编译。提示“编码GBK的不可映射字符”。
- 将中文写入mysql数据库中时,全部变成“??”
页面之间传参没有乱码。Action的结果页面可以正常接收并显示。
经过一番查找,找到了问题所在:
- netbeans模板生成的jsp默认为utf-8编码
- java源文件编码与本地系统一致,在Windows下应该是GB2312。
- mysql的JDBC驱动默认使用ISO8859_1
- mysql新建数据库字符型数据默认编码为Latin1
其中最后两项基本是兼容的,其他的之间就会兼容性问题了。乱码及变“?”就是在这些不同编码之间传递或组合之中出现的。
解决的原则很简单:统一编码。
我现在使用的是统一为utf-8,优点是确保在不同系统上的兼容性(目前几乎所有系统都能良好支持utf-8),缺点是中文一个字在utf-8编码中会占用3个字节,比gbk多占用一半的空间。
1)jsp文件无需改变。只需确认jsp头部有
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
html头部有以下声明:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
2)Java源文件
在netbeans中打开“工具”-“选项”,在打开的选项卡中点击左下角的“高级选项”,在左侧的树中找到“编辑”-“Java源代码”,在“缺省编码”中输入“utf-8”
3)数据库连接
连接数据库时的url中加入编码选择:
jdbc:mysql://localhost/regtest?user=root&password=root&useUnicode=true&characterEncoding=UTF8
4)数据库编码
在mysql中建库时将数据库的编码设为“utf8_general_ci”。
OK,在我的系统上完成这些后乱码再也没出现过。有空的话再研究一下gbk编码下的解决。