装好Netbeans,发现中文显示是乱码,WinXP下也是这样,只是Ubuntu下更严重,只知道进入英文界面的参数是-locale >EN<,却不知道怎么使应用程序菜单里的程序带参数启动。
试了n次后,才知道直接/usr/share/applications/net***.desktop的exec部分就行了
不过原来的exec是"/opt/net***",参数得加在括号外
ubuntu每次启动时默认检查所有分区,只要把/etc/fstab中的pass列改为0就可以跳过,另外defaults后面加上,ro就可以对win分区进行只读访问了

posted @ 2007-04-22 20:25 ZelluX 阅读(327) | 评论 (0)编辑 收藏

2007-02-27 13:51:48
把Core Java I Reflection那一节打印下来准备慢慢看支持泛型后的反射机制的用法,却看到
We are not dwelling on this issue because it would further complicate an already abstract concept. For most practical purposes, you can ignore the type parameter and work with the raw Class type.
-,-
好吧,既然都打印出来,还是看完了再说
1. Class.getMethods()方法返回一个Method数组,包括了所有类自身及继承下来的public方法
类似的有getFields() getConstructors()
要访问私有成员,先调用setAccessible(true),这是继承自AccessibleObject类的一个方法。
2. java.lang.reflect.Array
用于动态创建对象数组。
示例代码用于扩大一个任意类型的数组
static Object goodArrayGrow(Object a) {
Class cl = a.getClass();
if (!cl.isArray()) return null;
Class componentType = cl.getComponentType();
int length = Array.getLength(a);
int newLength = length * 11 / 10 + 10;
Object newArray = Array.newInstance(componentType, newLength);
System.arraycopy(a, 0, newArray, 0, length);
return newArray;
}
int[] a = {1, 2, 3, 4};
a = (int[]) goodArrayGrow(a);
这样也是正确的,因为返回值是Object,因此可以转型为int[]
3. NB的东东-方法指针
正如Field类有get方法,Method类也有invoke方法。
Object invoke(Object obj, Object... args)
第一个参数必须有,如果是静态方法,该参数为null。
假设m1代表Employee类的getName方法,下面的代码就调用了这个方法
String n = (String) m1.invoke(harry); //harry is a Employee
如果返回值是基本类型,Java通过autoboxing返回它们的wrapper类。
要获得Method类,可以从getdeclaredMethods方法的返回值中找到,也可以使用getMethod方法
Mathod getMethod(String name, Class... parameterTypes)
如要从Employee类中获得raiseSalary(double)这个方法
Method m2 = Employee.class.getMethod("raiseSalary", double.class);

posted @ 2007-04-22 20:25 ZelluX 阅读(291) | 评论 (0)编辑 收藏

2007-02-26 21:56:01
Thinking in Java 中尚未引入泛型概念
RTTI - run-time type identification
1. 每当编写并且编译了一个新类,就会产生一个Class对象(更恰当的说,是被保存在一个同名的.class文件中)
2. Class类的一些方法(*表示会抛出异常):
* static forName(String) 返回相应的Class类,注意字符串里要加上包名
* newInstance() 返回对应于该Class类的类的实例,注意该类必须有一个缺省构造器。
isInstance(Object) 返回该对象是否是Class类对应的类的实例(或子类)
getSuperClass() 返回直接父类的Class类
* getConstructors() 返回构造器,返回值是Constructor[]
* getFields() 返回字段,返回值是Field[]
* getMethods() 返回字段,返回值是Method[]
3. 类字面常量 (Class literals)
例如要获得Gum类的Class类就使用Gum.class
对于基本数据类型的wrapper类,还有一个标准字段TYPE,int.class和Integer.TYPE返回值一样,建议使用.class以保持一致。
4. Java希望我们始终使用多态机制,只在必需的时候使用RTTI。

posted @ 2007-04-22 20:25 ZelluX 阅读(175) | 评论 (0)编辑 收藏

2007-02-26 21:53:39

1. JDK 1.0版本中有一个stop方法用于强制中止线程,但是现在这个方法被废止。因此没有方法强制中止线程,但是interrupt方法可以要求某个线程的中止。

2. 某个线程的interrupt方法被调用后,该线程被设为中断状态,这是一个boolean值,每个线程都应当定期检查这个值,以知道自己是否被中断。一个线程被interrupt并不意味着它必须结束,仅仅是发送了一个消息而已。

3. Thread.currentThread().isInterrupted()方法返回一个boolean值,表示是否为中断状态。

4. 当某个线程阻滞时(如在sleep wait方法调用后),无法检查中断状态。如果此时interrupt方法被调用,当前的阻滞状态就会被中止,并且产生InterruptedException。

5. 一个run方法应当有这样的形式:
public void run() {
try {
//...
while (!Thread.currentThread().isInterrupted() && more work to do) {
//do more work
}
} catch (InterruptedException e) {
//...
}
finally {
//clean up, if required
}
}
如果在线程每个工作段后都使用sleep方法,就不必检查中断状态了,此时只要处理好InterruptedException就行了。

6. 还有一个类似的静态方法interrupted(),同样返回一个boolean值,不同的是该方法同时把当前中断状态设为了false。

7. 有一个很不好习惯:捕获InterruptedException后没有进行任何的处理。如果的确想不到什么事情做,至少可以加上Thread.currentThread().interrupted()改变中断状态,以便呼叫者知道这个情况;或者可以开头声明throws InterrupedException,并取消try块,让呼叫者处理这个问题。

8. 线程的四个状态:New, Runnable, Blocked, Dead
New状态:在new Thread(r)被调用后,start方法调用前。做一些初始化工作。
Runaable状态:start方法调用后。一个线程在运行并不意味着它在不停地运行,事实上,应当不时的中断,以便其他线程有机会运行。具体细节由操作系统决定。preemptive系统给每个线程一段时间运行,之后暂停该线程,给另一个线程运行的机会。选择另一个线程时,系统会考虑优先权。但是在cooperative系统中,只有在一个线程sleep或yield时才会交出控制权。
Blocked:以下几种情况会导致停滞:1)调用sleep方法 2)执行了某个在IO上阻塞的操作 3)试图获得正被其他线程控制的lock 4)waits for a conditionsee page 5)其他人调用了该线程的suspend方法,注意这个方法已被废止。
当一个线程从Blocked中恢复时(如sleep方法设定时间到,IO操作完成等),系统会根据优先级决定是否继续运行这个线程。
不能简单地调用线程的resume方法使之从Blocked状态中恢复。如果要取消因IO操作导致的block,可以让另一个线程关闭对应的IO通道(channel),则原来那个线程恢复运行,并抛出ClosedChannelException。
Death:run方法结束后线程就进入Death状态。也可以通过调用线程的stop方法中止该线程运行,会抛出ThreadDeath错误。当然,不要在你自己的代码里使用这个方法。
线程的isAlive()方法返回该线程是否已被中止(也有可能尚未运行)。

posted @ 2007-04-22 20:25 ZelluX 阅读(238) | 评论 (0)编辑 收藏

2007-02-26 21:52:36
貌似这章比较有趣,先把前面的跳了。
1. 最简单的Beans就是一个Java类,只不过它遵循了一些严格的命名惯例。有些人强调一个bean必须有一个缺省构造器,但JavaBeans的说明中并没有提到。然而,大多数的编程工具还是要求每个bean都有一个缺省构造器的。
2. bean的属性(property)并非就是实例域(instance field),属性是接口的特性,而实例域则属于类的实现部分。
3. 将beans打包到JAR文件,在mainfest.mf文件中说明哪个是java bean
Manifest-Version: 1.0
Name: com/horstmann/corejava/ImageViewerBean.class
Java-Bean: True
注意中间的空行不能少。

posted @ 2007-04-22 20:25 ZelluX 阅读(219) | 评论 (0)编辑 收藏

2007-02-25 14:38:21
1. 安装jdk
安装jdk的时候就遇到问题了,使用apt-get安装太慢,就用迅雷从官方下载了个bin包,接下来怎么安装就是问题了。
google到了一篇安装说明:
1. 下载jdk-6-linux-i586.bin





2. 下载http://linuxtoy.org/deb/java-package_0.28ubuntu1_all.deb





使用sudo dpkg -i java-package_0.28ubuntu1_all.deb 安装
结果发现需要fakeroot,sudo apt-get install fakeroot 也报错,根据提示用sudo apt-get -f install搞定。

3. 使用 fakeroot make-jpkg jdk-6-linux-i586.bin 来制作 deb 包,生成的文件名为 sun-j2sdk1.6_1.6.0_i386.deb。

4. 安装 JDK 6,执行指令 sudo dpkg -i sun-j2sdk1.6_1.6.0_i386.deb 即可。

搞定,google真是好东西


2. 安装LumaQQ zz from UbuntuChina

安装Luma QQ

  • 1.下载并安装
  • 安装QQ需要先安装上一步的JAVA环境
  • wget -c http://download.ubuntu.org.cn/software/lumaqq_2005-linux_gtk2_x86_no_jre.tar.gz
    sudo tar zxvf lumaqq_2005-linux_gtk2_x86_no_jre.tar.gz -C /opt/
    wget -c http://download.ubuntu.org.cn/software/lumaqq_2005_patch_2006.02.02.15.00.zip
    sudo unzip -o lumaqq_2005_patch_2006.02.02.15.00.zip -d /opt/LumaQQ/lib
    sudo chown -R root:root /opt/LumaQQ/
    sudo chmod -R 755 /opt/LumaQQ/
    sudo gedit /usr/share/applications/LumaQQ.desktop
    2.在新增的文件内加入下面这几行
  • [Desktop Entry]
    Name=LumaQQ
    Comment=QQ Client
    Exec=/opt/LumaQQ/lumaqq
    Icon=/opt/LumaQQ/QQ.png
    Terminal=false
    Type=Application
    Categories=Application;Network;

    3.保存编辑过的文件安装完成后的快捷方式在(应用程序 -< Internat -< LumaQQ)。


3. 安装Eclipse
http://forum.ubuntu.org.cn/viewtopic.php?t=1251

4. 安装GVIm
http://forum.ubuntu.org.cn/viewtopic.php?t=2486&highlight=gvim

5. QTerm
装好后不能输入中文,得安装qtimm
apt-get install scim-qtimm

posted @ 2007-04-22 20:25 ZelluX 阅读(460) | 评论 (0)编辑 收藏

2007-02-25 14:09:11

1. 多任务实现方法根据操作系统是否随时地能中止程序的运行,可以分为两类。可以随时中止的称为preemptive multitasking,如UNIX/Linux,OS X,Windows NT/XP,以及Windows 9x下的32位程序。不能的则被称为cooperative multitasking,如Windows 3.x和Mac OS 9,已经一些手机上的系统。后者有一个严重的缺陷,当运行的程序不交出控制权的时候,整个系统就挂起了。
多线程则更深入了一步,单独的程序同时执行多个任务。
两者的差异在于,每个进程拥有属于自己的完整的变量群,而线程则享有相同的数据。

2. 运行线程的简单步骤

1) 继承Runnable接口
public interface Runnable
{
void run();
}
class MyRunnable implements Runnable
{
public void run()
{
task code
}
}
2. 创建该类的实例
Runnable r = new MyRunnable();
3. 通过这个实例创建一个线程
Thread t = new Thread(r);
4. 运行该线程
t.start();

另外,也可以通过继承Thread类并覆盖run()方法实现,但并不提倡,因为太多单独的线程很耗资源。

3. 不要直接调用run()方法

posted @ 2007-04-22 20:25 ZelluX 阅读(216) | 评论 (0)编辑 收藏

2007-02-24 23:40:06

写了个Core Java源程序中的行号去掉的程序。

Java中使用正则表达式,一般过程是

Pattern pattern = Pattern.compile("\\d+\\. (\\s*.*)", Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher(string);

while (matcher.find()) {}

但这样并没有用到分组,小括号里的内容并不会单独列出。

如果要去掉行号,只想要小括号里的部分,使用group方法

System.out.println(matcher.group(1));

group(0)group()效果一样,返回整行内容

group(x)则是返回和第x组小括号匹配的内容(x<=1

posted @ 2007-04-22 20:25 ZelluX 阅读(215) | 评论 (0)编辑 收藏

2007-02-24 20:38:00

1. 二进制IO操作
主要通过InputStream和OutputStream类及其子类进行。方法和文本操作类似。
FileInputStream和FileOutputStream用于操作文件。
BufferedInputStream和BufferOutputStream和文本操作类似,只是默认的缓冲区大小为512字节。
DataInputStream和DataOutputStream用于包装InputStream和OutputStream,直接进行字符、实数、整数、布尔值等的读写。
DataOutputStream中writeChar方法写入Unicode编码,如果要写入ASCII吗,使用writeByte。

2. UTF编码
UTF编码存储字符使用的字节数不固定,小于0x7F的ASCII码用一个字节表示,小于0x7FF的Unicode编码用两个字节表示,其余的Unicode编码用三个字节表示。
UTF编码的开头几位表示该字符使用的字节数。如果第一位是0,则是单字节字符;如果前三位是110,则是双字节字符;如果前四位是1110,则是三字节字符。
字符串的长度则保存在UTF串的头两个字节。
DataInputStream和DataOutputStream分别有readUTF()和writeUTF()方法操作UTF编码。

3. 当一个Unicode码无法被转换为ASCII码时,产生的是”?”字符。

4. 对象IO操作
ObjectInputStream类和ObjectOutputStream类,使用readObject/writeObject方法进行读写。注意需要转型。

5. Serializeable接口
可写入对象流的对象称为可串化的,可串化对象都继承了java.io.Serializable接口,这是一个记号接口。
当一个对象被储存时,对象的类名、类的签名、实例变量的值都被储存,但是静态变量不会被储存。
如果对象中含有不能被串化的实例数据域,必须将该数据域声明为transient才能使得自身可串化。
一个对象第一次被储存时,对象的完整内容及序列号都会被保存,之后再存储该对象,仅仅写入序列号。

6. 随机文件访问
RandomAccessFile类同时继承了DataInput和DataOutput接口。
构造器中可以带mode参数,”rw”表示可读写,”r”表示只读。
读写操作都在一个称为文件指针指示的位置进行。
length()方法返回文件的长度。
sekk()方法在文件中跳跃。

posted @ 2007-04-22 20:25 ZelluX 阅读(307) | 评论 (0)编辑 收藏

2007-02-23 19:38:46

1. Throwable的方法

String getMessage()

String getLocalizedMessage()
String toString()
void printStackTrace()
每个方法都比前一个提供更多的信息

2. 重新抛出异常

catch (Exception e) {

System.err.println(“An exception was thrown”);

throw e;

}

重抛异常会把异常抛给上一级环境中的异常处理程序,同一个try快的后续catch字句将被忽略。

由于只是把当前异常对象重新抛出,printStackTrace()方法显示的将是原来的异常抛出点的调用栈信息,而非重新抛出点的信息。要想更新这个信息,把throw e;改成

throw e.fillInStackTrace();

3. 异常链

有时候你需要处理一个异常并抛出另一个,但仍要保持原异常的信息,这被成为异常链。

Throwable的三个基础子类Error, Exception, RuntimeException都有一个接收cause参数的构造器。如果想建立这三个子类以外的异常链,就得使用initCause()方法。

4. 标准Java异常

Throwable有两个直接子类:Error类代表了系统运行期错误,通常情况不用捕获;Exception类则是Java类库、用户的方法。通常要处理的是Exception

当然,异常类中最重要的还是类名。

异常并非都在java.lang中,有些还在util, net, io等库中。

5. RuntimeException

RuntimeException通常由Java自动抛出,如

if (reference == null) throw new NullPointerException();

是多余的。

如果一个RuntimeException被抛出后一直到main方法也未被处理,printTraceStack()方法被自动调用。

6. finally

没有垃圾收集器或析构函数自动调用的语言中,finally的重要性在于释放内存。而Javafinally则多用在使对象恢复到原来的状态,如打开的文件、网络连接,在屏幕上的绘图等。

7. 异常丢失

try {

lm.f();

} finally {

lm.dispose();

}

如果lm.f()lm.dispose()都会抛出错误的话,f()中抛出的错误会被彻底丢失。C++中就不存在这个问题。

所以对于会抛出错误的方法,最好将他们放入每一个try-catch块中。

posted @ 2007-04-22 20:25 ZelluX 阅读(241) | 评论 (0)编辑 收藏

仅列出标题
共39页: First 上一页 29 30 31 32 33 34 35 36 37 下一页 Last 
posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2007-02-27 20:21:42