存档

‘java学习’ 分类的存档

ROME读取RSS

2010年1月20日

Rome是由Sun公司开发的,一个用来操作RSS的java开源库,它可以用来读取和生成RSS。支持的RSS版本从0.90到2.0,同时也支持Atom 0.3和Atom1.0。我现在学习的仅是使用该jar包来读取RSS源,并进行比较简单的操作。

首先,需要加入jar包,ROME.jar,并在程序中引入相应的包

1
2
3
4
5
6
import java.net.URL;
import java.io.InputStreamReader;
import com.sun.syndication.feed.synd.*;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;
import java.util.*;

其次,通过RSS订阅地址创建SyndFeed对象

1
2
3
URL feedUrl=new URL("您的订阅地址");
SyndFeedInput input=new SyndFeedInput();
SyndFeed feed=input.build(new XmlReader(feedUrl));//创建SyndFeed对象

这样就通过Rss或Atom的地址创建了SyndFeed对象,通过SyndFeed,可以获取Rss源返回的信息,如SyndFeed的getEntries方法可以返回一个List列表,用以表示Rss中的每一项内容。

1
2
3
4
5
6
7
List<SyndEntry> entries = feed.getEntries();  
for (SyndEntry entry : entries) {  
String title=entry.getTitle();  
Date publishDate=entry.getPublishedDate();  
String content=entry.getDescription().getValue();  
  ...  
}

java学习

Java常用字符集编码详解

2009年10月30日

转载于:http://ricki-cheung.blogbus.com/logs/49420359.html
Web开发的时候经常会遇到一些字符编码的错误,如页面乱码等问题,所以有必要需对字符编码有所了解。
Java标准字符集:所谓Java标准字符集,就是Java平台支持的字符集:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16。
US-ASCII
US-ASCII,这是一个出现得比较早的字符编码规范;因为它出现比较早,在通用型方面也考虑得比较少,所以也比较简单。一个ASCII字符用一个字节存储,也就是说它可以用来表示256个不同的字符。由于英文大小写字母、阿拉伯数字和标点符号等字符是有限的,所以就把前128个字符作为常用字符,而剩下的高位字符作为扩展字符。这128个字符通常用来表示音标、特殊字符等。
ISO-8859-1
ISO-8859-1也常被称为Latin_1(拉丁1)字符集,像MySQL的默认字符集就是ISO-8859-1,其他它与ASCII编码类似,也是用一个字节表示一个字符,也只用于表示英文字符、数字、符号及特殊字符。它与ASCII唯一的不同在于它是一个国际标准,而ASCII只是一个美国国家标准。
中文字符集
通过对上面两种字符集的了解,如果想用它们来表示中文字符集,显然有些不太现实,因为常用的中文字符都有上千个之多,所以我们需要能表示更多字符的字符集实现中文字符编码。但又为了兼容ASCII编码,中国在ASCII的基础上制定了自己的字符编码规范,也就是我们比较熟悉的GB2312,它的全称是GB2312-80信息交换用汉字编码字符集(基础集)。它能定义了7000多个常用汉字和符号,GB2312的实现是通过使用两个扩展ASCII字符来定义一个中文字符,根据这一特定,我们就可以判断相邻的两个ASCII字符是否为扩展字符,我们就可以确认这两个字符组成一个中文字符,但是在扩展ASCII字符中,也定义了一些其他字符,所以相邻两个ASCII同为扩展字符时,并不能肯定的说它是一个中文字符,处理起来是相当麻烦的。
除了GB2312这个字符集以外,还有几个中文的字符集:Big5、HKSCS、GBK、GB18030。
——>Big5:台湾使用的编码标准,繁体中文字符,字符数也有7000多个。
——>HKSCS:香港使用的编码标准,繁体中文字符,但跟Big5不同
——>GBK:《汉字内码扩展规范》是GB2312的扩展集,不仅增加了大量简体中文字符和符号,也增加了对繁体中文字符的支持,另外还留有用户自定义字符空间,总共字符数在22000左右。
——>GB18030:《信息交换用汉字编码字符集 基本集的扩充》将会成为中国字符编码规范新标准,它兼容GB2312和GBK。
GB2312、Big5、HKSCS是同一时期的产物,虽然都是通过扩展ASCII来实现的,但是它们彼此之间并不兼容,GBK作为GB2312的扩展产物,它几乎涵盖了Big5里所有的繁体字,并将一些不常见的中文字符也添加进入标准,windows操作系统支持的中文字符集也就是GBK;GB18030是2000年制定的标准,它为了兼容GB2312和GBK,保留了双字节编码,同时为了扩展,新增了四字节编码,扩展后的GB18030字符集新增了部分少数民族文字,支持的字符数量比GBK多5000多个。
Unicode
通过对上面知识的学习,你就会觉得Unicode(Universal Multiple-Octet Coded Character Set)的出现是种必然,如果没有一套统一的字符编码标准,我们将举步维艰。Unicode提供了两套字符编码标准:
——>UCS-2(Unicode-16):2个字节字符编码
——>UCS-4(Unicode-32):4个字节字符编码
Unicode编码能支持的字符数相当多,Unicode-16就能定义65535个字符,其中包含了大量中文字符(一个中文字符只暂一位)。
其实Unicode是一种理想化的字符标准,它并没有过多的考虑目前已经存在的字符集标准,它只与ISO-8859-1兼容,但它并不与ASCII兼容,想从ASCII编码转换为Unicode编码相当困难;另外,Unicode里很多字符都有‘0’字节,这将导致C语言会误认为它为字符串结束标志,这是相当可怕的,如果使用了Unicode编码,所有用C语言实现的系统将无法正常工作。这也是为何会出现UTF的原因。
UTF编码
UTF(UCS Transformation Format)实现了Unicode与计算机所使用的编码之间的映射关系。常用的UTF编码有:UTF-8、UTF-16、UTF-7等。
——>UTF-8:是三字节变长字符编码,它能兼容ASCII编码。
——>UTF-16:是Unicode的标准实现,与Unicode编码规范相同
——>UTF-16BE:UTF-16编码big endian,先存放高字节
——>UTF-16LE:UTF-16编码little endian,先存放低字节
其中,big endian和little endian是CPU处理多字节字符的不同方法,因CPU的不同而有所不同。另外,很多人都认为UTF-8和Unicode是一个概念,其实UTF-8只是Unicode标准的一种编码实现,是目前使用得比较多的字符编码格式之一。
PS:一、 各个国家和地区所制定的不同 ANSI 编码(不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码)标准中,都只规定了各自语言所需的“字符”。比如:汉字标准(GB2312)中没有规定韩国语字符怎样存储。这些 ANSI 编码标准所规定的内容包含两层含义:
1.使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。
2.规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。
各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。
“UNICODE 字符集”包含了各种语言中使用到的所有“字符”。用来给 UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-16, UnicodeLittle, UnicodeBig 等。
二、从计算机对多国语言的支持角度看,大致可以分为三个阶段:
  系统内码 说明 系统
阶段一 ASCII 计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。 英文 DOS
阶段二 ANSI编码
(本地化) 为使计算机支持更多语言,通常使用 0×80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 ‘中’ 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。 中文 DOS,中文 Windows 95/98,日文 Windows 95/98
阶段三 UNICODE
(国际化) 为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。
====================================================下面是自己的理解:
一般说来,英文、数字、半角符号,在ANSI和UTF-8编码格式下都占用1个byte;中文,全角标点,在ANSI下占用2个byte,在UTF-8下占用3个byte。看完这篇文章,对lc项目导入Eclipse出现乱码的情况有了一定程度的理解。Eclipse的配置环境是将编码设为UTF-8,这样在新建一个类的时候,默认编码是UTF-8,而原来的类采用的编码均为ANSI,jsp中采用编码为gb2312,可想而知,就出现乱码了。

java学习

socket的一些说明

2009年3月1日

1.

Socket用于与服务器的某个端口建立连接,主动的发送数据(当然连接建立后也能接收数据)。
ServerSocket用于在本机开一个端口,被动的等待数据(用accept方法,该方法的返回值为Socket)并建立连接进行数据交互。

2.

类库:Java有关网络及接口的定义在java.net包中。

3.

ServerSocket构造器是服务器程序运行的基础,它将参数port指定的端口初始化作为该服务器的端口,监听客户机连接请求。仅初始化了ServerSocket是远远不够的,它没有同客户机交互的套接字(Socket),因此需要调用该类的accept方法接受客户呼叫。accept()方法直到有连接请求才返回Socket的实例。通过这个实例的输入、输出流,服务器可以接收用户指令,并将相应结果回应客户机。ServerSocket类的getInetAddress和getLocalPort方法可得到该服务器的IP地址和端口。setSoTimeout和getSoTimeout方法分别是设置和得到服务器超时设置,如果服务器在timout设定时间内还未得到accept方法返回的套接字实例,则抛出IOException的异常。

4.出现:java.net.ConnectException: Connection refused:
connect。此时需要检查端口开放没有,即客户端程序和服务器端程序是否使用同一端口。

5.出现:java.net.SocketException: Connection
reset。该异常是连接重置,即没有把连接关闭,问题出在把sockets关闭前,程序正在
阻塞等待,结果没有把sockets关闭,下一次连接的时候就会抛出这个异常。

java学习

守护线程(精灵线程)

2009年3月1日


守护线程是一类特殊的线程,它和普通线程的区别在于它并不是应用程序的核心部分,当一个应用程序的所有非守护线程终止运行时,即使仍然有守护线程在运行,应用程序也将终止,反之,只要有一个非守护线程在运行,应用程序就不会终止。守护线程一般被用于在后台为其它线程提供服务。


在java中,设置某线程为守护线程(精灵线程),可以通过方法setDaemon(boolean
on)来实现。如果一个线程被设为守护线程或者用户线程,那么该线程处于后台运行,当主线程做完,那么整个程序就结束了,自然而然该线程也就结束了。需要强调的一点是该方法必须在启动线程前调用。



我们也可以通过isDaemon()方法来判断某一个线程是否是精灵线程。


package socket;
import com.SepUserlist;

public class UserTimeOutThread extends Thread{

private SepUserlist sepUserlist=new
SepUserlist();

public UserTimeOutThread(){

this.setDaemon(true);//必须在调用start()方法之前调用

start();

}

public void run(){


//该线程需要做的工作,在这儿是设置每隔5分钟进行一次扫描

while(true){

try{

super.sleep(300000);

}catch(Exception
e){

System.out.println(e.toString());

}

System.out.println(”search
user”);

sepUserlist.TravelVector(SocketConstant.name);

}

}

}

java学习

JNI技术之java程序调用C程序

2009年2月24日

JNI(Java Native
Interface),允许java虚拟机内部运行的java代码能够与其它编程语言编写的应用程序和库进行交互操作。JNI可以理解为Java和本地应用程序之间的中介。

实现JNI的步骤一般包括以下六步:

1.编写java源文件

2.编译java文件

3.用javah
-jni命令编译得到头文件

4.本地方法的实现,用非java语言编写程序源文件

5.创建一个共享库,用cl编译器编译

6.执行java程序

举例如下:

编写java源文件

声明一个native方法:如果将一个方法作为本地方法,那么必须声明为native,并且不能实现。

Load动态库:System.loadLibrary(“Test”):native方法在java中没有实现,但是我们却直接使用,加载动态库的目的就是引入方法的实现。在这儿注意,Test是动态库的名字,但不要加后缀名。

package
jni;

public
class TestJni

{

public native void display(String strName);

static {

System.loadLibrary(”Test”);

}

public static void main(String[] args){

new TestJni().display(”Christmas”);

}

}

编译java源文件

编译得到头文件


javah –jni jni.TestJni编译得到头文件,在当前目录下生成jni_TestJni.h,内容如下

#include
<jni.h>



#ifndef
_Included_jni_TestJni

#define
_Included_jni_TestJni

#ifdef
__cplusplus

extern
“C” {

#endif

JNIEXPORT void JNICALL
Java_jni_TestJni_display



(JNIEnv *, jobject, jstring);



#ifdef
__cplusplus

}

#endif

#endif


该h文件相当于java中的接口,声明了一个JNIEXPORT
void JNICALL Java_jni_TestJni_display(JNIEnv *, jobject,
jstring)方法,然后在本地方法(C语言或其它语言编写的方法)实现本方法,也就是在C语言程序中方法名必须跟这一致。

本地方法的实现

用C语言编写TestJniImp.c文件——主要实现.h中的方法

#include
<jni.h>

#include
“jni_TestJni.h”

#include
<stdio.h>

JNIEXPORT void JNICALL
Java_jni_TestJni_display(JNIEnv *env, jobject arg, jstring
inString){

const jbyte* str;

//从inString字符串取得指向字符串UTF编码的指针

str=(const
jbyte*)env->GetStringUTFChars(inString,JNI_FALSE);

printf(”Hello,%s\n”,str);

//通知本地虚拟机本机代码不再需要通过str访问java字符串

env->ReleaseStringUTFChars(inString,(const
char*)str);

return;



}


创建共享库


cl编译器,命令为:(我所采用的编译器为VS2005下的Visual Studio Tools下的Visual Studio 2005命令提示,相关参数可以输入cl /help查看)

cl -I”C:\Program
Files\Java\jdk1.5.0_12\include” -I”C:\Program
Files\Java\jdk1.5.0_12\include\win32″ -LD “D:\testJni\TestJniImp.c”
-FeTest.dll

该命令的说明:1)”C:\Program
Files\Java\jdk1.5.0_12\include”和”C:\Program
Files\Java\jdk1.5.0_12\include\win32″对应java安装目录下的include文件夹,之所以加引号是因为路径之间有空格,如果不加引号将会导致路径错误2)”D:\testJni\TestJniImp.c”对应将要编译C程序的路径3)-FeTest.dll,Test与load动态库中的参数一致
4)如果后缀名为.c编译出现一些无法解决的错误,可以试着将其改为.cpp

运行java程序

将生成的dll文件放到system32目录下,运行java程序。如果不加入dll文件,将会出现下图界面上面提示的错误。



java学习

InetAddress.getLocalHost().getHostAddress() 问题

2009年2月23日

今天把在Windows下运行很正常的程序拿到Linux下测试,却出现了问题,经过检查发现是InetAddress.getLocalHost().getHostAddress()
取本地IP地址时出现了问题。因为期望得到的IP是222.xxx.xxx.xx,但实际打印出来的IP地址却是127.0.0.1。

查看 /etc/hosts
文件,里面有一条本机名和 222.xxx.xxx.xx这个 IP 对应的记录。把它注释掉,然后修改本机的主机名,又在 hosts
文件中加入主机名和222. xx.xx.xx的对应,问题解决了。

通过问题的解决方法,我们可以发现InetAddress.getLocalHost().getHostAddress()
方法找到本机 IP的实现方法——依靠本机的机器名去查询IP 地址,和 ping `hostname` 返回的 IP
地址是同一个,并不是 ipconfig 方法得到的 eth0 IP 地址。


getHostAddress
() :返回类型是String,返回 IP 地址字符串(以文本表现形式)。


getLocalHost
():返回类型是static InetAddress,返回本地主机。

java学习