java路径问题.....(补充)

常常为路径问题而煎熬。


 包路径如下所示:JavaDemo为项目名, com.springTest包下有Config,java 文件和  a.properties 

JavaDemo

|_src

|_com

|_springTest

|_Config.java

|_a.properties


1.Class.getResourceAsStream

通过Class.getResourceAsStream 方法读取配置文件,配置文件的相对路径以

类文件所在目录作为当前目录。

故通过Config.java文件读取a.properties文件,我们可以通过下面语句获取路径

InputStream in = Config.class.getResourceAsStream("./a.properties");

2.new FileinputStream()

通过new FileInputstream 读取配置文件路径,配置文件的路径以工作目录作为当前目录

可以通过下面代码获取工作目录

System.getProperty("user.dir")

我的工作目录:D:\Program Files (x86)\Workspaces_new\JavaDemo

故通过new FileinputStream()文件读取a.properties文件,我们可以通过下面语句获取路径

InputStream in = new FileInputStream("./src/com/springTest/a.properties");

或者

InputStream in = new FileInputStream("src/com/springTest/a.properties");
就表示从当前项目的根目录开始。
当前项目的根目录等同于:

File f = new File("");
System.out.println(f.getAbsolutePath());  //  D:\Program Files (x86)\Workspaces_new\javaDemo


InputStream in = new FileInputStream("/src/com/springTest/a.properties"); //error
"/"表示根目录,相当于跑到盘目录下了。等同于下面的代码
File f = new File("/");
System.out.println(f.getAbsolutePath());    //   D:\





-------------------------------分割线---------------------------------------------------------

将conf文件夹设置为classpath路径下。

eclipse下-->"右键"-->"build path"-->"Configure Build path"-->"Source"-->"Add folder",将conf文件加进去即可。




此时jdbc.properties文件在PropertyPlaceholderConfigurer包下



<bean id ="propertyConfigurer" class ="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<!-- <value>classpath:jdbc.properties</value> -->
			<value>classpath:/com/spring/PropertyPlaceholderConfigurer/jdbc.properties</value>
		</property>
		<property name="fileEncoding" value="utf-8"></property>
	</bean>

故路径为classpath:/com/spring/PropertyPlaceholderConfigurer/jdbc.properties


如果jdbc.properties文件在conf文件夹下,



路径为 classpath:jdbc.properties 或者

classpath:./jdbc.properties



==========================================================

 1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从

  ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。

  2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由 ClassLoader获取资源。


  1. 其次,getResourceAsStream 用法大致有以下几种:

      第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml

      那么,应该有如下代码:

      me.class.getResourceAsStream("myfile.xml");

      第二:在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml

      那么,应该有如下代码:

      me.class.getResourceAsStream("file/myfile.xml");

      第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml

      那么,应该有如下代码:

      me.class.getResourceAsStream("/com/x/file/myfile.xml");

  2. 2

      总结一下,可能只是两种写法

      第一:前面有 “ / ”

      “ / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject

      me.class.getResourceAsStream("/com/x/file/myfile.xml");

      第二:前面没有 “ / ”

      代表当前类的目录

      me.class.getResourceAsStream("myfile.xml");

      me.class.getResourceAsStream("file/myfile.xml");



----------------------------------------------------------------------------


 java类中相对路径与绝对路径讲解
      File类或者一些IO流中,在其构造函数中要求传入String类型的参数,用于指示文件所在的路径。使用绝对路径不用说,很容易就能定位到文件,那么使用了相对路径jvm如何定位文件的呢?

      按照jdk Doc上的说法”绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。当前用户目录由系统属性user.dir 指定,通常是Java 虚拟机的调用目录.

      相对路径顾名思义,相对于某个路径,那么究竟相对于什么路径我们必须弄明白。按照上面jdk文档上讲的这个路径是“当前用户目录”也就是“java虚拟机的调用目录”.更明白的说这个路径其实是我们在哪里调用jvm的路径(我们在哪启动jvm的路径).
 
 举个例子:
 假设有一java源文件Example.java在d盘根目录下,该文件不含package信息.
 我们进入命令行窗口,然后使用”d:”命令切换到d盘根目录下,然后用”javac Example.java”来编译此文件,
 编译无错后,会在d盘根目录下自动生成”Example.class”文件.
 我们在调用”java Example”来运行该程序.此时我们已经启动了一个jvm,这个jvm是在d盘根目录下被启动的,
 所以此jvm所加载的程序中File类的相对路径也就是相对这个路径的,即d盘根目录:D:\
 同时“当前用户目录”也是D:\
 在System.getProperty(“user.dir”);系统变量”user.dir”存放的也是这个值.
 
 搞清了这些,我们可以使用相对路径来创建文件,例如:
 File file = new File(“a.txt”);
 file.createNewFile();
 假设jvm是在”D:\”下启动的,那么a.txt就会生成在D:\a.txt;
 
 此外,这个参数还可以使用一些常用的路径表示方法,例如”.”或”.\”代表当前目录,这个目录也就是jvm启动路径
 所以如下代码能得到当前目录完整路径:
 File f = new File(".");
 String absolutePath = f.getAbsolutePath();
 System.out.println(absolutePath);//D:\
 
 再说说在eclipse中的情况:Eclipse中启动jvm都是在项目根路径上启动的.
 比如该类所在的项目为coreJava,其完整路径为:D:\myEclipse_workspace\coreJava\.
 那么这个路径就是jvm的启动路径了.所以以上代码如果在eclipse里运行
 则输出结果为D:\myEclipse_workspace\coreJava\.
 

 说说在服务器中的Java类获得当前路径
 1、 在Tomcat中的情况.
 如果在tomcat中运行web应用,此时,如果我们在某个类中使用如下代码:
 File f = new File(".");

 //或者:File f = new File(System.getProperty("user.dir"));
 String absolutePath = f.getAbsolutePath();
 System.out.println(absolutePath);
 那么输出的将是tomcat下的bin目录,即%Tomcat_Home%/bin
 我的机器就是D:\myEclipsetomcat6\bin\.  ,由此可以看出tomcat服务器是在bin目录下启动jvm的.
 其实是在bin目录下的” catalina.bat”文件中启动jvm的.

 

2、在weblogic中的情况

WebApplication的系统文件根目录是你的weblogic安装所在根目录。
例如:如果你的weblogic安装在c:/weblogic10.....
那么,你的文件根路径就是c:.
所以,有两种方式能够让你访问你的服务器端的文件:
a.使用绝对路径:
比如将你的参数文件放在c:/yourconfig/yourconf.properties,
直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相对路径:
相对路径,是相对于你的webapplication的根路径,即WEB-INF的上一级目录,将你的参数文件放
在yourwebapp/yourconfig/yourconf.properties,
这样使用:
new FileInputStream("../yourconfig/yourconf.properties");
这两种方式均可,自己选择。

 

关于在web应用中的路径

      Java EE里的Web项目有个相对独立的最高目录WebRoot,我们估且认为它是根目录/。Web项目成品中的其它目录都是相对与此目录的子目录。在开发时, 我们可能会用到一些框架,比如struts,spring等。使用这些框架,我们需要配制相应的xml文件,至少也会配制web.xml文件。比如使用struts2时,在struts.xml中映射Action是最常见的配制,所有的映射,都以“/”开头,那么这里的“/”指的是那个目录呢?那就是不可见相对独立的WebRoot,应用中“/action”就相当于是系统目录中的”WebRoot/action", 知道这一点,就不会在为Action映射老是不可用发愁了。

   

 

关于JSP/Servlet中的相对路径和绝对路径

 

 在jsp/servlet中,服务器端的地址和客户端的地址表示有区别

 1、服务器端的地址

   服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在jsp和servlet中的相对地址应该是相对于你的web应用,即相对于http: //127.0.0.1/webapp/的。

     其用到的地方有:forward:servlet中的request.getRequestDispatcher(address);这个address是在服务器端解析的,所以,你要forward到a.jsp应该这么写:request.getRequestDispatcher(“/user/a.jsp”)这个/ 相对于当前的web应用webapp,其绝对地址就是:http://127.0.0.1/webapp/user/a.jsp。 sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>

 

2、客户端的地址

所有的html页面中的相对地址都是相对于服务器根目录(http://127.0.0.1/)的,而不是(跟目录下的该Web应用的目录) http://127.0.0.1/webapp/的。 Html中的form表单的action属性的地址应该是相对于服务器根目录(http://127.0.0.1/)的

    所以,如果提交到a.jsp 为:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()% >"/user/a.jsp;
    提交到servlet为actiom="/webapp/handleservlet" Javascript也是在客户端解析的,所以其相对路径和form表单一样。
     因此,一般情况下,在JSP/HTML页面等引用的CSS,Javascript.Action等属性前面最好都加上
<%=request.getContextPath()%>,以确保所引用的文件都属于Web应用中的目录。另外,应该尽量避免使用类似".","./","../../"等类似的相对该文件位置的相对路径,这样当文件移动时,很容易出问题。

 

3、JSP中获得当前应用的相对路径和绝对路径

随便在应用webroot下新建一个jsp文件,启动tomcat,测试一下便知:

 System.out.println(request.getRequestURI()); //相对地址 /ebpp/test/MyJsp.jsp
 System.out.println(request.getRequestURL());

//得到该文件的IE地址栏访问地址http://localhost:9999/ebpp/test/MyJsp.jsp
 System.out.println(application.getRealPath("/")); //当前web应用的绝对路径

 

 

4、Servlet中获得当前应用的相对路径和绝对路径

根目录所对应的路径:request.getServletPath();
文件的绝对路径 :request.getSession().getServletContext().getRealPath(request.getRequestURI())
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");






阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shihengli2010/article/details/43022199
个人分类: java基础
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭