<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-16  評論-54  文章-0  trackbacks-0
      2006年8月1日
     

     

    1      基本介紹

    可以說CSV格式的文件經(jīng)常碰到,何為CSV格式,CVS全稱comma-separated values,就是典型的用逗號隔開的文件,比如下面這種文件格式

    Name,company

    zhangsan,ibm

    lisi,oracle

    這種就是典型的CSV格式文件。不過也可以擴展到其它符號隔開的字符,比如

    Name#company

    Zhangsan#ibm

    Lisi#oracle

    這種也算CSV格式

    Java開源框架CVSReader提供了一個輕量級、簡單方便的統(tǒng)一操作接口可用,下面具體講解如何操作CVS格式

    2      安裝和使用

    2.1下載

    目前CSV reader的最新發(fā)布版本是1.8。我們可以從

    http://opencsv.sourceforge.net/

    上面下載到最新的csvreader包。

    2.2安裝

    直接把jar包分別存放到開發(fā)工程的類路徑下面即可使用。

    3      讀取CSV格式文件

    3.1基本簡介

    首先,讀取CSV格式的文件需要創(chuàng)建一個CSVReader,如下

    CsvReader reader = new CsvReader(Reader r,  char c);

    其中第一個參數(shù)為讀取文件,第二個參數(shù)為分割符,比如“,”,或者“#

    另外,也有其它幾個參數(shù),可以查閱API,比如

    CsvReader reader = new CsvReader(InputStream r,  char c, Charset charset);等等

    其次,一般需要讀取頭信息,如下:

    reader.readHeaders();

    String[] headers = reader.getHeaders();

    讀取了后,指針就會移動到下一行,也就是可以開始讀取文件內(nèi)容

    假如,有多行的話,可以用一個循環(huán)套入,例如下面:

                 while (reader.readRecord()) {

                        for (int i = 0; i < headers.length; i++) {

                               String value = reader.get(headers[i]);

                               System.out.print(value+" ");

                        }

                        System.out.println("");

                 }

    3.2綜合例子

    C盤下創(chuàng)建一個測試文件test.cvs,內(nèi)容如下:

    a#b#c

    1#2#3

    4#5#6

    下面是解析代碼:

          public static void main(String[] args) throws Exception {

    CsvReader reader = new CsvReader(new FileReader("c://csv.txt"), '#');

                 reader.readHeaders();

                 String[] headers = reader.getHeaders();

                 while (reader.readRecord()) {

                        for (int i = 0; i < headers.length; i++) {

                               String value = reader.get(headers[i]);

                               System.out.print(value+" ");

                        }

                        System.out.println("");

                 }

          }

    運行以上程序,可以看到輸出

     1 2 3

     4 5 6

    4      CSV格式文件

    CSV格式文件也比較簡單,寫每一列只要直接調(diào)用

    csvWriter.write()即可

    另外,寫完每行結(jié)束后,都要調(diào)用 csvWriter.endRecord();

    表示結(jié)束一行

    文件寫完畢后,要記得刷新一下并關(guān)掉,如下:

           csvWriter.flush();

           csvWriter.close();

    代碼如下:

        publicstaticvoid main(String[] args) throws Exception {

           CsvWriter csvWriter = new CsvWriter(new FileWriter("c://test.text"), '#');

           csvWriter.write("name");

           csvWriter.write("company");

           csvWriter.endRecord();

           csvWriter.write("11");

           csvWriter.write("12");

           csvWriter.endRecord();

           csvWriter.write("21");

           csvWriter.write("22");

           csvWriter.flush();

           csvWriter.close();

       }

    }

    運行以上程序,可以看到C盤下面創(chuàng)建了一個文件

    test.text

    內(nèi)容如下:

    name#company

    11#12

    21#22

    posted @ 2008-10-31 14:42 jspark 閱讀(11805) | 評論 (3)編輯 收藏
         摘要: (本文檔的全篇可以到博客下面的文件列表下載,地址下面)  http://www.tkk7.com/jspark/admin/Files.aspx 為了讓盡快對jbossRules有一個感官的認(rèn)識,下面先開發(fā)一個HelloWorld的程序。 建立一個java工程,目錄如下:     如上所示,建立一個com包,然后在下面分別建立一個Sa...  閱讀全文
    posted @ 2008-10-28 15:54 jspark 閱讀(1634) | 評論 (0)編輯 收藏
     

    1      Java規(guī)則系統(tǒng)簡介

    在大型商業(yè)系統(tǒng)中,業(yè)務(wù)規(guī)則、商業(yè)邏輯等等都會比較復(fù)雜。而且在很多大型系統(tǒng)當(dāng)中,很多業(yè)務(wù)規(guī)則、商業(yè)邏輯并不是一成不變的。甚至當(dāng)系統(tǒng)進(jìn)入生產(chǎn)階段時,客戶的業(yè)務(wù)規(guī)則、商業(yè)邏輯也會改變。某些系統(tǒng)要求甚至更高,要求能24小時不停機,并且能夠?qū)崟r修改商業(yè)規(guī)則。這就對商業(yè)系統(tǒng)提出了較大的挑戰(zhàn)。如果將這些可變的規(guī)則直接編寫到代碼里面的話,業(yè)務(wù)規(guī)則一旦改變,就要修改代碼。并由此帶來編譯、打包、發(fā)布等等問題。這對于生產(chǎn)系統(tǒng)來說是極不方便的。因此,如何考慮把一些可變的業(yè)務(wù)規(guī)則抽取到外面,使這些業(yè)務(wù)規(guī)則獨立于程序代碼。并最好是能夠?qū)崟r的修改業(yè)務(wù)規(guī)則,這樣就可以做到不用打包編譯發(fā)布等等。

    值得慶幸的是現(xiàn)在出現(xiàn)了一些Java規(guī)則引擎(Rule Engine),專門解決以上所述的問題。利用它,我們就可以在應(yīng)用系統(tǒng)中分離客戶的商業(yè)決策邏輯和應(yīng)用開發(fā)者的技術(shù)決策,并把這些商業(yè)規(guī)額則放在中心數(shù)據(jù)庫或其他統(tǒng)一的地方,讓它們能在運行時可以動態(tài)地管理和修改。

    JbossRules是一個優(yōu)秀的JAVA規(guī)則引擎,其前身是Drools3,后來被Jboss合并并改名為JbossRules

    1.1基于規(guī)則的專家系統(tǒng)簡介

    人工智能是一個新興的學(xué)科,它是想讓計算機模擬人腦的思維和推理模式。人工智能分成如下幾個主要的分學(xué)科:

    知識表示

    神經(jīng)網(wǎng)絡(luò)

    基因算法

    決策樹

    專家系統(tǒng)

    等等幾個學(xué)科

    知識表示是人工智能中的一個基礎(chǔ)領(lǐng)域,其目的是如何更好的在計算機當(dāng)中描述已存在的事實。專家系統(tǒng)就是使用知識表示,來做規(guī)則推理,得出最后的結(jié)論來。

    Java規(guī)則引擎起源于基于規(guī)則的專家系統(tǒng),而基于規(guī)則的專家系統(tǒng)又是專家系統(tǒng)的其中一個分支。專家系統(tǒng)屬于人工智能的范疇,它模仿人類的推理方式,使用試探性的方法進(jìn)行推理,并使用人類能理解的術(shù)語解釋和證明它的推理結(jié)論。為了更深入地了解Java規(guī)則引擎,下面簡要地介紹基于規(guī)則的專家系統(tǒng)。RBES包括三部分:Rule Baseknowledge base)、Working Memoryfact base)和Inference Engine。它們的結(jié)構(gòu)如下系統(tǒng)所示:

    如上圖所示,推理引擎包括三部分:模式匹配器(Pattern Matcher)、議程(Agenda)和執(zhí)行引擎(Execution Engine)。推理引擎通過決定哪些規(guī)則滿足事實或目標(biāo),并授予規(guī)則優(yōu)先級,滿足事實或目標(biāo)的規(guī)則被加入議程。模式匹配器決定選擇執(zhí)行哪個規(guī)則,何時執(zhí)行規(guī)則;議程管理模式匹配器挑選出來的規(guī)則的執(zhí)行次序;執(zhí)行引擎負(fù)責(zé)執(zhí)行規(guī)則和其他動作。

    和人類的思維相對應(yīng),推理引擎存在兩者推理方式:演繹法(Forward-Chaining)和歸納法(Backward-Chaining)。演繹法從一個初始的事實出發(fā),不斷地應(yīng)用規(guī)則得出結(jié)論(或執(zhí)行指定的動作)。而歸納法則是根據(jù)假設(shè),不斷地尋找符合假設(shè)的事實。Rete算法是目前效率最高的一個Forward-Chaining推理算法,許多Java規(guī)則引擎都是基于Rete算法來進(jìn)行推理計算的。

    正向推理:

     

    正向推理圖形如下:

    正向推理引擎的推理步驟如下:

    將初始數(shù)據(jù)(fact)輸入Working Memory

    使用Pattern Matcher比較規(guī)則庫(rule base)中的規(guī)則(rule)和數(shù)據(jù)(fact)。

    如果執(zhí)行規(guī)則存在沖突(conflict),即同時激活了多個規(guī)則,將沖突的規(guī)則放入沖突集合。

    解決沖突,將激活的規(guī)則按順序放入Agenda

    使用執(zhí)行引擎執(zhí)行Agenda中的規(guī)則。重復(fù)步驟25,直到執(zhí)行完畢所有Agenda中的規(guī)則。

    直到得出最終的結(jié)果為止

    反向推理:

     

    反向推理是目標(biāo)驅(qū)動的推理方式。從目標(biāo)出發(fā),找出所有能滿足該目

    標(biāo)的子目標(biāo)。這樣一直推導(dǎo)下去,直到所有的子目標(biāo)都已經(jīng)滿足為止。

    1.2Java規(guī)則引擎

    Java規(guī)則引擎是一種嵌入在Java程序中的組件,它的任務(wù)是把當(dāng)前提交給引擎的Java數(shù)據(jù)對象與加載在引擎中的業(yè)務(wù)規(guī)則進(jìn)行測試和比對,激活那些符合當(dāng)前數(shù)據(jù)狀態(tài)下的業(yè)務(wù)規(guī)則,根據(jù)業(yè)務(wù)規(guī)則中聲明的執(zhí)行邏輯,觸發(fā)應(yīng)用程序中對應(yīng)的操作。

    一般來說,一條規(guī)則的形式如下:

    when

        <conditions>

    then

        <actions>

    也就是說,當(dāng)conditions成立的話,就做下面的actions。其中actions可以為生成新的事實、或者做其他動作,比如,發(fā)送email通知、執(zhí)行一些本地任務(wù)等等。

    1.3    JAVA規(guī)則引擎的優(yōu)點

    聲明式編程

    聲明式編程,規(guī)則引擎讓我們直到“做什么”,而不用直到“怎么做”。我們只要把一系列規(guī)則表示出來后。具體的推理動作就交給規(guī)則引擎來處理。

    邏輯和數(shù)據(jù)分開

    將可變的業(yè)務(wù)邏輯和數(shù)據(jù)分開。雖然,這違背了面向?qū)ο笤瓌t。面向?qū)ο髲娬{(diào)數(shù)據(jù)和業(yè)務(wù)邏輯耦合。但是,對于一些易變而復(fù)雜的業(yè)務(wù)規(guī)則。如果散步在程序的各個地方、各個層次。那么一旦業(yè)務(wù)規(guī)則更改的話,就會出現(xiàn)“牽一發(fā)而動全身”的局面。因此,將可變的業(yè)務(wù)邏輯獨立出來管理,將有助于后面的業(yè)務(wù)變更。

    性能

    Rete算法的性能比較高。

    知識集中表示

    通過使用規(guī)則,我們把規(guī)則集中存放起來,從而使系統(tǒng)知識能夠集中表示。

    可讀性

    規(guī)則的可讀性比較高。對于熟悉業(yè)務(wù)規(guī)則。但不會程序開發(fā)的業(yè)務(wù)專家,只要熟悉規(guī)則的標(biāo)示,也可以編寫和修改業(yè)務(wù)規(guī)則。

    1.4    使用JAVA規(guī)則系統(tǒng)的場合

    那么,在那些場合下適合應(yīng)用JAVA規(guī)則系統(tǒng)呢?總而言之,可以用一句話來概括:當(dāng)用傳統(tǒng)的程序開發(fā),無法得到一種優(yōu)雅的解決方法的時候,就可以考慮使用規(guī)則系統(tǒng)。如下的一些場合:

    用傳統(tǒng)的代碼開發(fā)比較復(fù)雜、繁瑣

    問題雖然不復(fù)雜,但是用傳統(tǒng)的代碼開發(fā)比較脆弱,也就是經(jīng)常修改

    沒有優(yōu)雅的算法

    業(yè)務(wù)規(guī)則頻繁改變

    有很多業(yè)務(wù)專家、不懂技術(shù)開發(fā)

    1.5    不適合使用JAVA規(guī)則系統(tǒng)場合

    雖然規(guī)則系統(tǒng)看起來比較不錯,但是并不是任何地方都可以使用規(guī)則系統(tǒng)。很多簡單、固定的業(yè)務(wù)系統(tǒng),可以不用使用規(guī)則系統(tǒng)。規(guī)則系統(tǒng)也不能用來作為標(biāo)示重要的業(yè)務(wù)流程、不能用來作為工作流引擎。

    有很多程序員把JAVA規(guī)則系統(tǒng)當(dāng)成是一種動態(tài)修改配置。也就是把一部分代碼邏輯抽取到外面,統(tǒng)一存放起來。這樣,當(dāng)一些配置修改的話,通過修改規(guī)則,就能修改代碼的一部分邏輯。如果把JAVA規(guī)則僅僅用在這個場合下的話,可以考慮采用腳本引擎。比如BeanShellJEXLGroovy等等。

    posted @ 2008-10-28 12:15 jspark 閱讀(1562) | 評論 (1)編輯 收藏

    grant {
        permission java.lang.RuntimePermission  
    "loadLibrary.*";
        permission java.lang.RuntimePermission  
    "queuePrintJob";
        permission java.lang.RuntimePermission  
    "setContextClassLoader";
        permission java.lang.RuntimePermission  
    "getProtectionDomain";
        permission java.lang.reflect.ReflectPermission 
    "suppressAccessChecks";
        };

    grant {
        permission java.util.PropertyPermission   
    "*" ,  " read,write " ;

    };  

         最近一個項目需要用到SUN ONE APPSERVER8.1,本人在WINDOWS SERVER 2003中安裝,碰到一些問題,不過比較幸運的是都解決了,下面大概描述一下個人碰到的問題,期望能給別人帶來幫助

       一、DNS服務(wù)器問題
        安裝SUN ONE APPSERVER8.1必須要在服務(wù)器上安裝,而且必須要將該服務(wù)器設(shè)置為DNS服務(wù)器。關(guān)于WINDOWS SERVER 2003
        如何設(shè)置DNS服務(wù)器,網(wǎng)上很多資料,可以查閱

       二、文件系統(tǒng)權(quán)限訪問問題
     也許SUN ONE APPSERVER8.1服務(wù)器在文件訪問方面控制比較嚴(yán)格,如果按照默認(rèn)安裝上去的系統(tǒng)。對于一些文件夾、文件讀取是會有一些控制的。比如說,當(dāng)將應(yīng)用部署上去,然后訪問應(yīng)用,會拋出SecurityException。這是因為需要編譯jsp頁面,生成class文件,由于沒有寫權(quán)限,所以會出錯。解決的方法是為SUN ONE APPSERVER增加文件訪問權(quán)限。修改方法如下:
     找到安裝路徑,下面以本人的安裝路徑為例子:
     c\sunjes\ApplicationServer\domains\domain1\config
     該目錄下面有一個文件叫server.policy,打開該頁面,可以看到里面是一些關(guān)于文件訪問權(quán)限的例子

        
    //  Core server classes get all permissions by default

    grant codeBase  " file:${com.sun.aas.installRoot}/lib/- "  {
        permission java.security.AllPermission;
    };
        
        下面為文件路徑增加訪問權(quán)限,個人把整個c盤設(shè)置為可讀可寫,如下

        grant codeBase 
    " file:c:/- "
     {
        permission java.security.AllPermission;
    };

    grant {
        permission java.io.FilePermission 
    " c:/- " " read,write,execute,delete "
    ;

    }; 


     編輯完畢,保存,重啟服務(wù)器,OK,該問題解決。 :)

      三、其他幾個權(quán)限問題:
             編輯以上問題后,重新自動,可能還會發(fā)現(xiàn)以下幾個異常,比如 permission java.util.PropertyPermission   "*" ,  " read,write " ;
          因此,分別加上如下幾個權(quán)限設(shè)置即可
       



      四、ORACLE10.2.0.1驅(qū)動問題
     本人部署的應(yīng)用是spring+hb架構(gòu),里面用到blog/clob大字段處理,因此驅(qū)動程序用最新的驅(qū)動程序10g,版本為10.2.0.1。在部署到SUN ONE APPSERVER8.1時,也拋出類訪問異常,異常信息是:oracle.sql is sealed。沒辦法,上網(wǎng)搜索了一下,發(fā)現(xiàn)有很多人也遇過這個情況。主要是oracle10g.jar里面的Meta-inf定義,增加了sealed屬性。打開該文件MANIFEST.MF,內(nèi)容如下:
     

        Manifest - Version:  1.0
    Specification
    - Title:    Oracle JDBC driver classes  for  use with JDK14
    Created
    - By:  1.4
    .2_08 (Sun Microsystems Inc.)
    sealed:
    true

    Implementation
    - Title:   ojdbc14.jar
    Specification
    -
    Vendor:   Oracle Corporation
    Specification
    - Version:  Oracle JDBC Driver version  -   " 10.2.0.1.0 "

    Implementation
    - Version: Oracle JDBC Driver version  -   " 10.2.0.1.0 "
    Implementation
    - Vendor:  Oracle Corporation
    Implementation
    - Time:    Wed Jun  22   18 : 55 : 48   2005

     關(guān)于sealed屬性網(wǎng)上也有
     很多資料介紹,有興趣的網(wǎng)友可以參閱一下。網(wǎng)上同行的解決方法是下載10g,低點的版本。本人的解決方法是修改一下里面的MANIFEST.MF文件,把sealed:true去掉即可。


     四、包版本不兼容。
     解決完以上幾個問題后,重新啟動,本以為萬事大吉,很不幸運的是,再次拋出異常:
     ClassNotFoundException: org.hibernate.hql.ast.HqlToken。同樣,上網(wǎng)搜索了一下,發(fā)現(xiàn)是hibernate的antlr.jar和SUN ONE APPSERVER的antlr.jar存在沖突。hibernate3.0版本用
     的antlr.jar包版本是2.7.5,比SUN ONE APPSERVER的高。以前在weblogic部署應(yīng)用時,也出現(xiàn)過類似的問題。由于這些服務(wù)器會優(yōu)先裝載自己的類,因此會出現(xiàn)一些問題。解決方法是把hibernate下較高版本的antlr.jar放在classpath的前面。在SUN ONE APPSERVER
     下最快捷的方式就是將antlr-2.7.5H3.jar拷貝到ApplicationServer\lib目錄下面即可

     解決完以上幾個問題后,再次重啟,訪問,OK,一切正常!好有成就感 :)

    posted @ 2006-11-29 14:42 jspark 閱讀(1687) | 評論 (1)編輯 收藏
    Sun HotSpot 1.4.1 JVM堆大小的調(diào)整
    ????
    ????Sun HotSpot 1.4.1使用分代收集器,它把堆分為三個主要的域:新域、舊域以及永久域。Jvm生成的所有新對象放在新域中。一旦對象經(jīng)歷了一定數(shù)量的垃圾收集循環(huán)后,便獲得使用期并進(jìn)入舊域。在永久域中jvm則存儲class和method對象。就配置而言,永久域是一個獨立域并且不認(rèn)為是堆的一部分。

    ????下面介紹如何控制這些域的大小。可使用-Xms和-Xmx 控制整個堆的原始大小或最大值。
    ????下面的命令是把初始大小設(shè)置為128M:
    ????java –Xms128m
    ???? –Xmx256m為控制新域的大小,可使用-XX:NewRatio設(shè)置新域在堆中所占的比例。

    ?? 下面的命令把整個堆設(shè)置成128m,新域比率設(shè)置成3,即新域與舊域比例為1:3,新域為堆的1/4或32M:
    ?? java –Xms128m –Xmx128m
    ????–XX:NewRatio =3可使用-XX:NewSize和-XX:MaxNewsize設(shè)置新域的初始值和最大值。

    ?? 下面的命令把新域的初始值和最大值設(shè)置成64m:
    ???? java –Xms256m –Xmx256m –Xmn64m
    ?? 永久域默認(rèn)大小為4m。運行程序時,jvm會調(diào)整永久域的大小以滿足需要。每次調(diào)整時,jvm會對堆進(jìn)行一次完全的垃圾收集。

    ?? 使用-XX:MaxPerSize標(biāo)志來增加永久域搭大小。在WebLogic Server應(yīng)用程序加載較多類時,經(jīng)常需要增加永久域的最大值。當(dāng)jvm加載類時,永久域中的對象急劇增加,從而使jvm不斷調(diào)整永久域大小。為了避免調(diào)整,可使用-XX:PerSize標(biāo)志設(shè)置初始值。
    ?? 下面把永久域初始值設(shè)置成32m,最大值設(shè)置成64m。
    ????java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m

    ????默認(rèn)狀態(tài)下,HotSpot在新域中使用復(fù)制收集器。該域一般分為三個部分。第一部分為Eden,用于生成新的對象。另兩部分稱為救助空間,當(dāng)Eden充滿時,收集器停止應(yīng)用程序,把所有可到達(dá)對象復(fù)制到當(dāng)前的from救助空間,一旦當(dāng)前的from救助空間充滿,收集器則把可到達(dá)對象復(fù)制到當(dāng)前的to救助空間。From和to救助空間互換角色。維持活動的對象將在救助空間不斷復(fù)制,直到它們獲得使用期并轉(zhuǎn)入舊域。使用-XX:SurvivorRatio可控制新域子空間的大小。

    ????同NewRation一樣,SurvivorRation規(guī)定某救助域與Eden空間的比值。比如,以下命令把新域設(shè)置成64m,Eden占32m,每個救助域各占16m:
    ????java -Xms256m -Xmx256m -Xmn64m -XX:SurvivorRation =2

    ????如前所述,默認(rèn)狀態(tài)下HotSpot對新域使用復(fù)制收集器,對舊域使用標(biāo)記-清除-壓縮收集器。在新域中使用復(fù)制收集器有很多意義,因為應(yīng)用程序生成的大部分對象是短壽命的。理想狀態(tài)下,所有過渡對象在移出Eden空間時將被收集。如果能夠這樣的話,并且移出Eden空間的對象是長壽命的,那么理論上可以立即把它們移進(jìn)舊域,避免在救助空間反復(fù)復(fù)制。但是,應(yīng)用程序不能適合這種理想狀態(tài),因為它們有一小部分中長壽命的對象。最好是保持這些中長壽命的對象并放在新域中,因為復(fù)制小部分的對象總比壓縮舊域廉價。為控制新域中對象的復(fù)制,可用-XX:TargetSurvivorRatio控制救助空間的比例(該值是設(shè)置救助空間的使用比例。如救助空間位1M,該值50表示可用500K)。該值是一個百分比,默認(rèn)值是50。當(dāng)較大的堆棧使用較低的sruvivorratio時,應(yīng)增加該值到80至90,以更好利用救助空間。用-XX:maxtenuring threshold可控制上限。

    ?? 為放置所有的復(fù)制全部發(fā)生以及希望對象從eden擴展到舊域,可以把MaxTenuring Threshold設(shè)置成0。設(shè)置完成后,實際上就不再使用救助空間了,因此應(yīng)把SurvivorRatio設(shè)成最大值以最大化Eden空間,設(shè)置如下:
    ?? java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000 …
    posted @ 2006-11-28 11:58 jspark 閱讀(654) | 評論 (0)編輯 收藏
    Assigning the target property requires the name of a window not the window itself.

    Wecould try something like

    window.opener.name="opener728";
    form.target="opener728";

    however, I suspect the window.name property is read-only.

    Alternatively, if We are certain that the opener already has a name then this might work

    form.target=window.opener.name;

    It's also possible that browsers assign unique names to otherwise unnamed windows, so the above would always work - I've never checked this.


    posted @ 2006-11-22 15:39 jspark 閱讀(472) | 評論 (0)編輯 收藏

    今天從網(wǎng)上找了一個讀寫csv格式的開源程序,還挺好用的。

    下面是一個讀取例子:

    源文件格式:

    ?ProductID,ProductName,SupplierID,CategoryID,QuantityPerUnit,UnitPrice,UnitsInStock,UnitsOnOrder,ReorderLevel,Discontinued
    ?1,Chai,1,1,10 boxes x 20 bags,18,39,0,10,FALSE
    ?2,Chang,1,1,24 - 12 oz bottles,19,17,40,25,FALSE

    ?下面讀取程序

    ?

    ?CsvReader?reader? = ? new ?CsvReader( " products.csv " );

    ?reader.readHeaders();

    ?
    while ?(reader.readRecord())
    ?
    {
    ??String?productID?
    = ?reader.get( " ProductID " );
    ??String?productName?
    = ?reader.get( " ProductName " );
    ??String?supplierID?
    = ?reader.get( " SupplierID " );
    ??String?categoryID?
    = ?reader.get( " CategoryID " );
    ??String?quantityPerUnit?
    = ?reader.get( " QuantityPerUnit " );
    ??String?unitPrice?
    = ?reader.get( " UnitPrice " );
    ??String?unitsInStock?
    = ?reader.get( " UnitsInStock " );
    ??String?unitsOnOrder?
    = ?reader.get( " UnitsOnOrder " );
    ??String?reorderLevel?
    = ?reader.get( " ReorderLevel " );
    ??String?discontinued?
    = ?reader.get( " Discontinued " );
    ??
    ??
    // ?perform?program?logic?here

    ?}


    ?reader.close();




    寫CSV例子:

    ?CsvWriter writer = new CsvWriter(new FileWriter(new File("c:\\1.csv")),',');
    ??writer.write("aa");
    ??writer.write("bb");
    ??writer.write("cc");
    ??writer.endRecord();
    ??writer.write("1");
    ??writer.write("2");
    ??writer.write("3");
    ??writer.close();

    posted @ 2006-11-07 12:05 jspark 閱讀(6561) | 評論 (0)編輯 收藏

    在spring中如何處理oracle大字段

    在spring中采用OracleLobHandler來處理oracle大字段(包括clob和blob),則在程序中不需要引用oracle的特殊類,從而能夠保證支持我們的代碼支持多數(shù)據(jù)庫。

    1、首先數(shù)據(jù)表中的clob類型對應(yīng)java持久化類的String類型;而blob類型對應(yīng)byte[]類型
    2、定義hibernate標(biāo)簽時,持久化類中對應(yīng)clob類型的屬性的hibernate type應(yīng)為org.springframework.orm.hibernate.support.ClobStringType;而對應(yīng)blob類型的屬性的hibernate type應(yīng)為org.springframework.orm.hibernate.support.BlobByteArrayType。
    3、以后訪問這些對應(yīng)clob和blob類型的屬性時,按普通屬性處理,不需要特別編碼。

    java代碼:?


    < bean? id ="mySessionFactory2" ?class ="org.springframework.orm.hibernate.LocalSessionFactoryBean" > ?
    ????????
    < property? name ="dataSource" > ?
    ????????????????
    < ref? bean ="myDataSource2" /> ?
    ?????????
    </ property > ?
    ?????????
    < property? name ="lobHandler" > ?
    ????????
    < ref? bean ="oracleLobHandle" /> ?
    ?????????
    </ property > ??
    </ bean > ?
    < bean? id ="nativeJdbcExtractor" ?class ="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" /> ?

    < bean? id ="oracleLobHandle" ?class ="org.springframework.jdbc.support.lob.OracleLobHandler" ?Lazy-init ="true" > ?
    < property? name ="nativeJdbcExtractor" > ?
    ????
    < ref? local ="nativejdbcExtractor" /> ?
    </ property > ?
    </ bean >


    Spring為處理數(shù)據(jù)庫Lob字段,特別提供了LobHandler接口。在操作Oracle RDBMS過程中,由于Oracle JDBC Driver實現(xiàn)的問題,應(yīng)用必須采用Oracle原生的數(shù)據(jù)庫連接(比如,oracle.jdbc.OracleConnection)、LOB原生實現(xiàn)(比如,oracle.sql.BLOB、oracle.sql.CLOB)。因此,LobHandler接口存在上述兩種實現(xiàn)。簡而言之,為操作Oracle數(shù)據(jù)庫,必須使用OracleLobHandler實現(xiàn)。如果操作其他RDBMS類型,則使用DefaultLobHandler。NativeJdbcExtractor是個接口,通過它能夠抽象各種連接池。另外Spring還提供兩個接口存取Blob,LobCreator及LobHandler
    posted @ 2006-08-28 11:58 jspark 閱讀(888) | 評論 (0)編輯 收藏

    ?? jdk提供的正則表達(dá)式是非常強大的,只要用過正則表達(dá)式的程序員應(yīng)該是為其功能嘆為觀止。不過,正則表達(dá)式中的一個group概念相信應(yīng)該不多人熟悉。

    ??? 正則表達(dá)式中的group,主要是用來區(qū)分子序列的,所謂子序列是用()之內(nèi)的表達(dá)式。下面以一段程序為例

    ????????String?regex?=?"\\$\\{(I)(love)(java)\\}";
    ????????System.out.println(Pattern.compile(regex).matcher("${Ilovejava}P)").groupCount());

    ?運行上面的代碼段,結(jié)果為:3
    ?其中(I)為一個組, (love)為一個組,(java)為一個組。

    ??
    ? 也許有人覺得這只是一個小功能,但是正則表達(dá)式的group,還有一個更加強大的地方就是在String.replaceAll方法中。
    ? public StringreplaceAll(String?regex,
    ???????????????????????? String?replacement)

    ?其中第一個參數(shù)當(dāng)然是政則表達(dá)式,第二個一般是普通的文本;但是第二個參數(shù)可以應(yīng)用group的地方,這個功能用在一些場合是非常方便的。
    ??????比如,下面這個例子? <driverClass>${driverClass}</driverClass>,要將${}去掉,即將這個例子替換成<driverClass>driverClass</driverClass>,可以用下面的代碼來替換。例如
    ????????String?text?=?"<driverClass>${driverClass}</driverClass>";
    ????????String?result?=?replaceStr(text,"\\$\\{(driverClass)\\}","$1");
    ????????System.out.println("result?is:"+result);

    ?? 運行結(jié)果:result is:<driverClass>driverClass</driverClass>
    ? 從上面可以看出,$1就是正則表達(dá)式中匹配的第一個序列,同樣$2...表示第幾個序列。如果$index中的index超出了表達(dá)式中子序列的個數(shù)的話,將拋出異常信息。 $0表示整個正則表達(dá)式。
    posted @ 2006-08-15 15:30 jspark 閱讀(495) | 評論 (0)編輯 收藏
    在tomcat5.5版本以前,可以說jndi配置相對是比較復(fù)雜的,而且據(jù)網(wǎng)友說用tomcat5.0的控制臺配置數(shù)據(jù)庫連接池經(jīng)常有問題,而且文檔寫得又不詳細(xì)。

    tomcat5.5出來后,jndi的配置方法是大大地節(jié)省,而且很簡潔,個人覺得比以前的版本好很多。這里大概給出一個配置例子。tomcat數(shù)據(jù)庫連接池jndi配置有兩種,一種是全局的,一種是context的,下面主要是講全局的,并且以一個實例jdbc/byisdb為例子
    ???
    一、tomcat5.0配置方法

    1、首先在server.xml里面配置,找到下面的配置
    ? <!-- Global JNDI resources -->
    ? <GlobalNamingResources>
    ?</GlobalNamingResources>

    2、在里面增加一個Resource
    ??????<Resource?name="jdbc/byisdb"
    ???????????????auth
    ="Container"
    ???????????????type
    ="javax.sql.DataSource"/>


    3、在下面增加屬性

    ??<ResourceParams?name="jdbc/byisdb">
    ????
    <parameter>
    ??????
    <name>factory</name>
    ??????
    <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    ????
    </parameter>

    ????
    <!--?Maximum?number?of?dB?connections?in?pool.?Make?sure?you
    ?????????configure?your?mysqld?max_connections?large?enough?to?handle
    ?????????all?of?your?db?connections.?Set?to?
    0?for?no?limit.
    ?????????
    -->
    ????
    <parameter>
    ??????
    <name>maxActive</name>
    ??????
    <value>100</value>
    ????
    </parameter>

    ????
    <!--?Maximum?number?of?idle?dB?connections?to?retain?in?pool.
    ?????????Set?to?
    -1?for?no?limit.??See?also?the?DBCP?documentation?on?this
    ?????????and?the?minEvictableIdleTimeMillis?configuration?parameter.
    ?????????
    -->
    ????
    <parameter>
    ??????
    <name>maxIdle</name>
    ??????
    <value>30</value>
    ????
    </parameter>

    ????
    <!--?Maximum?time?to?wait?for?a?dB?connection?to?become?available
    ?????????in?ms,?in?
    this?example?10?seconds.?An?Exception?is?thrown?if
    ?????????
    this?timeout?is?exceeded.??Set?to?-1?to?wait?indefinitely.
    ?????????
    -->
    ????
    <parameter>
    ??????
    <name>maxWait</name>
    ??????
    <value>10000</value>
    ????
    </parameter>

    ????
    <!--?MySQL?dB?username?and?password?for?dB?connections??-->
    ????
    <parameter>
    ?????
    <name>username</name>
    ?????
    <value>una_oa</value>
    ????
    </parameter>
    ????
    <parameter>
    ?????
    <name>password</name>
    ?????
    <value>una_oa</value>
    ????
    </parameter>

    ????
    <!--?Class?name?for?the?old?mm.mysql?JDBC?driver?-?uncomment?this?entry?and?comment?next
    ?????????
    if?you?want?to?use?this?driver?-?we?recommend?using?Connector/J?though
    ????
    <parameter>
    ???????
    <name>driverClassName</name>
    ???????
    <value>org.gjt.mm.mysql.Driver</value>
    ????
    </parameter>
    ?????
    -->
    ????
    ????
    <!--?Class?name?for?the?official?MySQL?Connector/J?driver?-->
    ????
    <parameter>
    ???????
    <name>driverClassName</name>
    ???????
    <value>oracle.jdbc.driver.OracleDriver</value>
    ????
    </parameter>
    ????
    ????
    <!--?The?JDBC?connection?url?for?connecting?to?your?MySQL?dB.
    ?????????The?autoReconnect
    =true?argument?to?the?url?makes?sure?that?the
    ?????????mm.mysql?JDBC?Driver?will?automatically?reconnect?
    if?mysqld?closed?the
    ?????????connection.??mysqld?by?
    default?closes?idle?connections?after?8?hours.
    ?????????
    -->
    ????
    <parameter>
    ??????
    <name>url</name>
    ??????
    <value>jdbc:oracle:thin:@192.168.1.210:1521:byisdb</value>
    ????
    </parameter>
    ??
    </ResourceParams>

    4、在你的應(yīng)用的web.xml里面增加
    <resource-ref>
    ?
    <description>postgreSQL?Datasource?example</description>
    ?
    <res-ref-name>jdbc/byisdb</res-ref-name>
    ?
    <res-type>javax.sql.DataSource</res-type>
    ?
    <res-auth>Container</res-auth>
    </resource-ref>

    OK,到此配置完畢,可以用下面的幾段代碼進(jìn)行測試

    Context?initContext?=?new?InitialContext();
    Context?envContext??
    =?(Context)initContext.lookup("java:/comp/env");
    DataSource?ds?
    =?(DataSource)envContext.lookup("jdbc/byisdb");
    Connection?conn?
    =?ds.getConnection();
    out.println(
    "conn?is:"+conn);

    二、tomcat5.5配置

    1、打開conf/context.xml里面
    ? 添加下面的配置

    ????<Resource?name="jdbc/byisdb"?auth="Container"?type="javax.sql.DataSource"?driverClassName="oracle.jdbc.driver.OracleDriver"?url="jdbc:oracle:thin:@192.168.1.210:1521:byisdb"?username="una_oa"?password="una_oa"?maxActive="20"?maxIdle="10"?maxWait="10000"/>

    ?

    2在你的應(yīng)用的web.xml里面增加

    <resource-ref>
    ?
    <description>postgreSQL?Datasource?example</description>
    ?
    <res-ref-name>jdbc/byisdb</res-ref-name>
    ?
    <res-type>javax.sql.DataSource</res-type>
    ?
    <res-auth>Container</res-auth>
    </resource-ref>

    同樣,可以用上面的代碼進(jìn)行測試。
    posted @ 2006-08-11 14:03 jspark 閱讀(2949) | 評論 (1)編輯 收藏

    ?最近由于需要用到ThreadLocal,在網(wǎng)上搜索了一些相關(guān)資料,發(fā)現(xiàn)對ThreadLocal經(jīng)常會有下面幾種誤解

    ?一、ThreadLocal是java線程的一個實現(xiàn)
    ????? ThreadLocal的確是和java線程有關(guān),不過它并不是java線程的一個實現(xiàn),它只是用來維護(hù)本地變量。針對每個線程,提供自己的變量版本,主要是為了避免線程沖突,每個線程維護(hù)自己的版本。彼此獨立,修改不會影響到對方。

    ?二、ThreadLocal是相對于每個session的

    ??????? ThreadLocal顧名思義,是針對線程。在java web編程上,每個用戶從開始到會話結(jié)束,都有自己的一個session標(biāo)識。但是ThreadLocal并不是在會話層上。其實,Threadlocal是獨立于用戶session的。它是一種服務(wù)器端行為,當(dāng)服務(wù)器每生成一個新的線程時,就會維護(hù)自己的ThreadLocal。對于這個誤解,個人認(rèn)為應(yīng)該是開發(fā)人員在本地基于一些應(yīng)用服務(wù)器測試的結(jié)果。眾所周知,一般的應(yīng)用服務(wù)器都會維護(hù)一套線程池,也就是說,對于每次訪問,并不一定就新生成一個線程。而是自己有一個線程緩存池。對于訪問,先從緩存池里面找到已有的線程,如果已經(jīng)用光,才去新生成新的線程。所以,由于開發(fā)人員自己在測試時,一般只有他自己在測,這樣服務(wù)器的負(fù)擔(dān)很小,這樣導(dǎo)致每次訪問可能是共用同樣一個線程,導(dǎo)致會有這樣的誤解:每個session有一個ThreadLocal

    ?三、ThreadLocal是相對于每個線程的,用戶每次訪問會有新的ThreadLocal

    ??理論上來說,ThreadLocal是的確是相對于每個線程,每個線程會有自己的ThreadLocal。但是上面已經(jīng)講到,一般的應(yīng)用服務(wù)器都會維護(hù)一套線程池。因此,不同用戶訪問,可能會接受到同樣的線程。因此,在做基于TheadLocal時,需要謹(jǐn)慎,避免出現(xiàn)ThreadLocal變量的緩存,導(dǎo)致其他線程訪問到本線程變量

    ?四、對每個用戶訪問,ThreadLocal可以多用
    ??????? 可以說,ThreadLocal是一把雙刃劍,用得來的話可以起到非常好的效果。但是,ThreadLocal如果用得不好,就會跟全局變量一樣。代碼不能重用,不能獨立測試。因為,一些本來可以重用的類,現(xiàn)在依賴于ThreadLocal變量。如果在其他沒有ThreadLocal場合,這些類就變得不可用了。個人覺得ThreadLocal用得很好的幾個應(yīng)用場合,值得參考

    ??1、存放當(dāng)前session用戶:quake want的jert

    ??2、存放一些context變量,比如webwork的ActionContext

    ??3、存放session,比如Spring hibernate orm的session

    posted @ 2006-08-01 12:09 jspark 閱讀(30747) | 評論 (12)編輯 收藏
    主站蜘蛛池模板: 男女交性永久免费视频播放| 亚洲精品女同中文字幕| 亚洲精品国产精品乱码不卞| 无码精品A∨在线观看免费| 国产无遮挡裸体免费视频在线观看| 亚洲精品av无码喷奶水糖心| 亚洲精品美女视频| 亚洲AV无码成人网站久久精品大| 免费一级毛片正在播放| 午夜时刻免费入口| 成人免费午夜无码视频| 美丽的姑娘免费观看在线播放| 伊人免费在线观看高清版| 无码精品人妻一区二区三区免费| 亚洲日韩一中文字暮| 亚洲成人动漫在线观看| 亚洲视频在线观看| 亚洲国产一区二区a毛片| 亚洲乳大丰满中文字幕| 亚洲午夜日韩高清一区| 亚洲国产精品嫩草影院久久| 国产最新凸凹视频免费| 日韩人妻无码免费视频一区二区三区| 最近中文字幕无免费视频| 日韩国产免费一区二区三区| 91频在线观看免费大全| 国产a视频精品免费观看| 亚欧免费视频一区二区三区| 131美女爱做免费毛片| 91久久青青草原线免费| 国产成人精品免费午夜app| 91嫩草免费国产永久入口| 国产精品永久免费10000| 久久久久久久免费视频| 男男AV纯肉无码免费播放无码| 91视频国产免费| 午夜dj在线观看免费视频| 成人免费无码精品国产电影| 精品免费久久久久久成人影院| 日韩成人免费在线| 亚洲AV无码乱码精品国产|