可以在運行java時修改工作目錄嗎

可以在運行java時修改工作目錄嗎?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、烏魯木齊網(wǎng)絡(luò)推廣、小程序開發(fā)、烏魯木齊網(wǎng)絡(luò)營銷、烏魯木齊企業(yè)策劃、烏魯木齊品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供烏魯木齊建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

前言

首先我們直接來看一個例子:

程序啟動目錄即工作目錄是/Users/qkkcoolmax/work-private/testuserdir/hehe

public static void main(String[] args) {
  File file = new File("haha/test.log");
  System.out.println(file.getAbsolutePath());
  //Users/qkkcoolmax/work-private/testuserdir/hehe/haha/test.log
  System.out.println(System.setProperty("user.dir", "/Users/qkkcoolmax/work-private/testuserdir"));
  //Users/qkkcoolmax/work-private/testuserdir/hehe
  System.out.println(System.getProperty("user.dir"));
  //Users/qkkcoolmax/work-private/testuserdir
  System.out.println(file.getAbsolutePath());
  //Users/qkkcoolmax/work-private/testuserdir/haha/test.log
  try {
   new FileOutputStream(file);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }

該程序會拋FileNotFoundException異常。這是由于File對象使用了相對路徑創(chuàng)建,雖然我們動態(tài)修改了System.proproties中的user.dir即修改了java層面的工作目錄,但并沒有修改到j(luò)vm中實際記錄的工作目錄,所以需要創(chuàng)建的文件路徑中hehe/haha目錄并不存在,從而拋異常。其實System.property只是修改了System中的一個靜態(tài)map變量。

而getAbsolutePath返回的是修改工作目錄后的文件路徑,這是由于getAbsolutePath中總是會用System.getProperty("user.dir")來和相對路徑拼接,得到absolutePath。

綜上,我們了解到System.setProperty("user.dir",newPath)的方式是無法修改進程實際的工作目錄的,這個值是存放在jvm底層數(shù)據(jù)結(jié)構(gòu)中。但是有些特殊場景,我們確實希望能動態(tài)修改一下工作目錄。譬如一個服務(wù)端進程需要處理不同目錄下的文件,歷史代碼或者框架中使用了一些相對路徑,我們難以替換成絕對路徑時,動態(tài)修改工作目錄就成了唯一實現(xiàn)目標(biāo)的途徑。

所以,java是否可以動態(tài)修改工作目錄呢? 先說結(jié)論,是可以的!

首先,java語言層面并沒有提供這樣的接口。

其次,我們知道在c語言中,可以很方便的調(diào)用chdir系統(tǒng)調(diào)用來切換當(dāng)前進程的工作目錄。那么只要java能調(diào)用到j(luò)vm中鏈進來的libc中的chdir不就好了么。

java調(diào)c有幾種方式呢?有一定經(jīng)驗的讀者可能馬上會想到JNI。實際上,我們可以采用更好的方式即JNA。JNA(Java Native Access )提供一組Java工具類用于在運行期間動態(tài)訪問系統(tǒng)本地庫(native library:如Window的dll)而不需要編寫任何Native/JNI代碼。

簡單來說,JNA可以讓java代碼直接調(diào)用c代碼(包括jvm里面的代碼),使用方式相比jni更加簡單方便。

對JNA的介紹網(wǎng)上資料還蠻豐富的,感興趣的讀者可以自行搜索研究。這里我們直接使用了jnr-posixz(https://github.com/jnr/jnr-posixz)。該庫已經(jīng)對不同平臺的JNA調(diào)用實現(xiàn)了良好的封裝,避免我們使用原生的JNA時處理各種跨平臺的邏輯。

引入依賴

<dependency>
 <groupId>com.github.jnr</groupId>
 <artifactId>jnr-posix</artifactId>
 <version>3.0.47</version>
</dependency>  

使用示例

public class Main {

 private static POSIX posix;

 public static void main(String[] args) {
  posix = POSIXFactory.getPOSIX(new DummyPOSIXHandler(), true);
  File file = new File("haha/test.log");
  System.out.println(file.getAbsolutePath());
  //Users/qkkcoolmax/work-private/testuserdir/hehe/haha/test.log
  System.out.println(System.setProperty("user.dir", "/Users/qkkcoolmax/work-private/testuserdir"));
  posix.chdir(System.getProperty("user.dir"));
  //Users/qkkcoolmax/work-private/testuserdir/hehe
  System.out.println(System.getProperty("user.dir"));
  //Users/qkkcoolmax/work-private/testuserdir
  System.out.println(file.getAbsolutePath());
  //Users/qkkcoolmax/work-private/testuserdir/haha/test.log
  try {
   new FileOutputStream(file);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }
}

run起來,能夠成功創(chuàng)建出 /Users/qkkcoolmax/work-private/testuserdir/haha/test.log文件,無任何異常。

Java的特點有哪些

Java的特點有哪些 1.Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,實現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進行復(fù)雜的編程。 2.Java具有簡單性、面向?qū)ο?、分布式、安全性、平臺獨立與可移植性、動態(tài)性等特點。 3.使用Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。

關(guān)于可以在運行java時修改工作目錄嗎問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

當(dāng)前名稱:可以在運行java時修改工作目錄嗎
標(biāo)題URL:http://muchs.cn/article20/ghjojo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站品牌網(wǎng)站制作網(wǎng)站導(dǎo)航、網(wǎng)站營銷網(wǎng)站設(shè)計公司、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)