可以說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格式
目前CSV reader的最新發(fā)布版本是1.8。我們可以從
http://opencsv.sourceforge.net/
上面下載到最新的csvreader包。
直接把jar包分別存放到開發(fā)工程的類路徑下面即可使用。
首先,讀取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();
讀取了后,指針就會移動到下一行,也就是可以開始讀取文件內容
假如,有多行的話,可以用一個循環(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("");
}
在C盤下創(chuàng)建一個測試文件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
寫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盤下面創(chuàng)建了一個文件
test.text
內容如下:
name#company
11#12
21#22
在大型商業(yè)系統(tǒng)中,業(yè)務規(guī)則、商業(yè)邏輯等等都會比較復雜。而且在很多大型系統(tǒng)當中,很多業(yè)務規(guī)則、商業(yè)邏輯并不是一成不變的。甚至當系統(tǒng)進入生產(chǎn)階段時,客戶的業(yè)務規(guī)則、商業(yè)邏輯也會改變。某些系統(tǒng)要求甚至更高,要求能24小時不停機,并且能夠實時修改商業(yè)規(guī)則。這就對商業(yè)系統(tǒng)提出了較大的挑戰(zhàn)。如果將這些可變的規(guī)則直接編寫到代碼里面的話,業(yè)務規(guī)則一旦改變,就要修改代碼。并由此帶來編譯、打包、發(fā)布等等問題。這對于生產(chǎn)系統(tǒng)來說是極不方便的。因此,如何考慮把一些可變的業(yè)務規(guī)則抽取到外面,使這些業(yè)務規(guī)則獨立于程序代碼。并最好是能夠實時的修改業(yè)務規(guī)則,這樣就可以做到不用打包編譯發(fā)布等等。
值得慶幸的是現(xiàn)在出現(xiàn)了一些Java規(guī)則引擎(Rule Engine),專門解決以上所述的問題。利用它,我們就可以在應用系統(tǒng)中分離客戶的商業(yè)決策邏輯和應用開發(fā)者的技術決策,并把這些商業(yè)規(guī)額則放在中心數(shù)據(jù)庫或其他統(tǒng)一的地方,讓它們能在運行時可以動態(tài)地管理和修改。
JbossRules是一個優(yōu)秀的JAVA規(guī)則引擎,其前身是Drools3,后來被Jboss合并并改名為JbossRules
人工智能是一個新興的學科,它是想讓計算機模擬人腦的思維和推理模式。人工智能分成如下幾個主要的分學科:
知識表示
神經(jīng)網(wǎng)絡
基因算法
決策樹
專家系統(tǒng)
等等幾個學科
知識表示是人工智能中的一個基礎領域,其目的是如何更好的在計算機當中描述已存在的事實。專家系統(tǒng)就是使用知識表示,來做規(guī)則推理,得出最后的結論來。
Java規(guī)則引擎起源于基于規(guī)則的專家系統(tǒng),而基于規(guī)則的專家系統(tǒng)又是專家系統(tǒng)的其中一個分支。專家系統(tǒng)屬于人工智能的范疇,它模仿人類的推理方式,使用試探性的方法進行推理,并使用人類能理解的術語解釋和證明它的推理結論。為了更深入地了解Java規(guī)則引擎,下面簡要地介紹基于規(guī)則的專家系統(tǒng)。RBES包括三部分:Rule Base(knowledge base)、Working Memory(fact base)和Inference Engine。它們的結構如下系統(tǒng)所示:
如上圖所示,推理引擎包括三部分:模式匹配器(Pattern Matcher)、議程(Agenda)和執(zhí)行引擎(Execution Engine)。推理引擎通過決定哪些規(guī)則滿足事實或目標,并授予規(guī)則優(yōu)先級,滿足事實或目標的規(guī)則被加入議程。模式匹配器決定選擇執(zhí)行哪個規(guī)則,何時執(zhí)行規(guī)則;議程管理模式匹配器挑選出來的規(guī)則的執(zhí)行次序;執(zhí)行引擎負責執(zhí)行規(guī)則和其他動作。
和人類的思維相對應,推理引擎存在兩者推理方式:演繹法(Forward-Chaining)和歸納法(Backward-Chaining)。演繹法從一個初始的事實出發(fā),不斷地應用規(guī)則得出結論(或執(zhí)行指定的動作)。而歸納法則是根據(jù)假設,不斷地尋找符合假設的事實。Rete算法是目前效率最高的一個Forward-Chaining推理算法,許多Java規(guī)則引擎都是基于Rete算法來進行推理計算的。
l 正向推理:
正向推理圖形如下:
正向推理引擎的推理步驟如下:
n 將初始數(shù)據(jù)(fact)輸入Working Memory。
n 使用Pattern Matcher比較規(guī)則庫(rule base)中的規(guī)則(rule)和數(shù)據(jù)(fact)。
n 如果執(zhí)行規(guī)則存在沖突(conflict),即同時激活了多個規(guī)則,將沖突的規(guī)則放入沖突集合。
n 解決沖突,將激活的規(guī)則按順序放入Agenda。
n 使用執(zhí)行引擎執(zhí)行Agenda中的規(guī)則。重復步驟2至5,直到執(zhí)行完畢所有Agenda中的規(guī)則。
n 直到得出最終的結果為止
l 反向推理:
反向推理是目標驅動的推理方式。從目標出發(fā),找出所有能滿足該目
標的子目標。這樣一直推導下去,直到所有的子目標都已經(jīng)滿足為止。
Java規(guī)則引擎是一種嵌入在Java程序中的組件,它的任務是把當前提交給引擎的Java數(shù)據(jù)對象與加載在引擎中的業(yè)務規(guī)則進行測試和比對,激活那些符合當前數(shù)據(jù)狀態(tài)下的業(yè)務規(guī)則,根據(jù)業(yè)務規(guī)則中聲明的執(zhí)行邏輯,觸發(fā)應用程序中對應的操作。
一般來說,一條規(guī)則的形式如下:
when
<conditions>
then
<actions>
也就是說,當conditions成立的話,就做下面的actions。其中actions可以為生成新的事實、或者做其他動作,比如,發(fā)送email通知、執(zhí)行一些本地任務等等。
n 聲明式編程
聲明式編程,規(guī)則引擎讓我們直到“做什么”,而不用直到“怎么做”。我們只要把一系列規(guī)則表示出來后。具體的推理動作就交給規(guī)則引擎來處理。
n 邏輯和數(shù)據(jù)分開
將可變的業(yè)務邏輯和數(shù)據(jù)分開。雖然,這違背了面向對象原則。面向對象強調數(shù)據(jù)和業(yè)務邏輯耦合。但是,對于一些易變而復雜的業(yè)務規(guī)則。如果散步在程序的各個地方、各個層次。那么一旦業(yè)務規(guī)則更改的話,就會出現(xiàn)“牽一發(fā)而動全身”的局面。因此,將可變的業(yè)務邏輯獨立出來管理,將有助于后面的業(yè)務變更。
n 性能
Rete算法的性能比較高。
n 知識集中表示
通過使用規(guī)則,我們把規(guī)則集中存放起來,從而使系統(tǒng)知識能夠集中表示。
n 可讀性
規(guī)則的可讀性比較高。對于熟悉業(yè)務規(guī)則。但不會程序開發(fā)的業(yè)務專家,只要熟悉規(guī)則的標示,也可以編寫和修改業(yè)務規(guī)則。
那么,在那些場合下適合應用JAVA規(guī)則系統(tǒng)呢?總而言之,可以用一句話來概括:當用傳統(tǒng)的程序開發(fā),無法得到一種優(yōu)雅的解決方法的時候,就可以考慮使用規(guī)則系統(tǒng)。如下的一些場合:
n 用傳統(tǒng)的代碼開發(fā)比較復雜、繁瑣
n 問題雖然不復雜,但是用傳統(tǒng)的代碼開發(fā)比較脆弱,也就是經(jīng)常修改
n 沒有優(yōu)雅的算法
n 業(yè)務規(guī)則頻繁改變
n 有很多業(yè)務專家、不懂技術開發(fā)
雖然規(guī)則系統(tǒng)看起來比較不錯,但是并不是任何地方都可以使用規(guī)則系統(tǒng)。很多簡單、固定的業(yè)務系統(tǒng),可以不用使用規(guī)則系統(tǒng)。規(guī)則系統(tǒng)也不能用來作為標示重要的業(yè)務流程、不能用來作為工作流引擎。
有很多程序員把JAVA規(guī)則系統(tǒng)當成是一種動態(tài)修改配置。也就是把一部分代碼邏輯抽取到外面,統(tǒng)一存放起來。這樣,當一些配置修改的話,通過修改規(guī)則,就能修改代碼的一部分邏輯。如果把JAVA規(guī)則僅僅用在這個場合下的話,可以考慮采用腳本引擎。比如BeanShell、JEXL、Groovy等等。
最近一個項目需要用到SUN ONE APPSERVER8.1,本人在WINDOWS SERVER 2003中安裝,碰到一些問題,不過比較幸運的是都解決了,下面大概描述一下個人碰到的問題,期望能給別人帶來幫助
一、DNS服務器問題
安裝SUN ONE APPSERVER8.1必須要在服務器上安裝,而且必須要將該服務器設置為DNS服務器。關于WINDOWS SERVER 2003
如何設置DNS服務器,網(wǎng)上很多資料,可以查閱
二、文件系統(tǒng)權限訪問問題
也許SUN ONE APPSERVER8.1服務器在文件訪問方面控制比較嚴格,如果按照默認安裝上去的系統(tǒng)。對于一些文件夾、文件讀取是會有一些控制的。比如說,當將應用部署上去,然后訪問應用,會拋出SecurityException。這是因為需要編譯jsp頁面,生成class文件,由于沒有寫權限,所以會出錯。解決的方法是為SUN ONE APPSERVER增加文件訪問權限。修改方法如下:
找到安裝路徑,下面以本人的安裝路徑為例子:
c\sunjes\ApplicationServer\domains\domain1\config
該目錄下面有一個文件叫server.policy,打開該頁面,可以看到里面是一些關于文件訪問權限的例子
編輯完畢,保存,重啟服務器,OK,該問題解決。 :)
三、其他幾個權限問題:
編輯以上問題后,重新自動,可能還會發(fā)現(xiàn)以下幾個異常,比如 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。沒辦法,上網(wǎng)搜索了一下,發(fā)現(xiàn)有很多人也遇過這個情況。主要是oracle10g.jar里面的Meta-inf定義,增加了sealed屬性。打開該文件MANIFEST.MF,內容如下:
關于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部署應用時,也出現(xiàn)過類似的問題。由于這些服務器會優(yōu)先裝載自己的類,因此會出現(xiàn)一些問題。解決方法是把hibernate下較高版本的antlr.jar放在classpath的前面。在SUN ONE APPSERVER
下最快捷的方式就是將antlr-2.7.5H3.jar拷貝到ApplicationServer\lib目錄下面即可
解決完以上幾個問題后,再次重啟,訪問,OK,一切正常!好有成就感 :)
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.
今天從網(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
?下面讀取程序
?
寫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();
在spring中如何處理oracle大字段 在spring中采用OracleLobHandler來處理oracle大字段(包括clob和blob),則在程序中不需要引用oracle的特殊類,從而能夠保證支持我們的代碼支持多數(shù)據(jù)庫。 1、首先數(shù)據(jù)表中的clob類型對應java持久化類的String類型;而blob類型對應byte[]類型 2、定義hibernate標簽時,持久化類中對應clob類型的屬性的hibernate type應為org.springframework.orm.hibernate.support.ClobStringType;而對應blob類型的屬性的hibernate type應為org.springframework.orm.hibernate.support.BlobByteArrayType。 3、以后訪問這些對應clob和blob類型的屬性時,按普通屬性處理,不需要特別編碼。 java代碼:? |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
?? jdk提供的正則表達式是非常強大的,只要用過正則表達式的程序員應該是為其功能嘆為觀止。不過,正則表達式中的一個group概念相信應該不多人熟悉。
??? 正則表達式中的group,主要是用來區(qū)分子序列的,所謂子序列是用()之內的表達式。下面以一段程序為例
OK,到此配置完畢,可以用下面的幾段代碼進行測試
二、tomcat5.5配置
1、打開conf/context.xml里面
? 添加下面的配置
?
2在你的應用的web.xml里面增加