千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          在程序運行的過程中,我們可能需要更改一些配置,如果配置更改得很大的話,就可能會需要程序重新啟動,但是JAVA并沒有提供給我們直接的可以重啟的方法.在這里我們將利用JDK1.5新增的ProcessBuilder來創建一個重啟進程,然后自己的進程退出.

          簡單 代碼如下:
          /*
           * Test3.java
           * 
           * Created on 2007-9-27, 11:46:31
           * 
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */

          package test2;

          import java.io.File;
          import java.io.IOException;
          import java.util.Map;

          /**
           *
           * 
          @author hadeslee
           
          */
          public class Test3 {
              
          public static void restart() throws IOException{
                  
          //用一條指定的命令去構造一個進程生成器
                  ProcessBuilder pb=new ProcessBuilder("java","-jar","Test3.jar");
                  
          //讓這個進程的工作區空間改為F:\dist
                  
          //這樣的話,它就會去F:\dist目錄下找Test.jar這個文件
                  pb.directory(new File("F:\\dist"));
                  
          //得到進程生成器的環境 變量,這個變量我們可以改,
                  
          //改了以后也會反應到新起的進程里面去
                  Map<String,String> map=pb.environment();
                  Process p
          =pb.start();
                  
          //然后就可以對p做自己想做的事情了
                  
          //自己這個時候就可以退出了
                  System.exit(0);
              }
          }

          在這里我們利用了ProcessBuilder這個類,這個類是一個進程的生成類,我們在起動一個進程之前可以設置好相關的一些參數,比如工作目錄,環境變量等等,但是設置環境變的時候,有一個需要注意的地方就是你設置的環境變量不會改變系統原來的環境變量.也就是說即使你把path設為空,這個進程的運行的時候,依然是讀取系統的path找到java這個命令,否則的話,你把path設為空,java命令是不可能找得到的.
          一般來說ProcessBuilder這個類都是在萬不得已的情況下才用的,因為用了它以后,程序很難保證可移植性,除非你在每個平臺上都找到相應的命令執行相應的事情.


          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-09-27 11:55 千里冰封 閱讀(8494) 評論(2)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: 利用ProcessBuilder實現JAVA程序的重啟
          2009-01-19 22:58 | 游客
          在myEclpise環境下,這種方法怎么不行?!例如,我在MyEclipse環境下給出的兩個程序:package multipleProcess;

          /*
          * Test3.java
          *
          * Created on 2007-9-27, 11:46:31
          *
          * To change this template, choose Tools | Templates
          * and open the template in the editor.
          */

          import java.io.File;
          import java.io.IOException;
          import java.util.Map;

          /**
          *
          * @author hadeslee
          */
          public class test3 {
          public static void main(String[] args) throws IOException{
          //用一條指定的命令去構造一個進程生成器
          ProcessBuilder pb=new ProcessBuilder("java","test2");

          pb.start();
          //讓這個進程的工作區空間改為F:\dist
          //這樣的話,它就會去F:\dist目錄下找Test.jar這個文件
          //pb.directory(new File("d:\\dist"));
          //得到進程生成器的環境 變量,這個變量我們可以改,
          //改了以后也會反應到新起的進程里面去
          Map<String,String> map=pb.environment();
          Process p=pb.start();
          //然后就可以對p做自己想做的事情了
          //自己這個時候就可以退出了
          System.exit(0);
          }
          }
          package multipleProcess;

          import java.awt.BorderLayout;
          import java.awt.event.ActionEvent;
          import java.awt.event.ActionListener;
          import java.net.MalformedURLException;
          import java.net.URL;
          import java.util.logging.Level;
          import java.util.logging.Logger;
          import javax.swing.JButton;
          import javax.swing.JFrame;
          import javax.swing.JPanel;
          import javax.swing.JTextField;

          /**
          *
          * @author hadeslee
          */
          public class test2 extends JPanel{

          private JTextField input;
          private JButton go;

          public test2() {
          super(new BorderLayout());
          initWindow();
          }

          private void initWindow() {
          try {

          go = new JButton("轉到");
          input = new JTextField();
          JPanel up = new JPanel(new BorderLayout());
          up.add(input, BorderLayout.CENTER);
          up.add(go, BorderLayout.EAST);
          this.add(up, BorderLayout.NORTH);

          } catch (Exception ex) { }
          JFrame jf = new JFrame("JAVA瀏覽器");
          jf.add(this, BorderLayout.CENTER);
          jf.setSize(500, 300);
          jf.setLocationRelativeTo(null);
          jf.setVisible(true);
          jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          }

          public void actionPerformed(ActionEvent ae) {
          doOpen();
          }

          private void doOpen() {
          // try {
          String text = input.getText();
          if (text == null || text.equals("")) {
          return;
          }
          if (!text.toLowerCase().startsWith("http://")) {
          text = "http://" + text;
          }
          /* } catch (MalformedURLException ex) {
          Logger.getLogger(Test1.class.getName()).log(Level.SEVERE, null, ex);
          }*/
          }

          public static void main(String[] args) {
          new test2();

          }
          }

          當然,上面的兩個程序,去掉package之后,在命令行下能得到預期結果,但在MyEclipse環境下,就得不到預期結果!
            回復  更多評論
            
          # re: 利用ProcessBuilder實現JAVA程序的重啟
          2009-01-19 22:59 | 千里冰封
          @游客
          因為myEclipse改變了程序運行的進程目錄  回復  更多評論
            
          主站蜘蛛池模板: 荥阳市| 鄂尔多斯市| 新丰县| 嘉兴市| 宜宾县| 将乐县| 金湖县| 收藏| 灌南县| 普洱| 孝感市| 逊克县| 靖安县| 潢川县| 涟源市| 英德市| 城口县| 永胜县| 云安县| 依安县| 永宁县| 同德县| 都匀市| 红安县| 南京市| 壤塘县| 内乡县| 棋牌| 开平市| 东乡族自治县| 商河县| 玛曲县| 安新县| 美姑县| 建平县| 巨鹿县| 长岛县| 荆门市| 招远市| 马鞍山市| 古蔺县|