最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java在運(yùn)行時(shí)能修改工作目錄嗎

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

前言

首先我們直接來看一個(gè)例子:

程序啟動目錄即工作目錄是/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中實(shí)際記錄的工作目錄,所以需要?jiǎng)?chuàng)建的文件路徑中hehe/haha目錄并不存在,從而拋異常。其實(shí)System.property只是修改了System中的一個(gè)靜態(tài)map變量。

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

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

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

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

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

java調(diào)c有幾種方式呢?有一定經(jīng)驗(yàn)的讀者可能馬上會想到JNI。實(shí)際上,我們可以采用更好的方式即JNA。JNA(Java Native Access )提供一組Java工具類用于在運(yùn)行期間動態(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)用實(shí)現(xiàn)了良好的封裝,避免我們使用原生的JNA時(shí)處理各種跨平臺的邏輯。

引入依賴

<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工作目錄達(dá)成,請自行取用。

總結(jié)

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

相關(guān)文章

  • 深扒Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和區(qū)別以及如何應(yīng)用

    深扒Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和區(qū)別以及如何應(yīng)用

    po vo bo dto dao 和 pojo 是軟件開發(fā)中經(jīng)常使用的一些概念,用于設(shè)計(jì)和實(shí)現(xiàn)對象模型,下面將分別解釋這些概念的含義及其在開發(fā)中的應(yīng)用,這篇文章主要給大家介紹了關(guān)于Java中POJO、VO、DO、DTO、PO、BO、AO、DAO的概念和區(qū)別以及如何應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Scala入門教程詳解

    Scala入門教程詳解

    這篇文章主要介紹了Scala入門教程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Java中生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié)

    Java中生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié)

    這篇文章主要介紹了Java中生成隨機(jī)數(shù)的實(shí)現(xiàn)方法總結(jié),其中多線程并發(fā)的實(shí)現(xiàn)方式尤為exciting,需要的朋友可以參考下
    2015-11-11
  • 解析Java Class 文件過程

    解析Java Class 文件過程

    class文件全名稱為Java class文件,主要在平臺無關(guān)性和網(wǎng)絡(luò)移動性方面使Java更適合網(wǎng)絡(luò)。它在平臺無關(guān)性方面的任務(wù)是:為Java程序提供獨(dú)立于底層主機(jī)平臺的二進(jìn)制形式的服務(wù)。下面我們來詳細(xì)解讀下它吧
    2019-05-05
  • Java簡單從文件讀取和輸出的實(shí)例

    Java簡單從文件讀取和輸出的實(shí)例

    下面小編就為大家?guī)硪黄狫ava簡單從文件讀取和輸出的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • JavaWeb開發(fā)實(shí)現(xiàn)備忘錄

    JavaWeb開發(fā)實(shí)現(xiàn)備忘錄

    這篇文章主要為大家詳細(xì)介紹了JavaWeb開發(fā)實(shí)現(xiàn)備忘錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào)的方法

    詳解springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào)的方法

    這篇文章主要介紹了springboot通過Async注解實(shí)現(xiàn)異步任務(wù)及回調(diào),文中通過一個(gè)簡單示例來直觀的理解什么是同步調(diào)用,在單元測試用例中,注入?SyncTask?對象,并在測試用例中執(zhí)行?doTaskOne(),doTaskTwo(),doTaskThree()?三個(gè)方法,具體實(shí)現(xiàn)方式跟隨小編一起看看吧
    2022-05-05
  • 關(guān)于兩個(gè)BeanUtils.copyProperties()的用法及區(qū)別

    關(guān)于兩個(gè)BeanUtils.copyProperties()的用法及區(qū)別

    這篇文章主要介紹了關(guān)于兩個(gè)BeanUtils.copyProperties()的用法及區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java對接Modbus協(xié)議代碼示例

    java對接Modbus協(xié)議代碼示例

    Modbus是一種串行通信協(xié)議,Modbus已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式,這篇文章主要給大家介紹了關(guān)于java對接Modbus協(xié)議的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 基于Java向zip壓縮包追加文件

    基于Java向zip壓縮包追加文件

    這篇文章主要介紹了基于Java向zip壓縮包追加文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評論

赤峰市| 高邮市| 东乡县| 汉寿县| 吐鲁番市| 逊克县| 灵武市| 东阿县| 苍梧县| 峨眉山市| 肃南| 乐安县| 榆树市| 木里| 刚察县| 徐闻县| 崇仁县| 河东区| 南涧| 铜川市| 留坝县| 四会市| 鄄城县| 博湖县| 健康| 清丰县| 聂拉木县| 大荔县| 安化县| 乐昌市| 青海省| 刚察县| 彝良县| 平果县| 阜南县| 西藏| 射阳县| 长沙市| 北流市| 濮阳市| 温州市|