??xml version="1.0" encoding="utf-8" standalone="yes"?> 1. 日期部分 一眼看q去怿大家都知道用Runtime.getRuntime().exec来调用,我的需求就是:
对于像日期、时间和pL对象来说Q不同的国家、地区都有不同的昄格式。即便是同一地区Q也可能存在差异。但是在不考虑国家化,旉格式相对固定的情形下Q对于时间的处理q是相对比较单的。在我最q所作的一个小E序里面Q遇C一些与日期有关的且不考虑国际化和复杂格式的问题。例如如何求两个日期所差的天数Q所差的月数Q将日期c{化ؓ规定格式的字W串Q将规定格式的日期字W串转成相应的日期类{等。下面我׃源码的Ş式逐一介绍上面提到的问题,需要注意的是这些代码都源于我做的一个名为DateUtil的类Q其中独立的变量都是其中的成员变量,函数都是其成员函敎ͼ
1.1.成员变量介:
要想Ҏ(gu)期进行格式化首先需要一个DateFormatcȝ实例Q如果没有特D需求的话,SimpleDateFormatcd是一个不错的选择Q它可以日期类格式化ؓ在其构造函C指定的日期格式。例如,如果我们惌日期格式化为类g2007-07-25q样的格式,我们可以如下定义:
/**以yyyy-MM-dd的Ş式显C格式 **/
SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sFullFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
q里需要注意的是指定的日期格式一定要?#8221;yyyy-MM-dd”Q而不能是”YYYY-MM-DD”Q否则的׃能正常显C。对于这个问题我没有qQ如果有对这个问题有研究的朋友欢q留a?br>
下面的两个成员变量分别是日期分隔W字W串和字W串分隔器,专门用来解析字符串格式的日期?br>/**
*E序中主要的日期分隔Wؓ"-"?/"Q且日期序列?#8220;q???#8221;型,其内容缺一不可
* 例如:09/02/02?009-02-02
**/
publicstaticfinal String DATE_SEPARATOR ="-/";
/**作日期分析之?/
static StringTokenizer sToken;
1.2.取得两个日期之间所差天数的Ҏ(gu)
鉴于java.util.Datecȝl大多数Ҏ(gu)都不使用了,所以我也就不能够利用Date里面方便的getYear()QgetMonth()QgetDay()Ҏ(gu)来计日期差了—现在的JRE都可以自动升U,谁知道哪天SUNH然把Dateq些APIL了,那我欲哭无泪了。不q话又说回来q是能够用这些方法,我们g也不太好,因ؓ每个月的日期数都不一P如果单纯用两个日期的q月日信息来计算日期差还真是有些ȝ。基于以上两点原因,我在我的E序里采用了GregorianCalendar做ؓ日期计算的主力军。这个类有一些很实用的方法,如get(int)Q这个方法可以获得当前日期类的各Ҏ(gu)期指标。比如我们有一个日期类名ؓgcDateQ要获取它所在的q_月,日,至需要这么做QgcDate.get(Calendar.YEAR), gcDate.get(Calendar.MONTH)以及gcDate.get(Calendar.DATE)。不q由于用这U方法获得的日期和月份都是日期类所指定的年份的Q所以如果我们知道两个日期在同一q䆾的话才能使用gcDate1.get(Calendar.DATE)- gcDate2.get(Calendar.DATE)来获得日期差Q否则就不能q么做?br>所以如果想要获得不在同一q䆾的日期差的话需要用到另一个有用的Ҏ(gu)QGregorianCalendar.add(int, int)Q这个方法可以让我们在日期类指定的日期指标(如年Q月Q日{)上加上一个数字,q个数字可以是正C可以数?其中W一个参数指定所要增加的指标Q第二个参数指定增加的数量。例如我们调用gcDate.add(Calendar.DATEQ?)的话Q如果gcDate原来代表的时间ؓ2007-07-24Q那么调用之后就变成2007-07-25了。于是我们就可以q样计算日期差:让日期比较小的那个日期用add函数逐渐“D”那个较大的日期,直到两个日期完全相等为止。计数器中包含的数量即ؓ两个日期的差倹{?br>下面我给Z多个的计日期差的方法,主要包含两个版本Q一个版本参Cؓ格式化字W串Q另一个版本参CؓGregorianCalendar。功能包括计?#8220;今天与未来的某一天之间的日期?#8221;?#8220;l定两个日期的日期差”。主要的计算集中在最后一个daysBetween函数上,该函数接受两个GregorianCalendarcM为参敎ͼq可以计出两个日期之间的日期差Q如果用L出的较大的日期和较小的日期顺序颠倒的话,该函Cq回一个负数倹{?br> /**
*q回未来的某一天和今天所差的日期?br> *注意Q这里要clone一个新的日期以免对原始日期c造成的修攏V?br> *而在daysBetween(GregorianCalendarpFormer,GregorianCalendarpLatter)?br> *直接处理而不q行clone动作Q因里已l做?)
**/
publicstaticint daysBetween(GregorianCalendar pFurtherDay){
GregorianCalendar vToday = new GregorianCalendar();
GregorianCalendar vFurtherDay = (GregorianCalendar) pFurtherDay.clone();
return daysBetween(vToday,vFurtherDay);
}
/**上面函数的String版本 **/
publicstaticint daysBetween(String pFurtherDayStr){
GregorianCalendar vFurtherDay = DateUtil.parse2Cal(pFurtherDayStr);
GregorianCalendar vToday = new GregorianCalendar();
return daysBetween(vToday,vFurtherDay);
}
/**q回较晚的时?latter)与较早的旉(former)所差的天数**/
publicstaticint daysBetween(String pFormerStr,String pLatterStr){
GregorianCalendar pFormer = DateUtil.parse2Cal(pFormerStr);
GregorianCalendar pLatter = DateUtil.parse2Cal(pLatterStr);
return daysBetween(pFormer,pLatter);
}
/**q回较晚的时?latter)与较早的旉(former)所差的天数**/
publicstaticint daysBetween(GregorianCalendar pFormer,GregorianCalendar pLatter){
GregorianCalendar vFormer = pFormer,vLatter = pLatter;
boolean vPositive = true;
if( pFormer.before(pLatter) ){
vFormer = pFormer;
vLatter = pLatter;
}else{
vFormer = pLatter;
vLatter = pFormer;
vPositive = false;
}
vFormer.set(Calendar.MILLISECOND,0);
vFormer.set(Calendar.SECOND,0);
vFormer.set(Calendar.MINUTE,0);
vFormer.set(Calendar.HOUR_OF_DAY,0);
vLatter.set(Calendar.MILLISECOND,0);
vLatter.set(Calendar.SECOND,0);
vLatter.set(Calendar.MINUTE,0);
vLatter.set(Calendar.HOUR_OF_DAY,0);
int vCounter = 0;
while(vFormer.before(vLatter)){
vFormer.add(Calendar.DATE, 1);
vCounter++;
}
if( vPositive)
return vCounter;
else
return -vCounter;
}
1.3.两个日期的月份差
获得两个日期的月份差的方法与获得日期差基本一致。但需要注意的是,计算月䆾差不能简单用before()来进行计。还需要考虑C们的q䆾及月份是否同时相{,只有在这U情况下Q才能获得月份差的正数倹{下面同LZ月䆾差的两个版本的多个函敎ͼ与日期差基本一_q里׃再赘q?br> /**
*l定两个旉相差的月?br> */
//本月和未来一个月的月份差
publicstaticint monthsBetween(GregorianCalendar pFurtherMonth){
GregorianCalendar vToday = new GregorianCalendar();
GregorianCalendar vFurtherMonth = (GregorianCalendar) pFurtherMonth.clone();
return monthsBetween(vToday,vFurtherMonth);
}
/**l定月分和本月的月䆾?*/
publicstaticint monthsBetween(String pFurtherMonth){
GregorianCalendar vToday = new GregorianCalendar();
GregorianCalendar vFurtherMonth = DateUtil.parse2Cal(pFurtherMonth);
return monthsBetween(vToday,vFurtherMonth);
}
/**l定两个旉相差的月?String?*/
publicstaticint monthsBetween(String pFormerStr,String pLatterStr){
GregorianCalendar vFormer = DateUtil.parse2Cal(pFormerStr);
GregorianCalendar vLatter = DateUtil.parse2Cal(pLatterStr);
return monthsBetween(vFormer,vLatter);
}
publicstaticint monthsBetween(GregorianCalendar pFormer,GregorianCalendar pLatter){
GregorianCalendar vFormer = pFormer,vLatter = pLatter;
boolean vPositive = true;
if( pFormer.before(pLatter) ){
vFormer = pFormer;
vLatter = pLatter;
}else{
vFormer = pLatter;
vLatter = pFormer;
vPositive = false;
}
int vCounter = 0;
while(vFormer.get(vFormer.YEAR) != vLatter.get(vLatter.YEAR) ||
vFormer.get(vFormer.MONTH) != vLatter.get(vLatter.MONTH)){
vFormer.add(Calendar.MONTH, 1);
vCounter++;
}
if( vPositive)
return vCounter;
else
return -vCounter;
}
1.4.格式转换
日期类转换成制定格式的字符串只需要调用DateFormat.format()卛_。而反q来比较麻烦,我们需要对字符串进行分析,扑և其年Q月Q日的值分别ؓ何,然后再用GregorianCalendar(vYear,vMonth,vDayOfMonth)构徏一个新的日期类?br>
/** 日期变为字W串格式 **/
publicstatic String format(GregorianCalendar pCal){
returnsDateFormat.format(pCal.getTime());
}
publicstatic String format(Date pDate){
returnsDateFormat.format(pDate);
}
publicstatic String fullFormat(Date pDate){
returnsFullFormat.format(pDate);
}
/**字W串格式的日期{换ؓCalender**/
publicstatic GregorianCalendar parse2Cal(String pDateStr){
sToken = new StringTokenizer(pDateStr,DATE_SEPARATOR);
int vYear = Integer.parseInt(sToken.nextToken());
//GregorianCalendar的月份是?开始算LQ变态!Q?br> int vMonth = Integer.parseInt(sToken.nextToken())-1;
int vDayOfMonth = Integer.parseInt(sToken.nextToken());
returnnew GregorianCalendar(vYear,vMonth,vDayOfMonth);
}
/**字W串cd的日?yyyy-MM-dd)转换成Date**/
publicstatic Date parse2Date(String pDate){
try {
returnsDateFormat.parse(pDate);
}catch(ParseException ex) {
returnnull;
}
}
1.5.其他
q部分主要是一些常用方法的包装Q包括获得今天是本月的第几天Q本月是本年的第几个月,获得l定字符串日期的月䆾敎ͼ以及获得下面q个月䆾区间[本月Q本?pZoneSize]里的月䆾列表。即如果本月?月,pZoneSize=6Q则获得的月份列表应该ؓ{6Q?Q?Q?Q?0Q?1Q?2}
/**q回今天是本月的W几?*/
publicstaticint dayOfMonthOfToday(){
GregorianCalendar vTodayCal = new GregorianCalendar();
return vTodayCal.get(vTodayCal.DAY_OF_MONTH);
}
/**q回本月是本q的W几个月**/
publicstaticint monthOfYear(){
GregorianCalendar vTodayCal = new GregorianCalendar();
return vTodayCal.get(vTodayCal.MONTH)+1;
}
//q回l定日期的月?br> publicstatic String getMonth(String pFormattedDate){
StringTokenizer vSt = new StringTokenizer(pFormattedDate,"-");
vSt.nextToken();//跌q䆾
int val = Integer.parseInt(vSt.nextToken());
return val+"";
}
/**获得从本月开始到本月+pZoneSize区间内的月数**/
publicstatic String[] monthList(int pZoneSize){
String[] vMonthList = new String[pZoneSize];
GregorianCalendar vTodayCal = new GregorianCalendar();
for(int i = 0; i < pZoneSize; i++){
vMonthList[i] = String.valueOf(vTodayCal.get(vTodayCal.MONTH)+1);
vTodayCal.roll(vTodayCal.MONTH,true);
}
return vMonthList;
}
2. 数字部分Q?br>q一部分我的工作比较单,首先是格式化l定的Double变量Q让其只昄两位数。其ơ是׃我所做的E序付款额都是以万作为单位的Q所以在必要的时候将其{Z万ؓ单位的,带有两位数的数字。由于比较简单,q里׃多说Q各位看代码好Q?br>/**仅显C小数点后两位的Formater**/
publicstatic DecimalFormat formatter = new DecimalFormat("####.##");
/**给定的数字变成数点后两位的字W串**/
publicstatic String format(double pSrcVal){
returnformatter.format(pSrcVal);
}
/**原始数据除?0000所得的l果**/
publicstatic String fromat2Myriad(double pSrcVal){
returnformatter.format(pSrcVal/10000.0);
}
/**原始数据除?0000所得的l果**/
publicstatic String fromat2Myriad(String pSrcVal){
returnformatter.format(Double.parseDouble(pSrcVal)/10000.0);
}
/**给定的数字保留两位数q回**/
publicstaticdouble format2Double(double pSrcVal){
return (double)Math.round(pSrcVal*100)/100.0;
}
1. Map的遍?br>有h看了q个标题可能发笑Q因实在太简单,N我在凑字敎ͼ可是Ҏ(gu)我自ql验来说Qh的岁数长的时候记忆力却不跟着长,倒有不进反退的现象。我是虽然写过很多遍但仍然用到的时候就忘个q净Q在q里写一下强化记忆J
SortedMap pDataMap = new TreeMap();
Iterator itor = pDataMap.entrySet().iterator();
while(itor.hasNext()){
Map.Entry vEntry = (Entry) itor.next();
vEntry.getKey();
vEntry.getValue();
//做一些其他的?#8230;…
}
2. 文g操作
本文主要x单的对象序列化的相关操作Q对于更l的操作q程Q请参照《Java~程思想 2e》?br>2.1.文gqo?br>文gqo器主要用在FileChooser或者File.listFiles()Ҏ(gu)中,用于qo掉一些与本程序无关的cd文g。本例给Z个察看给定文件后~名的文gqo器,对于l定的文件察看其文g名,如果和给定的后缀名一致则q回trueQ否则返回false?br>publicclass RecorderFileFilter implements FilenameFilter
{
/**后缀名 **/
String postfixStr;
public RecorderFileFilter(String postfix){
this.postfixStr = postfix;
}
publicboolean accept(File dir, String name) {
/**只判断后文g的缀名是否正即可 **/
if( name.endsWith(postfixStr) )
returntrue;
else
returnfalse;
}
}
2.2.对象的保存与d
首先介绍一下我的程序的存储l构Q我的数据保存在两种cd的文件中Q即“旉字符?data”?#8220;旉字符?plan”两种cd。其?data文g是一个HashMap<String,String>cȝ序列化文Ӟ?plan文g是一个SortedMap<String,String>cȝ序列化文件。他们都保存?#8220;user.dir/data”目录下。下面的q些Ҏ(gu)的功能是d/保存q个目录下数据文Ӟ如果你想保存你自定义的文件到指定目录Q下面的代码至需要稍微修改一下即可用:
/**用以标识d数据的类型,也是文g后缀?*/
publicstaticfinal String DATA_TYPE = ".data";
publicstaticfinal String PLAN_TYPE = ".plan";
/**以程序运行目录作为基目录**/
publicstatic File appDir = new File(System.getProperty("user.dir"));
publicstatic File imgDir = new File(appDir,"img");
publicstatic File dataDir = new File(appDir,"data");
publicstatic File reportDir = new File(appDir,"report");
publicstatic FileInputStream fIn;
publicstatic FileOutputStream fOut;
publicstatic ObjectInputStream objIn;
publicstatic ObjectOutputStream objOut;
/**---------------功能函数部分----------------------**/
/**
*查找q读?user.home/data/"目录下所有的记录文gQ将其放C个Map?br> *HashMap的Key为文件名Q也是欠ƾh帐户的ID受?br> *关于获得的文件的具体信息请参照技术说明书?br> *如果pType=DATA_TYPEQ则dataMap的格式ؓ<String,HashMap>
* pType=PLAN_TYPEQ则dataMap的格式ؓ<String,SortedMap>
*@returnSortedMap
*/
publicstatic HashMap loadAll(String pType){
/** 数据文g?历̎L旉)即ؓID **/
HashMap vDataMap = new HashMap();
/**后缀名ؓdata的即为数据文?*/
File[] dataFiles = dataDir.listFiles(new RecorderFileFilter(pType));
for(int i = 0; i < dataFiles.length; i++){
try{
if( pType.equals(FileUtil.DATA_TYPE) ){
HashMap<String,String> hMap = (HashMap<String,String>)loadObjectFromFile(dataFiles[i]);
/**L文g名的后缀名即或得keyQ也是Ơ款帐户ID**/
vDataMap.put(hMap.get("id"),hMap);
}elseif( pType.equals(FileUtil.PLAN_TYPE) ){
SortedMap<String,SortedMap> hMap = (SortedMap<String,SortedMap>)loadObjectFromFile(dataFiles[i]);
/**L文g名的后缀名即或得keyQ也是Ơ款帐户ID**/
vDataMap.put(StringUtil.clearFileName(dataFiles[i]) ,hMap);
}else
thrownew Exception("d了错误的文gcd");
}
catch(Exception ex) {
MessageUtil.showErrMsg("d数据时出现错误,数据有可能丢失!"+
"\n 文g名ؓ:"+dataFiles[i].getName());
}
}
return vDataMap;
}
/**
*给定内容存入文件中.
*@parampContentMapMap其所装内容ؓ<id(String), HashMap或SortedMap>
*/
publicstaticvoid saveAll(HashMap<String,String> pDataMap,SortedMap<String,String> pPlanMap){
Iterator itor = pDataMap.entrySet().iterator();
while(itor.hasNext()){
Map.Entry vEntry = (Entry) itor.next();
String id = (String) vEntry.getKey();
saveToFile(id,pDataMap,pPlanMap);
}
}
/**
*制定欠ƾ̎L信息存入文g?br> *@paramidString q个信息在保存欠Ƒ֍议时不可或缺
*@parampDataMapSortedMap
*@parampPlanMapSortedMap
*/
publicstaticvoid saveToFile(String id, HashMap<String,String> pDataMap,
SortedMap<String,String> pPlanMap){
try{
if( pDataMap != null )
saveObjectToFile(new File(dataDir,id+DATA_TYPE), pDataMap);
if( pPlanMap != null )
saveObjectToFile(new File(dataDir,id+PLAN_TYPE), pPlanMap);
}
catch(Exception ex) {
MessageUtil.showErrMsg("保存数据时出现错误,数据没有被正保存!");
}
}
/**
*文件中的序列化对象d?br> *@parampFileFile
*@returnObject
*@throwsException
*/
publicstatic Object loadObjectFromFile(File pFile) throws Exception {
fIn = new FileInputStream(pFile);
objIn = new ObjectInputStream(fIn);
Object obj = objIn.readObject();
fIn.close();
objIn.close();
return obj;
}
/**
*对象序列化到相应的文g中去--保存数据时候专用,因ؓ该函数将数据保存在appDir/data目录?br> *@parampFileNameString
*@paramobjObject
*@throwsException
*/
publicstaticvoid saveObjectToFile(File pFile,Object pObj) throws Exception
{
fOut = new FileOutputStream(pFile);
objOut = new ObjectOutputStream(fOut);
objOut.writeObject(pObj);
fOut.close();
objOut.close();
}
2.3.其他
׃每个E序都有图标文gQ所以从制定目录d图标应该是每个程序都会用到的。其ơ,删除指定目录下的指定cd文gg也很常用J
/**从img文g夹中获取图标**/
publicstatic ImageIcon getImageIcon(String pImageFileName){
File imgFile = new File(imgDir,pImageFileName);
ImageIcon imageIcon = new ImageIcon(imgFile.getAbsolutePath());
return imageIcon;
}
/**清除reportDir目录下所有html文g**/
publicstaticvoid clearReportFiles(){
File vReportDir = new File(reportDir.getAbsolutePath());
File[] vReportFiles = vReportDir.listFiles(new FilenameFilter(){
publicboolean accept(File dir, String name){
if( name.endsWith("html"))
returntrue;
returnfalse;
}
});
for(int i = 0; i < vReportFiles.length; i++)
vReportFiles[i].delete();
}
]]>
@echo 你提供的jdk安装目录为:%1
@echo off
IF EXIST %1\bin\java.exe (
rem 如输入正的 Java2SDK 安装目录Q开始设|环境变?br>
@setx JAVA_HOME %1
@setx path %JAVA_HOME%\bin;%path%
@setx classpath %classpath%;.
@setx classpath %classpath%;%JAVA_HOME%\lib\tools.jar
@setx classpath %classpath%;%JAVA_HOME%\lib\dt.jar
@setx classpath %classpath%;%JAVA_HOME%\jre\lib\rt.jar
@echo on
@echo Java 2 SDK 环境参数讄完毕Q正帔R出?br>
) ELSE (
IF %1=="" (
rem 如没有提供安装目录,提示之后退?br>
@echo on
@echo 没有提供 Java2SDK 的安装目?不做M讄Q现在退出环境变量设|?br>
) ELSE (
rem 如果提供非空的安装目录但没有bin\java.exeQ则指定的目录ؓ错误的目?br>
@echo on
@echo 非法?nbsp;Java2SDK 的安装目?不做M讄Q现在退出环境变量设|?br>
)
)
这个文件解压羃后的exe文g和bat攑֜同一个文件夹下即?br>
]]>
调用Oracle EXP命o完成备䆾Qƈq回生成的备份文件名Q这个备份文件会很快在其他的地方被用?br>采用Runtime.getRuntime().exec我们都知道,需要处理它的InputStreamQ以避免出现执行的命令输出的信息q多使得q程被堵死,OKQ按照这LҎ(gu)Q开写: String[] cmds = new String[ 3 ];
cmds[ 0 ] = " cmd " ;
cmds[ 1 ] = " /C " ;
cmds[ 2 ] = "exp username/password@sid file=xxx.dmp log=xxx.log";
Process process = Runtime.getRuntime().exec(cmds);
try
{
InputStreamReader isr = new InputStreamReader(process.getInputStream());
BufferedReader br = new BufferedReader(isr);
String line = null ;
while ((line = br.readLine()) != null )
{
System.out.println(line);
} }
catch (IOException ioe)
{
ioe.printStackTrace();
}
String[] cmds = new String[3];
cmds[0] = "cmd";
cmds[1] = "/C";
cmds[2]=commandBuf.toString();
Process process=Runtime.getRuntime().exec(cmds);
boolean shouldClose=false;
try
{
InputStreamReader isr = new InputStreamReader(process.getErrorStream());
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
{
if(line.indexOf("错误")!=-1)
{
shouldClose=true;
break;
}
}
}
catch (IOException ioe)
{
shouldClose=true;
}
if(shouldClose)
process.destroy();
int exitVal = process.waitFor();
担心以后再次到q样的问题,备忘一?...
]]>
split Ҏ(gu)能够很方便的字W串按照一定的规则拆分开?/span>
比如对于下面的字W串Q?/span>
Tom,Jane,Tony,Elva,Gigi
只要调用如下的代码就可以各个名字提取出来:
String value = "Tom,Jane,Tony,Elva,Gigi";
String[] names = value.split(",");
for(int i=0,n=names.length;i<n;i++)
{
System.out.println(names[i]);
}
q行l果Q?/span>
Tom
Jane
Tony
Elva
Gigi
看到q个q行l果Q很多h都认?/span> split Ҏ(gu)是按照l定的字W串对字W串q行拆分Q知道碰C下面的问题?/span>
有一个字W串Q中?/span> . 北京 . h(wn) . 学院路。请解析此字W串Qƈ打印输出“中国 北京 h(wn) 学院?/span> ”?/span>
于是写代码如下:
String value = " 中国 . 北京 . h(wn) . 学院?/span> ";
String[] names = value.split(".");
for(int i=0,n=names.length;i<n;i++)
{
System.out.print(names[i]+" ");
}
q行l果Q?/span>
对,没看错!没有M输出Q?/span>
让我们来看看 split Ҏ(gu)的方法签名吧Q?/span>
public String[] split(String regex)
q里的参数的名称?/span> regex Q也是 Regular Expression Q正则表辑ּQ。这个参数ƈ不是一个简单的分割用的字符Q而是一个正则表辑ּQ看?/span> split Ҏ(gu)的实C码就更坚定了我们的信心:
public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
}
split 的实现直接调用的 Matcher cȝ split 的方法。读者已l知道,“ . ”在正则表辑ּ中有Ҏ(gu)的含义,因此我们使用的时候必进行{义?/span>
修改代码如下Q?/span>
private static void split2()
{
String value = " 中国 . 北京 . h(wn) . 学院?/span> ";
String[] names = value.split("\\.");
for(int i=0,n=names.length;i<n;i++)
{
System.out.print(names[i]+" ");
}
}
q行l果 Q?/span>
中国 北京 h(wn) 学院?/span>