Java分类的最新日记
基础:
public String changeCharset(String str)
throws UnsupportedEncodingException {
if (str != null) {
//得到gbk编码的字节串
byte[] bs = str.getBytes("GBK");
System.out.println("gbk:");
System.out.println("hex format is:"+encodeHex(bs));
//得到utf8编码的字节串
byte[] ns = str.getBytes("UTF-8");
System.out.println("utf8:");
System.out.println("hex format is:"+encodeHex(ns));
System.out.println("Bin format is:"+encodeBin(ns)
);
//将编码为utf8的字节串再生成新的字符串,然后解码,看看转换过程中是否出错
String newutf=new String(ns,"UTF-8");
System.out.println("convert back from utf8:"+encodeHex(newutf.getBytes("UTF-8")));
return newutf;
}
public static final String encodeHex (byte[] bytes)
{
StringBuffer buff =
new StringBuffer(bytes.length * 2);
String b;
for (int i=0; i<bytes.length ; i++)
{
b = Integer.toHexString(bytes[i]);
// byte是两个字节的, 而上面的Integer.toHexString会把字节扩展为4个字节
buff.append(b.length() > 2 ? b.substring(6,8) : b);
buff.append(" ");
}
return buff.toString();
}
public static final String encodeBin (byte[] bytes)
{
StringBuffer buff =
new StringBuffer(bytes.length * 2);
String b;
for (int i=0; i<bytes.length ; i++)
{
b = Integer.toBinaryString(bytes[i]);
// byte是两个字节的, 而上面的Integer.toHexString会把字节扩展为4个字节
buff.append(b.substring(24,b.length()));
buff.append(" ");
}
return buff.toString();
}
在Java中,String.getBytes("GBK")获得的是gbk编码的字节串,打印出来之后得到的是对应编码的十进制值,转换成16进制后就和编码表中的值一样了。
最后可以根据输出的二进制编码,和unicode表对比。
示例:
str: 中国
gbk:
hex format is:d6 d0 b9 fa
utf8:
hex format is:e4 b8 ad e5 9b bd
Bin format is:11100100 10111000 10101101 11100101 10011011 10111101
convert back from utf8:e4 b8 ad e5 9b bd
其中,“中”的unicode编码是4e2d,二进制表示为0100 1110 0010 1101,从低位到高位按六位截取及补齐高位后就可以得到11100100 10111000 1010110 ,即为utf8编码。
中文编码基础知识介绍(理论基础)
Java 编程技术中汉字问题的分析及解决
String.getBytes()方法中的中文编码问题 (这篇最为简单易懂且结合实际)
Unicode和UTF-8之间的转换详解
附录:
unicode编码表
GBK 汉字内码扩展规范编码表(二)
代码示例:public String changeCharset(String str)
throws UnsupportedEncodingException {
if (str != null) {
//得到gbk编码的字节串
byte[] bs = str.getBytes("GBK");
System.out.println("gbk:");
System.out.println("hex format is:"+encodeHex(bs));
//得到utf8编码的字节串
byte[] ns = str.getBytes("UTF-8");
System.out.println("utf8:");
System.out.println("hex format is:"+encodeHex(ns));
System.out.println("Bin format is:"+encodeBin(ns)
);
//将编码为utf8的字节串再生成新的字符串,然后解码,看看转换过程中是否出错
String newutf=new String(ns,"UTF-8");
System.out.println("convert back from utf8:"+encodeHex(newutf.getBytes("UTF-8")));
return newutf;
}
public static final String encodeHex (byte[] bytes)
{
StringBuffer buff =
new StringBuffer(bytes.length * 2);
String b;
for (int i=0; i<bytes.length ; i++)
{
b = Integer.toHexString(bytes[i]);
// byte是两个字节的, 而上面的Integer.toHexString会把字节扩展为4个字节
buff.append(b.length() > 2 ? b.substring(6,8) : b);
buff.append(" ");
}
return buff.toString();
}
public static final String encodeBin (byte[] bytes)
{
StringBuffer buff =
new StringBuffer(bytes.length * 2);
String b;
for (int i=0; i<bytes.length ; i++)
{
b = Integer.toBinaryString(bytes[i]);
// byte是两个字节的, 而上面的Integer.toHexString会把字节扩展为4个字节
buff.append(b.substring(24,b.length()));
buff.append(" ");
}
return buff.toString();
}
在Java中,String.getBytes("GBK")获得的是gbk编码的字节串,打印出来之后得到的是对应编码的十进制值,转换成16进制后就和编码表中的值一样了。
最后可以根据输出的二进制编码,和unicode表对比。
示例:
str: 中国
gbk:
hex format is:d6 d0 b9 fa
utf8:
hex format is:e4 b8 ad e5 9b bd
Bin format is:11100100 10111000 10101101 11100101 10011011 10111101
convert back from utf8:e4 b8 ad e5 9b bd
其中,“中”的unicode编码是4e2d,二进制表示为0100 1110 0010 1101,从低位到高位按六位截取及补齐高位后就可以得到11100100 10111000 1010110 ,即为utf8编码。
线程可以共享地址空间。
下面为java实现线程的两种方法,以及启动线程、停止线程、同步线程和线程间通信的Java实现方法。不涉及线程基本理论的讨论。
参考页面:
http://www.3lian.com/zl/2004/10-5/222237.html
http://www.itisedu.com/phrase/200603091754305.html
http://www.javafan.net/article/20040426165025144.html
Java线程要点:
http://www.jdon.com/concurrent/thread.htm
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=126&threadID=19439&tstart=0
下面为java实现线程的两种方法,以及启动线程、停止线程、同步线程和线程间通信的Java实现方法。不涉及线程基本理论的讨论。
参考页面:
http://www.3lian.com/zl/2004/10-5/222237.html
http://www.itisedu.com/phrase/200603091754305.html
http://www.javafan.net/article/20040426165025144.html
Java线程要点:
http://www.jdon.com/concurrent/thread.htm
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=126&threadID=19439&tstart=0
阅读更多细节Java 线程一 基础 (转载)
第一步 ,下载jdk
地址:http://java.sun.com/javase/downloads/index.jsp
选择jdk5.0
第二步,安装
根据下载的不同,有两种安装方法。
如果是rpm.bin文件,则按照下面的方法:先将jdkxxx.bin拷贝到当前目录(/home/hd/java)下,然后执行下面的命令
#chmod a+x jdkxxxx.bin
#./jdkxxxx.bin
然后得到一个rpm文件,继续下面的执行
rpm -i --badreloc --relocate /usr/java=/home/hd/java jdk-1_5_0_10-linux-i586.rpm
执行完后,安装并配置环境变量。
如果直接下载bin的安装包,
则直接进行安装,然后配置环境变量
第三步,环境变量设置,
在终端中输入命令
vi /etc/profile.d/java.sh
这样可以在所有的用户中使用
在新的java.sh中输入以下内容:
#set java environment
export JAVA_HOME=/home/hd/java/jdk1.5.0_10;/home/hd/class
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
其中,/home/hd/class是即将运行class的位置。
地址:http://java.sun.com/javase/downloads/index.jsp
选择jdk5.0
第二步,安装
根据下载的不同,有两种安装方法。
如果是rpm.bin文件,则按照下面的方法:先将jdkxxx.bin拷贝到当前目录(/home/hd/java)下,然后执行下面的命令
#chmod a+x jdkxxxx.bin
#./jdkxxxx.bin
然后得到一个rpm文件,继续下面的执行
rpm -i --badreloc --relocate /usr/java=/home/hd/java jdk-1_5_0_10-linux-i586.rpm
执行完后,安装并配置环境变量。
如果直接下载bin的安装包,
则直接进行安装,然后配置环境变量
第三步,环境变量设置,
在终端中输入命令
vi /etc/profile.d/java.sh
这样可以在所有的用户中使用
在新的java.sh中输入以下内容:
#set java environment
export JAVA_HOME=/home/hd/java/jdk1.5.0_10;/home/hd/class
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
其中,/home/hd/class是即将运行class的位置。
测试一个页面的连接是否成功,可以通过连接的返回值来判断:
try {
boolean fail=true;
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
int a=conn.getResponseCode();
if(a==200){
fail=false;
}else{
fail=true;
}
} catch (IOException e) {
fail=true;
System.out.println("连接:" + urlString + " 时错误,Cause:" + e.getMessage());
}
如果返回值不为200,则连接失败,如果不能建立连接也算失败。即不能连接到该页面。
使用了HttpURLConnection的 int getResponseCode()方法。(Gets the status code from an HTTP response message.)
***********
以下为PHP的实现方法:
1.安装pear
2.安装pear的类库:
HTTP_Client
3.修改php.ini文件中的include_path,设置include_path =".;C:\PHP\PEAR";
重启Apache
4.代码如下:
$url="http://210.34.4.20";
$client = new HTTP_Client(array('allowRedirects' => false));
$client->head($url);
$res = $client->currentResponse();
echo $res['code'];
从而得到header的返回值,然后判断网页是否连通。
参考资料:
HTTP 状态码表示什么意思?
try {
boolean fail=true;
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
int a=conn.getResponseCode();
if(a==200){
fail=false;
}else{
fail=true;
}
} catch (IOException e) {
fail=true;
System.out.println("连接:" + urlString + " 时错误,Cause:" + e.getMessage());
}
如果返回值不为200,则连接失败,如果不能建立连接也算失败。即不能连接到该页面。
使用了HttpURLConnection的 int getResponseCode()方法。(Gets the status code from an HTTP response message.)
***********
以下为PHP的实现方法:
1.安装pear
2.安装pear的类库:
HTTP_Client
3.修改php.ini文件中的include_path,设置include_path =".;C:\PHP\PEAR";
重启Apache
4.代码如下:
$url="http://210.34.4.20";
$client = new HTTP_Client(array('allowRedirects' => false));
$client->head($url);
$res = $client->currentResponse();
echo $res['code'];
从而得到header的返回值,然后判断网页是否连通。
参考资料:
HTTP 状态码表示什么意思?
前段时间因为使用到java进行xml的解析和校验,现在做一个小小的总结:
使用JDOM校验:
但是由于JDOM没有自己的解析器,它使用标准的解析器(如Xerces)来完成这个工作。如果想要进行schema校验必须确保选择了支持这个schema的解析器。
代码如下:
SAXBuilder builder =
new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);
builder.setFeature(
"http://apache.org/xml/features/validation/schema", true);
builder.setProperty(
"http://apache.org/xml/properties/schema/external-schemaLocation",
"http://www.w3.org/2001/12/soap-envelope soap-envelope.xsd" + " " +
"http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd");
Document doc = builder.build(xml);
如果你想要使用JAXP来选择解析器,可以跳过指定类到SAXBuilder结构和用"org.apache.xerces.jaxp.SAXParserFactoryImpl"代替" javax.xml.parsers.SAXParserFactory"作为系统属性。这就告诉JAXP使用Xerces的 factory来创建解析器。可以用命令行来指定这个属性:
java -Djavax.xml.parsers.SAXParserFactory=
org.apache.xerces.jaxp.SAXParserFactoryImpl
以上内容摘自http://www.jdom.org/docs/faq.html How do I validate against a schema when using JDOM?
使用JAXP进行校验:
代码如下:
// 1. Lookup a factory for the W3C XML Schema language
SchemaFactory factory =
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
// 2. Compile the schema.
// Here the schema is loaded from a java.io.File, but you could use
// a java.net.URL or a javax.xml.transform.Source instead.
File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
Schema schema = factory.newSchema(schemaLocation);
// 3. Get a validator from the schema.
Validator validator = schema.newValidator();
// 4. Parse the document you want to check.
Source source = new StreamSource(args[0]);
// 5. Check the document
try {
validator.validate(source);
System.out.println(args[0] + " is valid.");
}
catch (SAXException ex) {
System.out.println(args[0] + " is not valid because ");
System.out.println(ex.getMessage());
}
如果要使用xml自身指定的xsd进行校验,则使用下面的方法:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();
这种方法仅适用于 XSD。
参考文章:
Java 语言的 XML 验证 API (www.ibm.com/developerworks/cn/xml/x-javaxmlvalidapi.html)
JAXP 专述(www-128.ibm.com/developerworks/cn/xml/jaxp/)
用JAXP解析xml:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
org.w3c.dom.Document doc = parser.parse("temp.xml");
//获得根节点元素
Node record=doc.getFirstChild();
由于对xml没有系统的理解,以上仅为粗糙可用的代码,并不理解其中的原理,有待进一步学习。
具体代码见:http://210.34.4.9:8080/svn/SvnTest/datacheck1.0/
使用JDOM校验:
但是由于JDOM没有自己的解析器,它使用标准的解析器(如Xerces)来完成这个工作。如果想要进行schema校验必须确保选择了支持这个schema的解析器。
代码如下:
SAXBuilder builder =
new SAXBuilder("org.apache.xerces.parsers.SAXParser", true);
builder.setFeature(
"http://apache.org/xml/features/validation/schema", true);
builder.setProperty(
"http://apache.org/xml/properties/schema/external-schemaLocation",
"http://www.w3.org/2001/12/soap-envelope soap-envelope.xsd" + " " +
"http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd");
Document doc = builder.build(xml);
如果你想要使用JAXP来选择解析器,可以跳过指定类到SAXBuilder结构和用"org.apache.xerces.jaxp.SAXParserFactoryImpl"代替" javax.xml.parsers.SAXParserFactory"作为系统属性。这就告诉JAXP使用Xerces的 factory来创建解析器。可以用命令行来指定这个属性:
java -Djavax.xml.parsers.SAXParserFactory=
org.apache.xerces.jaxp.SAXParserFactoryImpl
以上内容摘自http://www.jdom.org/docs/faq.html How do I validate against a schema when using JDOM?
使用JAXP进行校验:
代码如下:
// 1. Lookup a factory for the W3C XML Schema language
SchemaFactory factory =
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
// 2. Compile the schema.
// Here the schema is loaded from a java.io.File, but you could use
// a java.net.URL or a javax.xml.transform.Source instead.
File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
Schema schema = factory.newSchema(schemaLocation);
// 3. Get a validator from the schema.
Validator validator = schema.newValidator();
// 4. Parse the document you want to check.
Source source = new StreamSource(args[0]);
// 5. Check the document
try {
validator.validate(source);
System.out.println(args[0] + " is valid.");
}
catch (SAXException ex) {
System.out.println(args[0] + " is not valid because ");
System.out.println(ex.getMessage());
}
如果要使用xml自身指定的xsd进行校验,则使用下面的方法:
SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();
这种方法仅适用于 XSD。
参考文章:
Java 语言的 XML 验证 API (www.ibm.com/developerworks/cn/xml/x-javaxmlvalidapi.html)
JAXP 专述(www-128.ibm.com/developerworks/cn/xml/jaxp/)
用JAXP解析xml:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
org.w3c.dom.Document doc = parser.parse("temp.xml");
//获得根节点元素
Node record=doc.getFirstChild();
由于对xml没有系统的理解,以上仅为粗糙可用的代码,并不理解其中的原理,有待进一步学习。
具体代码见:http://210.34.4.9:8080/svn/SvnTest/datacheck1.0/
第二章内存管理
这章看得不太懂,觉得书上还是没有说明原理,等看到其它的再补充上来吧。
第三章表达式、语句和保留字
使用循环语句的几个建议:
阅读更多细节Java 优化编程阅读笔记二
Java优化编程
林胜利等编著,电子工业出版社
说明:仅记录自己以前不明白或觉得重要的东西。
第一章Java程序设计风格
阅读更多细节Java 优化编程阅读笔记一
