1、利用System.getProperty()函数获取当前路径:

System.getProperty("user.dir");//user.dir用户当前的工作目录,输出:D:\开发工程\GitHub\5_java_example\uritest\application,(如果想要通过此方法获取其它系统信息,参考:http://www.cnblogs.com/EasonJim/p/6507672.html

注意:以上输出为eclipse的application的输出。

测试JAR(Application):

正常,输出如下:

测试WAR(Web):

正常,输出如下:

总结:

①在jar中得到的是这个应用程序根目录,而且最后不带\,没有精确到具体哪个类。

②在war中得到的是tomcat的根目录,没有精确到webapps这个文件,更没有说是哪个web项目了。而在eclipse中,得到的是eclipse所在的目录。

System.getProperty("java.class.path");//java.class.path类路径,输出:D:\开发工程\GitHub\5_java_example\uritest\application\bin,(如果想要通过此方法获取其它系统信息,参考:http://www.cnblogs.com/EasonJim/p/6507672.html

注意:以上输出为eclipse的application的输出。

测试JAR(Application):

正常,输出如下:

测试WAR(Web):

正常,输出如下:

总结:

①在eclipse中调试application时,得到的路径觉得是完美,精确到了bin。但是如果导出jar包,得到的路径确实如上所示,没有达到目的。

②在war中得到的是tomcat中bin的jar包,如上所示,都是没有达到目的。

2、使用File提供的函数获取当前路径:

参考:http://www.cnblogs.com/franson-2016/p/5728280.html

     try{
File directory = new File("");//设定为当前文件夹
System.out.println(directory.getCanonicalPath());//获取标准的路径,输出:D:\开发工程\GitHub\5_java_example\uritest\application
System.out.println(directory.getAbsolutePath());//获取绝对路径,输出:D:\开发工程\GitHub\5_java_example\uritest\application
}catch(Exception e){}
/*
* File.getCanonicalPath()和File.getAbsolutePath()大约只是对于new File(".")和new File("..")两种路径有所区别。
* 对于getCanonicalPath()函数,“."就表示当前的文件夹,而”..“则表示当前文件夹的上一级文件夹
* 对于getAbsolutePath()函数,则不管”.”、“..”,返回当前的路径加上你在new File()时设定的路径
* 至于getPath()函数,得到的只是你在new File()时设定的路径
*/
//比如当前的路径为 D:\开发工程\GitHub\5_java_example\uritest\application :
try{
File directory1 = new File("abc");
System.out.println(directory1.getCanonicalPath());//输出:D:\开发工程\GitHub\5_java_example\uritest\application\abc
System.out.println(directory1.getAbsolutePath());//输出:D:\开发工程\GitHub\5_java_example\uritest\application\abc
System.out.println(directory1.getPath());//输出:abc
}catch(Exception e){} try{
File directory2 = new File(".");
System.out.println(directory2.getCanonicalPath());//输出:D:\开发工程\GitHub\5_java_example\uritest\application
System.out.println(directory2.getAbsolutePath());//输出:D:\开发工程\GitHub\5_java_example\uritest\application\.
System.out.println(directory2.getPath());//输出:.
}catch(Exception e){} try{
File directory3 = new File("..");
System.out.println(directory3.getCanonicalPath());//输出:D:\开发工程\GitHub\5_java_example\uritest
System.out.println(directory3.getAbsolutePath());//输出:D:\开发工程\GitHub\5_java_example\uritest\application\..
System.out.println(directory3.getPath());//输出:..
}catch(Exception e){}

注意:以上输出为eclipse的application的输出。

测试JAR(Application):

正常,输出如下:

测试WAR(Web):

正常,输出如下:

总结:

①对于jar包来说,正常输出所在目录的路径。(换句话说,就是这个程序在哪运行,目录就定位在哪,但是不是精确到哪个类中的那种。)

②针对war包部署后,得到的是tomcat所在的根目录。没有精确到最根本的webapps目录。

③File对象获取的路径只精确到工作目录,而非class目录,所以在对于一些配置文件放置在class中,File对象获取时会比较麻烦,而且测试eclipse获取的路径和打包出jar时获取的路径是不一样的。因此在写法上需要来回切换。

④打包jar时,最终获取的是jar文件所在的路径,而这个路径是绝对的,所以没办法获取具体文件。而war包就是web容器的目录,所以再加工一下,也可以看成是相对目录,这个较容易处理。

3、在类中取得路径:

参考:http://www.cnblogs.com/yejg1212/p/3270152.html

提示:如果不想要file:可以使用getPath()方法获取,但是这样前面还是会有/出现,最终只能是使用截取的方式去除。

      //类的绝对路径,指的是编译后字节码class文件放置的位置根目录
System.out.println(ApplicationTest.class.getResource(""));//当前类(class)所在的包目录,输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/applicationtest/
System.out.println(Class.class.getResource(""));//当前类(class)所在的包目录,得到的会是null,因为没有这个具体的类,输出:null
System.out.println(ApplicationTest.class.getResource("/"));//class path根目录,输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/
System.out.println(Class.class.getResource("/"));//class path根目录,与上面效果一致,输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/
System.out.println(ApplicationTest.class.getResource("/Test.xml"));//输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/Test.xml
System.out.println(ApplicationTest.class.getResource("/applicationtest/Test2.xml"));//输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/applicationtest/Test2.xml
System.out.println(Class.class.getResource("/applicationtest/Test2.xml"));//效果和上面一致,输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/applicationtest/Test2.xml
System.out.println(ApplicationTest.class.getResource("applicationtest/Test2.xml"));//没有开头的斜杠,无法确定起始的class path根目录,输出:null
System.out.println(Class.class.getResource("applicationtest/Test2.xml"));//效果和上面一致,输出:null
//这里取资源文件有个技巧,在src文件夹下的资源文件,编译后都会按照原有的路径全部拷贝到class文件夹放置的位置下,因此会出现如上的取法
//当然,可以通过判断获取的对象是否为null来确定文件是否存在
//以下这种写法会自动查找当前文件,但是只能查找当前类所在的包下的文件,如果有子包存在时,要带上子包的路径,同时开头不需要斜杠。
System.out.println(ApplicationTest.class.getResource("Test.xml"));//不在当前类所在的包下,输出:null
System.out.println(ApplicationTest.class.getResource("Test3.xml"));//不在当前类所在的包下,输出:null
System.out.println(ApplicationTest.class.getResource("Test2.xml"));//不在当前类所在的包下,输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/applicationtest/Test2.xml
System.out.println(Class.class.getResource("Test2.xml"));//返回null,说明还是没有这个具体的类,所以找不到在哪里开始查找文件,输出:null
//总结:综上测试,具体的类获取资源文件可以免去很多麻烦,建议使用具体的类进行获取;还有中文路径会经过转码。

注意:以上输出为eclipse的application的输出。

测试JAR(Application):

正常,输出如下:

可以发现,这个输出和eclipse中的输出不一样,其中获取class path根目录和类所在的包目录已经无法获取。而且值的路径变了。

测试WAR(Web):

正常,输出如下:

同样可以发现路径都是url编码后的,中文也是如此。

总结:

①使用此方法,在jar和war中都能正常找到class的路径。

②推荐使用具体的类取查找资源。Class在这里就已经无效。

③资源文件的查找方式在jar和war包保持一致。

对比:Class.getClassLoader().getResource()

      //类的绝对路径,指的是编译后字节码class文件放置的位置根目录
System.out.println(ApplicationTest.class.getClassLoader().getResource(""));//class path根目录,输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/
//System.out.println(Class.class.getClassLoader().getResource(""));//报错
System.out.println(ApplicationTest.class.getClassLoader().getResource("/"));//输出:null
//System.out.println(Class.class.getClassLoader().getResource("/"));//报错
System.out.println(ApplicationTest.class.getClassLoader().getResource("/Test.xml"));//输出:null
System.out.println(ApplicationTest.class.getClassLoader().getResource("/applicationtest/Test2.xml"));//输出:null
//System.out.println(Class.class.getClassLoader().getResource("/applicationtest/Test2.xml"));//报错
System.out.println(ApplicationTest.class.getClassLoader().getResource("applicationtest/Test2.xml"));//没有开头的斜杠,输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/applicationtest/Test2.xml
//System.out.println(Class.class.getClassLoader().getResource("applicationtest/Test2.xml"));//报错
//这里取资源文件有个技巧,在src文件夹下的资源文件,编译后都会按照原有的路径全部拷贝到class文件夹放置的位置下,因此会出现如上的取法
//当然,可以通过判断获取的对象是否为null来确定文件是否存在
//以下这种写法会自动查找当前文件,但是只能查找class根目录下的文件,所在包下的文件无法找到
System.out.println(ApplicationTest.class.getClassLoader().getResource("Test.xml"));//输出:file:/D:/%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b/GitHub/5_java_example/uritest/application/bin/Test.xml
System.out.println(ApplicationTest.class.getClassLoader().getResource("Test3.xml"));//输出:null
System.out.println(ApplicationTest.class.getClassLoader().getResource("Test2.xml"));//输出:null
//System.out.println(Class.class.getClassLoader().getResource("Test2.xml"));//报错
//总结:综上测试,具体的类获取资源文件可以免去很多麻烦,建议使用具体的类进行获取;还有中文路径会经过转码。

注意:以上结果为eclipse的application的输出。

可以发现,Class.class的全部报错了,而且ApplicationTest.class.getResource("/") == ApplicationTest.class.getClassLoader().getResource(""),也就是相反

测试JAR(Application):

正常,输出如下:

结果和上面eclipse输出的基本一致。

测试WAR(Web):

正常,输出如下:

可以看出这个和jar的方式有很大区别,不管开头有没有斜杠都能正常输出,而且都能找到这个文件Test2.xml。

总结:

①class.getClassLoader()这个方式在jar和war上其实有比较大的区别,如果为了统一的结果,建议不要使用这个方法。

②Class.class.getClassLoader可以用这个方法代替Thread.currentThread().getContextClassLoader(),效果一致。

③也可以用这个方法代替,和上面的效果一致:ClassLoader.getSystemClassLoader()。

4、File函数与类取路径结合输出:

     try{
File directory1 = new File(ApplicationTest.class.getResource("/Test.xml").getPath());
System.out.println(directory1.getCanonicalPath());//输出:D:\%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b\GitHub\5_java_example\uritest\application\bin\Test.xml
System.out.println(directory1.getAbsolutePath());//输出: D:\%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b\GitHub\5_java_example\uritest\application\bin\Test.xml
System.out.println(directory1.getPath());//输出:D:\%e5%bc%80%e5%8f%91%e5%b7%a5%e7%a8%8b\GitHub\5_java_example\uritest\application\bin\Test.xml
}catch(Exception e){}

注意:以上输出为eclipse的application的输出。

可以看出完美解决了上面方法出现file开头的问题。

测试JAR(Application):

正常,输出如下:

可以发现,完全为空,所以这个方法在jar中是不靠谱。

测试WAR(Web):

正常,输出如下:

总结:

①唯一的好处是去除了file开头。

5、(Web)在JSP中获取路径:

<%=request.getSession().getServletContext().getRealPath("") %><br/><!-- //得到工程目录, 参数可具体到包名。输出:D:\开发工程\workspace_web\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\webtest;对于获取资源文件的方法还可以这样用:request.getSession().getServletContext().getResource("WEB-INF/web.xml") -->
<%=request.getRequestURL() %><br/><!-- //得到IE地址栏地址。输出:http://localhost:8080/webtest/index.jsp -->
<%=request.getRequestURI() %><br/><!-- //得到相对地址,输出:/webtest/index.jsp -->
<%=request.getServletPath() %><br/><!-- //根目录所对应的绝对路径,输出:/index.jsp -->
<%=request.getContextPath() %><br/><!-- //得到工程名,输出://webtest -->

可以发现,和servlet没什么区别。

<%=application.getRealPath("index.jsp") %><br/><!-- //得到页面所在服务器的全路径,输出://D:\开发工程\workspace_web\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\webtest\index.jsp --> 

对于application的用法还有很多,比如获取文件夹的组合路径(输入upload)、根目录(输入/)即可。

6、(Web)在Servlet中获取路径:

     System.out.println(request.getSession().getServletContext().getRealPath(""));//得到工程目录, 参数可具体到包名。输出:D:\开发工程\workspace_web\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\webtest;对于获取资源文件的方法还可以这样用:request.getSession().getServletContext().getResource("WEB-INF/web.xml");比如getRealPath("/")得到的目录后面自动带上\或者/;
System.out.println(request.getRequestURL());//得到IE地址栏地址。输出:http://localhost:8080/webtest/UriTest
System.out.println(request.getRequestURI());//得到相对地址,输出:/webtest/UriTest
System.out.println(request.getServletPath());//根目录所对应的绝对路径,输出:/UriTest
System.out.println(request.getContextPath());//得到工程名,输出://webtest 

测试WAR(Web):

测试工程:https://github.com/easonjim/5_java_example/tree/master/uritest

Java获取路径的方法分析详解(Application/Web)的更多相关文章

  1. java获取路径的方法

    package com.zjf; import java.io.File; public class GetPath { public static void getPath() { //方式一 Sy ...

  2. Java中获取路径的方法_自我分析

    就目前的我来说最常用的两种获取路径的方法是  class.getRecource(filename) 和 class.getclassloader.getRecource(filename) 这两者的 ...

  3. Java获取路径方法&相对路径读取xml文件方法

    (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...

  4. java 获取路径的各种方法

    (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI ...

  5. java ----获取路径的各种方法(总结)

    Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 那么针对这个站点的几个基本概念表述如下: 1. web站点的根目录:http: ...

  6. 【转载】java 获取路径的各种方法

    转载只供个人学习参考,查看请前往原出处:http://www.cnblogs.com/guoyuqiangf8/p/3506768.html 主要方法有: (1).request.getRealPat ...

  7. java中获取路径的方法

    在class获取路径的方法,getResource有没有“\”的区别 System.out.println("" + this.getClass().getResource(&qu ...

  8. Memcache的使用和协议分析详解

    Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.NET/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linu ...

  9. java的集合框架最全详解

    java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...

随机推荐

  1. leetcode 【 Reverse Nodes in k-Group 】 python 实现

    原题: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...

  2. [错误解决]paramiko.ssh_exception.SSHException: Error reading SSH protocol banner 设置

    报错信息 上午的时候数据组的同事跟我说有几个程序报错,经过查看log发现找到报错信息: paramiko.ssh_exception.SSHException: Error reading SSH p ...

  3. PAT1029

    旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输入的文字.以及实际 ...

  4. 第六篇:python基础_6 内置函数与常用模块(一)

    本篇内容 内置函数 匿名函数 re模块 time模块 random模块 os模块 sys模块 json与pickle模块 shelve模块 一. 内置函数 1.定义 内置函数又被称为工厂函数. 2.常 ...

  5. iOS App启动图不显示的解决办法.

    1. 正常来说,启动图以及App图标需按照命名规则命名, 但是命名不规范并不影响显示; 2. 设置启动图的两种方法:      (1) iOS 8—xcode 6 之后新出LaunchScreen.s ...

  6. HDU 2896 病毒侵袭(AC自动机水)

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. Linux系统——常见的系统调用

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

  8. Java EE 学习(5):IDEA + maven + spring 搭建 web(1)

    参考:http://www.cnblogs.com/lonelyxmas/p/5397422.html http://www.ctolib.com/docs-IntelliJ-IDEA-c--1590 ...

  9. Python(2)-- 运算符

    1. 算术运算符 常规: 加(+).减(-).乘(*).除(/).取模(%) 此外: 幂(**):返回x的y次幂, eg: 2**3---返回 2 的 5 次幂,输出结果32 取整除(//):返回商的 ...

  10. 洛谷 [P4301] 新Nim游戏

    线性基 +博弈论 先手必胜当且仅当先手取完之后留下的序列无论如何组合,异或和都不为 0 也就是剩下的整数线性无关,所以我们对所有整数排序,由高往低的贪心的插入线性基, 无法插入的就有先手取出,容易发现 ...