2010年10月14日 星期四

轉貼 java 呼叫外部執行程式

以下轉貼至 javaworld - sungo 的文章

執行 exe 是沒問題,但若要在呼叫其他的java 程式我嘗試會沒反應,這點應該是索引位置判別錯誤的關係。
若將java 檔包成可執行檔如 jar 我想可以正常呼叫



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;


public class JPing {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
Process process = null;
String line = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
String ip = "127.0.0.1"; //要Ping 的IP位址
try {
process = runtime.exec("ping " + ip);
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while ( (line = br.readLine()) != null) {
System.out.println(line);
System.out.flush();
}
is.close();
isr.close();
br.close();
System.out.println("Java 呼叫 ping 程式,執行完畢!");
}
catch (IOException e) {
System.out.println(e);
runtime.exit(0);
}
}//end main method
}//end class


2010年10月13日 星期三

java 動態button 宣告

以下範例 是宣告 按鈕數目多少,之後在 panel 上顯示按鈕

之後 要改成動態的話,可以由外部讀取檔案決定 按鈕的數目及相關的資訊


import javax.swing.SwingUtilities;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Rectangle;
import javax.swing.JOptionPane;
import java.awt.Frame;





public class layout extends JFrame{

/// 宣告要產生 button 的數目
private int _programNum=6;

/// JPanel
private JPanel jContentPane = null;

/// 宣告 JButton 的數目
private JButton[] jButtons = new JButton[_programNum];



/**
* @param args
*/
public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {
public void run() {
layout thisClass = new layout();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}

/**
* This is the default constructor
*/
public layout() {
super();
initialize();
}

/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(348, 224);
this.setContentPane(getJContentPane());
this.setTitle("動態產生 JButton");

/// 打開window 的事件
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent e) {
System.out.println("Open Window");
}
});

}

/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {

if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(null);

/// 逐次添加 JButton
for(int i=0;i<_programNum;i++)
{

jContentPane.add(GetJButtons(i), null);
}
}
return jContentPane;
}


/**
* This method initializes JButtons [i]
*
* @return javax.swing.JButton
*/
private JButton GetJButtons(final int i) {

/// 宣告
jButtons[i] = new JButton();
/// 設定範圍
jButtons[i].setBounds(new Rectangle(12, 12+i*50, 310, 59));
/// 設定顯示文字
jButtons[i].setText("範例按鈕"+i);
/// 設定提示
jButtons[i].setToolTipText("快點按我!"+i);

/// 設定按鈕
jButtons[i].addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
System.out.println(" 按了範例按鈕"+i);
Frame frame = new Frame();
JOptionPane.showMessageDialog(frame, "按了範例按鈕"+i);
}
});

return jButtons[i];
}


}


2010年10月12日 星期二

java XML 讀取

轉貼自網路 http://java.chinaitlab.com/XMLBeans/717370_2.html


1)DOM(JAXP Crimson解析器)

DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文檔和構造層次結構,然後才能做任何工作。由於它是基於資訊層次的,因而DOM被認為是基於樹或基於物件的。DOM以及廣義的基於樹的處理具有幾個優點。首先,由於樹在記憶體中是持久的,因此可以修改它以便應用程式能對資料和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡單得多。

2)SAX

SAX處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的資料被處理。而且,由於應用程式只是在讀取資料時檢查資料,因此不需要將資料存儲在記憶體中。這對於大型文檔來說是個巨大的優點。事實上,應用程式甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX還比它的替代者DOM快許多。

選擇DOM還是選擇SAX? 對於需要自己編寫代碼來處理XML文檔的開發人員來說, 選擇DOM還是SAX解析模型是一個非常重要的設計決策。 DOM採用建立樹形結構的方式訪問XML文檔,而SAX採用的事件模型。

DOM解析器把XML文檔轉化為一個包含其內容的樹,並可以對樹進行遍曆。用DOM解析模型的優點是編程容易,開發人員只需要調用建樹的指令,然後利用navigation APIs訪問所需的樹節點來完成任務。可以很容易的添加和修改樹中的元素。然而由於使用DOM解析器的時候需要處理整個XML文檔,所以對性能和記憶體的要求比較高,尤其是遇到很大的XML檔的時候。由於它的遍曆能力,DOM解析器常用于XML文檔需要頻繁的改變的服務中。

SAX解析器採用了基於事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以啟動一個回調方法,告訴該方法制定的標籤已經找到。SAX對記憶體的要求通常會比較低,因為它讓開發人員自己來決定所要處理的tag.特別是當開發人員只需要處理文檔中所包含的部分資料時,SAX這種擴展能力得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同資料。

3)JDOM http://www.jdom.org

JDOM的目的是成為Java特定文檔模型,它簡化與XML的交互並且比使用DOM實現更快。由於是第一個Java特定模型,JDOM一直得到大力推廣和促進。正在考慮通過"Java規範請求JSR-102"將它最終用作"Java標準擴展"。從2000年初就已經開始了JDOM開發。

JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用介面。這在某些方面簡化了API,但是也限制了靈活性。第二,API大量使用了 Collections類,簡化了那些已經熟悉這些類的Java開發者的使用。

JDOM文檔聲明其目的是"使用20%(或更少)的精力解決80%(或更多)Java/XML問題"(根據學習曲線假定為20%)。JDOM對於大多數Java/XML應用程式來說當然是有用的,並且大多數開發者發現API比DOM容易理解得多。JDOM還包括對程式列為的相當廣泛檢查以防止用戶做任何在XML中無意義的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情況下的錯誤)。這也許是比學習DOM或JDOM介面都更有意義的工作。

JDOM自身不包含解析器。它通常使用SAX2解析器來解析和驗證輸入XML文檔(儘管它還可以將以前構造的DOM表示作為輸入)。它包含一些轉換器以將JDOM表示輸出成SAX2事件流、DOM模型或XML文本文檔。JDOM是在Apache許可證變體下發佈的開放源碼。

4)DOM4J http://dom4j.sourceforge.net

雖然DOM4J代表了完全獨立的開發結果,但最初,它是JDOM的一種智慧分支。它合併了許多超出基本XML文檔表示的功能,包括集成的XPath支持、XML Schema支援以及用於大文檔或流化文檔的基於事件的處理。它還提供了構建文檔表示的選項,它通過DOM4J API和標準DOM介面具有並行訪問功能。從2000下半年開始,它就一直處於開發之中。

為支援所有這些功能,DOM4J使用介面和抽象基本類方法。DOM4J大量使用了API中的Collections類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然DOM4J付出了更複雜的API的代價,但是它提供了比JDOM大得多的靈活性。

在添加靈活性、XPath集成和對大文檔處理的目標時,DOM4J的目標與JDOM是一樣的:針對Java開發者的易用性和直觀操作。它還致力於成為比JDOM更完整的解決方案,實現在本質上處理所有Java/XML問題的目標。在完成該目標時,它比JDOM更少強調防止不正確的應用程式列為。

DOM4J是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟體。如今你可以看到越來越多的Java軟體都在使用DOM4J來讀寫XML,特別值得一提的是連Sun的JAXM也在用DOM4J.

2...... 比較

1)DOM4J性能最好,連Sun的JAXM也在用DOM4J.目前許多開源專案中大量採用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J 來讀取XML配置檔。如果不考慮可攜性,那就採用DOM4J.

2)JDOM和DOM在性能測試時表現不佳,在測試10M文檔時記憶體溢出。在小文檔情況下還值得考慮使用DOM和JDOM.雖然JDOM的開發者已經說明他們期望在正式發行版前專注性能問題,但是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM仍是一個非常好的選擇。DOM實現廣泛應用於多種編程語言。它還是許多其他與XML相關的標準的基礎,因為它正式獲得W3C推薦(與基於非標準的Java模型相對),所以在某些類型的專案中可能也需要它(如在JavaScript中使用DOM)。

3)SAX表現較好,這要依賴於它特定的解析方式-事件驅動。一個SAX檢測即將到來的XML流,但並沒有載入到記憶體(當然當XML流被讀入時,會有部分文檔暫時隱藏在記憶體中)。


----------------------------------------------------------

就JDK 而言, DOM 和 SAX 兩個方法不用在額外 import 其他的 library.



以下是我用DOM 讀取的簡單範例



XML 內容, Sample.xml

<?xml version="1.0" encoding="UTF-8"?>
<cmds>
<cmd text="Test1" path="Add" params="3 5"/>
<cmd text="Test2" path="Add" params="7 9"/>
</cmds>


讀取XML 的 function



/**
* GetXMLInfo
*
* 讀取XML 檔案並儲存於陣列 RecordS 之中
*
*/
private String[][] GetXMLInfo()
{

/// the string array to record the XML info 讀取XML 資訊的陣列
String[][] RecordS ;

try{
File f=new File("Sample.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("cmd");

int _cmdLength = nl.getLength();

/// 目前XML 格式設定有3個屬性
int _cmdAttributes=3;

RecordS = new String[_cmdLength][_cmdAttributes];

for (int i=0;i<_cmdLength;i++){

RecordS[i][0]= nl.item(i).getAttributes().getNamedItem("text").getNodeValue();
RecordS[i][1]= nl.item(i).getAttributes().getNamedItem("path").getNodeValue();
RecordS[i][2]= nl.item(i).getAttributes().getNamedItem("params").getNodeValue();

}

//System.out.println("cmd " + RecordS.length);

}
catch(Exception e){
e.printStackTrace();
RecordS = null;
}


return RecordS;
}