程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JVM(Java虛擬機)中進程工作目錄講解

JVM(Java虛擬機)中進程工作目錄講解

編輯:關於JAVA

每次我們用Java命令運行我們的Java程序,都會在JVM中開啟一個進程,對於每一個進程,都會有一個相對應的工作目錄,這個工作目錄在虛擬機初始化的時候就已經設置好了,默認的情況下,工作目錄是我們工程的根目錄,比如:

/home/test/Project-

--bin

--divinemind.onlyfun.test.helloworld.java

--src

假如我們在用下面的命令啟動helloworld,那麼這個進程的根目錄就是/home/test/Project/bin,helloworld裡進行操作需要的資源,比如文件什麼的,都會在這個目錄進行查找。

在Windows下,情況也是相同的。

我們可以通過

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

System.getProperty(“user.dir”);

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

取得當前進程的工作目錄,而且當我們想改變這個工作目錄的時候,也可以通過

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

System.setProperty(“user.dir”,”/home/test/xxxxxxx”);

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

設置當前進程的工作目錄,但是,事實上,user.dir這個系統環境是不可以重新設置的,問題很多,最常見的問題,當前進程下的所有線程都在使用這個環境變量,如果修改的話,危險可想而知,Sun的JDK這樣做估計是一個小BUG.所以,System.setProperty這個方法只是讓我們看看,實際上沒有作用。在Sun的JDK1.4中,當前進程的工作目錄是沒有辦法修改的,在JDK1.5中,ProcessBuilder在這方面有所改進。

當我們沒有選擇需要使用非工作目錄下的資源的時候,比如:Java調用A, A使用B,B和A在同一個目錄下,A和B不在當前進程的工作目錄下,這樣的話,程序肯定運行會有問題,這個時候有兩個辦法可以解決

1. 所有的路徑都寫絕對路徑

所有的路徑寫絕對路徑可以實現,但是程序在部署的時候麻煩非常多,維護也困難,但是方法簡單,直觀。

2. 在當前進程中新開一個子進程,修改子進程的工作目錄

在Java中新開一個子進程的方法跟JDK版本有關:

A.JDK1.4中:

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

Process process = System.getRuntime.exec(arg1,arg2,arg3);

arg1:系統命令

arg2:命令運行的環境變量

arg3:子進程的工作目錄,在這個地方就可以設置我們自己想要的工作目錄,達到使用非父進程工作目下資源的方法。

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

B.JDK1.5中:

在這個版本中,我們可以使用ProcessBuilder來新開一個JVM進程。

下面的代碼可以實現這裡我們的功能:

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

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");

// myDir就是當前進程的工作目錄,如果不設置,那就是默認為父進程的工作//目錄

pb.directory("myDir");

Process p = pb.start();

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

Java在平時跟操作系統的關系確實很少,我們都很少碰到問題,但是如果我們調用操作系統命令什麼的時候,麻煩就多起來了,不過如果我們更多地了解JVM,問題就是比較容易解決了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved