隨筆-16  評論-54  文章-0  trackbacks-0
            2006年11月22日
           

           

          1      基本介紹

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

          Name,company

          zhangsan,ibm

          lisi,oracle

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

          Name#company

          Zhangsan#ibm

          Lisi#oracle

          這種也算CSV格式

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

          2      安裝和使用

          2.1下載

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

          http://opencsv.sourceforge.net/

          上面下載到最新的csvreader包。

          2.2安裝

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

          3      讀取CSV格式文件

          3.1基本簡介

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

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

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

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

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

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

          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("");

                       }

          3.2綜合例子

          C盤下創建一個測試文件test.cvs,內容如下:

          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格式文件也比較簡單,寫每一列只要直接調用

          csvWriter.write()即可

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

          表示結束一行

          文件寫完畢后,要記得刷新一下并關掉,如下:

                 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盤下面創建了一個文件

          test.text

          內容如下:

          name#company

          11#12

          21#22

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

          1      Java規則系統簡介

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

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

          JbossRules是一個優秀的JAVA規則引擎,其前身是Drools3,后來被Jboss合并并改名為JbossRules

          1.1基于規則的專家系統簡介

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

          知識表示

          神經網絡

          基因算法

          決策樹

          專家系統

          等等幾個學科

          知識表示是人工智能中的一個基礎領域,其目的是如何更好的在計算機當中描述已存在的事實。專家系統就是使用知識表示,來做規則推理,得出最后的結論來。

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

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

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

          正向推理:

           

          正向推理圖形如下:

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

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

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

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

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

          使用執行引擎執行Agenda中的規則。重復步驟25,直到執行完畢所有Agenda中的規則。

          直到得出最終的結果為止

          反向推理:

           

          反向推理是目標驅動的推理方式。從目標出發,找出所有能滿足該目

          標的子目標。這樣一直推導下去,直到所有的子目標都已經滿足為止。

          1.2Java規則引擎

          Java規則引擎是一種嵌入在Java程序中的組件,它的任務是把當前提交給引擎的Java數據對象與加載在引擎中的業務規則進行測試和比對,激活那些符合當前數據狀態下的業務規則,根據業務規則中聲明的執行邏輯,觸發應用程序中對應的操作。

          一般來說,一條規則的形式如下:

          when

              <conditions>

          then

              <actions>

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

          1.3    JAVA規則引擎的優點

          聲明式編程

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

          邏輯和數據分開

          將可變的業務邏輯和數據分開。雖然,這違背了面向對象原則。面向對象強調數據和業務邏輯耦合。但是,對于一些易變而復雜的業務規則。如果散步在程序的各個地方、各個層次。那么一旦業務規則更改的話,就會出現“牽一發而動全身”的局面。因此,將可變的業務邏輯獨立出來管理,將有助于后面的業務變更。

          性能

          Rete算法的性能比較高。

          知識集中表示

          通過使用規則,我們把規則集中存放起來,從而使系統知識能夠集中表示。

          可讀性

          規則的可讀性比較高。對于熟悉業務規則。但不會程序開發的業務專家,只要熟悉規則的標示,也可以編寫和修改業務規則。

          1.4    使用JAVA規則系統的場合

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

          用傳統的代碼開發比較復雜、繁瑣

          問題雖然不復雜,但是用傳統的代碼開發比較脆弱,也就是經常修改

          沒有優雅的算法

          業務規則頻繁改變

          有很多業務專家、不懂技術開發

          1.5    不適合使用JAVA規則系統場合

          雖然規則系統看起來比較不錯,但是并不是任何地方都可以使用規則系統。很多簡單、固定的業務系統,可以不用使用規則系統。規則系統也不能用來作為標示重要的業務流程、不能用來作為工作流引擎。

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

          posted @ 2008-10-28 12:15 jspark 閱讀(1566) | 評論 (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服務器問題
              安裝SUN ONE APPSERVER8.1必須要在服務器上安裝,而且必須要將該服務器設置為DNS服務器。關于WINDOWS SERVER 2003
              如何設置DNS服務器,網上很多資料,可以查閱

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

              
          //  Core server classes get all permissions by default

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

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

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

          }; 


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

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



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

              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

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


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

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

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

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

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

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

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

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

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

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

          ?? 為放置所有的復制全部發生以及希望對象從eden擴展到舊域,可以把MaxTenuring Threshold設置成0。設置完成后,實際上就不再使用救助空間了,因此應把SurvivorRatio設成最大值以最大化Eden空間,設置如下:
          ?? java … -XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000 …
          posted @ 2006-11-28 11:58 jspark 閱讀(658) | 評論 (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 閱讀(476) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 隆化县| 九龙坡区| 永寿县| 喀什市| 西昌市| 遂昌县| 中西区| 南京市| 肥东县| 德惠市| 武宣县| 台山市| 盐边县| 新营市| 扎囊县| 平果县| 灌阳县| 台州市| 北辰区| 四川省| 利川市| 仙居县| 隆昌县| 大余县| 和平区| 呈贡县| 乐清市| 且末县| 龙海市| 天水市| 玉山县| 西畴县| 青铜峡市| 清丰县| 潜江市| 获嘉县| 鱼台县| 江油市| 临沂市| 贵溪市| 杭州市|