隨筆-16  評(píng)論-54  文章-0  trackbacks-0
            2006年11月29日
           

           

          1      基本介紹

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

          Name,company

          zhangsan,ibm

          lisi,oracle

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

          Name#company

          Zhangsan#ibm

          Lisi#oracle

          這種也算CSV格式

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

          2      安裝和使用

          2.1下載

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

          http://opencsv.sourceforge.net/

          上面下載到最新的csvreader包。

          2.2安裝

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

          3      讀取CSV格式文件

          3.1基本簡(jiǎn)介

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

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

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

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

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

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

          reader.readHeaders();

          String[] headers = reader.getHeaders();

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

          假如,有多行的話,可以用一個(gè)循環(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)建一個(gè)測(cè)試文件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("");

                       }

                }

          運(yùn)行以上程序,可以看到輸出

           1 2 3

           4 5 6

          4      CSV格式文件

          CSV格式文件也比較簡(jiǎn)單,寫每一列只要直接調(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();

             }

          }

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

          test.text

          內(nèi)容如下:

          name#company

          11#12

          21#22

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

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

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

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

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

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

          知識(shí)表示

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

          基因算法

          決策樹

          專家系統(tǒng)

          等等幾個(gè)學(xué)科

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

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

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

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

          正向推理:

           

          正向推理圖形如下:

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

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

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

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

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

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

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

          反向推理:

           

          反向推理是目標(biāo)驅(qū)動(dòng)的推理方式。從目標(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ù)對(duì)象與加載在引擎中的業(yè)務(wù)規(guī)則進(jìn)行測(cè)試和比對(duì),激活那些符合當(dāng)前數(shù)據(jù)狀態(tài)下的業(yè)務(wù)規(guī)則,根據(jù)業(yè)務(wù)規(guī)則中聲明的執(zhí)行邏輯,觸發(fā)應(yīng)用程序中對(duì)應(yīng)的操作。

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

          when

              <conditions>

          then

              <actions>

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

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

          聲明式編程

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

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

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

          性能

          Rete算法的性能比較高。

          知識(shí)集中表示

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

          可讀性

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

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

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

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

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

          posted @ 2008-10-28 12:15 jspark 閱讀(1563) | 評(píng)論 (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 " ;

          };  

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

             一、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)。對(duì)于一些文件夾、文件讀取是會(huì)有一些控制的。比如說,當(dāng)將應(yīng)用部署上去,然后訪問應(yīng)用,會(huì)拋出SecurityException。這是因?yàn)樾枰幾gjsp頁面,生成class文件,由于沒有寫權(quán)限,所以會(huì)出錯(cuò)。解決的方法是為SUN ONE APPSERVER增加文件訪問權(quán)限。修改方法如下:
           找到安裝路徑,下面以本人的安裝路徑為例子:
           c\sunjes\ApplicationServer\domains\domain1\config
           該目錄下面有一個(gè)文件叫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)限,個(gè)人把整個(gè)c盤設(shè)置為可讀可寫,如下

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

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

          }; 


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

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



            四、ORACLE10.2.0.1驅(qū)動(dòng)問題
           本人部署的應(yīng)用是spring+hb架構(gòu),里面用到blog/clob大字段處理,因此驅(qū)動(dòng)程序用最新的驅(qū)動(dòng)程序10g,版本為10.2.0.1。在部署到SUN ONE APPSERVER8.1時(shí),也拋出類訪問異常,異常信息是:oracle.sql is sealed。沒辦法,上網(wǎng)搜索了一下,發(fā)現(xiàn)有很多人也遇過這個(gè)情況。主要是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,低點(diǎn)的版本。本人的解決方法是修改一下里面的MANIFEST.MF文件,把sealed:true去掉即可。


           四、包版本不兼容。
           解決完以上幾個(gè)問題后,重新啟動(dòng),本以為萬事大吉,很不幸運(yùn)的是,再次拋出異常:
           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)用時(shí),也出現(xiàn)過類似的問題。由于這些服務(wù)器會(huì)優(yōu)先裝載自己的類,因此會(huì)出現(xiàn)一些問題。解決方法是把hibernate下較高版本的antlr.jar放在classpath的前面。在SUN ONE APPSERVER
           下最快捷的方式就是將antlr-2.7.5H3.jar拷貝到ApplicationServer\lib目錄下面即可

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

          posted @ 2006-11-29 14:42 jspark 閱讀(1688) | 評(píng)論 (1)編輯 收藏
          主站蜘蛛池模板: 三江| 无锡市| 卢氏县| 铜川市| 兰州市| 冀州市| 东港市| 元氏县| 科技| 塘沽区| 保山市| 蓬安县| 安溪县| 阿荣旗| 介休市| 涟源市| 保定市| 江口县| 苏尼特左旗| 米林县| 锡林浩特市| 杭州市| 翼城县| 东海县| 靖远县| 乌海市| 富阳市| 太康县| 英德市| 芒康县| 大理市| 安康市| 三穗县| 县级市| 巴南区| 湖口县| 承德县| 呈贡县| 庐江县| 米脂县| 马鞍山市|