我在MyEclipse中新建了一个web工程,在src下新建一个test包,在包下新建一个Test.java,代码如下:
package test;
import java.io.File;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException {
System.out.println(Test.class.getClassLoader().getResource("").getPath());
new File("test.txt").createNewFile();
}
}
控制台打印出
/D:/workspace/Test7/WebRoot/WEB-INF/classes/
test.txt在工程根目录下(D:\workspace\Test7)
问题来了,从控制台打印的语句可以看出虚拟机的根目录是在classes下的
我这个test.txt是相对路径,应该是在classes路径下才对。
我又做了实验,用命令行执行该代码,D:\workspace\Test7\WebRoot\WEB-INF\classes>java test.Test
这次test.txt生成路径是D:\workspace\Test7\WebRoot\WEB-INF\classes\
这么看来是eclipse里面的启动加了些东西了,我看了下run configurations,默认设置都是空的。
我又用jvisualvm查看这个jvm的启动参数,参数是-Dfile.encoding=UTF-8和-Xbootclasspath/a:...(eclipse的jar包)
不想是能改变路径的
不明白了,哪位兄弟给我解释下,这是怎么回事?
如果用java命令行怎么实现eclipse里面的效果?
------最佳解决方案--------------------
Test.class.getClassLoader().getResource("")
这个是让负责找到了Test这个类定义的ClassLoader的目录,并不是你期望的程序级的当前目录,两者不能混为一谈。
你试试看:
D:\>java -cp "D:\workspace\Test7\WebRoot\WEB-INF\classes" test.Test
你再看看这次文件会生成在哪里。
想看到程序级的当前目录,就:System.out.println(new File("").getAbsolutePath());
------其他解决方案--------------------
D:\>java -cp "D:\workspace\Test7\WebRoot\WEB-INF\classes" test.Test
test.txt生成在classes下
另外我想请教下new File("").getAbsolutePath(),这个东西是由什么决定的,在eclipse里面执行和使用java命令执行的结果不一样。
------其他解决方案--------------------
用cp有效,我刚是路径不对。
D:\workspace\Test7>java -cp "D:\workspace\Test7\WebRoot\WEB-INF\classes" test.Test
这样就和eclipse里面效果一样了
非常感谢
------其他解决方案--------------------
◎ test.txt生成在classes下
—— 真有意思,我这里测试是生成在根目录上的。
◎ 这个东西是由什么决定的
—— 没记错的话,应该是:
System.getProperty("user.dir")
------其他解决方案--------------------
这个分怎么给,第一次在这发帖。。。
------其他解决方案--------------------
是我的错,我打命令的时候还在classes位置,非常感谢,分给你了。