JVM中进程的工作目录

转载 2015年11月19日 22:55:17
每次我们用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. 
参见下面的连接: 

http://gcc.gnu.org/ml/java/2000-q1/msg00408.html 
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4045688 

  所以,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,问题就是比较容易解决了。

JVM中进程的工作目录

 JVM中进程的工作目录yaogao@gmail.com 每次我们用Java命令运行我们的Java程序,都会在JVM中开启一个进程,对于每一个进程,都会有一个相对应的工作目录,这个工作目录在虚拟机初始...
  • fantian830211
  • fantian830211
  • 2007年09月05日 20:52
  • 1543

进程工作目录

linux的lsof命令能够显示被进程打开的文件或目录。 被进程打开的文件就是在某个...
  • xiaoshengqdlg
  • xiaoshengqdlg
  • 2014年08月20日 17:21
  • 548

在 eclipse 中 设置 jvm 的 运行时目录

然而 在 eclipse中 类所在包的目录是项目所在目录的 孙子目录 而不是 父目录;所以,如果要运行 诸如 chapter18.className这样的类 就需要 将 运行时目录设置为 项目目录/s...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2016年09月27日 11:39
  • 702

获取和设置应用程序的工作目录

1.获取本exe的所在目录 std::string GetProcFolder(const char* module_name/* = NULL*/) { std::string ret_s...
  • zhuxian2009
  • zhuxian2009
  • 2014年07月17日 17:59
  • 831

设置当前exe执行文件为进程工作目录

设置当前exe执行文件为进程工作目录 两种办法: 1,   API void _splitpath( const char *path, char *drive, ch...
  • guyue35
  • guyue35
  • 2015年07月13日 16:58
  • 1224

进程当前目录

系统跟踪记录着进程的当前驱动器和目录,但它没有记录每个驱动器的当前目录。不过利用操作系统提供的支持,可以处理多个驱动器的当前目录。这个支持是通过进程的环境字符串来提供的。例如,一个进程可以有如下所示的...
  • minglingji
  • minglingji
  • 2012年05月01日 10:22
  • 955

当前工作目录与当前执行目录的区别

当前工作目录——进行某项操作的目的目录,会随着OpenFileDialog、SaveFileDialog等对象所确定的目录而改变。(变化的) 当前执行目录——该进程从中启动的目录,即文件自身所在...
  • KnightOnHourse
  • KnightOnHourse
  • 2017年02月15日 11:40
  • 140

当前工作目录与当前执行目录

定义:       当前工作目录——进行某项操作的目的目录,会随着OpenFileDialog、SaveFileDialog等对象所确定的目录而改变。当前执行目录——该进程从中启动的目录,即文件自身所...
  • xiucaijiang
  • xiucaijiang
  • 2011年06月16日 10:23
  • 4924

进程、线程与JVM之间的关系

Android 包括一个应用程序框架、几个应用程序库和一个基于 Dalvik 虚拟机的运行时,所有这些都运行在 Linux 内核之上。 通过利用 Linux 内核的优势,Android 得到了大...
  • comkingfly
  • comkingfly
  • 2012年03月12日 09:51
  • 3009

进程及其进程环境

6.1.1  基本概念 程序是保存在磁盘上的可执行代码和数据的映像. 进程是正在运行的程序. 一个程序可以同时有多个进程实例, 它们互相没有关系. 6.1.2  main 函数 main...
  • jnwangcan
  • jnwangcan
  • 2013年03月03日 15:11
  • 928
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM中进程的工作目录
举报原因:
原因补充:

(最多只允许输入30个字)