欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java路径问题

程序员文章站 2022-05-08 13:30:28
...
一 相对路径的获得
说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)
String relativelyPath=System.getProperty("user.dir"); 

上述相对路径中,java项目中的文件是相对于项目的根目录
web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于 tomcat安装目录\bin)


二 类加载目录的获得(即当运行时某一类时获得其装载目录)
1.1)通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录)

InputStream is=TestAction.class.getClassLoader().getResourceAsStream("test.txt"); 
(test.txt文件的路径为 项目名\src\test.txt;类TestAction所在包的第一级目录位于src目录下)

上式中将TestAction,test.txt替换成对应成相应的类名和文件名字即可

1.2)通用方法二 (此方法和1.1中的方法类似,不同的是此方法必须以'/'开头)
InputStream is=Test1.class.getResourceAsStream("/test.txt"); 

(test.txt文件的路径为 项目名\src\test.txt,类Test1所在包的第一级目录位于src目录下)




三 web项目根目录的获得(发布之后)
1 从servlet出发
可建立一个servlet在其的init方法中写入如下语句
ServletContext s1=this.getServletContext(); 
String temp=s1.getRealPath("/"); (关键)

结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\ (002_ext为项目名字)
如果是调用了s1.getRealPath("")则输出D:\工具\Tomcat-6.0\webapps\002_ext(少了一个"\")
2 从httpServletRequest出发
String cp11111=request.getSession().getServletContext().getRealPath("/"); 

结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\


四 classpath的获取(在Eclipse中为获得src或者classes目录的路径)
方法一
Thread.currentThread().getContextClassLoader().getResource("").getPath() 

eg: String t=Thread.currentThread().getContextClassLoader().getResource("").getPath();
System.out.println("t---"+t); 输出:t---/E:/order/002_ext/WebRoot/WEB-INF/classes/



方法二
JdomParse.class.getClassLoader().getResource("").getPath()   (JdomParse为src某一个包中的类,下同) 
eg:String p1=JdomParse.class.getClassLoader().getResource("").getPath();
System.out.println("JdomParse.class.getClassLoader().getResource--"+p1);
输出: JdomParse.class.getClassLoader().getResource--/E:/order/002_ext/WebRoot/WEB-INF/classes/


另外,如果想把文件放在某一包中,则可以 通过以下方式获得到文件(先定位到该包的最后一级目录)
eg  String p2=JdomParse.class.getResource("").getPath(); 
System.out.println("JdomParse.class.getResource---"+p2);
输出: JdomParse.class.getResource---/E:/order/002_ext/WebRoot/WEB-INF/classes/jdom/ (JdomParse为src目录下jdom包中的类)


四 属性文件的读取:
方法 一
InputStream in = lnew BufferedInputStream( new  FileInputStream(name));          Properties p = new  Properties();    p.load(in); 


注意路径的问题,做执行之后就可以调用p.getProperty("name")得到对应属性的值

方法二
Locale locale = Locale.getDefault();   
ResourceBundle localResource = ResourceBundle.getBundle("test/propertiesTest", locale);
String value = localResource.getString("test");
System.out.println("ResourceBundle: " + value);
工程src目录下propertiesTest.properties(名字后缀必须为properties)文件内容如下:
test=hello word


问题:有什么方法实现在JAVA代码中(SRC下),来获取路径,而不管项目名是否为中文(比如我的工程名叫"JavaEye推荐"或工程发布后WEB服务器放在中文路径下的)?


其实我是利用jvm加载类的路径来定位文件,注意你工程根目录下的.classpath文件,如我这里有一个java项目中的.class文件内容如下

<?xml version="1.0" encoding="UTF-8"?> 
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="classes"/>
</classpath>
它表示当java虚拟机加载类的时候从项目根目录下的classes目录去加载 如果你的文件放在classes目录下,程序自然就可以找到文件了(因为
InputStream is=TestAction.class.getClassLoader().getResourceAsStream("test.txt");  
当程序运行的时候,jvm从TestAction这个类的加载路径类找文件 也就是从classes这个目录下找文件)要强调的是是从classes来加载类,而不是src目录来加载类,只不过很多的IDE工具给了我们太多的错觉,比如说Eclipse里面,当我们在写完程序保存的时候,Eclipse会自动的帮我们编译该程序,至于保存到哪里就要靠你项目根目录下的.classpath文件类决定了比如如果有
<?xml version="1.0" encoding="UTF-8"?> 
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="classes"/>
</classpath>

那你在src某一目录写一个类,保存的时候,它会把编译后的class文件(包括包的目录结构)都放到了<classpathentry kind="output" path="classes"/>指定目录,在这里也就是classes目录;但是针对一般的配置文件(非java类文件)就无所谓什么编译和编译后的class文件了,而Eclipse采取的做法就是对文件不做任何改变,直接放到classes目录下;
这样给我们的错觉就是程序从src目录下读文件,其实它是从classes目录下读文件,但是因为src和classes两个目录下的文件(一般的配置文件)内容是一模一样的,所以我们感觉不到这一点;
最后要说一下,项目名字的中文问题;
对于一般的java项目如果你的项目名字是中文的那是一点问题都没有的;
但是如果是web项目就有问题了,我这里说的是web项目的名字是中文,不是说工程发布后WEB服务器放在中文路径下;如果你仅仅是工程发布后WEB服务器放在中文路径下的那也是没有任何问题了;但如果web项目的名字是中文那就有麻烦了,比如说你的web项目名字是web项目中文目录,你现在要想访问该工程的index.jsp 那么常规的做法就是打入http://localhost:8080/web项目中文目录/index.jsp 这样显然是访问不到的,因为当你回车的时候http://localhost:8080/web项目中文目录/index.jsp是要经过编码转换的,具体如何转换在这里就不多说了,在开发中也不推荐这样,如果这样搞那也是自取麻烦!!