欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2019年08月07日 11:03:46   作者:lost陸離  
這篇文章主要給大家介紹了關(guān)于java在運行時能修改工作目錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

程序啟動目錄即工作目錄是/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文件,無任何異常。

好了,動態(tài)修改java工作目錄達成,請自行取用。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 解讀tk.mybatis的通用批量更新方式

    解讀tk.mybatis的通用批量更新方式

    這篇文章主要介紹了關(guān)于tk.mybatis的通用批量更新方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 全面解讀Spring Boot 中的Profile配置體系

    全面解讀Spring Boot 中的Profile配置體系

    配置體系是基于 Spring Boot 框架開發(fā)應(yīng)用程序的基礎(chǔ),而自動配置也是該框架的核心功能之一。本文梳理Spring Boot 中的Profile配置體系的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • SpringMVC中RequestParam注解的簡單理解

    SpringMVC中RequestParam注解的簡單理解

    @RequestMapping RequestMapping是一個用來處理請求地址映射的注解,可用于類或方法上,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中RequestParam注解的簡單理解,需要的朋友可以參考下
    2022-03-03
  • Java中instanceof 關(guān)鍵字的使用

    Java中instanceof 關(guān)鍵字的使用

    instanceof通過返回一個布爾值來指出,某個對象是否是某個特定類或者是該特定類的子類的一個實例,本文就來詳細(xì)的介紹一下instanceof 關(guān)鍵字的使用,感興趣的可以了解一下
    2023-10-10
  • maven導(dǎo)入本地倉庫jar包,報:Could?not?find?artifact的解決

    maven導(dǎo)入本地倉庫jar包,報:Could?not?find?artifact的解決

    這篇文章主要介紹了maven導(dǎo)入本地倉庫jar包,報:Could?not?find?artifact的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java數(shù)字和中文算數(shù)驗證碼的實現(xiàn)

    java數(shù)字和中文算數(shù)驗證碼的實現(xiàn)

    這篇文章主要介紹了java數(shù)字和中文算數(shù)驗證碼的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 關(guān)于Spring中Bean的創(chuàng)建進行更多方面的控制

    關(guān)于Spring中Bean的創(chuàng)建進行更多方面的控制

    今天小編就為大家分享一篇關(guān)于關(guān)于Spring中Bean的創(chuàng)建進行更多方面的控制,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 基于Java實現(xiàn)考試管理系統(tǒng)

    基于Java實現(xiàn)考試管理系統(tǒng)

    這篇文章主要介紹了基于Java實現(xiàn)的考試管理系統(tǒng),項目運用到的技術(shù)有Springboot、Maven、Jpa、Vue等等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • Fluent Mybatis實現(xiàn)環(huán)境隔離和租戶隔離

    Fluent Mybatis實現(xiàn)環(huán)境隔離和租戶隔離

    我們在實際的業(yè)務(wù)開發(fā)中,經(jīng)常會碰到環(huán)境邏輯隔離和租戶數(shù)據(jù)邏輯隔離的問題。本文就詳細(xì)的來介紹一下,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 淺談Mybatis獲取參數(shù)值的方式

    淺談Mybatis獲取參數(shù)值的方式

    本文主要介紹了Mybatis獲取參數(shù)值的方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論