原創(chuàng)|其它|編輯:郝浩|2009-03-06 15:34:14.000|閱讀 990 次
概述:每次我們用Java命令運(yùn)行我們的Java程序,都會(huì)在JVM中開(kāi)啟一個(gè)進(jìn)程,對(duì)于每一個(gè)進(jìn)程,都會(huì)有一個(gè)相對(duì)應(yīng)的工作目錄,這個(gè)工作目錄在虛擬機(jī)初始化的時(shí)候就已經(jīng)設(shè)置好了,默認(rèn)的情況下,工作目錄是我們工程的根目錄
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
每次我們用Java命令運(yùn)行我們的Java程序,都會(huì)在JVM中開(kāi)啟一個(gè)進(jìn)程,對(duì)于每一個(gè)進(jìn)程,都會(huì)有一個(gè)相對(duì)應(yīng)的工作目錄,這個(gè)工作目錄在虛擬機(jī)初始化的時(shí)候就已經(jīng)設(shè)置好了,默認(rèn)的情況下,工作目錄是我們工程的根目錄,比如:
/home/test/Project-
--bin
--divinemind.onlyfun.test.helloworld.java
--src
假如我們?cè)谟孟旅娴拿顔?dòng)helloworld,那么這個(gè)進(jìn)程的根目錄就是/home/test/Project/bin,helloworld里進(jìn)行操作需要的資源,比如文件什么的,都會(huì)在這個(gè)目錄進(jìn)行查找。
在Windows下,情況也是相同的。
我們可以通過(guò)
---------------------
System.getProperty(“user.dir”);
----------------------
取得當(dāng)前進(jìn)程的工作目錄,而且當(dāng)我們想改變這個(gè)工作目錄的時(shí)候,也可以通過(guò)
---------------------
System.setProperty(“user.dir”,”/home/test/xxxxxxx”);
---------------------
設(shè)置當(dāng)前進(jìn)程的工作目錄,但是,事實(shí)上,user.dir這個(gè)系統(tǒng)環(huán)境是不可以重新設(shè)置的,問(wèn)題很多,最常見(jiàn)的問(wèn)題,當(dāng)前進(jìn)程下的所有線程都在使用這個(gè)環(huán)境變量,如果修改的話,危險(xiǎn)可想而知,Sun的JDK這樣做估計(jì)是一個(gè)小BUG.所以,System.setProperty這個(gè)方法只是讓我們看看,實(shí)際上沒(méi)有作用。在Sun的JDK1.4中,當(dāng)前進(jìn)程的工作目錄是沒(méi)有辦法修改的,在JDK1.5中,ProcessBuilder在這方面有所改進(jìn)。
當(dāng)我們沒(méi)有選擇需要使用非工作目錄下的資源的時(shí)候,比如:Java調(diào)用A, A使用B,B和A在同一個(gè)目錄下,A和B不在當(dāng)前進(jìn)程的工作目錄下,這樣的話,程序肯定運(yùn)行會(huì)有問(wèn)題,這個(gè)時(shí)候有兩個(gè)辦法可以解決
1. 所有的路徑都寫絕對(duì)路徑
所有的路徑寫絕對(duì)路徑可以實(shí)現(xiàn),但是程序在部署的時(shí)候麻煩非常多,維護(hù)也困難,但是方法簡(jiǎn)單,直觀。
2. 在當(dāng)前進(jìn)程中新開(kāi)一個(gè)子進(jìn)程,修改子進(jìn)程的工作目錄
在Java中新開(kāi)一個(gè)子進(jìn)程的方法跟JDK版本有關(guān):
A.JDK1.4中:
-------------------------
Process process = System.getRuntime.exec(arg1,arg2,arg3);
arg1:系統(tǒng)命令
arg2:命令運(yùn)行的環(huán)境變量
arg3:子進(jìn)程的工作目錄,在這個(gè)地方就可以設(shè)置我們自己想要的工作目錄,達(dá)到使用非父進(jìn)程工作目下資源的方法。
-------------------------
B.JDK1.5中:
在這個(gè)版本中,我們可以使用ProcessBuilder來(lái)新開(kāi)一個(gè)JVM進(jìn)程。
下面的代碼可以實(shí)現(xiàn)這里我們的功能:
-------------------------
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
// myDir就是當(dāng)前進(jìn)程的工作目錄,如果不設(shè)置,那就是默認(rèn)為父進(jìn)程的工作//目錄
pb.directory("myDir");
Process p = pb.start();
-------------------------
Java在平時(shí)跟操作系統(tǒng)的關(guān)系確實(shí)很少,我們都很少碰到問(wèn)題,但是如果我們調(diào)用操作系統(tǒng)命令什么的時(shí)候,麻煩就多起來(lái)了,不過(guò)如果我們更多地了解JVM,問(wèn)題就是比較容易解決了。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn