原創|其它|編輯:郝浩|2009-03-06 15:57:09.000|閱讀 626 次
概述:每次我們用Java命令運行我們的Java程序,都會在JVM中開啟一個進程,對于每一個進程,都會有一個相對應的工作目錄,這個工作目錄在虛擬機初始化的時候就已經設置好了,默認的情況下,工作目錄是我們工程的根目錄。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
每次我們用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,問題就是比較容易解決了。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn