/**
* 将某个日期以固定格式转化成字符串
*
* @param date
* @return String
*/
public
static
String
dateToStr
(
java
.
util
.
Date
date
)
{
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
)
;
String
str
=
sdf
.
format
(
date
)
;
return
str
;
}
/**
* 判断任意一个整数是否素数
*
* @param n
* @return boolean
*/
public
static
boolean
isPrimes
(
int
n
)
{
for
(
int
i
=
2
;
i
<=
Math
.
sqrt
(
n
)
;
i
++
)
{
if
(
n
%
i
==
0
)
{
return
false
;
}
}
return
true
;
}
/**
* 获得任意一个整数的阶乘,递归
*
* @param n
* @return n!
*/
public
static
int
factorial
(
int
n
)
{
if
(
n
==
1
)
{
return
1
;
}
return
n
*
factorial
(
n
-
1
)
;
}
/**
* 将指定byte数组以16进制的形式打印到控制台
*
* @param hint
* String
* @param b
* byte[]
* @return void
*/
public
static
void
printHexString
(
String
hint
,
byte
[
]
b
)
{
System
.
out
.
print
(
hint
)
;
for
(
int
i
=
0
;
i
<
b
.
length
;
i
++
)
{
String
hex
=
Integer
.
toHexString
(
b
&
0xFF
)
;
if
(
hex
.
length
(
)
==
1
)
{
hex
=
'0'
+
hex
;
}
System
.
out
.
print
(
hex
.
toUpperCase
(
)
+
" "
)
;
}
System
.
out
.
println
(
""
)
;
}
package
net
.
java2000
.
tools
;
/**
* Title: Java Bean 工具
* @version 1.0
*/
import
java
.
util
.
*
;
import
java
.
util
.
regex
.
Pattern
;
public
class
StrTools
{
/**
* 分割字符串
*
* @param str String 原始字符串
* @param splitsign String 分隔符
* @return String[] 分割后的字符串数组
*/
@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
(
)
)
;
}
al
.
add
(
str
)
;
return
(
String
[
]
)
al
.
toArray
(
new
String
[
0
]
)
;
}
/**
* 替换字符串
*
* @param from String 原始字符串
* @param to String 目标字符串
* @param source String 母字符串
* @return String 替换后的字符串
*/
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页面上直接显示(替换双引号和小于号)
*
* @param str String 原始字符串
* @return String 替换后的字符串
*/
public
static
String
htmlencode
(
String
str
)
{
if
(
str
==
null
)
{
return
null
;
}
return
replace
(
"\""
,
"""
,
replace
(
"<"
,
"<"
,
str
)
)
;
}
/**
* 替换字符串,将被编码的转换成原始码(替换成双引号和小于号)
*
* @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/>"
;
/**
* 在页面上直接显示文本内容,替换小于号,空格,回车,TAB
*
* @param str String 原始字符串
* @return String 替换后的字符串
*/
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
;
}
/**
* 返回指定字节长度的字符串
*
* @param str String 字符串
* @param length int 指定长度
* @return String 返回的字符串
*/
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
(
)
;
}
/**
* 判断是否为整数
*
* @param str 传入的字符串
* @return 是整数返回true,否则返回false
*/
public
static
boolean
isInteger
(
String
str
)
{
Pattern
pattern
=
Pattern
.
compile
(
"^[-\\+]?[\\d]*$"
)
;
return
pattern
.
matcher
(
str
)
.
matches
(
)
;
}
/**
* 判断是否为浮点数,包括double和float
*
* @param str 传入的字符串
* @return 是浮点数返回true,否则返回false
*/
public
static
boolean
isDouble
(
String
str
)
{
Pattern
pattern
=
Pattern
.
compile
(
"^[-\\+]?[.\\d]*$"
)
;
return
pattern
.
matcher
(
str
)
.
matches
(
)
;
}
/**
* 判断输入的字符串是否符合Email样式.
*
* @param str 传入的字符串
* @return 是Email样式返回true,否则返回false
*/
public
static
boolean
isEmail
(
String
str
)
{
Pattern
pattern
=
Pattern
.
compile
(
"^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"
)
;
return
pattern
.
matcher
(
str
)
.
matches
(
)
;
}
/**
* 判断输入的字符串是否为纯汉字
*
* @param str 传入的字符窜
* @return 如果是纯汉字返回true,否则返回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
;
}
/**
* 判断是否为质数
*
* @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"
,
"中1国"
}
;
for
(
String
str
:
chineses
)
{
System
.
out
.
println
(
str
+
"="
+
isChinese
(
str
)
)
;
}
}
}
/* * Db.java
Created on 2007年8月20日, 上午 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
(
)
;
}
}
}
DBConf
.
properties
:
driver
=
oracle
.
jdbc
.
driver
.
OracleDriver
url
=
jdbcracle
:
thintdt151
:
1521
:
train
user
=
XX
password
=
XX
/**
* 人民币转成大写
*
* @param value
* @return String
*/
public
static
String
hangeToBig
(
double
value
)
{
char
[
]
hunit
=
{
'拾'
,
'佰'
,
'仟'
}
;
// 段内位置表示
char
[
]
vunit
=
{
'万'
,
'亿'
}
;
// 段名表示
char
[
]
digit
=
{
'零'
,
'壹'
,
'贰'
,
'叁'
,
'肆'
,
'伍'
,
'陆'
,
'柒'
,
'捌'
,
'玖'
}
;
// 数字表示
long
midVal
=
(
long
)
(
value
*
100
)
;
// 转化成整形
String
valStr
=
String
.
valueOf
(
midVal
)
;
// 转化成字符串
String
head
=
valStr
.
substring
(
0
,
valStr
.
length
(
)
-
2
)
;
// 取整数部分
String
rail
=
valStr
.
substring
(
valStr
.
length
(
)
-
2
)
;
// 取小数部分
String
prefix
=
""
;
// 整数部分转化的结果
String
suffix
=
""
;
// 小数部分转化的结果
// 处理小数点后面的数
if
(
rail
.
equals
(
"00"
)
)
{
// 如果小数部分为0
suffix
=
"整"
;
}
else
{
suffix
=
digit
[
rail
.
charAt
(
0
)
-
'0'
]
+
"角"
+
digit
[
rail
.
charAt
(
1
)
-
'0'
]
+
"分"
;
// 否则把角分转化出来
}
// 处理小数点前面的数
char
[
]
chDig
=
head
.
toCharArray
(
)
;
// 把整数部分转化成字符数组
char
zero
=
'0'
;
// 标志'0'表示出现过0
byte
zeroSerNum
=
0
;
// 连续出现0的次数
for
(
int
i
=
0
;
i
<
chDig
.
length
;
i
++
)
{
// 循环处理每个数字
int
idx
=
(
chDig
.
length
-
i
-
1
)
%
4
;
// 取段内位置
int
vidx
=
(
chDig
.
length
-
i
-
1
)
/
4
;
// 取段位置
if
(
chDig
==
'0'
)
{
// 如果当前字符是0
zeroSerNum
++
;
// 连续0次数递增
if
(
zero
==
'0'
)
{
// 标志
zero
=
digit
[
0
]
;
}
else
if
(
idx
==
0
&&
vidx
>
0
&&
zeroSerNum
<
4
)
{
prefix
+=
vunit
[
vidx
-
1
]
;
zero
=
'0'
;
}
continue
;
}
zeroSerNum
=
0
;
// 连续0次数清零
if
(
zero
!=
'0'
)
{
// 如果标志不为0,则加上,例如万,亿什么的
prefix
+=
zero
;
zero
=
'0'
;
}
prefix
+=
digit
[
chDig
-
'0'
]
;
// 转化该数字表示
if
(
idx
>
0
)
prefix
+=
hunit
[
idx
-
1
]
;
if
(
idx
==
0
&&
vidx
>
0
)
{
prefix
+=
vunit
[
vidx
-
1
]
;
// 段结束位置应该加上段名如万,亿
}
}
if
(
prefix
.
length
(
)
>
0
)
prefix
+=
'圆'
;
// 如果整数部分存在,则有圆的字样
return
prefix
+
suffix
;
// 返回正确表示
}
/**
* 全角字符转半角字符
*
* @param QJStr
* @return String
*/
public
static
final
String
QJToBJChange
(
String
QJStr
)
{
char
[
]
chr
=
QJStr
.
toCharArray
(
)
;
String
str
=
""
;
for
(
int
i
=
0
;
i
<
chr
.
length
;
i
++
)
{
chr
=
(
char
)
(
(
int
)
chr
-
65248
)
;
str
+=
chr
;
}
return
str
;
}
/**
* 去掉字符串中重复的子字符串
*
* @param str
* @return String
*/
private
static
String
removeSameString
(
String
str
)
{
Set
<String>
mLinkedSet
=
new
LinkedHashSet
<String>
(
)
;
String
[
]
strArray
=
str
.
split
(
" "
)
;
StringBuffer
sb
=
new
StringBuffer
(
)
;
for
(
int
i
=
0
;
i
<
strArray
.
length
;
i
++
)
{
if
(
!
mLinkedSet
.
contains
(
strArray
)
)
{
mLinkedSet
.
add
(
strArray
)
;
sb
.
append
(
strArray
+
" "
)
;
}
}
System
.
out
.
println
(
mLinkedSet
)
;
return
sb
.
toString
(
)
.
substring
(
0
,
sb
.
toString
(
)
.
length
(
)
-
1
)
;
}
/**
* 设置JSpinner的编辑属性
* @param spinner 目标JSpinner
* @param isAllowInvalid 是否允许输入非法值
* @param isEditable 是否允许编辑
*/
public
static
void
setAllowsInvalid
(
JSpinner
spinner
,
boolean
isAllowInvalid
,
boolean
isEditable
)
{
JSpinner
.
NumberEditor
editor
=
new
JSpinner
.
NumberEditor
(
spinner
,
"#"
)
;
spinner
.
setEditor
(
editor
)
;
JFormattedTextField
tf
=
(
(
JSpinner
.
NumberEditor
)
spinner
.
getEditor
(
)
)
.
getTextField
(
)
;
tf
.
setEditable
(
isEditable
)
;
DefaultFormatterFactory
factory
=
(
DefaultFormatterFactory
)
tf
.
getFormatterFactory
(
)
;
NumberFormatter
formatter
=
(
NumberFormatter
)
factory
.
getDefaultFormatter
(
)
;
formatter
.
setAllowsInvalid
(
isAllowInvalid
)
;
}
/**
* 根据指定方法的参数去构造一个新的对象的拷贝并将他返回
* @param obj 原始对象
* @return 新对象
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SecurityException
* @throws IllegalArgumentException
*/
@SuppressWarnings
(
"unchecked"
)
public
static
Object
copy
(
Object
obj
)
throws
IllegalArgumentException
,
SecurityException
,
InstantiationException
,
IllegalAccessException
,
InvocationTargetException
,
NoSuchMethodException
{
//获得对象的类型
Class
classType
=
obj
.
getClass
(
)
;
//通过默认构造方法去创建一个新的对象,getConstructor的视其参数决定调用哪个构造方法
Object
objectCopy
=
classType
.
getConstructor
(
new
Class
[
]
{
}
)
.
newInstance
(
new
Object
[
]
{
}
)
;
//获得对象的所有属性
Field
[
]
fields
=
classType
.
getDeclaredFields
(
)
;
for
(
int
i
=
0
;
i
<
fields
.
length
;
i
++
)
{
//获取数组中对应的属性
Field
field
=
fields
;
String
fieldName
=
field
.
getName
(
)
;
String
stringLetter
=
fieldName
.
substring
(
0
,
1
)
.
toUpperCase
(
)
;
//获得相应属性的getXXX和setXXX方法名称
String
getName
=
"get"
+
stringLetter
+
fieldName
.
substring
(
1
)
;
String
setName
=
"set"
+
stringLetter
+
fieldName
.
substring
(
1
)
;
//获取相应的方法
Method
getMethod
=
classType
.
getMethod
(
getName
,
new
Class
[
]
{
}
)
;
Method
setMethod
=
classType
.
getMethod
(
setName
,
new
Class
[
]
{
field
.
getType
(
)
}
)
;
//调用源对象的getXXX()方法
Object
value
=
getMethod
.
invoke
(
obj
,
new
Object
[
]
{
}
)
;
//调用拷贝对象的setXXX()方法
setMethod
.
invoke
(
objectCopy
,
new
Object
[
]
{
value
}
)
;
}
return
objectCopy
;
}
//过滤特殊字符
public
static
String
encoding
(
String
src
)
{
if
(
src
==
null
)
return
""
;
StringBuilder
result
=
new
StringBuilder
(
)
;
if
(
src
!=
null
)
{
src
=
src
.
trim
(
)
;
for
(
int
pos
=
0
;
pos
<
src
.
length
(
)
;
pos
++
)
{
switch
(
src
.
charAt
(
pos
)
)
{
case
'\"'
:
result
.
append
(
"""
)
;
break
;
case
'<'
:
result
.
append
(
"<"
)
;
break
;
case
'>'
:
result
.
append
(
">"
)
;
break
;
case
'\''
:
result
.
append
(
"'"
)
;
break
;
case
'&'
:
result
.
append
(
"&"
)
;
break
;
case
'%'
:
result
.
append
(
"&pc;"
)
;
break
;
case
'_'
:
result
.
append
(
"&ul;"
)
;
break
;
case
'#'
:
result
.
append
(
"&shap;"
)
;
break
;
case
'?'
:
result
.
append
(
"&ques;"
)
;
break
;
default
:
result
.
append
(
src
.
charAt
(
pos
)
)
;
break
;
}
}
}
return
result
.
toString
(
)
;
}
//反过滤特殊字符
public
static
String
decoding
(
String
src
)
{
if
(
src
==
null
)
return
""
;
String
result
=
src
;
result
=
result
.
replace
(
"""
,
"\""
)
.
replace
(
"'"
,
"\'"
)
;
result
=
result
.
replace
(
"<"
,
"<"
)
.
replace
(
">"
,
">"
)
;
result
=
result
.
replace
(
"&"
,
"&"
)
;
result
=
result
.
replace
(
"&pc;"
,
"%"
)
.
replace
(
"&ul"
,
"_"
)
;
result
=
result
.
replace
(
"&shap;"
,
"#"
)
.
replace
(
"&ques"
,
"?"
)
;
return
result
;
}
//利用反射调用一个继承层次上的函数族,比如安装程序,有安装数据库的,安装文件系统的等,命名均已“install”开始,你就可以将参数part设为“install”,src是其实类实例,root是终止父类
public
static
<T>
void
invokeMethods
(
String
part
,
T
src
,
Class
root
)
throws
ExceptionManager
{
if
(
root
!=
null
)
{
if
(
!
root
.
isInstance
(
src
)
)
return
;
root
=
(
Class
)
root
.
getGenericSuperclass
(
)
;
}
HashMap
<
String
,
Method
>
invokees
=
new
HashMap
<
String
,
Method
>
(
)
;
Class
target
=
src
.
getClass
(
)
;
do
{
Method
[
]
methods
=
target
.
getDeclaredMethods
(
)
;
for
(
Method
method
:
methods
)
{
String
mn
=
method
.
getName
(
)
;
Boolean
isPass
=
mn
.
startsWith
(
part
)
;
if
(
isPass
)
{
Integer
nopt
=
method
.
getParameterTypes
(
)
.
length
;
Boolean
isStatic
=
Modifier
.
isStatic
(
method
.
getModifiers
(
)
)
;
if
(
(
nopt
==
0
)
&&
(
!
isStatic
)
)
{
if
(
!
invokees
.
containsKey
(
mn
)
)
invokees
.
put
(
mn
,
method
)
;
}
}
}
target
=
(
Class
)
target
.
getGenericSuperclass
(
)
;
}
while
(
target
!=
root
)
;
Iterator
<String>
methods
=
invokees
.
keySet
(
)
.
iterator
(
)
;
while
(
methods
.
hasNext
(
)
)
{
Method
invokee
=
invokees
.
get
(
methods
.
next
(
)
)
;
Boolean
access
=
invokee
.
isAccessible
(
)
;
invokee
.
setAccessible
(
true
)
;
try
{
invokee
.
invoke
(
src
)
;
}
catch
(
InvocationTargetException
e
)
{
throw
ExceptionManager
.
wrap
(
e
.
getTargetException
(
)
)
;
}
catch
(
Exception
e
)
{
}
invokee
.
setAccessible
(
access
)
;
}
}
MySQL:
String
Driver
=
"com.mysql.jdbc.Driver"
;
//驱动程序
String
URL
=
"jdbc:mysql://localhost:3306/db_name"
;
//连接的URL,db_name为数据库名
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
new
Instance
(
)
;
Connection
con
=
DriverManager
.
getConnection
(
URL
,
Username
,
Password
)
;
Microsoft
SQL
Server
2.0驱动
(
3个
jar的那个
)
:
String
Driver
=
"com.microsoft.jdbc.sqlserver.SQLServerDriver"
;
//连接SQL数据库的方法
String
URL
=
"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name"
;
//db_name为数据库名
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
new
Instance
(
)
;
//加载数据可驱动
Connection
con
=
DriverManager
.
getConnection
(
URL
,
UserName
,
Password
)
;
//
Microsoft
SQL
Server
3.0驱动
(
1个
jar的那个
)
:
// 老紫竹完善
String
Driver
=
"com.microsoft.sqlserver.jdbc.SQLServerDriver"
;
//连接SQL数据库的方法
String
URL
=
"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=db_name"
;
//db_name为数据库名
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
new
Instance
(
)
;
//加载数据可驱动
Connection
con
=
DriverManager
.
getConnection
(
URL
,
UserName
,
Password
)
;
//
Sysbase
:
String
Driver
=
"com.sybase.jdbc.SybDriver"
;
//驱动程序
String
URL
=
"jdbc:Sysbase://localhost:5007/db_name"
;
//db_name为数据可名
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
newInstance
(
)
;
Connection
con
=
DriverManager
.
getConnection
(
URL
,
Username
,
Password
)
;
Oracle
(用
thin模式
)
:
String
Driver
=
"oracle.jdbc.driver.OracleDriver"
;
//连接数据库的方法
String
URL
=
"jdbcracle:thinloaclhost:1521rcl"
;
//orcl为数据库的SID
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
newInstance
(
)
;
//加载数据库驱动
Connection
con
=
DriverManager
.
getConnection
(
URL
,
Username
,
Password
)
;
PostgreSQL
:
String
Driver
=
"org.postgresql.Driver"
;
//连接数据库的方法
String
URL
=
"jdbc:postgresql://localhost/db_name"
;
//db_name为数据可名
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
newInstance
(
)
;
Connection
con
=
DriverManager
.
getConnection
(
URL
,
Username
,
Password
)
;
DB2:
String
Driver
=
"com.ibm.db2.jdbc.app.DB2.Driver"
;
//连接具有DB2客户端的Provider实例
//String Driver="com.ibm.db2.jdbc.net.DB2.Driver"; //连接不具有DB2客户端的Provider实例
String
URL
=
"jdbc:db2://localhost:5000/db_name"
;
//db_name为数据可名
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
newInstance
(
)
;
Connection
con
=
DriverManager
.
getConnection
(
URL
,
Username
,
Password
)
;
Informix
:
String
Driver
=
"com.informix.jdbc.IfxDriver"
;
String
URL
=
"jdbc:Informix-sqli://localhost:1533/db_name:INFORMIXSER=myserver"
;
//db_name为数据可名
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
newInstance
(
)
;
Connection
con
=
DriverManager
.
getConnection
(
URL
,
Username
,
Password
)
;
JDBC
-
ODBC
:
String
Driver
=
"sun.jdbc.odbc.JdbcOdbcDriver"
;
String
URL
=
"jdbcdbc:dbsource"
;
//dbsource为数据源名
String
Username
=
"username"
;
//用户名
String
Password
=
"password"
;
//密码
Class
.
forName
(
Driver
)
.
newInstance
(
)
;
Connection
con
=
DriverManager
.
getConnection
(
URL
,
Username
,
Password
)
;
/**
* 把TXT转换为XML
*/
import
java
.
io
.
BufferedReader
;
import
java
.
io
.
BufferedWriter
;
import
java
.
io
.
FileReader
;
import
java
.
io
.
FileWriter
;
import
java
.
util
.
StringTokenizer
;
public
class
TxtToXml
{
private
String
strTxtFileName
;
private
String
strXmlFileName
;
public
TxtToXml
(
)
{
strTxtFileName
=
new
String
(
)
;
strXmlFileName
=
new
String
(
)
;
}
public
void
createXml
(
String
strTxt
,
String
strXml
)
{
strTxtFileName
=
strTxt
;
strXmlFileName
=
strXml
;
String
strTmp
;
try
{
BufferedReader
inTxt
=
new
BufferedReader
(
new
FileReader
(
strTxtFileName
)
)
;
BufferedWriter
outXml
=
new
BufferedWriter
(
new
FileWriter
(
strXmlFileName
)
)
;
outXml
.
write
(
"<?xml version= \"1.0\" encoding=\"gb2312\"?>"
)
;
outXml
.
newLine
(
)
;
outXml
.
write
(
"<people>"
)
;
while
(
(
strTmp
=
inTxt
.
readLine
(
)
)
!=
null
)
{
StringTokenizer
strToken
=
new
StringTokenizer
(
strTmp
,
","
)
;
String
arrTmp
[
]
;
arrTmp
=
new
String
[
3
]
;
for
(
int
i
=
0
;
i
<
3
;
i
++
)
arrTmp
=
new
String
(
""
)
;
int
index
=
0
;
outXml
.
newLine
(
)
;
outXml
.
write
(
" <students>"
)
;
while
(
strToken
.
hasMoreElements
(
)
)
{
strTmp
=
(
String
)
strToken
.
nextElement
(
)
;
strTmp
=
strTmp
.
trim
(
)
;
arrTmp
[
index
++
]
=
strTmp
;
}
outXml
.
newLine
(
)
;
outXml
.
write
(
" <name>"
+
arrTmp
[
0
]
+
"</name>"
)
;
outXml
.
newLine
(
)
;
outXml
.
write
(
" <sex>"
+
arrTmp
[
1
]
+
"</sex>"
)
;
outXml
.
newLine
(
)
;
outXml
.
write
(
" <age>"
+
arrTmp
[
2
]
+
"</age>"
)
;
outXml
.
newLine
(
)
;
outXml
.
write
(
" </students>"
)
;
}
outXml
.
newLine
(
)
;
outXml
.
write
(
"</people>"
)
;
outXml
.
flush
(
)
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
}
}
public
static
void
main
(
String
[
]
args
)
{
String
txtName
=
"testtxt.txt"
;
String
xmlName
=
"testxml.xml"
;
TxtToXml
thisClass
=
new
TxtToXml
(
)
;
thisClass
.
createXml
(
txtName
,
xmlName
)
;
}
}
/**
* 写入日志
* filePath 日志文件的路径
* code 要写入日志文件的内容
*/
public
static
boolean
print
(
String
filePath
,
String
code
)
{
try
{
File
tofile
=
new
File
(
filePath
)
;
FileWriter
fw
=
new
FileWriter
(
tofile
,
true
)
;
BufferedWriter
bw
=
new
BufferedWriter
(
fw
)
;
PrintWriter
pw
=
new
PrintWriter
(
bw
)
;
System
.
out
.
println
(
getDate
(
)
+
":"
+
code
)
;
pw
.
println
(
getDate
(
)
+
":"
+
code
)
;
pw
.
close
(
)
;
bw
.
close
(
)
;
fw
.
close
(
)
;
return
true
;
}
catch
(
IOException
e
)
{
return
false
;
}
}
/**
* 判断是不是合法手机
* handset 手机号码
*/
public
static
boolean
isHandset
(
String
handset
)
{
try
{
if
(
!
handset
.
substring
(
0
,
1
)
.
equals
(
"1"
)
)
{
return
false
;
}
if
(
handset
==
null
||
handset
.
length
(
)
!=
11
)
{
return
false
;
}
String
check
=
"^[0123456789]+$"
;
Pattern
regex
=
Pattern
.
compile
(
check
)
;
Matcher
matcher
=
regex
.
matcher
(
handset
)
;
boolean
isMatched
=
matcher
.
matches
(
)
;
if
(
isMatched
)
{
return
true
;
}
else
{
return
false
;
}
}
catch
(
RuntimeException
e
)
{
return
false
;
}
}
}
字符串匹配的算法
.
public
String
getMaxMatch
(
String
a
,
String
b
)
{
StringBuffer
tmp
=
new
StringBuffer
(
)
;
String
maxString
=
""
;
int
max
=
0
;
int
len
=
0
;
char
[
]
aArray
=
a
.
toCharArray
(
)
;
char
[
]
bArray
=
b
.
toCharArray
(
)
;
int
posA
=
0
;
int
posB
=
0
;
while
(
posA
<
aArray
.
length
-
max
)
{
posB
=
0
;
while
(
posB
<
(
bArray
.
length
-
max
)
)
{
if
(
aArray
[
posA
]
==
bArray
[
posB
]
)
{
len
=
1
;
tmp
=
new
StringBuffer
(
)
;
tmp
.
append
(
aArray
[
posA
]
)
;
while
(
(
posA
+
len
<
aArray
.
length
)
&&
(
posB
+
len
<
bArray
.
length
)
&&
(
aArray
[
posA
+
len
]
==
bArray
[
posB
+
len
]
)
)
{
tmp
.
append
(
aArray
[
posA
+
len
]
)
;
len
++
;
}
if
(
len
>
max
)
{
max
=
len
;
maxString
=
tmp
.
toString
(
)
;
}
}
posB
++
;
}
posA
++
;
}
return
maxString
;
}
import
java
.
text
.
DecimalFormat
;
import
java
.
util
.
Arrays
;
/**
* 时间计算工具类
*/
public
class
Time
{
/**
* 时间字段常量,表示“秒”
*/
public
final
static
int
SECOND
=
0
;
/**
* 时间字段常量,表示“分”
*/
public
final
static
int
MINUTE
=
1
;
/**
* 时间字段常量,表示“时”
*/
public
final
static
int
HOUR
=
2
;
/**
* 时间字段常量,表示“天”
*/
public
final
static
int
DAY
=
3
;
/**
* 各常量允许的最大值
*/
private
final
int
[
]
maxFields
=
{
59
,
59
,
23
,
Integer
.
MAX_VALUE
-
1
}
;
/**
* 各常量允许的最小值
*/
private
final
int
[
]
minFields
=
{
0
,
0
,
0
,
Integer
.
MIN
_VALUE
}
;
/**
* 默认的字符串格式时间分隔符
*/
private
String
timeSeparator
=
":"
;
/**
* 时间数据容器
*/
private
int
[
]
fields
=
new
int
[
4
]
;
/**
* 无参构造,将各字段置为 0
*/
public
Time
(
)
{
this
(
0
,
0
,
0
,
0
)
;
}
/**
* 使用时、分构造一个时间
* @param hour 小时
* @param minute 分钟
*/
public
Time
(
int
hour
,
int
minute
)
{
this
(
0
,
hour
,
minute
,
0
)
;
}
/**
* 使用时、分、秒构造一个时间
* @param hour 小时
* @param minute 分钟
* @param second 秒
*/
public
Time
(
int
hour
,
int
minute
,
int
second
)
{
this
(
0
,
hour
,
minute
,
second
)
;
}
/**
* 使用一个字符串构造时间<br/>
* Time time = new Time("14:22:23");
* @param time 字符串格式的时间,默认采用“:”作为分隔符
*/
public
Time
(
String
time
)
{
this
(
time
,
null
)
;
}
/**
* 使用天、时、分、秒构造时间,进行全字符的构造
* @param day 天
* @param hour 时
* @param minute 分
* @param second 秒
*/
public
Time
(
int
day
,
int
hour
,
int
minute
,
int
second
)
{
set
(
DAY
,
day
)
;
set
(
HOUR
,
hour
)
;
set
(
MINUTE
,
minute
)
;
set
(
SECOND
,
second
)
;
}
/**
* 使用一个字符串构造时间,指定分隔符<br/>
* Time time = new Time("14-22-23", "-");
* @param time 字符串格式的时间
*/
public
Time
(
String
time
,
String
timeSeparator
)
{
if
(
timeSeparator
!=
null
)
{
setTimeSeparator
(
timeSeparator
)
;
}
String
pattern
=
patternQuote
(
this
.
timeSeparator
)
;
String
matcher
=
new
StringBuffer
(
)
.
append
(
"\\d+?"
)
.
append
(
pattern
)
.
append
(
"\\d+?"
)
.
append
(
pattern
)
.
append
(
"\\d+?"
)
.
toString
(
)
;
if
(
!
time
.
matches
(
matcher
)
)
{
throw
new
IllegalArgumentException
(
time
+
", time format error, HH"
+
this
.
timeSeparator
+
"mm"
+
this
.
timeSeparator
+
"ss"
)
;
}
String
[
]
times
=
time
.
split
(
pattern
)
;
set
(
DAY
,
0
)
;
set
(
HOUR
,
Integer
.
parseInt
(
times
[
0
]
)
)
;
set
(
MINUTE
,
Integer
.
parseInt
(
times
[
1
]
)
)
;
set
(
SECOND
,
Integer
.
parseInt
(
times
[
2
]
)
)
;
}
/**
* 设置时间字段的值
* @param field 时间字段常量
* @param value 时间字段的值
*/
public
void
set
(
int
field
,
int
value
)
{
if
(
value
<
minFields
[
field
]
)
{
throw
new
IllegalArgumentException
(
value
+
", time value must be positive."
)
;
}
fields
[
field
]
=
value
%
(
maxFields
[
field
]
+
1
)
;
// 进行进位计算
int
carry
=
value
/
(
maxFields
[
field
]
+
1
)
;
if
(
carry
>
0
)
{
int
upFieldValue
=
get
(
field
+
1
)
;
set
(
field
+
1
,
upFieldValue
+
carry
)
;
}
}
/**
* 获得时间字段的值
* @param field 时间字段常量
* @return 该时间字段的值
*/
public
int
get
(
int
field
)
{
if
(
field
<
0
||
field
>
fields
.
length
-
1
)
{
throw
new
IllegalArgumentException
(
field
+
", field value is error."
)
;
}
return
fields
[
field
]
;
}
/**
* 将时间进行“加”运算,即加上一个时间
* @param time 需要加的时间
* @return 运算后的时间
*/
public
Time
addTime
(
Time
time
)
{
Time
result
=
new
Time
(
)
;
int
up
=
0
;
// 进位标志
for
(
int
i
=
0
;
i
<
fields
.
length
;
i
++
)
{
int
sum
=
fields
+
time
.
fields
+
up
;
up
=
sum
/
(
maxFields
+
1
)
;
result
.
fields
=
sum
%
(
maxFields
+
1
)
;
}
return
result
;
}
/**
* 将时间进行“减”运算,即减去一个时间
* @param time 需要减的时间
* @return 运算后的时间
*/
public
Time
subtractTime
(
Time
time
)
{
Time
result
=
new
Time
(
)
;
int
down
=
0
;
// 退位标志
for
(
int
i
=
0
,
k
=
fields
.
length
-
1
;
i
<
k
;
i
++
)
{
int
difference
=
fields
+
down
;
if
(
difference
>=
time
.
fields
)
{
difference
-=
time
.
fields
;
down
=
0
;
}
else
{
difference
+=
maxFields
+
1
-
time
.
fields
;
down
=
-
1
;
}
result
.
fields
=
difference
;
}
result
.
fields
[
DAY
]
=
fields
[
DAY
]
-
time
.
fields
[
DAY
]
+
down
;
return
result
;
}
/**
* 获得时间字段的分隔符
* @return
*/
public
String
getTimeSeparator
(
)
{
return
timeSeparator
;
}
/**
* 设置时间字段的分隔符(用于字符串格式的时间)
* @param timeSeparator 分隔符字符串
*/
public
void
setTimeSeparator
(
String
timeSeparator
)
{
this
.
timeSeparator
=
timeSeparator
;
}
/**
* 正则表达式引用处理方法,源自 JDK @link java.util.regex.Pattern#quote(String)
*/
private
String
patternQuote
(
String
s
)
{
int
slashEIndex
=
s
.
indexOf
(
"\\E"
)
;
if
(
slashEIndex
==
-
1
)
return
"\\Q"
+
s
+
"\\E"
;
StringBuilder
sb
=
new
StringBuilder
(
s
.
length
(
)
*
2
)
;
sb
.
append
(
"\\Q"
)
;
slashEIndex
=
0
;
int
current
=
0
;
while
(
(
slashEIndex
=
s
.
indexOf
(
"\\E"
,
current
)
)
!=
-
1
)
{
sb
.
append
(
s
.
substring
(
current
,
slashEIndex
)
)
;
current
=
slashEIndex
+
2
;
sb
.
append
(
"\\E\\\\E\\Q"
)
;
}
sb
.
append
(
s
.
substring
(
current
,
s
.
length
(
)
)
)
;
sb
.
append
(
"\\E"
)
;
return
sb
.
toString
(
)
;
}
public
String
toString
(
)
{
DecimalFormat
df
=
new
DecimalFormat
(
"00"
)
;
return
new
StringBuffer
(
)
.
append
(
fields
[
DAY
]
)
.
append
(
", "
)
.
append
(
df
.
format
(
fields
[
HOUR
]
)
)
.
append
(
timeSeparator
)
.
append
(
df
.
format
(
fields
[
MINUTE
]
)
)
.
append
(
timeSeparator
)
.
append
(
df
.
format
(
fields
[
SECOND
]
)
)
.
toString
(
)
;
}
public
int
hashCode
(
)
{
final
int
PRIME
=
31
;
int
result
=
1
;
result
=
PRIME
*
result
+
Arrays
.
hashCode
(
fields
)
;
return
result
;
}
public
boolean
equals
(
Object
obj
)
{
if
(
this
==
obj
)
return
true
;
if
(
obj
==
null
)
return
false
;
if
(
getClass
(
)
!=
obj
.
getClass
(
)
)
return
false
;
final
Time
other
=
(
Time
)
obj
;
if
(
!
Arrays
.
equals
(
fields
,
other
.
fields
)
)
{
return
false
;
}
return
true
;
}
}
ISBN(国际标准书号)的校验
public
class
Test
{
public
static
void
main
(
String
[
]
args
)
{
System
.
out
.
println
(
"9787302155638 "
+
ISBN
.
checkISBN
(
"9787302155638"
)
)
;
System
.
out
.
println
(
"7564105607 "
+
ISBN
.
checkISBN
(
"7564105607"
)
)
;
System
.
out
.
println
(
"730213880X "
+
ISBN
.
checkISBN
(
"730213880X"
)
)
;
System
.
out
.
println
(
"7302138800 "
+
ISBN
.
checkISBN
(
"7302138800"
)
)
;
System
.
out
.
println
(
"9790000000000 "
+
ISBN
.
checkISBN
(
"9790000000000"
)
)
;
try
{
System
.
out
.
println
(
ISBN
.
checkISBN
(
"9770000000000"
)
)
;
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
"9770000000000 "
+
e
.
getMessage
(
)
)
;
}
try
{
System
.
out
.
println
(
ISBN
.
checkISBN
(
"123456545"
)
)
;
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
"123456545 "
+
e
.
getMessage
(
)
)
;
}
}
}
public
final
class
ISBN
{
/**
* 根据输入的ISBN号,检验ISBN的有效性。依据 GB/T 5795-2006 和 ISO 2108:2005 ISBN
* 10位标准和13位标准实现(13位标准自2007年1月1日开始实行,在此之前采用10位标准)。
*
* @param String isbn:需要进行校验的ISBN字符串
* @return true:所输入的ISBN校验正确;<br/> false:所输入的ISBN校验错误
*/
public
static
boolean
checkISBN
(
String
isbn
)
{
int
count
=
0
;
int
checkBitInt
=
0
;
// 将ISBN数据全取大写字母
//isbn = isbn.toUpperCase();
char
[
]
cs
=
isbn
.
toCharArray
(
)
;
switch
(
isbn
.
length
(
)
)
{
case
10
:
// ****************************************************************
// 当ISBN为10位时,进行的校验,用于2007年1月1日前的出版物
// 数据格式:从左至右前9位为ISBN数据,第10位为校验位
// 校验方法:
// (1) 从左至右将前9位数据从10开始至2进行编号,作为位权
// (2) 将9位数据与各位位权进行加权,并求其9位和(称为加权和,记作M)
// (3) 第10位校验位计算方法,校验位为C:
// M + C ≡ 0 (mod 11)
// C为10时,记作“X”
// ****************************************************************
// 取出前9位数字进行加权和计算
for
(
int
i
=
0
;
i
<
9
;
i
++
)
{
// 若前9位数据中有非数字字符,则抛出异常
if
(
cs
<
'0'
||
cs
>
'9'
)
{
throw
new
ISBNFormatException
(
"ISBN "
+
isbn
+
" 第 "
+
(
i
+
1
)
+
" 位中出现非法字符 "
+
cs
)
;
}
int
c
=
cs
-
'0'
;
// 求加权和
count
+=
c
*
(
10
-
i
)
;
}
// 取出校验位数据0~9和X符合校验字符要求
if
(
cs
[
9
]
>=
'0'
&&
cs
[
9
]
<=
'9'
)
{
checkBitInt
=
cs
[
9
]
-
'0'
;
}
else
if
(
cs
[
9
]
==
'X'
||
cs
[
9
]
==
'x'
)
{
// 校验位中的“X”表示数据“10”
checkBitInt
=
10
;
}
else
{
// 非0~9或X时抛出异常
throw
new
ISBNFormatException
(
"ISBN "
+
isbn
+
" 第 10 位中出现非法字符 "
+
cs
[
9
]
)
;
}
// 进行校验
if
(
(
count
+
checkBitInt
)
%
11
==
0
)
{
return
true
;
// 校验成功
}
else
{
return
false
;
// 校验失败
}
case
13
:
// ****************************************************************
// 当ISBN为13位时,进行的校验,用于2007年1月1日后的出版物
// 数据格式:从左至右前12位为ISBN数据,第13位为校验位
// 校验方法:
// (1) 从左至右将前12位数的取其奇位数和和偶位数和
// (2) 将偶位数和乘3,并其与奇位数和的和,得加权和
// (3) 第13位校验位计算方法,校验位为C:
// M + C ≡ 0 (mod 10)
// ****************************************************************
// ISBN为13位数据时,前3位目前只能是“978”(已实行)或“979”(暂未实行)
if
(
!
isbn
.
startsWith
(
"978"
)
&&
!
isbn
.
startsWith
(
"979"
)
)
{
throw
new
ISBNFormatException
(
"ISBN-13 格式不符合标准"
)
;
}
// 取出前12位数字进行加权和计算
int
countEven
=
0
;
int
countOdd
=
0
;
for
(
int
i
=
0
;
i
<
12
;
i
++
)
{
int
c
=
cs
-
'0'
;
// 若前12位数据中有非数字字符,则抛出异常
if
(
c
<
0
||
c
>
9
)
{
throw
new
ISBNFormatException
(
"ISBN "
+
isbn
+
" 第 "
+
(
i
+
1
)
+
" 位中出现非法字符 "
+
cs
)
;
}
// 分别计算奇位数和偶位数的和
if
(
(
i
&
0x1
)
==
0
)
{
countOdd
+=
c
;
}
else
{
countEven
+=
c
;
}
}
// 求加权和
count
=
countOdd
+
(
countEven
*
3
)
;
// 取出校验位数据
if
(
cs
[
12
]
<
'0'
||
cs
[
12
]
>
'9'
)
{
// 校验位为非0~9字符时,抛出异常
throw
new
ISBNFormatException
(
"ISBN "
+
isbn
+
" 第 13 位中出现非法字符 "
+
cs
[
12
]
)
;
}
checkBitInt
=
cs
[
12
]
-
'0'
;
// 进行校验
if
(
(
count
+
checkBitInt
)
%
10
==
0
)
{
return
true
;
// 校验成功
}
else
{
return
false
;
// 校验失败
}
default
:
// ISBN为非10位或13位时抛出异常
throw
new
ISBNFormatException
(
"ISBN 格式不符合标准"
)
;
}
}
}
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Iterator
;
import
java
.
util
.
LinkedHashMap
;
import
java
.
util
.
List
;
import
java
.
util
.
Map
;
/**
* JSON utility class
*
* @since 2008-04-21
*/
public
class
Json
{
// test
public
static
void
main
(
String
[
]
args
)
{
Json
json1
=
new
Json
(
)
;
json1
.
add
(
"totalCount"
,
2
)
;
json1
.
add
(
"isTest"
,
true
)
;
Json
json_a
=
new
Json
(
)
;
json_a
.
add
(
"menuid"
,
1
)
;
json_a
.
add
(
"menuname"
,
"testmenu"
)
;
json1
.
add
(
"topics"
,
json_a
)
;
Json
json_b
=
new
Json
(
)
;
json_b
.
add
(
"menuid"
,
2
)
;
json_b
.
add
(
"menuname"
,
"testmenu"
)
;
json1
.
add
(
"topics"
,
json_b
)
;
System
.
out
.
println
(
json1
.
toString
(
)
)
;
}
private
Map
map
=
new
LinkedHashMap
(
)
;
/**
* 添加一个 JSON 属性,值为一个字符串,重复添加时产生数组<p/>
*
* add("name", "value");<br/>
* 添加一个字符串,产生的 JSON 如:{"name":"value"}<p/>
*
* add("name", "value1");<br/>
* add("name", "value2");<br/>
* 添加两个同属性的字符串,产生的 JSON 如:{"name":["value1", "value2"]}<p/>
*
* @param key JSON 属性名
* @param str 字符串格式的属性值
*/
public
void
add
(
String
key
,
String
value
)
{
addElement
(
key
,
value
)
;
}
public
void
add
(
String
key
,
int
num
)
{
addElement
(
key
,
new
Integer
(
num
)
)
;
}
public
void
add
(
String
key
,
boolean
b
)
{
addElement
(
key
,
new
Boolean
(
b
)
)
;
}
/**
* 添加一个 JSON 属性,值为一个 JSON,重复添加时产生 JSON 数组<p/>
*
* Json json1 = new Json();<br/>
* json1.add("name1", "value1");<br/>
* json1.add("name2", "value2");<br/>
* Json json = new Json();<br/>
* json.add("message", json1);<br/>
* 添加一个 JSON,产生的 JSON 如:{"message":{"name1":"value1", "name2":"value2"}}<p/>
*
* Json json1 = new Json();<br/>
* json1.add("name1", "value1");<br/>
* json1.add("name2", "value2");<br/>
* Json json2 = new Json();<br/>
* json2.add("name1", "value3");<br/>
* json2.add("name2", "value4");<br/>
* Json json = new Json();<br/>
* json.add("message", json1);<br/>
* json.add("message", json2);<br/>
* 添加两个同属性的 JSON,产生的 JSON 如:{"message":[{"name1":"value1", "name2":"value2"}, {"name1":"value3", "name2":"value4"}]}<p/>
*
* @param key JSON 属性名
* @param json JSON 格式的属性值
*/
public
void
add
(
String
key
,
Json
json
)
{
addElement
(
key
,
json
)
;
}
public
String
toString
(
)
{
StringBuilder
sb
=
new
StringBuilder
(
)
;
sb
.
append
(
"{"
)
;
int
k
=
0
;
for
(
Iterator
i
=
map
.
keySet
(
)
.
iterator
(
)
;
i
.
hasNext
(
)
;
)
{
String
key
=
(
String
)
(
i
.
next
(
)
)
;
Object
obj
=
map
.
get
(
key
)
;
if
(
k
>
0
)
{
sb
.
append
(
","
)
;
}
appendKey
(
sb
,
key
)
;
if
(
obj
instanceof
String
)
{
appendString
(
sb
,
(
String
)
obj
)
;
}
else
if
(
obj
instanceof
List
)
{
appendList
(
sb
,
(
List
)
obj
)
;
}
else
if
(
obj
instanceof
Json
)
{
appendJson
(
sb
,
(
Json
)
obj
)
;
}
else
{
appendOther
(
sb
,
obj
)
;
}
k
++
;
}
sb
.
append
(
"}"
)
;
return
sb
.
toString
(
)
;
}
private
void
addElement
(
String
key
,
Object
obj
)
{
if
(
!
map
.
containsKey
(
key
)
)
{
if
(
obj
instanceof
Json
)
{
List
list
=
new
ArrayList
(
)
;
list
.
add
(
obj
)
;
map
.
put
(
key
,
list
)
;
}
else
{
map
.
put
(
key
,
obj
)
;
}
return
;
}
Object
o
=
map
.
remove
(
key
)
;
if
(
o
instanceof
List
)
{
(
(
List
)
o
)
.
add
(
obj
)
;
map
.
put
(
key
,
o
)
;
return
;
}
// o is a String
List
list
=
new
ArrayList
(
)
;
list
.
add
(
o
)
;
list
.
add
(
obj
)
;
map
.
put
(
key
,
list
)
;
}
/**
* Append JSON property name
*
* @param sb
* @param key
*/
private
void
appendKey
(
StringBuilder
sb
,
String
key
)
{
sb
.
append
(
"\""
)
.
append
(
key
)
.
append
(
"\":"
)
;
}
/**
* Append JSON property value that is a String
*
* @param sb
* @param str
*/
private
void
appendString
(
StringBuilder
sb
,
String
str
)
{
sb
.
append
(
"\""
)
.
append
(
str
)
.
append
(
"\""
)
;
}
/**
* Append JSON property value that is a Integer
*
* @param sb
* @param num
*/
private
void
appendOther
(
StringBuilder
sb
,
Object
obj
)
{
sb
.
append
(
obj
)
;
}
/**
* Append JSON property value that is a List
*
* @param sb
* @param list
*/
private
void
appendList
(
StringBuilder
sb
,
List
list
)
{
sb
.
append
(
"["
)
;
for
(
int
j
=
0
,
m
=
list
.
size
(
)
;
j
<
m
;
j
++
)
{
if
(
j
>
0
)
{
sb
.
append
(
","
)
;
}
Object
obj
=
list
.
get
(
j
)
;
if
(
obj
instanceof
String
)
{
appendString
(
sb
,
(
String
)
obj
)
;
}
else
if
(
obj
instanceof
Json
)
{
appendJson
(
sb
,
(
Json
)
obj
)
;
}
else
{
appendOther
(
sb
,
obj
)
;
}
}
sb
.
append
(
"]"
)
;
}
/**
* Append JSON property value that is a JSON
*
* @param sb
* @param json
*/
private
void
appendJson
(
StringBuilder
sb
,
Json
json
)
{
sb
.
append
(
json
.
toString
(
)
)
;
}
}
/**
* 从指定的字符串中提取Email
* content 指定的字符串
*/
public
static
String
parse
(
String
content
)
{
String
email
=
null
;
if
(
content
==
null
||
content
.
length
(
)
<
1
)
{
return
email
;
}
//找出含有@
int
beginPos
;
int
i
;
String
token
=
"@"
;
String
preHalf
=
""
;
String
sufHalf
=
""
;
beginPos
=
content
.
indexOf
(
token
)
;
if
(
beginPos
>
-
1
)
{
//前项扫描
String
s
=
null
;
i
=
beginPos
;
while
(
i
>
0
)
{
s
=
content
.
substring
(
i
-
1
,
i
)
;
if
(
isLetter
(
s
)
)
preHalf
=
s
+
preHalf
;
else
break
;
i
--
;
}
//后项扫描
i
=
beginPos
+
1
;
while
(
i
<
content
.
length
(
)
)
{
s
=
content
.
substring
(
i
,
i
+
1
)
;
if
(
isLetter
(
s
)
)
sufHalf
=
sufHalf
+
s
;
else
break
;
i
++
;
}
//判断合法性
email
=
preHalf
+
"@"
+
sufHalf
;
if
(
isEmail
(
email
)
)
{
return
email
;
}
}
return
null
;
}
/**
* 判断是不是合法Email
* email Email地址
*/
public
static
boolean
isEmail
(
String
email
)
{
try
{
if
(
email
==
null
||
email
.
length
(
)
<
1
||
email
.
length
(
)
>
256
)
{
return
false
;
}
String
check
=
"^([0-9a-zA-Z]+[_.0-9a-zA-Z-]+)@([a-zA-Z0-9-]+[.])+([a-zA-Z]{2,3})$"
;
Pattern
regex
=
Pattern
.
compile
(
check
)
;
Matcher
matcher
=
regex
.
matcher
(
email
)
;
boolean
isMatched
=
matcher
.
matches
(
)
;
if
(
isMatched
)
{
return
true
;
}
else
{
return
false
;
}
}
catch
(
RuntimeException
e
)
{
return
false
;
}
}
/**
* 判断是不是合法字符
* c 要判断的字符
*/
public
static
boolean
isLetter
(
String
c
)
{
boolean
result
=
false
;
if
(
c
==
null
||
c
.
length
(
)
<
0
)
{
return
false
;
}
//a-z
if
(
c
.
compareToIgnoreCase
(
"a"
)
>=
0
&&
c
.
compareToIgnoreCase
(
"z"
)
<=
0
)
{
return
true
;
}
//0-9
if
(
c
.
compareToIgnoreCase
(
"0"
)
>=
0
&&
c
.
compareToIgnoreCase
(
"9"
)
<=
0
)
{
return
true
;
}
//. - _
if
(
c
.
equals
(
"."
)
||
c
.
equals
(
"-"
)
||
c
.
equals
(
"_"
)
)
{
return
true
;
}
return
result
;
}
/**
* 列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤
*
* @param path
*/
public
static
void
list
(
File
path
)
{
if
(
!
path
.
exists
(
)
)
{
System
.
out
.
println
(
"文件名称不存在!"
)
;
}
else
{
if
(
path
.
isFile
(
)
)
{
if
(
path
.
getName
(
)
.
toLowerCase
(
)
.
endsWith
(
".pdf"
)
||
path
.
getName
(
)
.
toLowerCase
(
)
.
endsWith
(
".doc"
)
||
path
.
getName
(
)
.
toLowerCase
(
)
.
endsWith
(
".html"
)
||
path
.
getName
(
)
.
toLowerCase
(
)
.
endsWith
(
".htm"
)
)
{
System
.
out
.
println
(
path
)
;
System
.
out
.
println
(
path
.
getName
(
)
)
;
}
}
else
{
File
[
]
files
=
path
.
listFiles
(
)
;
for
(
int
i
=
0
;
i
<
files
.
length
;
i
++
)
{
list
(
files
)
;
}
}
}
}
/**
* 拷贝一个目录或者文件到指定路径下
*
* @param source
* @param target
*/
public
static
void
copy
(
File
source
,
File
target
)
{
File
tarpath
=
new
File
(
target
,
source
.
getName
(
)
)
;
if
(
source
.
isDirectory
(
)
)
{
tarpath
.
mkdir
(
)
;
File
[
]
dir
=
source
.
listFiles
(
)
;
for
(
int
i
=
0
;
i
<
dir
.
length
;
i
++
)
{
copy
(
dir
,
tarpath
)
;
}
}
else
{
try
{
InputStream
is
=
new
FileInputStream
(
source
)
;
OutputStream
os
=
new
FileOutputStream
(
tarpath
)
;
byte
[
]
buf
=
new
byte
[
1024
]
;
int
len
=
0
;
while
(
(
len
=
is
.
read
(
buf
)
)
!=
-
1
)
{
os
.
write
(
buf
,
0
,
len
)
;
}
is
.
close
(
)
;
os
.
close
(
)
;
}
catch
(
FileNotFoundException
e
)
{
e
.
printStackTrace
(
)
;
}
catch
(
IOException
e
)
{
e
.
printStackTrace
(
)
;
}
}
}
Java日期格式化及其使用例子
1
SimpleDateFormat担当重任
,怎样格式化都行
import
java
.
util
.
Date
;
import
java
.
text
.
SimpleDateFormat
;
public
class
Demo
{
public
static
void
main
(
String
[
]
args
)
{
Date
now
=
new
Date
(
)
;
SimpleDateFormat
f
=
newSimpleDateFormat
(
"今天是"
+
"yyyy年MM月dd日 E kk点mm分"
)
;
System
.
out
.
println
(
f
.
format
(
now
)
)
;
f
=
new
SimpleDateFormat
(
"a hh点mm分ss秒"
)
;
System
.
out
.
println
(
f
.
format
(
now
)
)
;
}
}
2
从字符串到日期类型的转换:
import
java
.
util
.
Date
;
import
java
.
text
.
SimpleDateFormat
;
import
java
.
util
.
GregorianCalendar
;
import
java
.
text
.
*
;
publicclass
Demo
{
public
static
void
main
(
String
[
]
args
)
{
String
strDate
=
"2005年04月22日"
;
//注意:SimpleDateFormat构造函数的样式与strDate的样式必须相符
SimpleDateFormat
simpleDateFormat
=
new
SimpleDateFormat
(
"yyyy年MM月dd日"
)
;
//必须捕获异常
try
{
Date
date
=
simpleDateFormat
.
parse
(
strDate
)
;
System
.
out
.
println
(
date
)
;
}
catch
(
ParseException
px
)
{
px
.
printStackTrace
(
)
;
}
}
}
3
将毫秒数换转成日期类型
import
java
.
util
.
Date
;
import
java
.
text
.
SimpleDateFormat
;
import
java
.
util
.
GregorianCalendar
;
import
java
.
text
.
*
;
public
class
Demo
{
public
static
void
main
(
String
[
]
args
)
{
long
now
=
System
.
currentTimeMillis
(
)
;
System
.
out
.
println
(
"毫秒数:"
+
now
)
;
Date
dNow
=
new
Date
(
now
)
;
System
.
out
.
println
(
"日期类型:"
+
dNow
)
;
}
}
这
3例源自
http
:
//blog.csdn.net/zhoujian2003/archive/2005/04/22/358363.aspx
4
获取系统时期和时间,转换成
SQL格式后更新到数据库
(
http
:
//blog.csdn.net/netrope/archive/2005/11/19/532729.aspx)
java
.
util
.
Date
d
=
new
java
.
util
.
Date
(
)
;
//获取当前系统的时间
//格式化日期
new
java
.
text
.
SimpleDateFormat
s
=
new
java
.
text
.
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
)
;
String
dateStr
=
s
.
format
(
d
)
;
//转为字符串
使用
RS更新数据库,仍然要用
rs
.
updateString,而不是
rs
.
updateDade。
rs
.
updateString
(
"regtime"
,
dateStr
)
;
//regtime字段为datetime类型的
下面两例源自
http
:
//blog.csdn.net/kingter520/archive/2004/10/27/155435.aspx
5
按本地时区输出当前日期
Date
myDate
=
new
Date
(
)
;
System
.
out
.
println
(
myDate
.
toLocaleString
(
)
)
;
输出结果为:
2003
-
5
-
30
6
如何格式化小数
DecimalFormat
df
=
new
DecimalFormat
(
",###.00"
)
;
double
aNumber
=
33665448856.6568975
;
String
result
=
df
.
format
(
aNumber
)
;
Sytem
.
out
.
println
(
result
)
;
输出结果为:
33
,
665
,
448
,
856.66
其他:获取毫秒时间
System
.
currentTimeMillis
(
)
;
7
在数据库里的日期只以年
-月
-日的方式输出
(
http
:
//blog.csdn.net/zzsxvzzsxv/archive/2007/08/27/1761004.aspx)
定义日期格式:
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
yy
-
MM
-
dd
)
;
sql语句为:
String
sqlStr
=
"select bookDate from roomBook where bookDate between '2007-4-10' and '2007-4-25'"
;
输出:
System
.
out
.
println
(
df
.
format
(
rs
.
getDate
(
"bookDate"
)
)
)
;
Java中的鼠标和键盘事件
1、使用
MouseListener借口处理鼠标事件
鼠标事件有
5种:按下鼠标键,释放鼠标键,点击鼠标键,鼠标进入和鼠标退出
鼠标事件类型是
MouseEvent,主要方法有:
getX
(
)
,
getY
(
)
获取鼠标位置
getModifiers
(
)
获取鼠标左键或者右键
getClickCount
(
)
获取鼠标被点击的次数
getSource
(
)
获取鼠标发生的事件源
事件源获得监视器的方法是
addMouseListener
(
),移去监视器的方法是
removeMouseListener
(
)
处理事件源发生的时间的事件的接口是
MouseListener
接口中有如下的方法
mousePressed
(
MouseEvent
)
负责处理鼠标按下事件
mouseReleased
(
MouseEvent
)
负责处理鼠标释放事件
mouseEntered
(
MouseEvent
)
负责处理鼠标进入容器事件
mouseExited
(
MouseEvent
)
负责处理鼠标离开事件
mouseClicked
(
MouseEvent
)
负责处理点击事件
2、使用
MouseMotionListener接口处理鼠标事件
事件源发生的鼠标事件有
2种:拖动鼠标和鼠标移动
鼠标事件的类型是
MouseEvent
事件源获得监视器的方法是
addMouseMotionListener
(
)
处理事件源发生的事件的接口是
MouseMotionListener
接口中有如下的方法
mouseDragged
(
)
负责处理鼠标拖动事件
mouseMoved
(
)
负责处理鼠标移动事件
3、控制鼠标的指针形状
setCursor
(
Cursor
.
getPreddfinedCursor
(
Cursor
.鼠标形状定义
)
)
鼠标形状定义见(书
P
210)
4、键盘事件
键盘事件源使用
addKeyListener
方法获得监视器
键盘事件的接口是
KeyListener
接口中有
3个方法
public
void
keyPressed
(
KeyEvent
e
)
按下键盘按键
public
void
keyReleased
(
KeyEvent
e
)
释放键盘按键
public
class
IsChineseOrEnglish
{
// GENERAL_PUNCTUATION 判断中文的“号
// CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号
// HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的,号
public
static
boolean
isChinese
(
char
c
)
{
Character
.
UnicodeBlock
ub
=
Character
.
UnicodeBlock
.
of
(
c
)
;
if
(
ub
==
Character
.
UnicodeBlock
.
CJK_UNIFIED_IDEOGRAPHS
||
ub
==
Character
.
UnicodeBlock
.
CJK_COMPATIBILITY_IDEOGRAPHS
||
ub
==
Character
.
UnicodeBlock
.
CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
||
ub
==
Character
.
UnicodeBlock
.
GENERAL_PUNCTUATION
||
ub
==
Character
.
UnicodeBlock
.
CJK_SYMBOLS_AND_PUNCTUATION
||
ub
==
Character
.
UnicodeBlock
.
HALFWIDTH_AND_FULLWIDTH_FORMS
)
{
return
true
;
}
return
false
;
}
public
static
void
isChinese
(
String
strName
)
{
char
[
]
ch
=
strName
.
toCharArray
(
)
;
for
(
int
i
=
0
;
i
<
ch
.
length
;
i
++
)
{
char
c
=
ch
;
if
(
isChinese
(
c
)
==
true
)
{
System
.
out
.
println
(
isChinese
(
c
)
)
;
return
;
}
else
{
System
.
out
.
println
(
isChinese
(
c
)
)
;
return
;
}
}
}
public
static
void
main
(
String
[
]
args
)
{
isChinese
(
"zhongguo"
)
;
isChinese
(
"中国"
)
;
}
}
MD5和一个可逆加密算法相接合的加密和解密程序
比较简单。
[
code
=
{
0
}
]
import
java
.
security
.
MessageDigest
;
/**
*先通过MD5加密之后,再来一次可逆的加密。
*顺序可以调整,可以选择先用可逆加密,然后再用MD5加密
*/
public
class
MD5andKL
{
//MD5加码。32位
public
static
String
MD5
(
String
inStr
)
{
MessageDigest
md5
=
null
;
try
{
md5
=
MessageDigest
.
getInstance
(
"MD5"
)
;
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
e
.
toString
(
)
)
;
e
.
printStackTrace
(
)
;
return
""
;
}
char
[
]
charArray
=
inStr
.
toCharArray
(
)
;
byte
[
]
byteArray
=
new
byte
[
charArray
.
length
]
;
for
(
int
i
=
0
;
i
<
charArray
.
length
;
i
++
)
byteArray
=
(
byte
)
charArray
;
byte
[
]
md5Bytes
=
md5
.
digest
(
byteArray
)
;
StringBuffer
hexValue
=
new
StringBuffer
(
)
;
for
(
int
i
=
0
;
i
<
md5Bytes
.
length
;
i
++
)
{
int
val
=
(
(
int
)
md5Bytes
)
&
0xff
;
if
(
val
<
16
)
hexValue
.
append
(
"0"
)
;
hexValue
.
append
(
Integer
.
toHexString
(
val
)
)
;
}
return
hexValue
.
toString
(
)
;
}
//可逆的加密算法
public
static
String
KL
(
String
inStr
)
{
//String s = new String(inStr);
char
[
]
a
=
inStr
.
toCharArray
(
)
;
for
(
int
i
=
0
;
i
<
a
.
length
;
i
++
)
{
a
=
(
char
)
(
a
^
't'
)
;
}
String
s
=
new
String
(
a
)
;
return
s
;
}
//加密后解密
public
static
String
JM
(
String
inStr
)
{
char
[
]
a
=
inStr
.
toCharArray
(
)
;
for
(
int
i
=
0
;
i
<
a
.
length
;
i
++
)
{
a
=
(
char
)
(
a
^
't'
)
;
}
String
k
=
new
String
(
a
)
;
return
k
;
}
//测试主函数
public
static
void
main
(
String
args
[
]
)
{
String
s
=
new
String
(
"admin"
)
;
System
.
out
.
println
(
"原始:"
+
s
)
;
System
.
out
.
println
(
"MD5后:"
+
MD5
(
s
)
)
;
System
.
out
.
println
(
"MD5后再加密:"
+
KL
(
MD5
(
s
)
)
)
;
System
.
out
.
println
(
"解密为MD5后的:"
+
JM
(
KL
(
MD5
(
s
)
)
)
)
;
}
}
[
/
code
]
/**
* 取得服务器当前的各种具体时间
* 回车:日期时间
*/
import
java
.
util
.
*
;
public
class
GetNowDate
{
Calendar
calendar
=
null
;
public
GetNowDate
(
)
{
calendar
=
Calendar
.
getInstance
(
)
;
calendar
.
setTime
(
new
Date
(
)
)
;
}
public
int
getYear
(
)
{
return
calendar
.
get
(
Calendar
.
YEAR
)
;
}
public
int
getMonth
(
)
{
return
1
+
calendar
.
get
(
Calendar
.
MONTH
)
;
}
public
int
getDay
(
)
{
return
calendar
.
get
(
Calendar
.
DAY_OF_MONTH
)
;
}
public
int
getHour
(
)
{
return
calendar
.
get
(
Calendar
.
HOUR_OF_DAY
)
;
}
public
int
getMinute
(
)
{
return
calendar
.
get
(
Calendar
.
MINUTE
)
;
}
public
int
getSecond
(
)
{
return
calendar
.
get
(
Calendar
.
SECOND
)
;
}
public
String
getDate
(
)
{
return
getMonth
(
)
+
"/"
+
getDay
(
)
+
"/"
+
getYear
(
)
;
}
public
String
getTime
(
)
{
return
getHour
(
)
+
":"
+
getMinute
(
)
+
":"
+
getSecond
(
)
;
}
public
String
getDate2
(
)
{
String
yyyy
=
"0000"
,
mm
=
"00"
,
dd
=
"00"
;
yyyy
=
yyyy
+
getYear
(
)
;
mm
=
mm
+
getMonth
(
)
;
dd
=
dd
+
getDay
(
)
;
yyyy
=
yyyy
.
substring
(
yyyy
.
length
(
)
-
4
)
;
mm
=
mm
.
substring
(
mm
.
length
(
)
-
2
)
;
dd
=
dd
.
substring
(
dd
.
length
(
)
-
2
)
;
return
yyyy
+
"/"
+
mm
+
"/"
+
dd
;
}
public
String
getTime2
(
)
{
String
hh
=
"00"
,
mm
=
"00"
,
ss
=
"00"
;
hh
=
hh
+
getHour
(
)
;
mm
=
mm
+
getMinute
(
)
;
ss
=
ss
+
getSecond
(
)
;
hh
=
hh
.
substring
(
hh
.
length
(
)
-
2
,
hh
.
length
(
)
)
;
mm
=
mm
.
substring
(
mm
.
length
(
)
-
2
,
mm
.
length
(
)
)
;
ss
=
ss
.
substring
(
ss
.
length
(
)
-
2
,
ss
.
length
(
)
)
;
return
hh
+
":"
+
mm
+
":"
+
ss
;
}
}
/**
* 用半角的特殊符号代替全角的特殊符号
* 防止特殊字符在传输参数时出现错误
*
*/
public
class
ReplaceStrE
{
public
static
String
rightToError
(
String
ss
)
{
String
strs
;
String
strs1
;
String
strs2
;
String
strs3
;
String
strs4
;
try
{
strs
=
ss
.
replace
(
'#'
,
'#'
)
;
}
catch
(
Exception
ex
)
{
return
ss
;
}
try
{
strs1
=
strs
.
replace
(
'"'
,
'"'
)
;
}
catch
(
Exception
ex
)
{
return
strs
;
}
try
{
strs2
=
strs1
.
replace
(
' '
,
'&'
)
;
}
catch
(
Exception
ex
)
{
return
strs1
;
}
try
{
strs3
=
strs2
.
replace
(
'+'
,
'+'
)
;
}
catch
(
Exception
ex
)
{
return
strs2
;
}
try
{
strs4
=
strs3
.
replace
(
'''
,
'\''
)
;
}
catch
(
Exception
ex
)
{
return
ss
;
}
return
strs4
;
}
}
/**
* Big5字与Unicode的互换
* 转换后的正常字型
*/
import
java
.
io
.
*
;
public
class
MyUtil
{
public
static
String
big5ToUnicode
(
String
s
)
{
try
{
return
new
String
(
s
.
getBytes
(
"ISO8859_1"
)
,
"Big5"
)
;
}
catch
(
UnsupportedEncodingException
uee
)
{
return
s
;
}
}
public
static
String
UnicodeTobig5
(
String
s
)
{
try
{
return
new
String
(
s
.
getBytes
(
"Big5"
)
,
"ISO8859_1"
)
;
}
catch
(
UnsupportedEncodingException
uee
)
{
return
s
;
}
}
public
static
String
toHexString
(
String
s
)
{
String
str
=
""
;
for
(
int
i
=
0
;
i
<
s
.
length
(
)
;
i
++
)
{
int
ch
=
(
int
)
s
.
charAt
(
i
)
;
String
s4
=
"0000"
+
Integer
.
toHexString
(
ch
)
;
str
=
str
+
s4
.
substring
(
s4
.
length
(
)
-
4
)
+
" "
;
}
return
str
;
}
}
import
java
.
io
.
*
;
import
java
.
util
.
ArrayList
;
import
java
.
util
.
List
;
public
class
FileCopy
{
private
String
message
=
""
;
public
String
getMessage
(
)
{
return
message
;
}
public
void
setMessage
(
String
message
)
{
this
.
message
=
message
;
}
/**
* 将源文件拷贝到目标文件
*
* @param src
* 写源文件地址,需文件名
* @param des
* 写目标文件地址,无需文件名
*/
public
boolean
copyFile
(
String
src
,
String
des
)
{
File
srcFile
=
new
File
(
src
)
;
File
desDir
=
new
File
(
des
)
;
File
desFile
=
new
File
(
des
+
"/"
+
srcFile
.
getName
(
)
)
;
// 判断源文件是否存在
if
(
!
srcFile
.
exists
(
)
)
{
this
.
setMessage
(
"源文件不存在!"
)
;
return
false
;
}
else
if
(
!
srcFile
.
isFile
(
)
)
{
this
.
setMessage
(
"源文件格式错!"
)
;
return
false
;
}
// 判断源文件是否存在
if
(
!
desDir
.
exists
(
)
)
{
this
.
setMessage
(
"目标目录不存在!"
)
;
return
false
;
}
else
if
(
!
desDir
.
isDirectory
(
)
)
{
this
.
setMessage
(
"不是有效的目录!"
)
;
return
false
;
}
BufferedReader
reader
=
null
;
BufferedWriter
writer
=
null
;
String
str
;
try
{
reader
=
new
BufferedReader
(
new
FileReader
(
srcFile
)
)
;
writer
=
new
BufferedWriter
(
new
FileWriter
(
desFile
)
)
;
// 判断目标文件是否存在及其格式,不存在就创建,格式不对先删除,存在就替代
if
(
!
desFile
.
exists
(
)
||
!
desFile
.
isFile
(
)
)
{
if
(
desFile
.
exists
(
)
)
{
desFile
.
delete
(
)
;
}
desFile
.
createNewFile
(
)
;
}
// 从源文件读取数据,并写入目标文件
str
=
reader
.
readLine
(
)
;
while
(
str
!=
null
)
{
writer
.
write
(
str
)
;
writer
.
newLine
(
)
;
str
=
reader
.
readLine
(
)
;
}
}
catch
(
IOException
e
)
{
this
.
setMessage
(
e
.
getMessage
(
)
)
;
return
false
;
}
finally
{
if
(
reader
!=
null
)
{
try
{
reader
.
close
(
)
;
}
catch
(
IOException
e
)
{
this
.
setMessage
(
e
.
getMessage
(
)
)
;
}
}
if
(
writer
!=
null
)
{
try
{
writer
.
close
(
)
;
}
catch
(
IOException
e
)
{
this
.
setMessage
(
e
.
getMessage
(
)
)
;
}
}
}
return
true
;
}
private
List
fileList
=
new
ArrayList
(
)
;
/**
* 列出所有文件
* @param srcFile
*/
private
void
file
(
File
srcFile
)
{
if
(
srcFile
.
isDirectory
(
)
)
{
String
[
]
files
=
srcFile
.
list
(
)
;
for
(
int
i
=
0
;
i
<
files
.
length
;
i
++
)
{
File
f
=
new
File
(
srcFile
+
"/"
+
files
)
;
// 如果是文件加入列表,否则递归列出
if
(
f
.
isFile
(
)
)
{
fileList
.
add
(
f
)
;
}
else
file
(
f
)
;
}
}
else
this
.
setMessage
(
srcFile
.
getAbsolutePath
(
)
+
"不是目录"
)
;
}
/**
* 建立目录
* @param des
* @throws IOException
*/
private
void
mkdir
(
File
des
)
{
if
(
!
des
.
exists
(
)
||
!
des
.
isDirectory
(
)
)
{
mkdir
(
des
.
getParentFile
(
)
)
;
if
(
des
.
exists
(
)
)
{
des
.
delete
(
)
;
}
des
.
mkdir
(
)
;
}
}
/**
* 复制目录 将源目录下所有文件拷贝到目标目录下
* @param src 源目录
* @param des 目标目录
*/
public
boolean
copyDir
(
String
src
,
String
des
)
{
File
srcFile
=
new
File
(
src
)
;
if
(
!
srcFile
.
exists
(
)
)
{
this
.
setMessage
(
"源目录不存在!"
)
;
return
false
;
}
else
if
(
!
srcFile
.
isDirectory
(
)
)
{
this
.
setMessage
(
src
+
"不是有效的目录!"
)
;
return
false
;
}
file
(
srcFile
)
;
for
(
int
i
=
0
;
i
<
fileList
.
size
(
)
;
i
++
)
{
String
srcName
=
(
(
File
)
fileList
.
get
(
i
)
)
.
getPath
(
)
;
String
desName
=
srcName
.
substring
(
src
.
length
(
)
,
srcName
.
length
(
)
)
;
desName
=
des
+
desName
;
File
dir
=
new
File
(
desName
)
.
getParentFile
(
)
;
mkdir
(
dir
)
;
if
(
!
copyFile
(
srcName
,
dir
.
getPath
(
)
)
)
{
return
false
;
}
}
return
true
;
}
public
static
void
main
(
String
[
]
args
)
{
FileCopy
t
=
new
FileCopy
(
)
;
System
.
out
.
println
(
t
.
copyFile
(
"D:/aaa.txt"
,
"E:"
)
)
;
String
src
=
"D:/asdf"
;
String
des
=
"E:/adf"
;
System
.
out
.
println
(
t
.
copyDir
(
src
,
des
)
)
;
System
.
out
.
println
(
t
.
getMessage
(
)
)
;
}
}
/**
* Description: 获取GMT8时间
* @return 将当前时间转换为GMT8时区后的Date
*/
public
static
Date
getGMT8Time
(
)
{
Date
gmt8
=
null
;
try
{
Calendar
cal
=
Calendar
.
getInstance
(
TimeZone
.
getTimeZone
(
"GMT+8"
)
,
Locale
.
CHINESE
)
;
Calendar
day
=
Calendar
.
getInstance
(
)
;
day
.
set
(
Calendar
.
YEAR
,
cal
.
get
(
Calendar
.
YEAR
)
)
;
day
.
set
(
Calendar
.
MONTH
,
cal
.
get
(
Calendar
.
MONTH
)
)
;
day
.
set
(
Calendar
.
DATE
,
cal
.
get
(
Calendar
.
DATE
)
)
;
day
.
set
(
Calendar
.
HOUR_OF_DAY
,
cal
.
get
(
Calendar
.
HOUR_OF_DAY
)
)
;
day
.
set
(
Calendar
.
MINUTE
,
cal
.
get
(
Calendar
.
MINUTE
)
)
;
day
.
set
(
Calendar
.
SECOND
,
cal
.
get
(
Calendar
.
SECOND
)
)
;
gmt8
=
day
.
getTime
(
)
;
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
"获取GMT8时间 getGMT8Time() error !"
)
;
e
.
printStackTrace
(
)
;
gmt8
=
null
;
}
return
gmt8
;
}
import
java
.
io
.
File
;
import
java
.
io
.
FileInputStream
;
import
java
.
io
.
FileNotFoundException
;
import
java
.
io
.
IOException
;
import
java
.
util
.
Properties
;
/**
* ReadProperties.java
* Description: 读取操作属性配置文件
* @author li.b
* @version 2.0
* Jun 26, 2008
*/
public
class
ReadProperties
{
/**
* Description: 获取属性配置文件
* @param path 资源文件路径
* @return Properties Object
* @throws FileNotFoundException
* @throws IOException
*/
public
static
Properties
getProperties
(
String
path
)
throws
FileNotFoundException
,
IOException
{
Properties
props
=
null
;
File
file
=
new
File
(
path
)
;
if
(
file
.
exists
(
)
&&
file
.
isFile
(
)
)
{
props
=
new
Properties
(
)
;
props
.
load
(
new
FileInputStream
(
file
)
)
;
}
else
{
System
.
out
.
println
(
file
.
toString
(
)
+
"不存在!"
)
;
}
return
props
;
}
/**
* Description: 从属性文件获取值
* @param props Properties Object
* @param key
* @return 通过key匹配到的value
*/
public
static
String
getValue
(
Properties
props
,
String
key
,
String
encod
)
{
String
result
=
""
;
String
en
=
""
;
String
localEN
=
System
.
getProperty
(
"file.encoding"
)
;
if
(
encod
!=
null
&&
!
encod
.
equals
(
""
)
)
{
en
=
encod
;
}
else
{
en
=
localEN
;
}
try
{
key
=
new
String
(
key
.
getBytes
(
en
)
,
"ISO-8859-1"
)
;
result
=
props
.
getProperty
(
key
)
;
if
(
!
result
.
equals
(
""
)
)
{
result
=
new
String
(
result
.
getBytes
(
"ISO-8859-1"
)
,
en
)
;
}
}
catch
(
Exception
e
)
{
}
finally
{
if
(
result
==
null
)
result
=
""
;
return
result
;
}
}
public
static
String
getValue
(
Properties
props
,
String
key
)
{
return
getValue
(
props
,
key
,
""
)
;
}
}
import
java
.
lang
.
reflect
.
Array
;
import
java
.
util
.
Date
;
public
class
TestCast
{
/**
* @param args
*/
//public static void main(String[] args) {
/** */
/**
*
* 一般情况下数组和数组是不能直接进行转换的,例如:
* Object[] t1={"1","2"};
* String[] t2=(String[])t1;//这里会出现转换错误
*
* 下面提供了一种方式进行转换
*/
//1.0测试一般基础类
/* Object[] t1={"1","2","3","4","5"};
String[] m1=(String[])TestCast.cast(t1,String.class);
for(int i=0;i<m1.length;i++)
System.out.println(m1);
//2.0测试复杂对象
Object[] t2={new Date(1000),new Date(2000)};
Date[] m2=(Date[])TestCast.cast(t2,Date.class);
for(int i=0;i<m2.length;i++)
System.out.println(m2.toString());*/
// }
/** */
/**
* 将数组array转换成clss代表的类型后返回
* @param array 需要转换的数组
* @param clss 要转换成的类型
* @return 转换后的数组
*/
public
static
Object
cast
(
Object
array
,
Class
clss
)
{
if
(
null
==
clss
)
throw
new
IllegalArgumentException
(
"argument clss cannot be null"
)
;
if
(
null
==
array
)
throw
new
IllegalArgumentException
(
"argument array cannot be null"
)
;
if
(
false
==
array
.
getClass
(
)
.
isArray
(
)
)
throw
new
IllegalArgumentException
(
"argument array must be array"
)
;
Object
[
]
src
=
(
Object
[
]
)
array
;
Object
[
]
dest
=
(
Object
[
]
)
Array
.
newInstance
(
clss
,
src
.
length
)
;
System
.
arraycopy
(
src
,
0
,
dest
,
0
,
src
.
length
)
;
return
dest
;
}
}
处理特殊符号的工具类,这个类是从
sturts源码里挖出来的
/**
* DealingCharacter.java
* Description:
* @author li.b
* @version 2.0
* Jun 27, 2008
*/
public
class
DealingCharacter
{
/**
* Description: 转译特殊符号标签
* @param value 需要处理的字符串
* @return
*/
public
static
String
filter
(
String
value
)
{
if
(
value
==
null
||
value
.
length
(
)
==
0
)
return
value
;
StringBuffer
result
=
null
;
String
filtered
=
null
;
for
(
int
i
=
0
;
i
<
value
.
length
(
)
;
i
++
)
{
filtered
=
null
;
switch
(
value
.
charAt
(
i
)
)
{
case
60
:
// '<'
filtered
=
"<"
;
break
;
case
62
:
// '>'
filtered
=
">"
;
break
;
case
38
:
// '&'
filtered
=
"&"
;
break
;
case
34
:
// '"'
filtered
=
"""
;
break
;
case
39
:
// '\''
filtered
=
"'"
;
break
;
}
if
(
result
==
null
)
{
if
(
filtered
!=
null
)
{
result
=
new
StringBuffer
(
value
.
length
(
)
+
50
)
;
if
(
i
>
0
)
result
.
append
(
value
.
substring
(
0
,
i
)
)
;
result
.
append
(
filtered
)
;
}
}
else
if
(
filtered
==
null
)
result
.
append
(
value
.
charAt
(
i
)
)
;
else
result
.
append
(
filtered
)
;
}
return
result
!=
null
?
result
.
toString
(
)
:
value
;
}
public
static
void
main
(
String
[
]
args
)
{
System
.
out
.
println
(
DealingCharacter
.
filter
(
"<HTML>sdfasfas</HTML>"
)
)
;
}
}
小标签
import
java
.
io
.
IOException
;
import
java
.
util
.
List
;
import
javax
.
servlet
.
jsp
.
JspException
;
import
javax
.
servlet
.
jsp
.
tagext
.
TagSupport
;
import
com
.
formcontent
.
show
.
ShowFormTypeOperateDb
;
import
com
.
forum
.
hibernatePrj
.
Space
;
public
class
OutPrintForumType
extends
TagSupport
{
public
int
doStartTag
(
)
throws
JspException
{
String
printStr
=
""
;
ShowFormTypeOperateDb
showtype
=
new
ShowFormTypeOperateDb
(
)
;
List
list
=
showtype
.
getForumType
(
)
;
if
(
list
!=
null
&&
list
.
size
(
)
>
0
)
{
for
(
int
i
=
0
;
i
<
list
.
size
(
)
;
i
++
)
{
Space
space
=
(
Space
)
list
.
get
(
i
)
;
if
(
space
!=
null
)
{
printStr
+=
" <tr> <td>"
+
" <div align='left' class='TypeCss'>"
+
space
.
getSpaceName
(
)
+
" "
+
space
.
getSpaceDescription
(
)
+
" <br/>目前登陆总人数:"
+
i
+
" 人访问数:"
+
i
+
"人 </div> </td> </tr>"
+
" <tr> <td> </td> </tr>"
;
}
}
}
try
{
pageContext
.
getOut
(
)
.
write
(
printStr
)
;
}
catch
(
IOException
e
)
{
e
.
printStackTrace
(
)
;
}
return
super
.
doStartTag
(
)
;
}
}
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。
匹配中文字符的正则表达式:
[
\
u4e00
-
\
u9fa5
]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符
(包括汉字在内
):
[
^
\
x00
-
\
xff
]
评注:可以用来计算字符串的长度(一个双字节字符长度计
2,
ASCII字符计
1)
匹配空白行的正则表达式:
\
n
\
s
*
\
r
评注:可以用来删除空白行
匹配
HTML标记的正则表达式:
<
(
\
S
*
?
)
[
^
>
]
*
>
.
*
?
<
/
\
1
>
|
<
.
*
?
/
>
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:
^
\
s
*
|
\
s
*
$
评注:可以用来删除行首行尾的空白字符
(包括空格、制表符、换页符等等
),非常有用的表达式
匹配
Email地址的正则表达式:
\
w
+
(
[
-
+
.
]
\
w
+
)
*
@
\
w
+
(
[
-
.
]
\
w
+
)
*
\
.
\
w
+
(
[
-
.
]
\
w
+
)
*
评注:表单验证时很实用
匹配网址
URL的正则表达式:
[
a
-
zA
-
z
]
+
:
//[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法
(字母开头,允许
5
-
16字节,允许字母数字下划线
):
^
[
a
-
zA
-
Z
]
[
a
-
zA
-
Z0
-
9_
]
{
4
,
15
}
$
评注:表单验证时很实用
匹配国内电话号码:
\
d
{
3
}
-
\
d
{
8
}
|
\
d
{
4
}
-
\
d
{
7
}
评注:匹配形式如
0511
-
4405222
或
021
-
87888822
匹配腾讯
QQ号:
[
1
-
9
]
[
0
-
9
]
{
4
,
}
评注:腾讯
QQ号从
10000开始
匹配中国邮政编码:
[
1
-
9
]
\
d
{
5
}
(
?
!
\
d
)
评注:中国邮政编码为
6位数字
匹配身份证:
\
d
{
15
}
|
\
d
{
18
}
评注:中国的身份证为
15位或
18位
匹配
ip地址:
\
d
+
\
.
\
d
+
\
.
\
d
+
\
.
\
d
+
评注:提取
ip地址时有用
匹配特定数字:
^
[
1
-
9
]
\
d
*
$
//匹配正整数
^
-
[
1
-
9
]
\
d
*
$
//匹配负整数
^
-
?
[
1
-
9
]
\
d
*
$
//匹配整数
^
[
1
-
9
]
\
d
*
|
0
$
//匹配非负整数(正整数 + 0)
^
-
[
1
-
9
]
\
d
*
|
0
$
//匹配非正整数(负整数 + 0)
^
[
1
-
9
]
\
d
*
\
.
\
d
*
|
0
\
.
\
d
*
[
1
-
9
]
\
d
*
$
//匹配正浮点数
^
-
(
[
1
-
9
]
\
d
*
\
.
\
d
*
|
0
\
.
\
d
*
[
1
-
9
]
\
d
*
)
$
//匹配负浮点数
^
-
?
(
[
1
-
9
]
\
d
*
\
.
\
d
*
|
0
\
.
\
d
*
[
1
-
9
]
\
d
*
|
0
?
\
.
0
+
|
0
)
$
//匹配浮点数
^
[
1
-
9
]
\
d
*
\
.
\
d
*
|
0
\
.
\
d
*
[
1
-
9
]
\
d
*
|
0
?
\
.
0
+
|
0
$
//匹配非负浮点数(正浮点数 + 0)
^
(
-
(
[
1
-
9
]
\
d
*
\
.
\
d
*
|
0
\
.
\
d
*
[
1
-
9
]
\
d
*
)
)
|
0
?
\
.
0
+
|
0
$
//匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^
[
A
-
Za
-
z
]
+
$
//匹配由26个英文字母组成的字符串
^
[
A
-
Z
]
+
$
//匹配由26个英文字母的大写组成的字符串
^
[
a
-
z
]
+
$
//匹配由26个英文字母的小写组成的字符串
^
[
A
-
Za
-
z0
-
9
]
+
$
//匹配由数字和26个英文字母组成的字符串
^
\
w
+
$
//匹配由数字、26个英文字母或者下划线组成的字符串
/**
* 将数组转成字符串 在调试或记录日志时用到
*
* @param array
* @return
*/
public
static
String
byte2string
(
byte
[
]
array
)
{
StringBuilder
sb
=
new
StringBuilder
(
)
;
sb
.
append
(
"Length "
+
array
.
length
+
" Content "
)
;
for
(
int
i
=
0
;
i
<
leng
;
i
++
)
{
sb
=
sb
.
append
(
String
.
format
(
"%02X"
,
array
)
)
.
append
(
":"
)
;
}
int
ind
=
sb
.
lastIndexOf
(
":"
)
;
sb
.
delete
(
ind
,
ind
+
1
)
;
return
sb
.
toString
(
)
;
}
import
java
.
util
.
Arrays
;
import
java
.
util
.
Random
;
/**
* <code>RandomUtil</code> - Random Tool Class.
* @author SageZk
* @version 1.0
*/
public
class
RandomUtil
{
private
RandomUtil
(
)
{
}
private
static
Random
rnd
=
null
;
/**
* 初始化随机数发生器。
*/
private
static
void
initRnd
(
)
{
if
(
rnd
==
null
)
rnd
=
new
Random
(
)
;
}
/**
* 计算并返回无重复值的以 <code>min</code> 为下限 <code>max</code> 为上限的随机整数数组。
* @param min 随机整数下限(包含)
* @param max 随机整数上限(包含)
* @param len 结果数组长度
* @return 结果数组
*/
public
static
int
[
]
getLotteryArray
(
int
min
,
int
max
,
int
len
)
{
//参数校验及性能优化
if
(
len
<
0
)
return
null
;
//长度小于 0 的数组不存在
if
(
len
==
0
)
return
new
int
[
0
]
;
//返回长度为 0 的数组
if
(
min
>
max
)
{
//校正参数 min max
int
t
=
min
;
min
=
max
;
max
=
t
;
}
final
int
LEN
=
max
-
min
+
1
;
//种子个数
if
(
len
>
LEN
)
return
null
;
//如果出现 35 选 36 的情况就返回 null
//计算无重复值随机数组
initRnd
(
)
;
//初始化随机数发生器
int
[
]
seed
=
new
int
[
LEN
]
;
//种子数组
for
(
int
i
=
0
,
n
=
min
;
i
<
LEN
;
)
seed
[
i
++
]
=
n
++
;
//初始化种子数组
for
(
int
i
=
0
,
j
=
0
,
t
=
0
;
i
<
len
;
++
i
)
{
j
=
rnd
.
nextInt
(
LEN
-
i
)
+
i
;
t
=
seed
;
seed
=
seed
[
j
]
;
seed
[
j
]
=
t
;
}
return
Arrays
.
copyOf
(
seed
,
len
)
;
//注意:copyOf 需要 JRE1.6
}
//Unit Testing
public
static
void
main
(
String
[
]
args
)
{
final
int
N
=
10000
;
//测试次数
for
(
int
i
=
0
;
i
<
N
;
++
i
)
{
int
[
]
la
=
RandomUtil
.
getLotteryArray
(
1
,
35
,
7
)
;
if
(
la
==
null
)
continue
;
for
(
int
v
:
la
)
System
.
out
.
printf
(
"%0$02d "
,
v
)
;
System
.
out
.
println
(
)
;
}
}
}
/*
操作属性文件,可以为我们的程序带来更方便的移植性,下面是一个示例,可以读、写、更改属性
读采用了两种方式,一种是采用Properties类,另外一种是采用资源绑定类ResourceBundle类,
下面是源程序,里面有详细的注释:
*/
import
java
.
io
.
FileInputStream
;
import
java
.
io
.
FileOutputStream
;
import
java
.
io
.
InputStream
;
import
java
.
util
.
Properties
;
import
java
.
util
.
ResourceBundle
;
/**
*对属性文件(xx.properties)的操作
*注:属性文件一定要放在当前工程的根目录下,也就是放在与src目录在同一个目录下(我的JDevelop
*是这样的)
*/
public
class
OperatePropertiesFile
{
public
OperatePropertiesFile
(
)
{
}
/**
*采用Properties类取得属性文件对应值
*@parampropertiesFileNameproperties文件名,如a.properties
*@parampropertyName属性名
*@return根据属性名得到的属性值,如没有返回""
*/
public
static
String
getValueByPropertyName
(
String
propertiesFileName
,
String
propertyName
)
{
String
s
=
""
;
Properties
p
=
new
Properties
(
)
;
//加载属性文件读取类
FileInputStream
in
;
try
{
//propertiesFileName如test.properties
in
=
new
FileInputStream
(
propertiesFileName
)
;
//以流的形式读入属性文件
p
.
load
(
in
)
;
//属性文件将该流加入的可被读取的属性中
in
.
close
(
)
;
//读完了关闭
s
=
p
.
getProperty
(
propertyName
)
;
//取得对应的属性值
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
}
return
s
;
}
/**
*采用ResourceBundel类取得属性文件对应值,这个只能够读取,不可以更改及写新的属性
*@parampropertiesFileNameWithoutPostfixproperties文件名,不带后缀
*@parampropertyName属性名
*@return根据属性名得到的属性值,如没有返回""
*/
public
static
String
getValueByPropertyName_
(
String
propertiesFileNameWithoutPostfix
,
String
propertyName
)
{
String
s
=
""
;
//如属性文件是test.properties,那此时propertiesFileNameWithoutPostfix的值就是test
ResourceBundle
bundel
=
ResourceBundle
.
getBundle
(
propertiesFileNameWithoutPostfix
)
;
s
=
bundel
.
getString
(
propertyName
)
;
return
s
;
}
/**
*更改属性文件的值,如果对应的属性不存在,则自动增加该属性
*@parampropertiesFileNameproperties文件名,如a.properties
*@parampropertyName属性名
*@parampropertyValue将属性名更改成该属性值
*@return是否操作成功
*/
public
static
boolean
changeValueByPropertyName
(
String
propertiesFileName
,
String
propertyName
,
String
propertyValue
)
{
boolean
writeOK
=
true
;
Properties
p
=
new
Properties
(
)
;
InputStream
in
;
try
{
in
=
new
FileInputStream
(
propertiesFileName
)
;
p
.
load
(
in
)
;
//
in
.
close
(
)
;
p
.
setProperty
(
propertyName
,
propertyValue
)
;
//设置属性值,如不属性不存在新建
//p.setProperty("testProperty","testPropertyValue");
FileOutputStream
out
=
new
FileOutputStream
(
propertiesFileName
)
;
//输出流
p
.
store
(
out
,
""
)
;
//设置属性头,如不想设置,请把后面一个用""替换掉
out
.
flush
(
)
;
//清空缓存,写入磁盘
out
.
close
(
)
;
//关闭输出流
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
}
return
writeOK
;
}
}
/**
* 如果是null,则返回空字符串,如果是非空值则返回该字符串头尾不为空白字符的字符串
*
* @param str
*/
public
static
String
toNoNullTrimedString
(
String
str
)
{
if
(
str
==
null
)
{
return
""
;
}
return
new
String
(
str
.
trim
(
)
)
;
}
/**
* 如果是null,则返回空字符串,如果是非空值则返回该对象所toString后的字符串
*
* @param obj
*/
public
static
String
toNoNullString
(
Object
obj
)
{
if
(
obj
==
null
)
return
""
;
return
obj
.
toString
(
)
;
}
/**
* 本方法把一个Throwable的StackTrace作为一个字符串输出,以利于对StackTrace的操作。<br />
* 通常用于把抛出的Exception转化成字符串进行后续操作。
*/
public
static
String
exceptionToStackTrace
(
Throwable
throwable
)
{
StringBuffer
retu
=
new
StringBuffer
(
)
;
StackTraceElement
[
]
traces
=
throwable
.
getStackTrace
(
)
;
for
(
StackTraceElement
ste
:
traces
)
{
retu
.
append
(
"\n"
)
.
append
(
ste
.
toString
(
)
)
;
}
return
retu
.
substring
(
1
)
;
}
package
com
.
sipgl
.
eam
.
utils
;
import
java
.
text
.
SimpleDateFormat
;
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Calendar
;
import
java
.
util
.
Date
;
import
java
.
util
.
GregorianCalendar
;
import
java
.
util
.
LinkedHashMap
;
/**
* 日期公用处理类
*
* @author SongJun
* @version 1.3
*/
public
class
DateUtil
{
/**
* 解析一个日期之间的所有月份
*
* @param beginDateStr
* @param endDateStr
* @return
*/
public
static
ArrayList
getMonthList
(
String
beginDateStr
,
String
endDateStr
)
{
// 指定要解析的时间格式
SimpleDateFormat
f
=
new
SimpleDateFormat
(
"yyyy-MM"
)
;
// 返回的月份列表
String
sRet
=
""
;
// 定义一些变量
Date
beginDate
=
null
;
Date
endDate
=
null
;
GregorianCalendar
beginGC
=
null
;
GregorianCalendar
endGC
=
null
;
ArrayList
list
=
new
ArrayList
(
)
;
try
{
// 将字符串parse成日期
beginDate
=
f
.
parse
(
beginDateStr
)
;
endDate
=
f
.
parse
(
endDateStr
)
;
// 设置日历
beginGC
=
new
GregorianCalendar
(
)
;
beginGC
.
setTime
(
beginDate
)
;
endGC
=
new
GregorianCalendar
(
)
;
endGC
.
setTime
(
endDate
)
;
// 直到两个时间相同
while
(
beginGC
.
getTime
(
)
.
compareTo
(
endGC
.
getTime
(
)
)
<=
0
)
{
sRet
=
beginGC
.
get
(
Calendar
.
YEAR
)
+
"-"
+
(
beginGC
.
get
(
Calendar
.
MONTH
)
+
1
)
;
list
.
add
(
sRet
)
;
// 以月为单位,增加时间
beginGC
.
add
(
Calendar
.
MONTH
,
1
)
;
}
return
list
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
return
null
;
}
}
/**
* 解析一个日期段之间的所有日期
*
* @param beginDateStr
* 开始日期
* @param endDateStr
* 结束日期
* @return
*/
public
static
ArrayList
getDayList
(
String
beginDateStr
,
String
endDateStr
)
{
// 指定要解析的时间格式
SimpleDateFormat
f
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
)
;
// 定义一些变量
Date
beginDate
=
null
;
Date
endDate
=
null
;
Calendar
beginGC
=
null
;
Calendar
endGC
=
null
;
ArrayList
list
=
new
ArrayList
(
)
;
try
{
// 将字符串parse成日期
beginDate
=
f
.
parse
(
beginDateStr
)
;
endDate
=
f
.
parse
(
endDateStr
)
;
// 设置日历
beginGC
=
Calendar
.
getInstance
(
)
;
beginGC
.
setTime
(
beginDate
)
;
endGC
=
Calendar
.
getInstance
(
)
;
endGC
.
setTime
(
endDate
)
;
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
)
;
// 直到两个时间相同
while
(
beginGC
.
getTime
(
)
.
compareTo
(
endGC
.
getTime
(
)
)
<=
0
)
{
list
.
add
(
sdf
.
format
(
beginGC
.
getTime
(
)
)
)
;
// 以日为单位,增加时间
beginGC
.
add
(
Calendar
.
DAY_OF_MONTH
,
1
)
;
}
return
list
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
return
null
;
}
}
public
static
ArrayList
getYearList
(
)
{
ArrayList
list
=
new
ArrayList
(
)
;
Calendar
c
=
null
;
c
=
Calendar
.
getInstance
(
)
;
c
.
setTime
(
new
Date
(
)
)
;
int
currYear
=
Calendar
.
getInstance
(
)
.
get
(
Calendar
.
YEAR
)
;
int
startYear
=
currYear
-
5
;
int
endYear
=
currYear
+
10
;
for
(
int
i
=
startYear
;
i
<
endYear
;
i
++
)
{
list
.
add
(
new
Integer
(
i
)
)
;
}
return
list
;
}
public
static
int
getCurrYear
(
)
{
return
Calendar
.
getInstance
(
)
.
get
(
Calendar
.
YEAR
)
;
}
/**
* 得到某一年周的总数
*
* @param year
* @return
*/
public
static
LinkedHashMap
getWeekList
(
int
year
)
{
LinkedHashMap
map
=
new
LinkedHashMap
(
)
;
Calendar
c
=
new
GregorianCalendar
(
)
;
c
.
set
(
year
,
Calendar
.
DECEMBER
,
31
,
23
,
59
,
59
)
;
int
count
=
getWeekOfYear
(
c
.
getTime
(
)
)
;
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
)
;
String
dayOfWeekStart
=
""
;
String
dayOfWeekEnd
=
""
;
for
(
int
i
=
1
;
i
<=
count
;
i
++
)
{
dayOfWeekStart
=
sdf
.
format
(
getFirstDayOfWeek
(
year
,
i
)
)
;
dayOfWeekEnd
=
sdf
.
format
(
getLastDayOfWeek
(
year
,
i
)
)
;
map
.
put
(
new
Integer
(
i
)
,
"第"
+
i
+
"周(从"
+
dayOfWeekStart
+
"至"
+
dayOfWeekEnd
+
")"
)
;
}
return
map
;
}
/**
* 得到一年的总周数
* @param year
* @return
*/
public
static
int
getWeekCountInYear
(
int
year
)
{
Calendar
c
=
new
GregorianCalendar
(
)
;
c
.
set
(
year
,
Calendar
.
DECEMBER
,
31
,
23
,
59
,
59
)
;
int
count
=
getWeekOfYear
(
c
.
getTime
(
)
)
;
return
count
;
}
/**
* 取得当前日期是多少周
*
* @param date
* @return
*/
public
static
int
getWeekOfYear
(
Date
date
)
{
Calendar
c
=
new
GregorianCalendar
(
)
;
c
.
setFirstDayOfWeek
(
Calendar
.
MONDAY
)
;
c
.
setMinimalDaysInFirstWeek
(
7
)
;
c
.
setTime
(
date
)
;
return
c
.
get
(
Calendar
.
WEEK_OF_YEAR
)
;
}
/**
* 得到某年某周的第一天
*
* @param year
* @param week
* @return
*/
public
static
Date
getFirstDayOfWeek
(
int
year
,
int
week
)
{
Calendar
c
=
new
GregorianCalendar
(
)
;
c
.
set
(
Calendar
.
YEAR
,
year
)
;
c
.
set
(
Calendar
.
MONTH
,
Calendar
.
JANUARY
)
;
c
.
set
(
Calendar
.
DATE
,
1
)
;
Calendar
cal
=
(
GregorianCalendar
)
c
.
clone
(
)
;
cal
.
add
(
Calendar
.
DATE
,
week
*
7
)
;
return
getFirstDayOfWeek
(
cal
.
getTime
(
)
)
;
}
/**
* 得到某年某周的最后一天
*
* @param year
* @param week
* @return
*/
public
static
Date
getLastDayOfWeek
(
int
year
,
int
week
)
{
Calendar
c
=
new
GregorianCalendar
(
)
;
c
.
set
(
Calendar
.
YEAR
,
year
)
;
c
.
set
(
Calendar
.
MONTH
,
Calendar
.
JANUARY
)
;
c
.
set
(
Calendar
.
DATE
,
1
)
;
Calendar
cal
=
(
GregorianCalendar
)
c
.
clone
(
)
;
cal
.
add
(
Calendar
.
DATE
,
week
*
7
)
;
return
getLastDayOfWeek
(
cal
.
getTime
(
)
)
;
}
/**
* 得到某年某月的第一天
* @param year
* @param month
* @return
*/
public
static
Date
getFirestDayOfMonth
(
int
year
,
int
month
)
{
month
=
month
-
1
;
Calendar
c
=
Calendar
.
getInstance
(
)
;
c
.
set
(
Calendar
.
YEAR
,
year
)
;
c
.
set
(
Calendar
.
MONTH
,
month
)
;
int
day
=
c
.
getActualMinimum
(
c
.
DAY_OF_MONTH
)
;
c
.
set
(
Calendar
.
DAY_OF_MONTH
,
day
)
;
return
c
.
getTime
(
)
;
}
/**
* 提到某年某月的最后一天
* @param year
* @param month
* @return
*/
public
static
Date
getLastDayOfMonth
(
int
year
,
int
month
)
{
month
=
month
-
1
;
Calendar
c
=
Calendar
.
getInstance
(
)
;
c
.
set
(
Calendar
.
YEAR
,
year
)
;
c
.
set
(
Calendar
.
MONTH
,
month
)
;
int
day
=
c
.
getActualMaximum
(
c
.
DAY_OF_MONTH
)
;
c
.
set
(
Calendar
.
DAY_OF_MONTH
,
day
)
;
return
c
.
getTime
(
)
;
}
/**
* 取得当前日期所在周的第一天
*
* @param date
* @return
*/
public
static
Date
getFirstDayOfWeek
(
Date
date
)
{
Calendar
c
=
new
GregorianCalendar
(
)
;
c
.
setFirstDayOfWeek
(
Calendar
.
MONDAY
)
;
c
.
setTime
(
date
)
;
c
.
set
(
Calendar
.
DAY_OF_WEEK
,
c
.
getFirstDayOfWeek
(
)
)
;
// Monday
return
c
.
getTime
(
)
;
}
/**
* 取得当前日期所在周的最后一天
*
* @param date
* @return
*/
public
static
Date
getLastDayOfWeek
(
Date
date
)
{
Calendar
c
=
new
GregorianCalendar
(
)
;
c
.
setFirstDayOfWeek
(
Calendar
.
MONDAY
)
;
c
.
setTime
(
date
)
;
c
.
set
(
Calendar
.
DAY_OF_WEEK
,
c
.
getFirstDayOfWeek
(
)
+
6
)
;
// Sunday
return
c
.
getTime
(
)
;
}
}
/**
* 为RootPaneContainer组件添加键盘事件
* @param rpc RootPaneContainer组件
* @param action 需要执行的动作
* @param keyName 键的名称
* @param keyCode 键的数字代码
* @param modifiers 任意修饰符的按位或组合
*/
public
static
void
registerKeyEvent
(
RootPaneContainer
rpc
,
Action
action
,
String
keyName
,
int
keyCode
,
int
modifiers
)
{
JRootPane
rp
=
rpc
.
getRootPane
(
)
;
InputMap
inputMap
=
rp
.
getInputMap
(
JComponent
.
WHEN_IN_FOCUSED_WINDOW
)
;
inputMap
.
put
(
KeyStroke
.
getKeyStroke
(
keyCode
,
modifiers
)
,
keyName
)
;
rp
.
getActionMap
(
)
.
put
(
keyName
,
action
)
;
}
// 判断一个文件是否为二进制文件
public
static
boolean
isBinary
(
File
file
)
{
boolean
isBinary
=
false
;
try
{
FileInputStream
fin
=
new
FileInputStream
(
file
)
;
long
len
=
file
.
length
(
)
;
for
(
int
j
=
0
;
j
<
(
int
)
len
;
j
++
)
{
int
t
=
fin
.
read
(
)
;
if
(
t
<
32
&&
t
!=
9
&&
t
!=
10
&&
t
!=
13
)
{
isBinary
=
true
;
break
;
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
(
)
;
}
return
isBinary
;
}