??xml version="1.0" encoding="utf-8" standalone="yes"?>国产欧美精品一区二区三区四区,欧美亚洲国产一区二区三区,亚洲精品久久http://www.aygfsteel.com/Swing/category/22249.html<font size="3"><br><font color="#669933">天行? 君子以自Z?lt;/font><br><br></font>zh-cnTue, 31 Jul 2007 17:41:32 GMTTue, 31 Jul 2007 17:41:32 GMT60java实用知识http://www.aygfsteel.com/Swing/articles/133585.htmlSunSunTue, 31 Jul 2007 07:49:00 GMThttp://www.aygfsteel.com/Swing/articles/133585.htmlhttp://www.aygfsteel.com/Swing/comments/133585.htmlhttp://www.aygfsteel.com/Swing/articles/133585.html#Feedback0http://www.aygfsteel.com/Swing/comments/commentRss/133585.htmlhttp://www.aygfsteel.com/Swing/services/trackbacks/133585.html刚才看到的觉得挺?备䆾一?/p>

1.   日期部分
对于像日期、时间和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();
}

 



Sun 2007-07-31 15:49 发表评论
]]>
自动讄环境变量 http://www.aygfsteel.com/Swing/articles/128259.htmlSunSunThu, 05 Jul 2007 02:06:00 GMThttp://www.aygfsteel.com/Swing/articles/128259.htmlhttp://www.aygfsteel.com/Swing/comments/128259.htmlhttp://www.aygfsteel.com/Swing/articles/128259.html#Feedback0http://www.aygfsteel.com/Swing/comments/commentRss/128259.htmlhttp://www.aygfsteel.com/Swing/services/trackbacks/128259.html把代码拷贝,另存为javaEnv.bat。安装完Java 2 SDK之后Q开一个命令行H口,输入javaEnv java2SDKDir(java2SDKDir是你的java的安装目录,不带路径最后的\。如果安装\径中有空|LjavaEnv "java2SDKDir"格式)q运行?注:一定要在javaEnv后边加上你的sdk的目?
@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>      )
)

如果找不到setx?可以从此?/span>下蝲
这个文件解压羃后的exe文g和bat攑֜同一个文件夹下即?br>

Sun 2007-07-05 10:06 发表评论
]]>
java调用Oracle EXP备忘 http://www.aygfsteel.com/Swing/articles/118239.htmlSunSunFri, 18 May 2007 01:31:00 GMThttp://www.aygfsteel.com/Swing/articles/118239.htmlhttp://www.aygfsteel.com/Swing/comments/118239.htmlhttp://www.aygfsteel.com/Swing/articles/118239.html#Feedback0http://www.aygfsteel.com/Swing/comments/commentRss/118239.htmlhttp://www.aygfsteel.com/Swing/services/trackbacks/118239.html

一眼看q去怿大家都知道用Runtime.getRuntime().exec来调用,我的需求就是:
调用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();

        }
写完收工Q执行,MQ进E被挂S了,到底什么原因呢Q开始瞎试Q把dprocess的InputStream的部分全部去掉,执行Q竟然OKQ更晕,但这个时候出C一个问题,那就是没法知道什么时候备份文件完全生成了Q如果在Runtime.getRuntime后去获取备䆾文gQ那个时候甚臌备䆾文g都没生成Q之后甚臛_试过轮询直到备䆾文g生成Q再往下走Q那栯是有问题Q就是生成的那个备䆾文g永远都只有正常的一半的大小Q只有在整个q程退出的时候它才正常的全部生成?br>竟然到q样的问题,d晕,开始googleQ竟然只查到一和我这同样的问题,更郁L是那个帖子最后楼d了一?#8220;问题解决?#8221;Q但没写是怎么解决的,郁闷S?br>只好自己开始尝试各U办法,上网抓h到处问,最后在自己不断的尝试下l于是出C转机Q在我的N+1ơ尝试的时候我改ؓ只读取process的ErrorStreamQ然后执行,晕,OK了,在导出成功的情况下没有问题,但在导出有错误的时?像sid不对Q用户名错误Q数据库没启动等)q程q是被挂SQ但只要导出成功没问题,导出有错误的问题是很好处理的QOKQ最后试验的代码改ؓq样Q?br>
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实际的代码中不能像q里写的一P直接d断是否含错误q个字符Ԍ而且q段代码是只适合在winnt版本以上的windows操作pȝ上执行的?br>q样反而可以了Q说明什么呢Q说明在执行oracle的expӞ出现了一个很怪的现象Q就是exp在console输出的信息没有被攑օInputStreamQ反而是攑ֈ了ErrorStream?即正确的情况也?Q这导致了按照正常的情况去写这D代码的话反而会出问题?br>
担心以后再次到q样的问题,备忘一?...
posted on 2006-11-22 22:43 BlueDavy 阅读(1593) 评论(5)  ~辑 收藏 引用 所属分c? Java

评论

# re: java调用Oracle EXP备忘 2006-11-23 13:09 javabeginer
从没写过有关process的东西,学习Q?nbsp; 回复  更多评论
  

# re: java调用Oracle EXP备忘 2006-11-24 14:38 kruce[匿名]
正如你所说的Q处理Process的时候要注意及时d子进E的输出,不然可能D子进E堵塞,甚至死锁?
如果我是你,我会q么来排除bug?
1Q把对InputStream的处理放C个单独Thread里面?
2Q用ProcessBuilder的redirectErrorStream来合qOutputStream和ErrorStream。注意子q程的InputStream对应父进E的OutStream。如果不合ƈq两个流的话则必dƈ行排I它们,序的排IZD思烦?
你好好看?.0的API和JLS?nbsp; 回复  更多评论
  

# re: java调用Oracle EXP备忘 2006-11-24 21:34 BlueDavy
@kruce[匿名]
....我用的是1.4....虽然我也很想?.0的ProcessBuilder  回复  更多评论
  

# re: java调用Oracle EXP备忘 2007-01-11 16:41 roygbip
我也遇到你这L问题Q不q我q是用getInputStream()才可以,用getErrorStream我也试了一下,只能倒入300条数据就卡住?  回复  更多评论


Sun 2007-05-18 09:31 发表评论
]]>
关于StringcȝsplitҎ(gu)http://www.aygfsteel.com/Swing/articles/115895.htmlSunSunTue, 08 May 2007 03:43:00 GMThttp://www.aygfsteel.com/Swing/articles/115895.htmlhttp://www.aygfsteel.com/Swing/comments/115895.htmlhttp://www.aygfsteel.com/Swing/articles/115895.html#Feedback0http://www.aygfsteel.com/Swing/comments/commentRss/115895.htmlhttp://www.aygfsteel.com/Swing/services/trackbacks/115895.html虽然使用正则表达式能很好的进行字W串的解析、提取、替换,但是对于一些简单的应用Q?/span> String cL供的一些方法就可以很好的完成,最H出的就?/span> split Ҏ(gu)?/span>

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 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>



Sun 2007-05-08 11:43 发表评论
]]>
վ֩ģ壺 Ȫ| | Ƥ| ͩ| ƽ| | ƽ| | | Ϫ| ˫| ³ƶ| | | ¬| ֵ| | ±| | | | | Ժ| | | | | ƽ| | ǫ| ĵ| | | ɽ| ˴| ƽ| | | ̨| Ȫ| |