??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
用开攑֮址法解军_H的做法是:当冲H发生时Q用某U探?亦称探测)技术在散列表中形成一个探??序列。沿此序列逐个单元地查找,直到扑ֈl定 的关键字Q或者碰C个开攄地址(卌地址单元为空)为止Q若要插入,在探查到开攄地址Q则可将待插入的新结点存地址单元Q。查找时探查到开攄 地址则表明表中无待查的关键字Q即查找p|?br />注意Q?br />①用开攑֮址法徏立散列表Ӟ前须表中所有单?更严格地_是指单元中存储的关键?|空?br />②I单元的表示与具体的应用相关?br /> 按照形成探查序列的方法不同,可将开攑֮址法区分ؓU性探查法、线性补偿探法、随机探等?br />Q?Q线性探查法(Linear Probing)
该方法的基本思想是:
散列表T[0..m-1]看成是一个@环向量,若初始探查的地址为d(即h(key)=d)Q则最长的探查序列为:
dQd+lQd+2Q?#8230;Qm-1Q?Q?Q?#8230;Qd-1
?探查时从地址d开始,首先探查T[d]Q然后依ơ探查T[d+1]Q?#8230;Q直到T[m-1]Q此后又循环到T[0]QT[1]Q?#8230;Q直到探查到T[d-1]为止?br />探查q程l止于三U情况:
(1)若当前探查的单元为空Q则表示查找p|Q若是插入则key写入其中Q;
(2)若当前探查的单元中含有keyQ则查找成功Q但对于插入意味着p|Q?br /> (3)若探查到T[d-1]时仍未发现空单元也未扑ֈkeyQ则无论是查找还是插入均意味着p|(此时表满)?br />利用开攑֜址法的一般Ş式,U性探查法的探查序列ؓQ?/strong>
hi=(h(key)+i)Qm 0≤i≤m-1 //即di=i
用线性探法处理冲突Q思\清晰Q算法简单,但存在下列缺点:
① 处理溢出需另编E序。一般可另外讄一个溢Q专门用来存放上q哈希表中放不下的记录。此溢出表最单的l构是顺序表Q查找方法可用顺序查找?br />② 按上q算法徏立v来的哈希表,删除工作非常困难。假如要从哈希表 HT 中删除一个记录,按理应将q个记录所在位|置为空Q但我们不能q样做,而只能标上已被删除的标记Q否则,会影响以后的查找?br />③ U性探法很容易生堆聚现象。所谓堆聚现象,是存入哈希表的记录在表中连成一片。按照线性探法处理冲突Q如果生成哈希地址的连l序列愈?( 即不同关键字值的哈希地址盔R在一h?) Q则当新的记录加入该表时Q与q个序列发生冲突的可能性愈大。因此,哈希地址的较长连l序列比较短q箋序列生长得快Q这意味着Q一旦出现堆?( 伴随着冲突 ) Q就引赯一步的堆聚?br />Q?Q线性补偿探法
U性补偿探法的基本思想是:
线性探的步长?1 改ؓ Q Q即上q算法中?j Q?(j Q?1) % m 改ؓQ?j Q?(j Q?Q) % m Q而且要求 Q ?m 是互质的Q以便能探测到哈希表中的所有单元?br />【例?PDP-11 型计算Z的汇~程序所用的W合表,采用此Ҏ来解军_H,所用表?m Q?1321 Q选用 Q Q?25 ?br />
Q?Q随机探?
随机探测的基本思想是:
线性探的步长从常数改为随机数Q即令: j Q?(j Q?RN) % m Q其?RN 是一个随机数。在实际E序中应预先用随机数发生器生一个随机序列,此序列作ؓ依次探测的步ѝ这样就能不同的关键字h不同的探次序,从而可以避 免或减少堆聚。基于与U性探法相同的理由,在线性补偿探法和随机探法中,删除一个记录后也要打上删除标记?br />
2、拉链法
Q?Q拉链法解决冲突的方?br /> 拉链法解军_H的做法是:所有关键字为同义词的结炚w接在同一个单链表中。若选定的散列表长度为mQ则可将散列表定义ؓ一个由m个头指针l成的指针数 lT[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应ؓI指针。在拉链法中Q装填因?#945;可以大于 1Q但一般均?#945;≤1?br />【例】设?m Q?5 Q?H(K) Q?K mod 5 Q关键字值序?5 Q?21 Q?17 Q?9 Q?15 Q?36 Q?41 Q?24 Q按外链地址法所建立的哈希表如下图所C:
Q?Q拉链法的优?br />与开攑֮址法相比,拉链法有如下几个优点Q?/strong>
①拉链法处理冲H简单,且无堆积现象Q即非同义词决不会发生冲H,因此q_查找长度较短Q?br />②׃拉链法中各链表上的结点空间是动态申LQ故它更适合于造表前无法确定表长的情况Q?br />③开攑֮址法ؓ减少冲突Q要求装填因?#945;较小Q故当结点规模较大时会浪费很多空间。而拉链法中可?#945;≥1Q且l点较大Ӟ拉链法中增加的指针域可忽略不计,因此节省I间Q?br />④在用拉链法构造的散列表中Q删除结点的操作易于实现。只要简单地删去链表上相应的l点卛_。而对开攑֜址法构造的散列表,删除l点不能单地被删结 点的I间|ؓI,否则截断在它之后填人散列表的同义词l点的查找\径。这是因为各U开攑֜址法中Q空地址单元(卛_攑֜址)都是查找p|的条件。因此在 用开攑֜址法处理冲H的散列表上执行删除操作Q只能在被删l点上做删除标记Q而不能真正删除结炏V?br />
Q?Q拉链法的缺?br /> 拉链法的~点是:指针需要额外的I间Q故当结点规模较时Q开攑֮址法较省空_而若节省的指针I间用来扩大散列表的规模Q可使装填因子变,q又减少了开攑֮址法中的冲H,从而提高^均查N度?
]]>
]]>
]]>
]]>8859_1 ISO 8859-1
8859_2 ISO 8859-2
8859_3 ISO 8859-3
8859_4 ISO 8859-4
8859_5 ISO 8859-5
8859_6 ISO 8859-6
8859_7 ISO 8859-7
8859_8 ISO 8859-8
8859_9 ISO 8859-9
Big5 Big5 码,J体中文
CNS11643 CNS 11643Q繁体中?br />Cp037 国、加拿大Q两U语aQ法语)、荷兰、葡萄牙、巴ѝ澳大利?br />Cp1006 IBM AIX 巴基斯坦Q乌都语)
Cp1025 IBM 多语U西里尔语:保加利亚、L斯尼?nbsp;、黑塞哥l那、马光 (FYR)
Cp1026 IBM Latin-5Q土耛_
Cp1046 IBM Open Edition US EBCDIC
Cp1097 IBM 伊朗QL斯语Q?波斯
Cp1098 IBM 伊朗QL斯语Q?波斯 (PC)
Cp1112 IBM 拉脱l亚Q立陶宛
Cp1122 IBM 爱沙g
Cp1123 IBM 乌克?br />Cp1124 IBM AIX 乌克?br />Cp1125 IBM 乌克?(PC)
Cp1250 Windows 东欧
Cp1251 Windows 斯拉夫语
Cp1252 Windows Latin-1
Cp1253 Windows 希腊
Cp1254 Windows 土耛_
Cp1255 Windows 希伯?br />Cp1256 Windows 阿拉?br />Cp1257 Windows 波罗的语
Cp1258 Windows 南?br />Cp1381 IBM OS/2, DOS 中华人民共和?(PRC)
Cp1383 IBM AIX 中华人民共和?(PRC)
Cp273 IBM 奥地利、d?br />Cp277 IBM 业w、挪?br />Cp278 IBM 芬兰、瑞?br />Cp280 IBM 意大?br />Cp284 IBM 加泰|尼亚语/西班牙、拉丁美z西班牙?br />Cp285 IBM 英国、爱兰
Cp297 IBM 法国
Cp33722 IBM-eucJP - 日语 (5050 的超?
Cp420 IBM 阿拉?br />Cp424 IBM 希伯?br />Cp437 MS-DOS 国、澳大利亚、新西兰、南?br />Cp500 EBCDIC 500V1
Cp737 PC 希腊
Cp775 PC 波罗的语
Cp838 IBM 泰国扩展 SBCS
Cp850 MS-DOS Latin-1
Cp852 MS-DOS Latin-2
Cp855 IBM 斯拉夫语
Cp857 IBM 土耛_?br />Cp860 MS-DOS 葡萄牙语
Cp861 MS-DOS 冰岛?br />Cp862 PC 希伯?br />Cp863 MS-DOS 加拿大法?br />Cp864 PC 阿拉伯语
Cp865 MS-DOS 日尔D
Cp866 MS-DOS 俄语
Cp868 MS-DOS 巴基斯坦?br />Cp869 IBM C希腊?br />Cp870 IBM 多语U?Latin-2
Cp871 IBM 冰岛?br />Cp874 IBM 泰国?br />Cp875 IBM 希腊?br />Cp918 IBM 巴基斯坦Q乌都语)
Cp921 IBM 拉脱l亚、立陶宛(AIX, DOS)
Cp922 IBM 爱沙g (AIX, DOS)
Cp930 ?4370 UDC 混合的日语,5026 的超?br />Cp933 ?1880 UDC 混合的韩文,5029 的超?br />Cp935 ?1880 UDC 混合的简体中文主机,5031 的超?
Cp937 ?6204 UDC 混合的繁体中文,5033 的超?br />Cp939 ?4370 UDC 混合的日语拉丁字母,5035 的超?br />Cp942 日语 (OS/2)Q?32 的超?
Cp948 OS/2 中文Q台湾)Q?38 集
Cp949 PC 韩文
Cp950 PC 中文Q香港、台湾)
Cp964 AIX 中文Q台湾)
Cp970 AIX 韩文
EUCJIS JIS, EUC ~码、日?br />GB2312 GB2312, EUC ~码、简体中?br />GBK GBK, 体中?br />ISO2022CN ISO 2022 CN, 中文
ISO2022CN_CNS ISO-2022-CN 形式?CNS 11643Q繁体中?
ISO2022CN_GB ISO-2022-CN 形式?GB 2312Q简体中?br />ISO2022KR ISO 2022 KR, 韩文
JIS JIS, 日语
JIS0208 JIS 0208, 日语
KOI8_R KOI8-R, 俄语
KSC5601 KS C 5601, 韩文
MS874 Windows 泰国?br />MacArabic Macintosh 阿拉伯语
MacCentralEurope Macintosh Latin-2
MacCroatian Macintosh 克罗C?br />MacCyrillic Macintosh 斯拉夫语
MacDingbat Macintosh Dingbat
MacGreek Macintosh 希腊?br />MacHebrew Macintosh 希伯p
MacIceland Macintosh 冰岛?br />MacRoman Macintosh |马?br />MacRomania Macintosh |马g?br />MacSymbol Macintosh W号
MacThai Macintosh 泰国?br />MacTurkish Macintosh 土耛_?br />MacUkraine Macintosh 乌克兰语
SJIS Shift-JIS, 日语
UTF8 UTF-8
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ObjectClone {
public static void main(String[] args) throws Exception,
IllegalAccessException, Exception {
Person jack = new Person("jack", 24, "hangzhou");
Person brown = new Person("brown", 54, "hangzhou");
jack.setFather(brown);
brown.setArray(new String[]{"lin","feng"});
String[] arr = { "lin", "fu" };
jack.setArray(arr);
Person lily = new Person();
copyProperties(lily,jack);
jack.getFather().setAddress("shanghai");
jack.setAddress("test");
System.out.println("jack" + jack.toString());
System.out.println("lily" + lily.toString());
System.out.println("jack.father:" + jack.getFather());
System.out.println("lily.father:" + lily.getFather());
}
public static void copyProperties(Object destObj,Object srcObj) throws Exception {
// 取得拯对象的所有域
Field[] fieldsBase = srcObj.getClass().getDeclaredFields();
Field.setAccessible(fieldsBase, true);
// 取得目标对象的所有域
Field[] fieldsObj = destObj.getClass().getDeclaredFields();
Field.setAccessible(fieldsObj, true);
for (int i = 0; i < fieldsObj.length; i++) {
// 取得域名U?br />
Field fieldObj = fieldsObj[i];
for (int j = 0; j < fieldsBase.length; j++) {
Field fieldBase = fieldsBase[j];
// 比较两域名称是否一?br />
if (fieldObj.getName().equals(fieldBase.getName())) {
// 取得域名Uƈ第一个字母大?br />
String fieldName = fieldObj.getName();
String firstChar = fieldName.substring(0, 1).toUpperCase();
fieldName = firstChar + fieldName.substring(1);
// 取得目标对象中的setҎ
Method methodObj = destObj.getClass().getMethod(
"set" + fieldName,
new Class[] { fieldObj.getType() });
// 取得参照对象中的getҎ
Method methodGet = srcObj.getClass().getMethod(
"get" + fieldName, null);
// 执行参照对象的getҎq取得返回?br />
Object resultObj = methodGet.invoke(srcObj, null);
// 执行目标对象的setҎq进行设?br />
methodObj.invoke(destObj, new Object[] { resultObj });
break;
}
}
}
}
// 深层克隆Q主要利用一个递归调用
public static Object cloneExt(Object obj) throws Exception {
// getDeclaredFields得到object内定义的所有field
Field[] fields = obj.getClass().getDeclaredFields();
// 利用newInstanceҎQ生成一个空的Object
Object newObj = obj.getClass().newInstance();
for (int i = 0, j = fields.length; i < j; i++) {
String propertyName = fields[i].getName();
// field的?br />
Object propertyValue = getProperty(obj, propertyName);
// field的类?br />
String propertyType = fields[i].getType().getName();
if (propertyValue != null) {
// 如果field不是8U基本类型,或者StringQ则直接赋?br />
if (propertyType.endsWith("String")
|| "char".equals(propertyType)
|| "int".equals(propertyType)
|| "boolean".equals(propertyType)
|| "byte".equals(propertyType)
|| "short".equals(propertyType)
|| "double".equals(propertyType)
|| "long".equals(propertyType)
|| "float".equals(propertyType)
|| "void".equals(propertyType)) {
setProperty(newObj, propertyName, propertyValue);
} else {
// 如果fieldcd是其他ObjectQ则递归克隆一?br />
Object newPropObj = cloneExt(propertyValue);
setProperty(newObj, propertyName, newPropObj);
}
}
}
return newObj;
}
// 层克隆
public static Object clone(Object obj) throws Exception {
Field[] fields = obj.getClass().getDeclaredFields();
Object newObj = obj.getClass().newInstance();
for (int i = 0, j = fields.length; i < j; i++) {
String propertyName = fields[i].getName();
Object propertyValue = getProperty(obj, propertyName);
setProperty(newObj, propertyName, propertyValue);
}
return newObj;
}
// 反射调用setterҎQ进行赋?br />
private static Object setProperty(Object bean, String propertyName,
Object value) {
Class clazz = bean.getClass();
try {
Field field = clazz.getDeclaredField(propertyName);
Method method = clazz.getDeclaredMethod(getSetterName(field
.getName()), new Class[] { field.getType() });
return method.invoke(bean, new Object[] { value });
} catch (Exception e) {
}
return null;
}
// 反射调用getterҎQ得到field的?br />
private static Object getProperty(Object bean, String propertyName) {
Class clazz = bean.getClass();
try {
Field field = clazz.getDeclaredField(propertyName);
Method method = clazz.getDeclaredMethod(getGetterName(field
.getName()), new Class[] {});
return method.invoke(bean, new Object[] {});
} catch (Exception e) {
}
return null;
}
// Ҏfield名,得到getterҎ?br />
private static String getGetterName(String propertyName) {
String method = "get" + propertyName.substring(0, 1).toUpperCase()
+ propertyName.substring(1);
return method;
}
// Ҏfield名,得到setterҎ?br />
private static String getSetterName(String propertyName) {
String method = "set" + propertyName.substring(0, 1).toUpperCase()
+ propertyName.substring(1);
return method;
}
}
class Person {
private String name;
private int age;
private String address;
// 用于试深层克隆
private Person father;
private String array[] = null;
public Person() {
}
public Person(String name, int age, String address) {
this.name = name;
this.address = address;
this.age = age;
}
public Person(String name, int age, String address, Person father) {
this.name = name;
this.address = address;
this.age = age;
this.father = father;
}
// 所有的getterҎ和setterҎ要求都是publicQ且h一定的命名规则
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person getFather() {
return father;
}
public void setFather(Person father) {
this.father = father;
}
public String toString() {
String sum = "";
for (String s : array) {
sum += " " + s;
}
return "{Name=" + name + ",Age=" + age + ",Address=" + address + sum
+ "}";
}
public String[] getArray() {
return array;
}
public void setArray(String[] array) {
this.array = array;
}
}
import java.util.Random;
public class Consumer implements Runnable {
private Drop drop;
public Consumer(Drop drop) {
this.drop = drop;
}
public void run() {
Random random = new Random();
for (String message = drop.take(); ! message.equals("DONE");
message = drop.take()) {
System.out.format("MESSAGE RECEIVED: %s%n", message);
try {
Thread.sleep(random.nextInt(5000));
} catch (InterruptedException e) {}
}
}
}
import java.util.Random;
public class Producer implements Runnable {
private Drop drop;
public Producer(Drop drop) {
this.drop = drop;
}
public void run() {
String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
Random random = new Random();
for (int i = 0; i < importantInfo.length; i++) {
drop.put(importantInfo[i]);
try {
Thread.sleep(random.nextInt(5000));
} catch (InterruptedException e) {}
}
drop.put("DONE");
}
}
public class Drop {
//Message sent from producer to consumer.
private String message;
//True if consumer should wait for producer to send message, false
//if producer should wait for consumer to retrieve message.
private boolean empty = true;
public synchronized String take() {
//Wait until message is available.
while (empty) {
try {
wait();
} catch (InterruptedException e) {}
}
//Toggle status.
empty = true;
//Notify producer that status has changed.
notifyAll();
return message;
}
public synchronized void put(String message) {
//Wait until message has been retrieved.
while (!empty) {
try {
wait();
} catch (InterruptedException e) {}
}
//Toggle status.
empty = false;
//Store message.
this.message = message;
//Notify consumer that status has changed.
notifyAll();
}
}
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfReader;
public class TestPdf {
private static ArrayList<String> pdffiles = new ArrayList<String>();
/**
* 递归得到特定目录下的所有文?br />
*/
public static void getAllPdfFile(String basedir) {
File dir = new File(basedir);
File[] files = dir.listFiles(new PdfFileFilter());
if (files == null)
return;
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
getAllPdfFile(files[i].getAbsolutePath());
} else {
pdffiles.add(files[i].getAbsolutePath());
}
}
}
/**
* 循环?br />
*/
private static void CheckPdfFiles(ArrayList<String> files) {
for (String file : files) {
boolean flag = false;
flag = check(file);
if (!flag) {
System.out.println(file + "文g损坏");
}
}
}
/**
* 利用itext打开pdf文档
*/
private static boolean check(String file) {
boolean flag1 = false;
int n = 0;
try {
Document document = new Document(new PdfReader(file).getPageSize(1));
document.open();
PdfReader reader = new PdfReader(file);
n = reader.getNumberOfPages();
if (n != 0)
flag1 = true;
document.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
return flag1;
}
public static void main(String[] args) {
getAllPdfFile("C:\\CO_uat\\");
if (pdffiles.size() > 0)
CheckPdfFiles(pdffiles);
System.out.println("No break down file");
}
}
/*
* pdf文gqo?br />
*/
class PdfFileFilter implements FileFilter {
public boolean accept(File file) {
if (file.isFile()) {
String filename = file.getName().toLowerCase();
if (filename.endsWith(".pdf") == true) {
return true;
} else {
return false;
}
} else {
return true;
}
}
}
public class FileTools {
private static final String SPECIAL_FILE_STYLE_PICTURECACHE = "Thumbs.db";
public static final Logger logger = LogManager.getLogger(FileTools.class);
public FileTools()
{
}
/*
* @discription:Delete a folder
* @param:dirPath String
* @return boolean
*/
public static boolean deleteDirectory(String dirPath,boolean deteDirRoot)
{
File parentFile = new File(dirPath);
File[] chirenFile = null;
if(parentFile.exists() && parentFile.isDirectory())
{
chirenFile = parentFile.listFiles();
for (int i = 0; i < chirenFile.length; i++) {
if(!chirenFile[i].isDirectory())
{
chirenFile[i].delete();
}
else
{
deleteDirectory(chirenFile[i].getAbsolutePath(),true);
chirenFile[i].delete();
}
}
if(deteDirRoot)
{
parentFile.delete();
}
return true;
}
else
{
FileTools.logger.error("The Floder Is Not Exist!");
return false;
}
}
/*
* @discription:Copy Folder
* @param:sourceFilePath String,targetFilePath String
* @return boolean
*/
public static boolean copyDirectory(String sourceFilePath,String targetFilePath) throws IOException
{
File sourceFile = new File(sourceFilePath);
File targetFile = new File(targetFilePath);
if(!targetFile.exists())
{
targetFile.mkdir();
}
File[] sourceChirenFile = null;
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
FileTools.logger.debug("Copy "+sourceFile.getName()+" Floder Start......");
if(sourceFile.exists() && sourceFile.isDirectory())
{
sourceChirenFile = sourceFile.listFiles();
for (int i = 0; i < sourceChirenFile.length; i++) {
File tempFile = null;
if(!sourceFilePath.endsWith(File.separator))
{
tempFile = new File(targetFilePath+File.separator+sourceChirenFile[i].getName());
}
else
{
tempFile = new File(targetFilePath+sourceChirenFile[i].getName());
}
if(!FileTools.SPECIAL_FILE_STYLE_PICTURECACHE.equalsIgnoreCase(sourceChirenFile[i].getName()))
{
if(!sourceChirenFile[i].isDirectory())
{
fileInputStream = new FileInputStream(sourceChirenFile[i]);
fileOutputStream = new FileOutputStream(tempFile);
byte[] b = new byte[1024];
FileTools.logger.debug("Copy "+sourceChirenFile[i].getName()+" File Start......");
while(fileInputStream.read(b)!=-1)
{
fileOutputStream.write(b);
}
FileTools.logger.debug("Copy "+sourceChirenFile[i].getName()+" File End!");
fileInputStream.close();
fileOutputStream.close();
}
else
{
copyDirectory(sourceFilePath+File.separator+sourceChirenFile[i].getName(),
targetFilePath+File.separator+sourceChirenFile[i].getName());
}
}
}
FileTools.logger.debug("Copy "+sourceFile.getName()+" Floder End!");
return true;
}
else
{
FileTools.logger.error("The Floder Is Not Exist!");
return false;
}
}
}
Junit试c?
import java.io.IOException;
import org.coolyongzi.FileTools;
import junit.framework.TestCase;
public class FileToolsTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testDeleteDirectory()
{
FileTools.deleteDirectory("F:/复g 囄",false);
}
public void testCopyDirectory()
{
try {
FileTools.copyDirectory("F:/Game","F:/Game1");
} catch (IOException e) {
e.printStackTrace();
}
}
}
许多语言Q包括Perl、PHP、Python、JavaScript和JScriptQ都支持用正则表辑ּ处理文本Q一些文本编辑器用正则表辑ּ实现高“搜烦-替换”功能。那么Java又怎样呢?本文写作Ӟ一个包含了用正则表辑ּq行文本处理的Java规范需求(Specification RequestQ已l得到认可,你可以期待在JDK的下一版本中看到它? |
然而,如果现在需要用正则表辑ּQ又该怎么办呢Q你可以从Apache.org下蝲源代码开攄Jakarta-ORO库。本文接下来的内容先要地介绍正则表达式的入门知识Q然后以Jakarta-ORO APIZ介绍如何使用正则表达式? |
一、正则表辑ּ基础知识 |
我们先从单的开始。假设你要搜索一个包含字W?#8220;cat”的字W串Q搜索用的正则表辑ּ是“cat”。如果搜索对大小写不敏感Q单?#8220;catalog”?#8220;Catherine”?#8220;sophisticated”都可以匹配。也是_ |
![]() |
1.1 句点W号 |
假设你在玩英文拼字游戏,惌扑և三个字母的单词,而且q些单词必须?#8220;t”字母开_?#8220;n”字母l束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内宏V要构造出q个正则表达式,你可以用一个通配W——句点符?#8220;.”。这P完整的表辑ּ是“t.n”Q它匚w“tan”?#8220;ten”?#8220;tin”?#8220;ton”Q还匚w“t#n”?#8220;tpn”甚至“t n”Q还有其他许多无意义的组合。这是因为句点符号匹配所有字W,包括I格、Tab字符甚至换行W: |
![]() |
1.2 ҎL?/strong> |
Z解决句点W号匚w范围q于q泛q一问题Q你可以在方括号Q?#8220;[]”Q里面指定看来有意义的字W。此Ӟ只有Ҏ号里面指定的字符才参与匹配。也是_正则表达?#8220;t[aeio]n”只匹?#8220;tan”?#8220;Ten”?#8220;tin”?#8220;ton”。但“Toon”不匹配,因ؓ在方括号之内你只能匹配单个字W: |
![]() |
1.3 “?#8221;W号 |
如果除了上面匚w的所有单词之外,你还惌匚w“toon”Q那么,你可以?#8220;|”操作W?#8220;|”操作W的基本意义是“?#8221;q算。要匚w“toon”Q?#8220;t(a|e|i|o|oo)n”正则表达式。这里不能用方扩号Q因为方括号只允许匹配单个字W;q里必须使用圆括?#8220;()”。圆括号q可以用来分l,具体请参见后面介l? |
![]() |
1.4 表示匚wơ数的符?/strong> |
表一昄了表C匹配次数的W号Q这些符L来确定紧靠该W号左边的符号出现的ơ数Q? |
|
假设我们要在文本文g中搜索美国的C会安全L。这个号码的格式?99-99-9999。用来匹配它的正则表辑ּ如图一所C。在正则表达式中Q连字符Q?#8220;-”Q有着Ҏ的意义,它表CZ个范_比如??。因此,匚wC会安全L中的q字W号Ӟ它的前面要加上一个{义字W?#8220;\”? |
|
图一Q匹配所?23-12-1234形式的社会安全号?/p> |
假设q行搜烦的时候,你希望连字符号可以出玎ͼ也可以不出现——即Q?99-99-9999?99999999都属于正的格式。这Ӟ你可以在q字W号后面加上“Q?#8221;数量限定W号Q如图二所C: |
|
图二Q匹配所?23-12-1234?23121234形式的社会安全号?/p> |
下面我们再来看另外一个例子。美国汽车牌照的一U格式是四个数字加上二个字母。它的正则表辑ּ前面是数字部?#8220;[0-9]{4}”Q再加上字母部分“[A-Z]{2}”。图三显CZ完整的正则表辑ּ? |
|
图三Q匹配典型的国汽R牌照LQ如8836KV |
1.5 “?#8221;W号 |
“^”W号UCؓ“?#8221;W号。如果用在方括号内,“^”表示不想要匹配的字符。例如,囑֛的正则表辑ּ匚w所有单词,但以“X”字母开头的单词除外? |
|
囑֛Q匹配所有单词,?#8220;X”开头的除外 |
1.6 圆括号和I白W号 |
假设要从格式?#8220;June 26, 1951”的生日日期中提取出月份部分,用来匚w该日期的正则表达式可以如图五所C: |
|
图五Q匹配所有Moth DD,YYYY格式的日?/p> |
新出现的“\s”W号是空白符P匚w所有的I白字符Q包括Tab字符。如果字W串正确匚wQ接下来如何提取出月份部分呢Q只需在月份周围加上一个圆括号创徏一个组Q然后用ORO APIQ本文后面详l讨论)提取出它的倹{修改后的正则表辑ּ如图六所C: |
|
囑օQ匹配所有Month DD,YYYY格式的日期,定义月䆾gؓW一个组 |
1.7 其它W号 |
为简便v见,你可以用一些ؓ常见正则表达式创建的快捷W号。如表二所C: |
表二Q常用符? |
|
例如Q在前面C会安全L的例子中Q所有出?#8220;[0-9]”的地Ҏ们都可以使用“\d”。修改后的正则表辑ּ如图七所C: |
|
图七Q匹配所?23-12-1234格式的社会安全号?/p> |
二、Jakarta-ORO?/span> |
有许多源代码开攄正则表达式库可供JavaE序员用,而且它们中的许多支持Perl 5兼容的正则表辑ּ语法。我在这里选用的是Jakarta-ORO正则表达式库Q它是最全面的正则表辑ּAPI之一Q而且它与Perl 5正则表达式完全兼宏V另外,它也是优化得最好的API之一? |
Jakarta-ORO库以前叫做OROMatcherQDaniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下蝲它? |
我首先将要介l用Jakarta-ORO库时你必d建和讉K的对象,然后介绍如何使用Jakarta-ORO API? |
?PatternCompiler对象 |
首先Q创Z个Perl5Compilercȝ实例Qƈ把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实玎ͼ允许你把正则表达式编译成用来匚w的Pattern对象? |
![]() |
?Pattern对象 |
要把正则表达式编译成Pattern对象Q调用compiler对象的compile()ҎQƈ在调用参C指定正则表达式。例如,你可以按照下面这U方式编译正则表辑ּ“t[aeio]n”Q? |
![]() |
默认情况下,~译器创Z个大写敏感的模式(patternQ。因此,上面代码~译得到的模式只匚w“tin”?#8220;tan”?“ten”?#8220;ton”Q但不匹?#8220;Tin”?#8220;taN”。要创徏一个大写不敏感的模式Q你应该在调用编译器的时候指定一个额外的参数Q? |
![]() |
创徏好Pattern对象之后Q你可以通过PatternMatchercȝ该Pattern对象q行模式匚w? |
?PatternMatcher对象 |
PatternMatcher对象ҎPattern对象和字W串q行匚w查。你要实例化一个Perl5Matchercdƈ把结果赋值给PatternMatcher接口。Perl5MatchercLPatternMatcher接口的一个实玎ͼ它根据Perl 5正则表达式语法进行模式匹配: |
![]() |
使用PatternMatcher对象Q你可以用多个方法进行匹配操作,q些Ҏ的第一个参数都是需要根据正则表辑ּq行匚w的字W串Q? |
· boolean matches(String input, Pattern pattern)Q当输入字符串和正则表达式要_匚w时用。换句话_正则表达式必d整地描述输入字符丌Ӏ? |
· boolean matchesPrefix(String input, Pattern pattern)Q当正则表达式匹配输入字W串起始部分时用? |
· boolean contains(String input, Pattern pattern)Q当正则表达式要匚w输入字符串的一部分时用(卻I它必L一个子Ԍ? |
另外Q在上面三个Ҏ调用中,你还可以用PatternMatcherInput对象作ؓ参数替代String对象Q这Ӟ你可以从字符串中最后一ơ匹配的位置开始l进行匹配。当字符串可能有多个子串匚wl定的正则表辑ּӞ用PatternMatcherInput对象作ؓ参数很有用了。用PatternMatcherInput对象作ؓ参数替代StringӞ上述三个Ҏ的语法如下: |
· boolean matches(PatternMatcherInput input, Pattern pattern) |
· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) |
· boolean contains(PatternMatcherInput input, Pattern pattern) |
三、应用实?/span> |
下面我们来看看Jakarta-ORO库的一些应用实例? |
3.1 日志文g处理 |
dQ分析一个Web服务器日志文Ӟ定每一个用戯在网站上的时间。在典型的BEA WebLogic日志文g中,日志记录的格式如下: |
![]() |
分析q个日志记录Q可以发玎ͼ要从q个日志文g提取的内Ҏ两项QIP地址和页面访问时间。你可以用分l符P圆括P从日志记录提取出IP地址和时间标记? |
首先我们来看看IP地址。IP地址?个字节构成,每一个字节的值在0?55之间Q各个字节通过一个句点分隔。因此,IP地址中的每一个字节有臛_一个、最多三个数字。图八显CZ为IP地址~写的正则表辑ּQ? |
|
囑օQ匹配IP地址 |
IP地址中的句点字符必须q行转义处理Q前面加?#8220;\”Q,因ؓIP地址中的句点h它本来的含义Q而不是采用正则表辑ּ语法中的Ҏ含义。句点在正则表达式中的特D含义本文前面已l介l? |
日志记录的时间部分由一Ҏ括号包围。你可以按照如下思\提取出方括号里面的所有内容:首先搜烦起始Ҏ号字W(“[”Q,提取出所有不过l束Ҏ号字W(“]”Q的内容Q向前寻扄x到结束方括号字符。图九显CZq部分的正则表达式? |
|
图九Q匹配至一个字W,直至扑ֈ“]” |
现在Q把上述两个正则表达式加上分l符P圆括P后合q成单个表达式,q样可以从日志记录提取出IP地址和时间。注意,Z匚w“- -”Q但不提取它Q,正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如囑֍所C? |
|
囑֍Q匹配IP地址和时间标?/p> |
现在正则表达式已l编写完毕,接下来可以编写用正则表辑ּ库的Java代码了? |
Z用Jakarta-ORO库,首先创徏正则表达式字W串和待分析的日志记录字W串Q? |
![]() |
q里使用的正则表辑ּ与图十的正则表达式差不多完全相同Q但有一点例外:在Java中,你必d每一个向前的斜杠Q?#8220;\”Q进行{义处理。图十不是Java的表CŞ式,所以我们要在每?#8220;\”前面加上一?#8220;\”以免出现~译错误。遗憄是,转义处理q程很容易出现错误,所以应该小心}慎。你可以首先输入未经转义处理的正则表辑ּQ然后从左到右依ơ把每一?#8220;\”替换?#8220;\\”。如果要复检Q你可以试着把它输出到屏q上? |
初始化字W串之后Q实例化PatternCompiler对象Q用PatternCompiler~译正则表达式创Z个Pattern对象Q? |
![]() |
现在Q创建PatternMatcher对象Q调用PatternMatcher接口的contain()Ҏ查匹配情况: |
![]() |
接下来,利用PatternMatcher接口q回的MatchResult对象Q输出匹配的l。由于logEntry字符串包含匹配的内容Q你可以看到cd下面的输出: |
![]() |
3.2 HTML处理实例一 |
下面一个Q务是分析HTML面内FONT标记的所有属性。HTML面内典型的FONT标记如下所C: |
![]() |
E序按照如下Ş式,输出每一个FONT标记的属性: |
![]() |
在这U情况下Q我你用两个正则表辑ּ。第一个如囑֍一所C,它从字体标记提取?#8220;"face="Arial, Serif" size="+2" color="red"”? |
|
囑֍一Q匹配FONT标记的所有属?/p> |
W二个正则表辑ּ如图十二所C,它把各个属性分割成名字-值对? |
|
囑֍二:匚w单个属性,q把它分割成名字-值对 |
分割l果为: |
![]() |
现在我们来看看完成这个Q务的Java代码。首先创Z个正则表辑ּ字符Ԍ用Perl5Compiler把它们编译成Pattern对象。编译正则表辑ּ的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项Q得匹配操作不区分大小写? |
接下来,创徏一个执行匹配操作的Perl5Matcher对象? |
![]() |
假设有一个Stringcd的变量htmlQ它代表了HTML文g中的一行内宏V如果html字符串包含FONT标记Q匹配器返回true。此Ӟ你可以用匚w器对象返回的MatchResult对象获得W一个组Q它包含了FONT的所有属性: |
![]() |
接下来创Z个PatternMatcherInput对象。这个对象允怽从最后一ơ匹配的位置开始l进行匹配操作,因此Q它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象Q以参数形式传入待匹配的字符丌Ӏ然后,用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象Q而不是字W串对象Qؓ参数Q反复地调用PatternMatcher对象的contains()Ҏ完成。PatternMatcherInput对象之中的每一ơP代将把它内部的指针向前移动,下一ơ检将从前一ơ匹配位|的后面开始? |
本例的输出结果如下: |
![]() |
3.3 HTML处理实例?/strong> |
下面我们来看看另一个处理HTML的例子。这一ơ,我们假定Web服务器从widgets.acme.comUd了newserver.acme.com。现在你要修改一些页面中的链接: |
![]() |
执行q个搜烦的正则表辑ּ如图十三所C: |
|
囑֍三:匚w修改前的链接 |
如果能够匚wq个正则表达式,你可以用下面的内Ҏ换图十三的链接: |
![]() |
注意#字符的后面加上了$1。Perl正则表达式语法用$1?2{表C已l匹配且提取出来的组。图十三的表辑ּ把所有作Z个组匚w和提取出来的内容附加到链接的后面? |
现在Q返回Java。就象前面我们所做的那样Q你必须创徏试字符Ԍ创徏把正则表辑ּ~译到Pattern对象所必需的对象,以及创徏一个PatternMatcher对象Q?img style="width: 500px; cursor: pointer" alt="" src="http://edu.yesky.com/imagelist/05/10/qg1rzozee4bf.jpg" border="0" /> |
接下来,用com.oroinc.text.regex包Utilcȝsubstitute()静态方法进行替换,输出l果字符Ԍ |
![]() |
Util.substitute()Ҏ的语法如下: |
![]() |
q个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象Q它军_了替换操作如何进行。本例用的是Perl5Substitution对象Q它能够q行Perl5风格的替换。第四个参数是想要进行替换操作的字符Ԍ最后一个参数允许指定是否替换模式的所有匹配子ԌUtil.SUBSTITUTE_ALLQ,或只替换指定的次数? |
【结束语?/strong>在这文章中Q我Z介绍了正则表辑ּ的强大功能。只要正运用,正则表达式能够在字符串提取和文本修改中v到很大的作用。另外,我还介绍了如何在JavaE序中通过Jakarta-ORO库利用正则表辑ּ。至于最l采用老式的字W串处理方式Q用StringTokenizerQcharAtQ和substringQ,q是采用正则表达式,q就有待你自己决定了?/td> |
/**
* Title: Java Bean 工具
* Description:
* Copyright: Copyright (c) 2001
* Company: JAVA世纪|?http://www.java2000.net
* @author 赵学?br />
* @version 1.0
*/
import java.util.*;
import java.util.regex.Pattern;
public class StrTools {
/**
* 分割字符?br />
*
* @param str
* String 原始字符?br />
* @param splitsign
* String 分隔W?br />
* @return String[] 分割后的字符串数l?br />
*/
@SuppressWarnings("unchecked")
public static String[] split(String str, String splitsign) {
int index;
if (str == null || splitsign == null)
return null;
ArrayList al = new ArrayList();
while ((index = str.indexOf(splitsign)) != -1) {
al.add(str.substring(0, index));
str = str.substring(index + splitsign.length());
//System.out.println("str is : " +str);
}
al.add(str);
return (String[]) al.toArray(new String[0]);
}
/**
* 替换字符?br />
*
* @param from
* String 原始字符?br />
* @param to
* String 目标字符?br />
* @param source
* String 母字W串
* @return String 替换后的字符?br />
*/
public static String replace(String from, String to, String source) {
if (source == null || from == null || to == null)
return null;
StringBuffer bf = new StringBuffer("");
int index = -1;
while ((index = source.indexOf(from)) != -1) {
bf.append(source.substring(0, index) + to);
source = source.substring(index + from.length());
index = source.indexOf(from);
}
bf.append(source);
return bf.toString();
}
/**
* 替换字符Ԍ能能够在HTML面上直接显C?替换双引号和于?
*
* @param str
* String 原始字符?br />
* @return String 替换后的字符?br />
*/
public static String htmlencode(String str) {
if (str == null) {
return null;
}
return replace("\"", """, replace("<", "<", str));
}
/**
* 替换字符Ԍ被~码的{换成原始码(替换成双引号和小于号Q?br />
*
* @param str
* String
* @return String
*/
public static String htmldecode(String str) {
if (str == null) {
return null;
}
return replace(""", "\"", replace("<", "<", str));
}
private static final String _BR = "<br/>";
/**
* 在页面上直接昄文本内容Q替换小于号Q空|回RQTAB
*
* @param str
* String 原始字符?br />
* @return String 替换后的字符?br />
*/
public static String htmlshow(String str) {
if (str == null) {
return null;
}
str = replace("<", "<", str);
str = replace(" ", " ", str);
str = replace("\r\n", _BR, str);
str = replace("\n", _BR, str);
str = replace("\t", " ", str);
return str;
}
/**
* q回指定字节长度的字W串
*
* @param str
* String 字符?br />
* @param length
* int 指定长度
* @return String q回的字W串
*/
public static String toLength(String str, int length) {
if (str == null) {
return null;
}
if (length <= 0) {
return "";
}
try {
if (str.getBytes("GBK").length <= length) {
return str;
}
} catch (Exception ex) {
}
StringBuffer buff = new StringBuffer();
int index = 0;
char c;
length -= 3;
while (length > 0) {
c = str.charAt(index);
if (c < 128) {
length--;
} else {
length--;
length--;
}
buff.append(c);
index++;
}
buff.append("...");
return buff.toString();
}
/**
* 判断是否为整?br />
*
* @param str
* 传入的字W串
* @return 是整数返回true,否则q回false
*/
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
/**
* 判断是否为QҎQ包括double和float
*
* @param str
* 传入的字W串
* @return 是QҎq回true,否则q回false
*/
public static boolean isDouble(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");
return pattern.matcher(str).matches();
}
/**
* 判断输入的字W串是否W合Email样式.
*
* @param str
* 传入的字W串
* @return 是Email样式q回true,否则q回false
*/
public static boolean isEmail(String str) {
Pattern pattern = Pattern
.compile("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
return pattern.matcher(str).matches();
}
/**
* 判断输入的字W串是否为纯汉字
*
* @param str
* 传入的字W窜
* @return 如果是纯汉字q回true,否则q回false
*/
public static boolean isChinese(String str) {
Pattern pattern = Pattern.compile("[\u0391-\uFFE5]+$");
return pattern.matcher(str).matches();
}
/**
* 是否为空?包括null?"
*
* @param str
* @return
*/
public static boolean isBlank(String str) {
return str == null || str.trim().length() == 0;
}
/**
* 判断是否?br />
*
* @param x
* @return
*/
public static boolean isPrime(int x) {
if (x <= 7) {
if (x == 2 || x == 3 || x == 5 || x == 7)
return true;
}
int c = 7;
if (x % 2 == 0)
return false;
if (x % 3 == 0)
return false;
if (x % 5 == 0)
return false;
int end = (int) Math.sqrt(x);
while (c <= end) {
if (x % c == 0) {
return false;
}
c += 4;
if (x % c == 0) {
return false;
}
c += 2;
if (x % c == 0) {
return false;
}
c += 4;
if (x % c == 0) {
return false;
}
c += 2;
if (x % c == 0) {
return false;
}
c += 4;
if (x % c == 0) {
return false;
}
c += 6;
if (x % c == 0) {
return false;
}
c += 2;
if (x % c == 0) {
return false;
}
c += 6;
}
return true;
}
public static void main(String[] args) {
String[] numbers = { "12345", "-12345", "123.45", "-123.45", ".12345",
"-.12345", "a12345", "12345a", "123.a45" };
for (String str : numbers) {
System.out
.println(str + "=" + isInteger(str) + " " + isDouble(str));
}
String[] emails = { "1@2.com", "1.2@3.com", "1@3.4.5.com" };
for (String str : emails) {
System.out.println(str + "=" + isEmail(str));
}
String[] chineses = { "中国", "1中国", "中国1", "1中国2", "?? };
for (String str : chineses) {
System.out.println(str + "=" + isChinese(str));
}
String str = "lin@san@fu@2009";
String[] strArray =split(str,"@");
for(String s: strArray)
System.out.println(s);
}
}
-------------------------------------------------------------------------------------------------
/* * Db.java
Created on 2007q??0? 上午 8:37
*/
import java.io.*;
import java.sql.*;
import java.util.Properties;
public class Db {
private String driver;
private String url;
private String user;
private String password;
private Connection conn;
private Statement stm;
private ResultSet rs;
public Db(){
this("DBConf.properties");
}
public Db(String conf) {
loadProperties(conf);
setConn();
}
public Connection getConn(){
return this.conn;
}
//handle the properties file to get the informations for connection
private void loadProperties(String conf){
Properties props = new Properties();
try {
props.load(new FileInputStream(conf));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
this.driver = props.getProperty("driver");
this.url = props.getProperty("url");
this.user = props.getProperty("user");
this.password = props.getProperty("password");
}
//implement the Connection
private void setConn(){
try {
Class.forName(driver);
this.conn = DriverManager.getConnection(url,user,password);
} catch(ClassNotFoundException classnotfoundexception) {
classnotfoundexception.printStackTrace();
System.err.println("db: " + classnotfoundexception.getMessage());
} catch(SQLException sqlexception) {
System.err.println("db.getconn(): " + sqlexception.getMessage());
}
}
public void doInsert(String sql) {
try {
Statement statement = conn.createStatement();
int i = stm.executeUpdate(sql);
} catch(SQLException sqlexception) {
System.err.println("db.executeInset:" + sqlexception.getMessage());
}
}
public void doDelete(String sql) {
try {
stm = conn.createStatement();
int i = stm.executeUpdate(sql);
} catch(SQLException sqlexception) {
System.err.println("db.executeDelete:" + sqlexception.getMessage());
}
}
public void doUpdate(String sql) {
try {
stm = conn.createStatement();
int i = stm.executeUpdate(sql);
} catch(SQLException sqlexception) {
System.err.println("db.executeUpdate:" + sqlexception.getMessage());
}
}
public ResultSet doSelect(String sql) {
try {
stm = conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
rs = stm.executeQuery(sql);
} catch(SQLException sqlexception) {
System.err.println("db.executeQuery: " + sqlexception.getMessage());
}
return rs;
}
public static void main(String[] args){
try{
Db db = new Db();
Connection conn = db.getConn();
if(conn != null && !conn.isClosed()) {
System.out.println("連結成功");
ResultSet rs = db.doSelect("select * from content");
while(rs.next()){
System.out.println(rs.getString(1)+":"+rs.getString(2)+":"+rs.getString(3));
}
rs.close();
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
}
/**
* JAVA里面如何使用一个线E死亡或l束.
* @author 赵学庆,Java世纪|?java2000.net)
*
*/
public class T {
public static void main(String[] args) {
// 启动U程
MyThread thread = new MyThread();
new Thread(thread).start();
// 你的其它的工作,此时U程在运行中
// 你不惌U程q活了,停掉?br />
// 注意Q这只是一个标志,具体U程何时停,q不能精控?br />
thread.allDone = true;
}
}
class MyThread implements Runnable {
boolean volatile allDone = false;
public void run() {
// 每次循环都检标?br />
// 如果讄停止标志时已l在循环?br />
// 则最镉K要等待一个@环的旉才能l止
while (!allDone) {
// 循环里的工作
}
}
}
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/phphot/archive/2008/10/30/3187042.aspx
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import javax.net.ssl.SSLHandshakeException;
/**
* @author lin
*
*/
public class TestURL {
/**
* @param args
*/
public static void main(String[] args) {
String result = "";
try {
java.net.URL url = new java.net.URL("
HttpURLConnection httpConn = (HttpURLConnection) url
.openConnection();
httpConn.setDoOutput(true);
httpConn.setDoInput(true);
httpConn.setRequestMethod("POST");
PrintWriter out = new PrintWriter(httpConn.getOutputStream());
out.println("Email=test@gmail.com" +"password=123456");
out.flush();
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(
httpConn.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result += line + "\n";
}
System.out.println("result: " + result);
in.close();
}catch(SSLHandshakeException se){
System.out.println("error is open");
}
catch (Exception e) {
System.out.println("sucess " + e);
}
}
}
1. 得到某个对象的属?/p>
1 public Object getProperty(Object owner, String fieldName) throws Exception {
2 Class ownerClass = owner.getClass();
3
4 Field field = ownerClass.getField(fieldName);
5
6 Object property = field.get(owner);
7
8 return property;
9 }
Class ownerClass = owner.getClass()Q得到该对象的Class?/p>
Field field = ownerClass.getField(fieldName)Q通过Class得到cd明的属性?/p>
Object property = field.get(owner)Q通过对象得到该属性的实例Q如果这个属性是非公有的Q这里会报IllegalAccessException?/p>
2. 得到某个cȝ静态属?/p>
1 public Object getStaticProperty(String className, String fieldName)
2 throws Exception {
3 Class ownerClass = Class.forName(className);
4
5 Field field = ownerClass.getField(fieldName);
6
7 Object property = field.get(ownerClass);
8
9 return property;
10 }
Class ownerClass = Class.forName(className) Q首先得到这个类的Class?/p>
Field field = ownerClass.getField(fieldName)Q和上面一P通过Class得到cd明的属性?/p>
Object property = field.get(ownerClass) Q这里和上面有些不同Q因属性是静态的Q所以直接从cȝClass里取?/p>
3. 执行某对象的Ҏ
1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
2
3 Class ownerClass = owner.getClass();
4
5 Class[] argsClass = new Class[args.length];
6
7 for (int i = 0, j = args.length; i < j; i++) {
8 argsClass[i] = args[i].getClass();
9 }
10
11 Method method = ownerClass.getMethod(methodName, argsClass);
12
13 return method.invoke(owner, args);
14 }
Class owner_class = owner.getClass() Q首先还是必d到这个对象的Class?/p>
5?行:配置参数的Class数组Q作为寻找Method的条件?/p>
Method method = ownerClass.getMethod(methodName, argsClass)Q通过Method名和参数的Class数组得到要执行的Method?/p>
method.invoke(owner, args)Q执行该MethodQinvokeҎ的参数是执行q个Ҏ的对象,和参数数l。返回值是ObjectQ也既是该方法的q回倹{?/p>
4. 执行某个cȝ静态方?/p>
1 public Object invokeStaticMethod(String className, String methodName,
2 Object[] args) throws Exception {
3 Class ownerClass = Class.forName(className);
4
5 Class[] argsClass = new Class[args.length];
6
7 for (int i = 0, j = args.length; i < j; i++) {
8 argsClass[i] = args[i].getClass();
9 }
10
11 Method method = ownerClass.getMethod(methodName, argsClass);
12
13 return method.invoke(null, args);
14 }
基本的原理和实例3相同Q不同点是最后一行,invoke的一个参数是nullQ因是静态方法,不需要借助实例q行?/p>
5. 新徏实例
1
2 public Object newInstance(String className, Object[] args) throws Exception {
3 Class newoneClass = Class.forName(className);
4
5 Class[] argsClass = new Class[args.length];
6
7 for (int i = 0, j = args.length; i < j; i++) {
8 argsClass[i] = args[i].getClass();
9 }
10
11 Constructor cons = newoneClass.getConstructor(argsClass);
12
13 return cons.newInstance(args);
14
15 }
q里说的Ҏ是执行带参数的构造函数来新徏实例的方法。如果不需要参敎ͼ可以直接使用newoneClass.newInstance()来实现?/p>
Class newoneClass = Class.forName(className)Q第一步,得到要构造的实例的Class?/p>
W?~第9行:得到参数的Class数组?/p>
Constructor cons = newoneClass.getConstructor(argsClass)Q得到构造子?/p>
cons.newInstance(args)Q新建实例?/p>
6. 判断是否为某个类的实?/p>
1 public boolean isInstance(Object obj, Class cls) {
2 return cls.isInstance(obj);
3 }
7. 得到数组中的某个元素
1 public Object getByArray(Object array, int index) {
2 return Array.get(array,index);
3 }
附完整源码:
import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* Java Reflection Cookbook
*
* @author Michael Lee
* @since 2006-8-23
* @version 0.1a
*/
public class Reflection {
/**
* 得到某个对象的公共属?br />
*
* @param owner, fieldName
* @return 该属性对?br />
* @throws Exception
*
*/
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
/**
* 得到某类的静态公共属?br />
*
* @param className cd
* @param fieldName 属性名
* @return 该属性对?br />
* @throws Exception
*/
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}
/**
* 执行某对象方?br />
*
* @param owner
* 对象
* @param methodName
* Ҏ?br />
* @param args
* 参数
* @return Ҏq回?br />
* @throws Exception
*/
public Object invokeMethod(Object owner, String methodName, Object[] args)
throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
/**
* 执行某类的静态方?br />
*
* @param className
* cd
* @param methodName
* Ҏ?br />
* @param args
* 参数数组
* @return 执行Ҏq回的结?br />
* @throws Exception
*/
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class ownerClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(null, args);
}
/**
* 新徏实例
*
* @param className
* cd
* @param args
* 构造函数的参数
* @return 新徏的实?br />
* @throws Exception
*/
public Object newInstance(String className, Object[] args) throws Exception {
Class newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
}
/**
* 是不是某个类的实?br />
* @param obj 实例
* @param cls c?br />
* @return 如果 obj 是此cȝ实例Q则q回 true
*/
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}
/**
* 得到数组中的某个元素
* @param array 数组
* @param index 索引
* @return q回指定数组对象中烦引组件的?br />
*/
public Object getByArray(Object array, int index) {
return Array.get(array,index);
}
}
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/nomads/archive/2006/09/05/1178867.aspx
但是实际应用中,可能会碰到这样两cȝ问题Q?/p>
1.写UnitTest的时候,需要脱d器,手动dxml文g加蝲bean?/p>
2.在一个Web容器中,可能某个q了spring理Q也是一个非beanQ的c,需要感知ƈd某个springҎ的bean?/p>
下面转了2文章,分别是对应上?个问题的解决Ҏ
http://hi.baidu.com/%C9%CF%B5%DB%D2%B2%B7%B8%C0%A7/blog/item/f934474a104c3e2008f7ef66.html
Spring中读取bean配置文g的几U方?nbsp;
BeanFactory允许InputStream作ؓ构造函数的参数Q也可以org.springframework.core.io.Resource接口。下面这个例子是用ClassPathResource作ؓ参数Q?br />
Resource resource = new ClassPathResource("bean.xml");
BeanFactory factory = new XmlBeanFactory(resource);
ActionBean action = (ActionBean) factory.getBean("actionBean");
如果同一个Bean在配|文件有多个bean的定义,则用下面的方法取得所有的对象Q?br />
Resource resource = new ClassPathResource("bean.xml");
ListableBeanFactory factory = new XmlBeanFactory(resource);
Map helloBeans = factory.getBeansOfType(ActionBean.class, false, false);
一个应用程序中往往有很多的Bean要放在配|文Ӟ如果所有的Bean都放在一个文件中Q维护v来就相当的麻烦,q时我们可以按照模块把每个模块用到Bean攑ֈ不同的配|文ӞSpring提供了相应的ҎQ?br />
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);
// 載入bean定義?nbsp;
reader.loadBeanDefinitions(new ClassPathResource("bean1.xml"));
reader.loadBeanDefinitions(new ClassPathResource("bean2.xml"));
....
// 取得Bean
BeanFactory bf = (BeanFactory) reg;
Object o = bf.getBean("actionBean");
===================================================================
d配置文g的几U方?br />
在读spring in aciton Ӟ他用的BeanFactory factory = new XmlBeanFactory(new FileInputStream("hello.xml"));
可是现在的用?.2.6版本的构造器(XmlBeanFactory)只能接收Resource接口了,所以调不出来是正常的事情,假设现在有一个文件hello.xml
dҎ
1:ApplicationContext cx=new FileSystemXmlApplicationContext("hello.xml");//指定的\径去找文?br />
2:ApplicationContext factory = new ClassPathXmlApplicationContext("hello.xml");//q会在classpathL
3:Resource fa = new FileSystemResource("hello.xml");
BeanFactory factory=new XmlBeanFactory(fa);
4:q个要设制classpath了,ȝ
Resource res = new ClassPathResource("com/springinaction/chapter01/hello/hello.xml");
BeanFactory factory=new XmlBeanFactory(res);
好了Q用了上面那U方法都可以调用getBean("your bean name")了,
eg: BeanFactory factory=new XmlBeanFactory(fa);
hello he=(hello)factory.getBean("hello");
he.getHello();
================================================================================
贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰贰?/p>
http://babycountry.spaces.live.com/blog/cns!18767b1e2eb6d0e1!236.entry
spring d注册bean的一些方??
我现在在做的东西,主要用到了框架是struts2+hibernate+spring开发一个上?下蝲,播放视频,听歌的东?在做到获得到注册bean的时?我想通过在web.xml配置context-param中获?但老也不成?后来在网站上看到别h写的,共同分n:
通过几个目的实跉|ȝ一下几U获得spring里注册Bean的方法:
一Q方法一Q多在struts框架中)l承BaseDispatchAction
1234567891011121314151617181920212223242526272829303132333435363738394041 package com.mas.wawacommunity.wap.web.action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.actions.DispatchAction;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.mas.wawacommunity.wap.service.UserManager;
public class BaseDispatchAction extends DispatchAction {
/**
* web应用上下文环境变?br />
*/
protected WebApplicationContext ctx;
protected UserManager userMgr;
/**
* 获得注册Bean
* @param beanName String 注册Bean的名U?br />
* @return
*/
protected final Object getBean(String beanName) {
return ctx.getBean(beanName);
}
protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response) {
return mapping.findForward("index");
}
public void setServlet(ActionServlet servlet) {
this.servlet = servlet;
this.ctx = WebApplicationContextUtils.getWebApplicationContext(servlet.getServletContext());
this.userMgr = (UserManager) getBean("userManager");
}
}
action调用Q?
123456789101112131415161718192021222324252627282930313233343536373839 package com.mas.wawacommunity.wap.web.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import com.mas.wawacommunity.wap.model.News;
import com.mas.wawacommunity.wap.service.NewsManager;
public class NewsAction extends BaseDispatchAction {
NewsManager newsManager;
public void setServlet(ActionServlet servlet) {
super.setServlet(servlet);
newsManager = (NewsManager) this.getBean("newsManager");
}
/**
* 得到新闻列表
* @param mapping
* @param form
* @param request
* @param resp
* @return
*/
public ActionForward getNewsList(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse resp) {
int category = Text.parseInt(request, "category", 0);
int pageNo = Text.parseInt(request, "pageNo", 1);
int pageSize = Text.parseInt(request, "pageSize", 9);
PageRoll pageRoll = newsManager.getAllNews(category, pageNo, pageSize);
request.setAttribute("pageRoll", pageRoll);
return mapping.findForward("news.list");
}
}
二:Ҏ二实现BeanFactoryAware
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 package com.anymusic.oa.commons.service;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
/**
* Created by IntelliJ IDEA.
* User: Weany
* Date: 2006-4-2
* Time: 2:46:51
* To change this template use File | Settings | File Templates.
*/
public class ServiceLocator implements BeanFactoryAware {
private static BeanFactory beanFactory = null;
private static ServiceLocator servlocator = null;
public void setBeanFactory(BeanFactory factory) throws BeansException {
this.beanFactory = factory;
}
public BeanFactory getBeanFactory() {
return beanFactory;
}
/**
* 创徏dBean服务cd?从spring.xml中加?
* <bean id="serviceLocator" class="com.am.oa.commons.service.ServiceLocator" singleton="true" />
*/
public static ServiceLocator getInstance() {
if (servlocator == null)
servlocator = (ServiceLocator) beanFactory.getBean("serviceLocator");
return servlocator;
}
/**
* Ҏ提供的bean名称得到相应的服务类
* @param servName bean名称
*/
public static Object getService(String servName) {
return beanFactory.getBean(servName);
}
/**
* Ҏ提供的bean名称得到对应于指定类型的服务c?br />
* @param servName bean名称
* @param clazz q回的beancd,若类型不匚w,抛出异?br />
*/
public static Object getService(String servName, Class clazz) {
return beanFactory.getBean(servName, clazz);
}
}
action调用:
1234567891011121314151617181920212223242526272829303132333435363738 package com.anymusic.oa.webwork;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.anymusic.oa.commons.service.ServiceLocator;
import com.anymusic.oa.hibernate.pojo.Role;
import com.anymusic.oa.hibernate.pojo.Users;
import com.anymusic.oa.spring.IUserService;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ModelDriven;
public class UserAction extends BaseAction implements Action,ModelDriven{
private Users user = new Users();
protected ServiceLocator service = ServiceLocator.getInstance();
UserService userService = (UserService)service.getService("userService");
public String execute() throws Exception {
return SUCCESS;
}
public Object getModel() {
return user;
}
public String getAllUser(){
HttpServletRequest request = ServletActionContext.getRequest();
List ls=userService.LoadAllObject( Users.class );
request.setAttribute("user",ls);
this.setUrl("/yonghu.jsp");
return SUCCESS;
}
}
三:Ҏ三实现ApplicationContextAware
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 package com.easou.framework.common.util;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext; //Spring应用上下文环?br />
/**
* 实现ApplicationContextAware接口的回调方法,讄上下文环?nbsp;
* @param applicationContext
* @throws BeansException
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
/**
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 获取对象
* @param name
* @return Object 一个以所l名字注册的bean的实?br />
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
/**
* 获取cd为requiredType的对?br />
* 如果bean不能被类型{换,相应的异常将会被抛出QBeanNotOfRequiredTypeExceptionQ?br />
* @param name bean注册?br />
* @param requiredType q回对象cd
* @return Object q回requiredTypecd对象
* @throws BeansException
*/
public static Object getBean(String name, Class requiredType) throws BeansException {
return applicationContext.getBean(name, requiredType);
}
/**
* 如果BeanFactory包含一个与所l名U匹配的bean定义Q则q回true
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
/**
* 判断以给定名字注册的bean定义是一个singletonq是一个prototype?br />
* 如果与给定名字相应的bean定义没有被找刎ͼ会抛出一个异常(NoSuchBeanDefinitionExceptionQ?nbsp;
* @param name
* @return boolean
* @throws NoSuchBeanDefinitionException
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return applicationContext.isSingleton(name);
}
/**
* @param name
* @return Class 注册对象的类?br />
* @throws NoSuchBeanDefinitionException
*/
public static Class getType(String name) throws NoSuchBeanDefinitionException {
return applicationContext.getType(name);
}
/**
* 如果l定的bean名字在bean定义中有别名Q则q回q些别名
* @param name
* @return
* @throws NoSuchBeanDefinitionException
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
return applicationContext.getAliases(name);
}
}
action调用Q?
1234567891011121314151617181920212223242526272829303132333435363738 package com.anymusic.oa.webwork;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.anymusic.oa.commons.service.ServiceLocator;
import com.anymusic.oa.hibernate.pojo.Role;
import com.anymusic.oa.hibernate.pojo.Users;
import com.anymusic.oa.spring.IUserService;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ModelDriven;
public class UserAction extends BaseAction implements Action,ModelDriven{
private Users user = new Users();
UserService userService = (UserService) SpringContextUtil.getBean("userService");
public String execute() throws Exception {
return SUCCESS;
}
public Object getModel() {
return user;
}
public String getAllUser(){
HttpServletRequest request = ServletActionContext.getRequest();
List ls=userService.LoadAllObject( Users.class );
request.setAttribute("user",ls);
this.setUrl("/yonghu.jsp");
return SUCCESS;
}
}
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/d8111/archive/2008/08/31/2856601.aspx
/*** Java对象排序?U实现方?/
*/
/**Ҏ2 */
* 使用Collections.sort(List)实现Q对象必d现Comparable接口q复写compareTo()Ҏ */
*/
/** * Ҏ1需?/p> */
*/
|
Extract "jcom222.zip". And copy jcom.jar and jcom.dll to the following directories
jcom.dll -> (java.home)/bin/
jcom.jar -> (java.home)/lib/ext/
make sure the JAVA_HOME evironmental variable has been set, ie.
(java.home) == java.lang.System.getProperty("java.home");
import jp.ne.so_net.ga2.no_ji.jcom.ReleaseManager;
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelApplication;
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorkbook;
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorkbooks;
import jp.ne.so_net.ga2.no_ji.jcom.excel8.ExcelWorksheet;
public class JCom {
public boolean print(String fname) {
ReleaseManager rm = new ReleaseManager();
try {
ExcelApplication excel = new ExcelApplication(rm);
ExcelWorkbooks xlBooks = excel.Workbooks();
ExcelWorkbook xlBook = xlBooks.Open(fname);
ExcelWorksheet xlSheet = excel.ActiveSheet();
xlSheet.PrintOut();
xlBook.Close(false, null, false);
excel.Quit();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
rm.release();
}
return true;
}
public static void main(String[] args) {
JCom test = new JCom();
try {
//test.p
test.print("d:/test.xls");
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;
/**
* @author lin
*
*/
public class DirList {
//not using final in anonymous inner class
public static FilenameFilter filter(final String regex){//注意此处?final
return new FilenameFilter(){
private Pattern pattern = Pattern.compile(regex);
public boolean accept(File dir, String name) {
return pattern.matcher(
new File(name).getName()).matches();
}
};
}
/**
* @param args
*/
public static void main(String[] args) {
File path = new File(".");
String [] list;
if(args.length==0)
list=path.list();
else
list=path.list(filter(args[0]));
for(int i=0;i<list.length;i++)
System.out.println(list[i]);
}
}