服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jvm

每次我们用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.所以,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,问题就是比较容易解决了。

扫描关注微信公众号