﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;font color="#669933"&gt;MyJavaBlog&lt;/font&gt;-文章分类-J2se</title><link>http://www.blogjava.net/Swing/category/22249.html</link><description>&lt;font size="3"&gt;&lt;br&gt;&lt;font color="#669933"&gt;天行健  君子以自强不息&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 31 Jul 2007 17:41:32 GMT</lastBuildDate><pubDate>Tue, 31 Jul 2007 17:41:32 GMT</pubDate><ttl>60</ttl><item><title>java实用知识</title><link>http://www.blogjava.net/Swing/articles/133585.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Tue, 31 Jul 2007 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/133585.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/133585.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/133585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/133585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/133585.html</trackback:ping><description><![CDATA[<p style="COLOR: #008000">刚才看到的觉得挺好 备份一下</p>
<p style="COLOR: #008000">1.&nbsp;&nbsp; 日期部分<br>对于像日期、时间和钱这样的对象来说，不同的国家、地区都有不同的显示格式。即便是同一地区，也可能存在差异。但是在不考虑国家化，时间格式相对固定的情形下，对于时间的处理还是相对比较简单的。在我最近所作的一个小程序里面，遇到了一些与日期有关的且不考虑国际化和复杂格式的问题。例如如何求两个日期所差的天数，所差的月数；将日期类转化为规定格式的字符串，将规定格式的日期字符串转成相应的日期类等等。下面我就以源码的形式逐一介绍上面提到的问题，需要注意的是这些代码都源于我做的一个名为DateUtil的类，其中独立的变量都是其中的成员变量，函数都是其成员函数：<br>1.1.成员变量简介：<br>要想对日期进行格式化首先就需要一个DateFormat类的实例，如果没有特殊需求的话，SimpleDateFormat类就是一个不错的选择，它可以将日期类格式化为在其构造函数中指定的日期格式。例如，如果我们想要将日期格式化为类似于2007-07-25这样的格式，我们就可以如下定义：<br>/**以yyyy-MM-dd的形式显示格式　**/<br>SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd");<br>SimpleDateFormat sFullFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");<br>&nbsp;<br>这里需要注意的是指定的日期格式一定要是&#8221;yyyy-MM-dd&#8221;，而不能是&#8221;YYYY-MM-DD&#8221;，否则的就不能正常显示。对于这个问题我没有深究，如果有对这个问题有研究的朋友欢迎留言。<br>&nbsp;<br>下面的两个成员变量分别是日期分隔符字符串和字符串分隔器，专门用来解析字符串格式的日期。<br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; *程序中主要的日期分隔符为"-"和"/"，且日期序列为&#8220;年/月/日&#8221;型，其内容缺一不可<br>&nbsp;&nbsp;&nbsp;&nbsp; * 例如:09/02/02或2009-02-02<br>&nbsp;&nbsp;&nbsp;&nbsp; **/<br>publicstaticfinal String DATE_SEPARATOR ="-/";<br>/**作日期分析之用*/<br>static StringTokenizer sToken;<br>&nbsp;<br>1.2.取得两个日期之间所差天数的方法<br>鉴于java.util.Date类的绝大多数方法都不建议使用了，所以我也就不能够利用Date里面方便的getYear()，getMonth()，getDay()方法来计算日期差了—现在的JRE都可以自动升级，谁知道哪天SUN突然把Date这些API去掉了，那我就欲哭无泪了。不过话又说回来就算是能够使用这些方法，我们似乎也不太好算，因为每个月的日期数都不一样，如果单纯用两个日期的年月日信息来计算日期差还真是有些麻烦。基于以上两点原因，我在我的程序里采用了GregorianCalendar做为日期计算的主力军。这个类有一些很实用的方法，如get(int)，这个方法可以获得当前日期类的各项日期指标。比如我们有一个日期类名为gcDate，要获取它所在的年，月，日，至需要这么做：gcDate.get(Calendar.YEAR), gcDate.get(Calendar.MONTH)以及gcDate.get(Calendar.DATE)。不过由于使用这种方法获得的日期和月份都是日期类所指定的年份的，所以如果我们知道两个日期在同一年份的话才能使用gcDate1.get(Calendar.DATE)- gcDate2.get(Calendar.DATE)来获得日期差，否则就不能这么做。<br>所以如果想要获得不在同一年份的日期差的话就需要用到另一个有用的方法：GregorianCalendar.add(int, int)，这个方法可以让我们在日期类指定的日期指标（如年，月，日等）上加上一个数字，这个数字可以是正数也可以为负数。 其中第一个参数指定所要增加的指标，第二个参数指定增加的数量。例如我们调用gcDate.add(Calendar.DATE，1)的话，如果gcDate原来代表的时间为2007-07-24，那么调用之后就变成2007-07-25了。于是我们就可以这样计算日期差：让日期比较小的那个日期用add函数逐渐&#8220;逼近&#8221;那个较大的日期，直到两个日期完全相等为止。计数器中包含的数量即为两个日期的差值。<br>下面我给出了多个的计算日期差的方法，主要包含两个版本，一个版本参数为格式化字符串，另一个版本参数为GregorianCalendar。功能包括计算&#8220;今天与未来的某一天之间的日期差&#8221;和&#8220;给定两个日期的日期差&#8221;。主要的计算集中在最后一个daysBetween函数上，该函数接受两个GregorianCalendar类作为参数，并可以计算出两个日期之间的日期差，如果用户给出的较大的日期和较小的日期顺序颠倒的话，该函数会返回一个负数值。<br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; *返回未来的某一天和今天所差的日期数<br>&nbsp;&nbsp;&nbsp;&nbsp; *注意，这里要clone一个新的日期以免对原始日期类造成的修改。<br>&nbsp;&nbsp;&nbsp;&nbsp; *而在daysBetween(GregorianCalendarpFormer,GregorianCalendarpLatter)就<br>&nbsp;&nbsp;&nbsp;&nbsp; *直接处理而不进行clone动作，因为这里已经做了:)<br>&nbsp;&nbsp;&nbsp;&nbsp; **/<br>&nbsp;&nbsp;&nbsp; publicstaticint daysBetween(GregorianCalendar pFurtherDay){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vToday = new GregorianCalendar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vFurtherDay = (GregorianCalendar) pFurtherDay.clone();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return daysBetween(vToday,vFurtherDay);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**上面函数的String版本　**/<br>&nbsp;&nbsp;&nbsp; publicstaticint daysBetween(String pFurtherDayStr){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vFurtherDay = DateUtil.parse2Cal(pFurtherDayStr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vToday = new GregorianCalendar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return daysBetween(vToday,vFurtherDay);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**返回较晚的时间(latter)与较早的时间(former)所差的天数**/<br>&nbsp;&nbsp; publicstaticint daysBetween(String pFormerStr,String pLatterStr){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar pFormer = DateUtil.parse2Cal(pFormerStr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar pLatter = DateUtil.parse2Cal(pLatterStr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return daysBetween(pFormer,pLatter);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>/**返回较晚的时间(latter)与较早的时间(former)所差的天数**/<br>publicstaticint daysBetween(GregorianCalendar pFormer,GregorianCalendar pLatter){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vFormer = pFormer,vLatter = pLatter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean vPositive = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( pFormer.before(pLatter) ){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer = pFormer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vLatter = pLatter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer = pLatter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vLatter = pFormer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vPositive = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer.set(Calendar.MILLISECOND,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer.set(Calendar.SECOND,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer.set(Calendar.MINUTE,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer.set(Calendar.HOUR_OF_DAY,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vLatter.set(Calendar.MILLISECOND,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vLatter.set(Calendar.SECOND,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vLatter.set(Calendar.MINUTE,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vLatter.set(Calendar.HOUR_OF_DAY,0);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int vCounter = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(vFormer.before(vLatter)){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer.add(Calendar.DATE, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( vPositive)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return vCounter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -vCounter;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>1.3.两个日期的月份差<br>获得两个日期的月份差的方法与获得日期差基本一致。但需要注意的是，计算月份差不能简单用before()来进行计算。还需要考虑到他们的年份及月份是否同时相等，只有在这种情况下，才能获得月份差的正确数值。下面同样给出了月份差的两个版本的多个函数，与日期差基本一致，这里就不再赘述。<br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; *给定两个时间相差的月数<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; //本月和未来一个月的月份差<br>&nbsp;&nbsp; publicstaticint monthsBetween(GregorianCalendar pFurtherMonth){<br>&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vToday = new GregorianCalendar();<br>&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vFurtherMonth = (GregorianCalendar) pFurtherMonth.clone();<br>&nbsp;&nbsp;&nbsp;&nbsp; return monthsBetween(vToday,vFurtherMonth);<br>&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**给定月分和本月的月份差**/<br>&nbsp;&nbsp;&nbsp; publicstaticint monthsBetween(String pFurtherMonth){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vToday = new GregorianCalendar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vFurtherMonth = DateUtil.parse2Cal(pFurtherMonth);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return monthsBetween(vToday,vFurtherMonth);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**给定两个时间相差的月数,String版**/<br>&nbsp;&nbsp;&nbsp; publicstaticint monthsBetween(String pFormerStr,String pLatterStr){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vFormer = DateUtil.parse2Cal(pFormerStr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vLatter = DateUtil.parse2Cal(pLatterStr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return monthsBetween(vFormer,vLatter);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; publicstaticint monthsBetween(GregorianCalendar pFormer,GregorianCalendar pLatter){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vFormer = pFormer,vLatter = pLatter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean vPositive = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( pFormer.before(pLatter) ){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer = pFormer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vLatter = pLatter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer = pLatter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vLatter = pFormer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vPositive = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int vCounter = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(vFormer.get(vFormer.YEAR) != vLatter.get(vLatter.YEAR) ||<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer.get(vFormer.MONTH) != vLatter.get(vLatter.MONTH)){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vFormer.add(Calendar.MONTH, 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vCounter++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( vPositive)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return vCounter;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -vCounter;<br>&nbsp;&nbsp;&nbsp; }<br>1.4.格式转换<br>将日期类转换成制定格式的字符串只需要调用DateFormat.format()即可。而反过来就比较麻烦，我们需要对字符串进行分析，找出其年，月，日的值分别为何，然后再用GregorianCalendar(vYear,vMonth,vDayOfMonth)构建一个新的日期类。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /** 将日期变为字符串格式 **/<br>&nbsp;&nbsp;&nbsp; publicstatic String format(GregorianCalendar pCal){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnsDateFormat.format(pCal.getTime());<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; publicstatic String format(Date pDate){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnsDateFormat.format(pDate);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; publicstatic String fullFormat(Date pDate){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnsFullFormat.format(pDate);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**将字符串格式的日期转换为Calender**/<br>&nbsp;&nbsp;&nbsp; publicstatic GregorianCalendar parse2Cal(String pDateStr){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sToken = new StringTokenizer(pDateStr,DATE_SEPARATOR);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int vYear = Integer.parseInt(sToken.nextToken());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //GregorianCalendar的月份是从0开始算起的，变态！！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int vMonth = Integer.parseInt(sToken.nextToken())-1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int vDayOfMonth = Integer.parseInt(sToken.nextToken());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnnew GregorianCalendar(vYear,vMonth,vDayOfMonth);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**将字符串类型的日期(yyyy-MM-dd)转换成Date**/<br>&nbsp;&nbsp;&nbsp; publicstatic Date parse2Date(String pDate){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnsDateFormat.parse(pDate);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(ParseException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnnull;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>1.5.其他<br>这部分主要是一些常用方法的包装，包括获得今天是本月的第几天，本月是本年的第几个月，获得给定字符串日期的月份数，以及获得下面这个月份区间[本月，本月+pZoneSize]里的月份列表。即如果本月为6月，pZoneSize=6，则获得的月份列表应该为{6，7，8，9，10，11，12}<br>&nbsp;&nbsp;&nbsp; /**返回今天是本月的第几天**/<br>&nbsp;&nbsp;&nbsp; publicstaticint dayOfMonthOfToday(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vTodayCal = new GregorianCalendar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return vTodayCal.get(vTodayCal.DAY_OF_MONTH);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**返回本月是本年的第几个月**/<br>&nbsp;&nbsp;&nbsp; publicstaticint monthOfYear(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vTodayCal = new GregorianCalendar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return vTodayCal.get(vTodayCal.MONTH)+1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; //返回给定日期的月份<br>&nbsp;&nbsp;&nbsp; publicstatic String getMonth(String pFormattedDate){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringTokenizer vSt = new StringTokenizer(pFormattedDate,"-");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vSt.nextToken();//跳过年份<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int val = Integer.parseInt(vSt.nextToken());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return val+"";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**获得从本月开始到本月+pZoneSize区间内的月数**/<br>&nbsp;&nbsp;&nbsp; publicstatic String[] monthList(int pZoneSize){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] vMonthList = new String[pZoneSize];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GregorianCalendar vTodayCal = new GregorianCalendar();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; pZoneSize; i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vMonthList[i] = String.valueOf(vTodayCal.get(vTodayCal.MONTH)+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vTodayCal.roll(vTodayCal.MONTH,true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return vMonthList;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>2.&nbsp;&nbsp; 数字部分：<br>这一部分我的工作比较简单，首先是格式化给定的Double变量，让其只显示两位小数。其次是由于我所做的程序付款额都是以万作为单位的，所以在必要的时候将其转为以万为单位的，带有两位小数的数字。由于比较简单，这里就不多说，各位看代码就好：<br>/**仅显示小数点后两位的Formater**/<br>&nbsp;&nbsp;&nbsp; publicstatic DecimalFormat formatter&nbsp;&nbsp; =&nbsp;&nbsp; new&nbsp;&nbsp; DecimalFormat("####.##");<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**将给定的数字变成小数点后两位的字符串**/<br>&nbsp;&nbsp;&nbsp; publicstatic String format(double pSrcVal){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnformatter.format(pSrcVal);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**将原始数据除以10000所得的结果**/<br>&nbsp;&nbsp;&nbsp; publicstatic String fromat2Myriad(double pSrcVal){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnformatter.format(pSrcVal/10000.0);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**将原始数据除以10000所得的结果**/<br>&nbsp;&nbsp;&nbsp; publicstatic String fromat2Myriad(String pSrcVal){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnformatter.format(Double.parseDouble(pSrcVal)/10000.0);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**将给定的数字保留两位小数返回**/<br>&nbsp;&nbsp;&nbsp; publicstaticdouble format2Double(double pSrcVal){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (double)Math.round(pSrcVal*100)/100.0;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 1.&nbsp;&nbsp; Map的遍历<br>有人看了这个标题可能发笑，因为这实在太简单，难道我在凑字数？可是根据我自己的经验来说，人的岁数长的时候记忆力却不跟着长，倒有不进反退的现象。我就是虽然写过很多遍但仍然用到的时候就忘个干净，在这里写一下强化记忆J<br>SortedMap pDataMap = new TreeMap();<br>Iterator itor = pDataMap.entrySet().iterator();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(itor.hasNext()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map.Entry vEntry = (Entry) itor.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vEntry.getKey();<br>&nbsp;&nbsp;&nbsp; vEntry.getValue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //做一些其他的事&#8230;&#8230;<br>}<br>2.&nbsp;&nbsp; 文件操作<br>本文主要关注简单的对象序列化的相关操作，对于更为详细的操作过程，请参照《Java编程思想 2e》。<br>2.1.文件过滤器<br>文件过滤器主要用在FileChooser或者File.listFiles()方法中，用于过滤掉一些与本程序无关的类型文件。本例给出一个察看给定文件后缀名的文件过滤器，对于给定的文件察看其文件名，如果和给定的后缀名一致则返回true，否则返回false。<br>publicclass RecorderFileFilter implements FilenameFilter<br>{<br>&nbsp;&nbsp;&nbsp; /**后缀名　**/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String postfixStr;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public RecorderFileFilter(String postfix){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.postfixStr = postfix;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; publicboolean accept(File dir, String name) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**只判断后文件的缀名是否正确即可　**/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( name.endsWith(postfixStr) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returntrue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnfalse;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br>2.2.对象的保存与读取<br>首先介绍一下我的程序的存储结构：我的数据保存在两种类型的文件中，即&#8220;时间字符串.data&#8221;和&#8220;时间字符串.plan&#8221;两种类型。其中.data文件是一个HashMap&lt;String,String&gt;类的序列化文件，而.plan文件是一个SortedMap&lt;String,String&gt;类的序列化文件。他们都保存在&#8220;user.dir/data&#8221;目录下。下面的这些方法的功能是读取/保存这个目录下数据文件，如果你想保存你自定义的文件到指定目录，下面的代码至需要稍微修改一下即可使用：<br>/**用以标识读入数据的类型，也是文件后缀名**/<br>&nbsp;&nbsp;&nbsp; publicstaticfinal String DATA_TYPE = ".data";<br>&nbsp;&nbsp;&nbsp; publicstaticfinal String PLAN_TYPE = ".plan";<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**以程序运行目录作为基目录**/<br>&nbsp;&nbsp;&nbsp; publicstatic File appDir = new File(System.getProperty("user.dir"));<br>&nbsp;&nbsp;&nbsp; publicstatic File imgDir = new File(appDir,"img");<br>&nbsp;&nbsp;&nbsp; publicstatic File dataDir = new File(appDir,"data");<br>&nbsp;&nbsp;&nbsp; publicstatic File reportDir = new File(appDir,"report");<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; publicstatic FileInputStream fIn;<br>&nbsp;&nbsp;&nbsp; publicstatic FileOutputStream fOut;<br>&nbsp;&nbsp;&nbsp; publicstatic ObjectInputStream objIn;<br>&nbsp;&nbsp;&nbsp; publicstatic ObjectOutputStream objOut;<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**---------------功能函数部分----------------------**/<br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; *查找并读入"user.home/data/"目录下所有的记录文件，将其放到一个Map中<br>&nbsp;&nbsp;&nbsp;&nbsp; *HashMap的Key为文件名，也是欠款人帐户的ID号。<br>&nbsp;&nbsp;&nbsp;&nbsp; *关于获得的文件的具体信息请参照技术说明书。<br>&nbsp;&nbsp;&nbsp;&nbsp; *如果pType=DATA_TYPE，则dataMap的格式为&lt;String,HashMap&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; pType=PLAN_TYPE，则dataMap的格式为&lt;String,SortedMap&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#114;&#101;&#116;&#117;&#114;&#110;&#83;&#111;&#114;&#116;&#101;&#100;&#77;&#97;&#112;">*@returnSortedMap</a><br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; publicstatic HashMap loadAll(String pType){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**　数据文件名(简历账号的时间)即为ID　**/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashMap vDataMap = new HashMap();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**后缀名为data的即为数据文件**/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File[] dataFiles = dataDir.listFiles(new RecorderFileFilter(pType));<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; dataFiles.length; i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( pType.equals(FileUtil.DATA_TYPE) ){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashMap&lt;String,String&gt; hMap = (HashMap&lt;String,String&gt;)loadObjectFromFile(dataFiles[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**去掉文件名的后缀名即或得key，也就是欠款帐户ID**/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vDataMap.put(hMap.get("id"),hMap);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }elseif( pType.equals(FileUtil.PLAN_TYPE) ){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortedMap&lt;String,SortedMap&gt; hMap = (SortedMap&lt;String,SortedMap&gt;)loadObjectFromFile(dataFiles[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**去掉文件名的后缀名即或得key，也就是欠款帐户ID**/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vDataMap.put(StringUtil.clearFileName(dataFiles[i]) ,hMap);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thrownew Exception("读取了错误的文件类型");<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageUtil.showErrMsg("读取数据时出现错误，数据有可能丢失！"+<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "\n 文件名为:"+dataFiles[i].getName());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return vDataMap;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; *将给定内容存入文件中.<br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;&#112;&#67;&#111;&#110;&#116;&#101;&#110;&#116;&#77;&#97;&#112;&#77;&#97;&#112;">*@parampContentMapMap</a>其所装内容为&lt;id(String), HashMap或SortedMap&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; publicstaticvoid saveAll(HashMap&lt;String,String&gt; pDataMap,SortedMap&lt;String,String&gt; pPlanMap){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator itor = pDataMap.entrySet().iterator();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(itor.hasNext()){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map.Entry vEntry = (Entry) itor.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String id = (String) vEntry.getKey();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveToFile(id,pDataMap,pPlanMap);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; *将制定欠款账户的信息存入文件中<br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;&#105;&#100;&#83;&#116;&#114;&#105;&#110;&#103;">*@paramidString</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个信息在保存欠款协议时不可或缺<br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;&#112;&#68;&#97;&#116;&#97;&#77;&#97;&#112;&#83;&#111;&#114;&#116;&#101;&#100;&#77;&#97;&#112;">*@parampDataMapSortedMap</a><br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;&#112;&#80;&#108;&#97;&#110;&#77;&#97;&#112;&#83;&#111;&#114;&#116;&#101;&#100;&#77;&#97;&#112;">*@parampPlanMapSortedMap</a><br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; publicstaticvoid saveToFile(String id, HashMap&lt;String,String&gt; pDataMap,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SortedMap&lt;String,String&gt; pPlanMap){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( pDataMap != null )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveObjectToFile(new File(dataDir,id+DATA_TYPE), pDataMap);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( pPlanMap != null )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveObjectToFile(new File(dataDir,id+PLAN_TYPE), pPlanMap);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch(Exception ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageUtil.showErrMsg("保存数据时出现错误，数据没有被正确保存！");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; *将文件中的序列化对象读出来<br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;&#112;&#70;&#105;&#108;&#101;&#70;&#105;&#108;&#101;">*@parampFileFile</a><br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#114;&#101;&#116;&#117;&#114;&#110;&#79;&#98;&#106;&#101;&#99;&#116;">*@returnObject</a><br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#116;&#104;&#114;&#111;&#119;&#115;&#69;&#120;&#99;&#101;&#112;&#116;&#105;&#111;&#110;">*@throwsException</a><br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; publicstatic Object loadObjectFromFile(File pFile) throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fIn = new FileInputStream(pFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objIn = new ObjectInputStream(fIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object obj = objIn.readObject();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fIn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objIn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return obj;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; *将对象序列化到相应的文件中去--保存数据时候专用，因为该函数将数据保存在appDir/data目录下<br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;&#112;&#70;&#105;&#108;&#101;&#78;&#97;&#109;&#101;&#83;&#116;&#114;&#105;&#110;&#103;">*@parampFileNameString</a><br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#112;&#97;&#114;&#97;&#109;&#111;&#98;&#106;&#79;&#98;&#106;&#101;&#99;&#116;">*@paramobjObject</a><br>&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#42;&#64;&#116;&#104;&#114;&#111;&#119;&#115;&#69;&#120;&#99;&#101;&#112;&#116;&#105;&#111;&#110;">*@throwsException</a><br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; publicstaticvoid saveObjectToFile(File pFile,Object pObj) throws Exception<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fOut = new FileOutputStream(pFile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objOut = new ObjectOutputStream(fOut);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objOut.writeObject(pObj);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fOut.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objOut.close();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>2.3.其他<br>由于每个程序都有图标文件，所以从制定目录读入图标应该是每个程序都会用到的。其次，删除指定目录下的指定类型文件似乎也很常用J<br>&nbsp;&nbsp;&nbsp; /**从img文件夹中获取图标**/<br>&nbsp;&nbsp;&nbsp; publicstatic ImageIcon getImageIcon(String pImageFileName){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File imgFile = new File(imgDir,pImageFileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageIcon imageIcon = new ImageIcon(imgFile.getAbsolutePath());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return imageIcon;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; /**清除reportDir目录下所有html文件**/<br>&nbsp;&nbsp;&nbsp; publicstaticvoid clearReportFiles(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File vReportDir = new File(reportDir.getAbsolutePath());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File[] vReportFiles = vReportDir.listFiles(new FilenameFilter(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; publicboolean accept(File dir, String name){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( name.endsWith("html"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returntrue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnfalse;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; vReportFiles.length; i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vReportFiles[i].delete();<br>}</p>
<p style="COLOR: #008000">&nbsp;</p>
<img src ="http://www.blogjava.net/Swing/aggbug/133585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-07-31 15:49 <a href="http://www.blogjava.net/Swing/articles/133585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动设置环境变量 </title><link>http://www.blogjava.net/Swing/articles/128259.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Thu, 05 Jul 2007 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/128259.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/128259.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/128259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/128259.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/128259.html</trackback:ping><description><![CDATA[<span style="COLOR: #008000">把代码拷贝，另存为javaEnv.bat。安装完Java 2 SDK之后，开一个命令行窗口,输入javaEnv java2SDKDir(java2SDKDir是你的java的安装目录，不带路径最后的\。如果安装路径中有空格，请用javaEnv "java2SDKDir"格式)并运行。(注：一定要在javaEnv后边加上你的sdk的目录) <br></span>
<div style="COLOR: #008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>@echo&nbsp;你提供的jdk安装目录为：%1<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>@echo&nbsp;off<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>IF&nbsp;EXIST&nbsp;%1\bin\java.exe&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;rem&nbsp;如输入正确的&nbsp;Java2SDK&nbsp;安装目录，开始设置环境变量<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;JAVA_HOME&nbsp;%1<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;path&nbsp;%JAVA_HOME%\bin;%path%<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;classpath&nbsp;%classpath%;.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;classpath&nbsp;%classpath%;%JAVA_HOME%\lib\tools.jar<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;classpath&nbsp;%classpath%;%JAVA_HOME%\lib\dt.jar<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@setx&nbsp;classpath&nbsp;%classpath%;%JAVA_HOME%\jre\lib\rt.jar<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@echo&nbsp;on<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;@echo&nbsp;Java&nbsp;2&nbsp;SDK&nbsp;环境参数设置完毕，正常退出。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>)&nbsp;&nbsp;ELSE&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;%1==""&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rem&nbsp;如没有提供安装目录，提示之后退出<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;on<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;没有提供&nbsp;Java2SDK&nbsp;的安装目录,不做任何设置，现在退出环境变量设置。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;ELSE&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rem&nbsp;如果提供非空的安装目录但没有bin\java.exe，则指定的目录为错误的目录<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;on<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;非法的&nbsp;Java2SDK&nbsp;的安装目录,不做任何设置，现在退出环境变量设置。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></div>
<span style="COLOR: #008000">如果找不到setx的 可以从此处</span><a href="http://www.blogjava.net/Files/Swing/setx.rar"><span style="COLOR: #008000">下载<br></span></a><span style="COLOR: #008000">将这个文件解压缩后的exe文件和bat放在同一个文件夹下即可<br></span>
<img src ="http://www.blogjava.net/Swing/aggbug/128259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-07-05 10:06 <a href="http://www.blogjava.net/Swing/articles/128259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java调用Oracle EXP备忘 </title><link>http://www.blogjava.net/Swing/articles/118239.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Fri, 18 May 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/118239.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/118239.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/118239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/118239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/118239.html</trackback:ping><description><![CDATA[<div class=post>
<div class=postTitle><a id=viewpost1_TitleUrl href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html"><font color=#000080>java调用Oracle EXP备忘</font></a> </div>
<div class=postText>
<p>一眼看过去相信大家都知道用Runtime.getRuntime().exec来调用，我的需求就是：<br>调用Oracle EXP命令完成备份，并返回生成的备份文件名，这个备份文件会很快在其他的地方被使用。<br>采用Runtime.getRuntime().exec我们都知道，需要处理它的InputStream，以避免出现执行的命令输出的信息过多使得进程被堵死，OK，按照这样的方法，开写：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #000000">String[]&nbsp;cmds&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;String[</span> <span style="COLOR: #000000">3</span> <span style="COLOR: #000000">];<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>cmds[</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">]&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">cmd</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>cmds[</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">]&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">/C</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>cmds[</span> <span style="COLOR: #000000">2</span> <span style="COLOR: #000000">]</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">"exp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#110;&#97;&#109;&#101;&#47;&#112;&#97;&#115;&#115;&#119;&#111;&#114;&#100;&#64;&#115;&#105;&#100;"><font color=#000080>username/password@sid</font></a> file=xxx.dmp log=xxx.log";<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br>&nbsp;&nbsp;&nbsp; Process&nbsp;process</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">Runtime.getRuntime().exec(cmds);</span> <span style="COLOR: #000000"><br><img id=Codehighlighter1_185_413_Open_Image onclick="this.style.display='none'; Codehighlighter1_185_413_Open_Text.style.display='none'; Codehighlighter1_185_413_Closed_Image.style.display='inline'; Codehighlighter1_185_413_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top> <img id=Codehighlighter1_185_413_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_185_413_Closed_Text.style.display='none'; Codehighlighter1_185_413_Open_Image.style.display='inline'; Codehighlighter1_185_413_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">try</span> <span style="COLOR: #000000">&nbsp;</span> <span id=Codehighlighter1_185_413_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_185_413_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader&nbsp;isr&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;InputStreamReader(process.getInputStream());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;BufferedReader(isr);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">;<br><img id=Codehighlighter1_375_409_Open_Image onclick="this.style.display='none'; Codehighlighter1_375_409_Open_Text.style.display='none'; Codehighlighter1_375_409_Closed_Image.style.display='inline'; Codehighlighter1_375_409_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_375_409_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_375_409_Closed_Text.style.display='none'; Codehighlighter1_375_409_Open_Image.style.display='inline'; Codehighlighter1_375_409_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">&nbsp;((line&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;br.readLine())&nbsp;</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">)</span> <span id=Codehighlighter1_375_409_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_375_409_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(line);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span><span style="COLOR: #000000">&nbsp;<br><img id=Codehighlighter1_442_467_Open_Image onclick="this.style.display='none'; Codehighlighter1_442_467_Open_Text.style.display='none'; Codehighlighter1_442_467_Closed_Image.style.display='inline'; Codehighlighter1_442_467_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_442_467_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_442_467_Closed_Text.style.display='none'; Codehighlighter1_442_467_Open_Image.style.display='inline'; Codehighlighter1_442_467_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">catch</span> <span style="COLOR: #000000">&nbsp;(IOException&nbsp;ioe)&nbsp;</span> <span id=Codehighlighter1_442_467_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_442_467_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ioe.printStackTrace();</span> <span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span> </span></div>
写完收工，执行，傻了，进程被挂S了，到底什么原因呢，开始瞎尝试，把读取process的InputStream的部分全部去掉，执行，竟然OK，更晕，但这个时候出现了一个问题，那就是没法知道什么时候备份文件完全生成了，如果在Runtime.getRuntime后去获取备份文件，那个时候甚至连备份文件都没生成，之后甚至尝试过轮询直到备份文件生成，再往下走，那样还是有问题，就是生成的那个备份文件永远都只有正常的一半的大小，只有在整个进程退出的时候它才正常的全部生成。<br>竟然碰到这样的问题，彻底晕，开始google，竟然只查到一篇和我这同样的问题，更郁闷的是那个帖子最后楼主写了一句&#8220;问题解决了&#8221;，但没写是怎么解决的，郁闷S。<br>只好自己开始尝试各种办法，上网抓人到处问，最后在自己不断的尝试下终于是出现了转机，在我的N+1次尝试的时候我改为只读取process的ErrorStream，然后执行，晕，OK了，在导出成功的情况下没有问题，但在导出有错误的时候(像sid不对，用户名错误，数据库没启动等)进程还是被挂S，但只要导出成功没问题，导出有错误的问题是很好处理的，OK，最后试验的代码改为这样：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">String[]&nbsp;cmds&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;String[</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmds[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cmd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmds[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmds[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">commandBuf.toString();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Process&nbsp;process</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Runtime.getRuntime().exec(cmds);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;shouldClose</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_187_459_Open_Image onclick="this.style.display='none'; Codehighlighter1_187_459_Open_Text.style.display='none'; Codehighlighter1_187_459_Closed_Image.style.display='inline'; Codehighlighter1_187_459_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_187_459_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_187_459_Closed_Text.style.display='none'; Codehighlighter1_187_459_Open_Image.style.display='inline'; Codehighlighter1_187_459_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_187_459_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_187_459_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStreamReader&nbsp;isr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;InputStreamReader(process.getErrorStream());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;BufferedReader(isr);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_377_455_Open_Image onclick="this.style.display='none'; Codehighlighter1_377_455_Open_Text.style.display='none'; Codehighlighter1_377_455_Closed_Image.style.display='inline'; Codehighlighter1_377_455_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_377_455_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_377_455_Closed_Text.style.display='none'; Codehighlighter1_377_455_Open_Image.style.display='inline'; Codehighlighter1_377_455_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;((line&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;br.readLine())&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_377_455_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_377_455_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_409_450_Open_Image onclick="this.style.display='none'; Codehighlighter1_409_450_Open_Text.style.display='none'; Codehighlighter1_409_450_Closed_Image.style.display='inline'; Codehighlighter1_409_450_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_409_450_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_409_450_Closed_Text.style.display='none'; Codehighlighter1_409_450_Open_Image.style.display='inline'; Codehighlighter1_409_450_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(line.indexOf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">错误</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">!=-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_409_450_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_409_450_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shouldClose</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img id=Codehighlighter1_488_513_Open_Image onclick="this.style.display='none'; Codehighlighter1_488_513_Open_Text.style.display='none'; Codehighlighter1_488_513_Closed_Image.style.display='inline'; Codehighlighter1_488_513_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_488_513_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_488_513_Closed_Text.style.display='none'; Codehighlighter1_488_513_Open_Image.style.display='inline'; Codehighlighter1_488_513_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;ioe)&nbsp;</span><span id=Codehighlighter1_488_513_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_488_513_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shouldClose</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(shouldClose)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process.destroy();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;exitVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;process.waitFor();</span></div>
当然，实际的代码中不能像这里写的一样，直接去判断是否含错误这个字符串，而且这段代码是只适合在winnt版本以上的windows操作系统上执行的。<br>这样反而可以了，说明什么呢，说明在执行oracle的exp时，出现了一个很怪的现象，就是exp在console输出的信息没有被放入InputStream，反而是放到了ErrorStream中(即使正确的情况也是)，这就导致了按照正常的情况去写这段代码的话反而会出问题。<br><br>担心以后再次碰到这样的问题，备忘一下.... </div>
<div class=postfoot>posted on 2006-11-22 22:43 <a href="http://www.blogjava.net/BlueDavy/"><font color=#000080>BlueDavy</font></a> 阅读(1593) <a href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#Post"><font color=#000080>评论(5)</font></a> &nbsp;<a href="http://www.blogjava.net/BlueDavy/admin/EditPosts.aspx?postid=82909"><font color=#000080>编辑</font></a>&nbsp;<a href="http://www.blogjava.net/BlueDavy/AddToFavorite.aspx?id=82909"><font color=#000080>收藏</font></a> <a href="http://www.blogjava.net/BlueDavy/services/trackbacks/82909.aspx"><font color=#000080>引用</font></a> 所属分类: <a href="http://www.blogjava.net/BlueDavy/category/1366.html"><font color=#000080>Java</font></a> </div>
</div>
<img height=1 src="http://www.blogjava.net/BlueDavy/aggbug/82909.html?webview=1" width=1> <!--
<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:description
rdf:about="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html"
dc:identifier="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html"
dc:title="java调用Oracle EXP备忘"
trackback:ping="http://www.blogjava.net/BlueDavy/services/trackbacks/82909.aspx" />
</rdf:rdf>
-->
<script type=text/javascript>
//<![cdata[
Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90);
//]]&gt;
</script>
<div id=AjaxHolder_UpdatePanel1><a name=pagedcomment></a><a name=评论><br>
<div id=comments>
<h3>评论</h3>
<div class=post>
<div class=postTitle><a title="permalink: re: java调用Oracle EXP备忘" href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#83009"><font color=#000080>#</font></a>&nbsp;<a name=83009></a>re: java调用Oracle EXP备忘 <span>2006-11-23 13:09 </span><a id=AjaxHolder_Comments_CommentList_ctl00_NameLink target=_blank>javabeginer</a> </div>
<div class=postText>从没写过有关process的东西，学习！&nbsp;&nbsp;<a onclick='return SetReplyAuhor("javabeginer")' href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#post"><font color=#000080>回复</font></a>&nbsp;&nbsp;<a title=查看该作者发表过的评论 href="http://www.blogjava.net/comment?author=javabeginer" target=_blank><font color=#000080>更多评论</font></a> <br><a id=AjaxHolder_Comments_CommentList_ctl00_DeleteLink href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl00$DeleteLink','')"></a>&nbsp;&nbsp;<a id=AjaxHolder_Comments_CommentList_ctl00_EditLink></a> </div>
</div>
<br>
<div class=post>
<div class=postTitle><a title="permalink: re: java调用Oracle EXP备忘" href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#83251"><font color=#000080>#</font></a>&nbsp;<a name=83251></a>re: java调用Oracle EXP备忘 <span>2006-11-24 14:38 </span><a id=AjaxHolder_Comments_CommentList_ctl01_NameLink target=_blank>kruce[匿名]</a> </div>
<div class=postText>正如你所说的，处理Process的时候要注意及时读取子进程的输出流，不然可能导致子进程堵塞，甚至死锁。 <br>如果我是你，我会这么来排除bug。 <br>1，把对InputStream的处理放到一个单独Thread里面。 <br>2，用ProcessBuilder的redirectErrorStream来合并OutputStream和ErrorStream。注意子进程的InputStream对应父进程的OutStream。如果不合并这两个流的话则必须并行排空它们，顺序的排空会导致思索。 <br>建议你好好看看5.0的API和JLS。&nbsp;&nbsp;<a onclick='return SetReplyAuhor("kruce[匿名]")' href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#post"><font color=#000080>回复</font></a>&nbsp;&nbsp;<a title=查看该作者发表过的评论 href="http://www.blogjava.net/comment?author=kruce%5b%e5%8c%bf%e5%90%8d%5d" target=_blank><font color=#000080>更多评论</font></a> <br><a id=AjaxHolder_Comments_CommentList_ctl01_DeleteLink href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl01$DeleteLink','')"></a>&nbsp;&nbsp;<a id=AjaxHolder_Comments_CommentList_ctl01_EditLink></a> </div>
</div>
<br>
<div class=post>
<div class=postTitle><a title="permalink: re: java调用Oracle EXP备忘" href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#83369"><font color=#000080>#</font></a>&nbsp;<a name=83369></a>re: java调用Oracle EXP备忘 <span>2006-11-24 21:34 </span><a id=AjaxHolder_Comments_CommentList_ctl02_NameLink href="http://www.blogjava.net/BlueDavy/" target=_blank><font color=#000080>BlueDavy</font></a> </div>
<div class=postText>@kruce[匿名] <br>....我用的是1.4....虽然我也很想用5.0的ProcessBuilder&nbsp;&nbsp;<a onclick='return SetReplyAuhor("BlueDavy")' href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#post"><font color=#000080>回复</font></a>&nbsp;&nbsp;<a title=查看该作者发表过的评论 href="http://www.blogjava.net/comment?author=BlueDavy" target=_blank><font color=#000080>更多评论</font></a> <br><a id=AjaxHolder_Comments_CommentList_ctl02_DeleteLink href="javascript:__doPostBack('AjaxHolder$Comments$CommentList$ctl02$DeleteLink','')"></a>&nbsp;&nbsp;<a id=AjaxHolder_Comments_CommentList_ctl02_EditLink></a> </div>
</div>
<br>
<div class=post>
<div class=postTitle><a title="permalink: re: java调用Oracle EXP备忘" href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#93206"><font color=#000080>#</font></a>&nbsp;<a name=93206></a>re: java调用Oracle EXP备忘 <span>2007-01-11 16:41 </span><a id=AjaxHolder_Comments_CommentList_ctl03_NameLink target=_blank>roygbip</a> </div>
<div class=postText>我也遇到你这样的问题，不过我还是用getInputStream()才可以，用getErrorStream我也试了一下，只能倒入300条数据就卡住了.&nbsp;&nbsp;<a onclick='return SetReplyAuhor("roygbip")' href="http://www.blogjava.net/BlueDavy/archive/2006/11/22/82909.html#post"><font color=#000080>回复</font></a>&nbsp;&nbsp;<a title=查看该作者发表过的评论 href="http://www.blogjava.net/comment?author=roygbip" target=_blank><font color=#000080>更多评论</font></a> <br></div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/Swing/aggbug/118239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-05-18 09:31 <a href="http://www.blogjava.net/Swing/articles/118239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于String类的split方法</title><link>http://www.blogjava.net/Swing/articles/115895.html</link><dc:creator>Sun</dc:creator><author>Sun</author><pubDate>Tue, 08 May 2007 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/articles/115895.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/115895.html</wfw:comment><comments>http://www.blogjava.net/Swing/articles/115895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/115895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/115895.html</trackback:ping><description><![CDATA[<p><span>虽然使用正则表达式能很好的进行字符串的解析、提取、替换，但是对于一些简单的应用，使用</span> <span>String</span> <span>类提供的一些方法就可以很好的完成，最突出的就是</span> <span>split</span> <span>方法。</span> </p>
<p><span>split</span> <span>方法能够很方便的将字符串按照一定的规则拆分开。</span> </p>
<p><span>比如对于下面的字符串：</span> </p>
<p><span>Tom,Jane,Tony,Elva,Gigi</span> </p>
<p><span>只要调用如下的代码就可以将各个名字提取出来：</span> </p>
<p><span><font face=宋体 size=2>String value = "Tom,Jane,Tony,Elva,Gigi";</font> </span></p>
<p><span><font face=宋体 size=2>String[] names = value.split(",");</font> </span></p>
<p><span><font face=宋体 size=2>for(int i=0,n=names.length;i&lt;n;i++)</font> </span></p>
<p><span><font face=宋体 size=2>{</font> </span></p>
<p><span><font size=2><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println(names[i]);</font> </font></span></p>
<p><span><font face=宋体 size=2>}</font> </span></p>
<p><span>运行结果：</span> </p>
<p><span><font face=宋体 size=2>Tom</font> </span></p>
<p><span><font face=宋体 size=2>Jane</font> </span></p>
<p><span><font face=宋体 size=2>Tony</font> </span></p>
<p><span><font face=宋体 size=2>Elva</font> </span></p>
<p><span><font face=宋体 size=2>Gigi</font> </span></p>
<p>&nbsp;</p>
<p><span>看到这个运行结果，很多人都认为</span> <span>split</span> <span>方法就是按照给定的字符串对字符串进行拆分，知道碰到了下面的问题。</span> </p>
<p><span>有一个字符串：中国</span> <span>.</span> <span>北京</span> <span>.</span> <span>海淀</span> <span>.</span> <span>学院路。请解析此字符串，并打印输出&#8220;中国</span> <span>北京</span> <span>海淀</span> <span>学院路</span> <span>&#8221;。</span> </p>
<p><span>于是写代码如下：</span> </p>
<p><font size=2><span><font face=宋体>String value = "</font> </span><span>中国</span> <span><font face=宋体>.</font> </span><span>北京</span> <span><font face=宋体>.</font> </span><span>海淀</span> <span><font face=宋体>.</font> </span><span>学院路</span> <span><font face=宋体>";</font> </span></font></p>
<p><span><font face=宋体 size=2>String[] names = value.split(".");</font> </span></p>
<p><span><font face=宋体 size=2>for(int i=0,n=names.length;i&lt;n;i++)</font> </span></p>
<p><span><font face=宋体 size=2>{</font> </span></p>
<p><span><font size=2><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print(names[i]+" ");</font> </font></span></p>
<p><span><font face=宋体 size=2>}</font> </span></p>
<p><span>运行结果：</span> </p>
<p>&nbsp;</p>
<p><span>对，没看错！没有任何输出！</span> </p>
<p><span>让我们来看看</span> <span>split</span> <span>方法的方法签名吧：</span> </p>
<p><span>public String[] split(String regex)</span> </p>
<p><span>这里的参数的名称是</span> <span>regex</span> <span>，也就是</span> <span>Regular Expression</span> <span>（正则表达式）。这个参数并不是一个简单的分割用的字符，而是一个正则表达式，看了</span> <span>split</span> <span>方法的实现代码就更坚定了我们的信心：</span> </p>
<p><span><font face=宋体 size=2>public String[] split(String regex, int limit) {</font> </span></p>
<p><span><font size=2><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>return Pattern.compile(regex).split(this, limit);</font> </font></span></p>
<p><span><font face=宋体 size=2>}</font> </span></p>
<p><span>split</span> <span>的实现直接调用的</span> <span>Matcher</span> <span>类的</span> <span>split</span> <span>的方法。读者已经知道，&#8220;</span> <span>.</span> <span>&#8221;在正则表达式中有特殊的含义，因此我们使用的时候必须进行转义。</span> </p>
<p><span>修改代码如下：</span> </p>
<p><span><font face=宋体 size=2>private static void split2()</font> </span></p>
<p><span><font face=宋体 size=2>{</font> </span></p>
<p><font size=2><span><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>String value = "</font> </span><span>中国</span> <span><font face=宋体>.</font> </span><span>北京</span> <span><font face=宋体>.</font> </span><span>海淀</span> <span><font face=宋体>.</font> </span><span>学院路</span> <span><font face=宋体>";</font> </span></font></p>
<p><span><font size=2><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>String[] names = value.split("\\.");</font> </font></span></p>
<p><span><font size=2><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>for(int i=0,n=names.length;i&lt;n;i++)</font> </font></span></p>
<p><span><font size=2><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>{</font> </font></span></p>
<p><span><font size=2><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.print(names[i]+" ");</font> </font></span></p>
<p><span><font size=2><font face=宋体><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </font></span></p>
<p><span><font face=宋体 size=2>}</font> </span></p>
<p><span>运行结果</span> <span>：</span> </p>
<p><span>中国</span> <span>北京</span> <span>海淀</span> <span>学院路</span> <span></span></p>
<img src ="http://www.blogjava.net/Swing/aggbug/115895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">Sun</a> 2007-05-08 11:43 <a href="http://www.blogjava.net/Swing/articles/115895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>