博文
正则表达式2(转转)(2012-08-16 16:51:00)
摘要:
3.3 HTML处理实例二
下面我们来看看另一个处理HTML的例子。这一次,我们假定Web服务器从widgets.acme.com移到了newserver.acme.com。现在你要修改一些页面中的链接:
执行这个搜索的正则表达式如图十三所示:
图十三:匹配修改前的链接
如果能够匹配这个正则表达式,你可以用下面的内容替换图十三的链接:
......
正则表达式1(转转)(2012-08-16 16:51:00)
摘要:
在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包。
可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式。正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性。在Unix世界里,正则表达式几乎没有什么限制,可肯定的是,它应用非常之广泛。
正则表达式的引擎已被许多普通的Unix工具所实现,包括grep,awk,vi和Emacs等。此外,许多使用比较广泛的脚本语言也支持正则表达式,比如Python,Tcl,JavaScript,以及最著名的Perl。
我很早以前就是个Perl方面的黑客,如果你和我一样话,你也会非常依赖你手边的这些强大的text-munging工具。近几年来,像其他程序开发者一样,我也越来越关注Java的开发。
Java作为一种开发语言,有许多值得推荐的地方,但是它一直以来没有自带对正则表达式的支持。直到最近,借助于第三方的类库,Java开始支持正则表达式,但这些第三方的类库都不一致、兼容性差,而且维护代码起来很糟糕。这个缺点,对我选择Java作为首要的开发工具来说,一直是个巨大的顾虑之处。
你可以想象,当我知道Sun的Java JDK 1.40版本包含了java.util.regex(一个完全开放、自带的正则表达式包)时,是多么的高兴!很搞笑的说,我花好些时间去挖掘这个被隐藏起来的宝石。我非常惊奇的是,Java这样的一个很大改进(自带了java.util.regex包)为什么不多公开一点呢?!
最近,Java双脚都跳进了正则表达式的世界。java.util.regex包在支持正则表达也有它的过人之处,另外Java也提供详细的相关说明文档。使得朦朦胧胧的regex神秘景象也慢慢被拨开。有一些正则表达式的构成(可能最显著的是,在于糅合了字符类库)在Perl都找不到。
在regex包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。Pattern类是用来表达和陈述所要搜索模式的对象,Matcher类是真正影响搜索的对象。另加一个新的例外类,PatternSyntaxException,当遇到不合法的搜索......
Decorator模式(2012-06-14 11:20:00)
摘要:
Decorator模式
一 意图
动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。——包装器Wrapper。
二 动机
有时我们希望给某个对象而不是整个类添加一些功能。
例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些特性,例如边框,或是一些行为,例如窗口滚动。
使用继承机制是添加功能的一种有效途径,从其他类继承过来的边框特性可以被多个子类的实例所使用。
但这种方法不够灵活,因为边框的选择是静态的,用户不能控制对组件加边框的方式和时机。
一种较为灵活的方式是将组件嵌入另一个对象中,由这个对象添加边框。我们称这个嵌入的对象为装饰。
这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且
可能在转发前后执行一些额外的动作(例如画一个边框)。
透明性使得你可以递归的嵌套多个装饰,从而可以添加任意多的功能,如下图所示。
这样一种结构:
VisualComponent是一个描述可视对象的抽象类,它定义了绘制和事件处理的接口。
注意Decorator类怎样将绘制请求简单地发送给它的组件,以及Decorator的子类如何扩展这个操作。
Decorator的子类为特定功能可以自由地添加一些操作。
例如,如果其他对象知道界面中恰好有一个ScrollDecorator对象,这些对象就可以用ScrollDecorator对象的ScrollTo操作滚动这个界面。
这个模式中有一点很重要,它使得在VisualComponent可以出现的任何地方都可以有装饰。
因此,客户通常不会感觉到装饰过的组件与未装饰组件之间的差异,也不会与装饰产生任何依赖关系。
Decorator中存在一个Component的对象,来接收所要装饰的组件——被装饰。
继承结构来实现:
或者组合的方式:
......
JAVA执行Linux脚本问题(2012-05-04 12:43:00)
摘要:
在项目中需要修改Linux主机信息,于是用了Linux支持的命令来完成操作。
该命令为 /bin/sed -i '1,$'d /var/log/XX.log
调用方法为:
public static InputStream excute(String command) {
InputStream inputStream = null;
System.out.println(command);
try{
Process process = Runtime.getRuntime().exec(command);
inputStream = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
System.out.println(br.readLine());
}catch(Exception e){
e.printStackTrace();
}
return inputStream;
}
发现根本就为清空该log文件。调试了半天不知道什么原因。
我于是在主机上自己新建了一个 shell脚本rmfilecontent 该脚本中写了/bin/sed -i '1,$'d......
java中的io系统总结(转)(2012-04-17 18:13:00)
摘要:
java中的io中的(input/output)stream无非就是包括基于字符的stream、基于字节的stream和把字节导向的stream转换
字符为导向的stream的stream。(很难理解么?)
以字节为导向的stream------InputStream/OutputStream
InputStream
和
OutputStream是两个abstact类,对于字节为导向的stream都扩展这两个鸡肋(基类^_^);
--InputStream
ByteArrayInputStream
-- 把内存中的一个缓冲区作为InputStream使用.
construct---ByteArrayInputStream(byte[])创建一个新字节数组输入流,它从指定字节数组中读取数据。
---ByteArrayInputStream(byte[],
int, int) 创建一个新字节数组输入流,它从指定字节数组中读取数据。
---mark::该字节数组未被复制。
StringBufferInputStream -- 把一个String对象作为InputStream .
注释:不推荐使用
StringBufferInputStream 方法。 此类不能将字符正确的转换为字节。
同 JDK 1.1
版中的类似,从一个串创建一个流的最佳方法是采用 StringReader 类。
construct---StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。
FileInputStream -- 把一个文件作为InputStream,实现对文件的读取操作
construct---FileInputStream(File) 创建一个输入文件流,从指定的 File
对象读取数据。
---FileInputStream(FileDescri......
java 实现ping(2012-03-06 13:18:00)
摘要:一、纯Java实现ICMP的ping命令
import java.io.*;
import java.net.*;
import java.nio.channels.*;
import java.util.*;
import java.util.regex.*;
public class Ping {
static int
DAYTIME_PORT = 13;
static int
port = DAYTIME_PORT;
static class
Target {
InetSocketAddress address;
SocketChannel channel;
Exception failure;
long connectStart;
long connectFinish = 0;
boolean shown = false;
Target(String host) {
try {
 ......
java链接Access数据库(2010-04-07 08:48:00)
摘要:import java.sql.*;
public class dbaccess{
public static void main(String args[]) throws Exception{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String dburl ="jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=Mobile.mdb";//此为NO-DSN方式
//String dburl ="jdbc:odbc:odbcName";//此为ODBC连接方式
Connection conn=DriverManager.getConnection(dburl);
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery("select Top 20 * from MobileSection");
System.out.println("号段\t地区\t类型\t省份\t区号");
while(rs.next()){
System.out.println(rs.getString(1)+"\t"+rs.getString(2)+"\t"+rs.getString(3)+"\t"+rs.getString(4)+"\t"+rs.getString(5));
}
rs.close();
stmt.close();
conn.close();
}
}......
编码与java编码(转载)(2009-09-22 12:06:00)
摘要:编码与java编码(转载)
2009-09-04 02:05
首先讲一下几种字符的编码方式:
1. ASCII码
我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
2、非ASCII编码
英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0—127表示的符号是一样的,不一样的只是128—255的这一段。
至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。
中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。
3.Unicod......
Java读取xml的四种方式(2009-05-20 14:42:00)
摘要: 在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。
预 备
测试环境:
AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server SP4、Sun JDK 1.4.1+Eclipse 2.1+Resin 2.1.8,在 Debug 模式下测试。
XML 文件格式如下:
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NO>A1234</NO>
<ADDR>四川省XX县XX镇XX路X段XX号</ADDR>
</VALUE>
<VALUE>
<NO>B1234</NO>
<ADDR>四川省XX市XX乡XX村XX组</ADDR>
</VALUE>
</RESULT>
测试方法:
采用 JSP 端调用Bean(至于为什么采用JSP来调用,请参考:http://blog.csdn.net/rosen/archive/2004/10/15/138324.aspx),让每一种方案分别解析10K、100K、1000K、10000K的 XML 文件,计算其消耗时间(单位:毫秒)。
JSP 文件:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="com.test.*"%>
<html>
<body>
<%
String args[]={""};
MyXMLReader.main(args);
%>
</body>
</html>
测 试
首先出场的是 DOM......
解决linux上java中文乱码问题(2009-04-21 09:32:00)
摘要:在项目开发的时候,发现在windows下,java中文字符输出正常显示,但移动linux上就变成了??。经过研究发现,windows上的设置是zh_CH(字符集编码是GB2312/GBK),而linux 上是zh_US(字符集编码是ISO-8859-1)。从而导致乱码。
解决方法是:
String oscode=System.getProperty("file.coding"); //是取得系统的编码方式。
String sourceStr="你好";
String targetStr=new String(sourceStr.getBytes("GBK"),sourceStr);
注:linux上用 locale命令就可查询字符设置。......