• 在服务器端使用文件时的路径解决方案


    2015年12月20日,星期日

    1.文件放在webRoot中的解决方案:
    1. SAXReader reader = new SAXReader();
    2. try {
    3. String path = this.getServletContext().getRealPath("/");
    4. System.out.println(path);
    5. Document doc = reader.read(new File(path + "Provinces.xml"));
    6. List<Node> nodes = doc.selectNodes("/Provinces/Province");
    2.文件放在src中的解决方案:
    方法一    Thread.currentThread().getContextClassLoader().getResource("").getPath()
             String path = Thread.currentThread().getContextClassLoader()
    .getResource("").getPath();
              System.out.println("path========" + path);输出: path========/F:/tomcat-6.0.36/webapps/test/WEB-INF/classes/
     
    方法二     JdomParse.class.getClassLoader().getResource("").getPath() (JdomParsesrc某一个包中的类,下同)
         eg:    String p1=JdomParse.class.getClassLoader().getResource("").getPath();
                System.out.println("JdomParse.class.getClassLoader().getResource--"+p1);
    输出:    JdomParse.class.getClassLoader().getResource-/F:/tomcat-6.0.36/webapps/test/WEB-INF/classes/
    另外,如果想把文件放在某一包中,则可以 通过以下方式获得到文件(先定位到该包的最后一级目录)
    eg String p2=JdomParse.class.getResource("").getPath();
    System.out.println("JdomParse.class.getResource---"+p2);
    输出:JdomParse.class.getResource--/F:/tomcat-6.0.36/webapps/test/WEB-INF/classes/
    (JdomParsesrc目录下jdom包中的类)











    详细笔记整理:
    1. java项目中文件的路径-方法大全
    2. 一、 相对路径的获得
    3. 说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)
    4. System.getProperty("user.dir");
    5. 上述相对路径中,java项目中的文件是相对于项目的根目录web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于tomcat安装目录in
    6. 类加载目录的获得(即当运行时某一类时获得其装载目录)
    7. 1.1)通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录)
    8. InputStreamis=TestAction.class.getClassLoader().getResourceAsStream("test.txt"); (test.txt文件的路径为 项目名src est.txt;类TestPath所在包的第一级目录位于src目录下)
    9. 上式中将TestPathtest.txt替换成对应成相应的类名和文件名字即可
    10. 1.2)通用方法二 (此方法和1.1中的方法类似,不同的是此方法必须以'/'开头) InputStream is=Test1.class.getResourceAsStream("/test.txt");
    11. (test.txt文件的路径为 项目名src est.txt,类Test1所在包的第一级目录位于src目录下)
    12. web项目根目录的获得(发布之后)
    13. 1 servlet出发
    14. 可建立一个servlet在其的init方法中写入如下语句(没有请求的话会抛空指针导常)
    15. ServletContext s1=this.getServletContext();
    16. String temp=s1.getRealPath("/"); (关键)
    17. 结果形如:F: omcat-6.0.36webapps est(test为项目名字)
    18. 如果是调用了s1.getRealPath("")则输出F: omcat-6.0.36webapps est(少了一个"")
    19. 2 httpServletRequest出发(没有请求的话会抛空指针导常)
    20. String path=request.getSession().getServletContext().getRealPath("/");
    21. 结果形如: F: omcat-6.0.36webapps est
    22. classpath的获取(在Eclipse中为获得src或者classes目录的路径),放在监听器,可以窗口启动获取路径
    23. 方法一 Thread.currentThread().getContextClassLoader().getResource("").getPath()
    24. String path = Thread.currentThread().getContextClassLoader()
    25. .getResource("").getPath();
    26. System.out.println("path========" + path);输出: path========/F:/tomcat-6.0.36/webapps/test/WEB-INF/classes/
    27. 方法二 JdomParse.class.getClassLoader().getResource("").getPath() (JdomParsesrc某一个包中的类,下同)
    28. eg:String p1=JdomParse.class.getClassLoader().getResource("").getPath();
    29. System.out.println("JdomParse.class.getClassLoader().getResource--"+p1);
    30. 输出:JdomParse.class.getClassLoader().getResource-/F:/tomcat-6.0.36/webapps/test/WEB-INF/classes/
    31. 另外,如果想把文件放在某一包中,则可以 通过以下方式获得到文件(先定位到该包的最后一级目录)
    32. eg String p2=JdomParse.class.getResource("").getPath();
    33. System.out.println("JdomParse.class.getResource---"+p2);
    34. 输出:JdomParse.class.getResource--/F:/tomcat-6.0.36/webapps/test/WEB-INF/classes/
    35. (JdomParsesrc目录下jdom包中的类)
    36. 属性文件的读取:
    37. 方法
    38. InputStream in = lnewBufferedInputStream( new FileInputStream(name));   
    39. Properties p = new Properties();   p.load(in);
    40. 注意路径的问题,做执行之后就可以调用p.getProperty("name")得到对应属性的值
    41. 方法二
    42. Locale locale =Locale.getDefault();
    43. ResourceBundle localResource = ResourceBundle.getBundle("test/propertiesTest",locale);
    44. String value = localResource.getString("test");
    45. System.out.println("ResourceBundle: " + value);
    46. 工程src目录下propertiesTest.properties(名字后缀必须为properties)文件内容如下:
    47. test=hello word
    48. 不通过Servlet获取路径
    49. 第一种实现
    50. Java代码
    51. URL url = ClassLoader.getSystemClassLoader().getResource("./");
    52. File file =new File(url.getPath());
    53. File parentFile =new File(file.getParent());
    54. System.out.println("webRoot:"+parentFile.getParent());
    55. 第二种实现
    56. 首先写一个接听类 (推荐使用,容器启动时就执行,不会抛空指针异常,适合做定时器任务来删除服务器文件的路径)
    57. Java代码:
    58. package com.chinacreator.report.listener;
    59. import javax.servlet.ServletContext;
    60. import javax.servlet.ServletContextEvent;
    61. import javax.servlet.ServletContextListener;
    62. /**
    63. * @authorxiaoqun.yi
    64. */
    65. public class PathListener implements ServletContextListener {
    66. private staticServletContext servletContext;
    67. public void contextDestroyed(ServletContextEvent sce) {
    68. this.servletContext= sce.getServletContext();
    69. System.out.println("path=======:"+servletContext.getRealPath("/"));
    70. }
    71. public void contextInitialized(ServletContextEvent arg0) {
    72. }
    73. }
    74. web.xml中加入如下配置
    75. Java代码 :
    76. <listener>
    77. <listener-class>com.chinacreator.report.listener.PathListener</listener-class>
    78. </listener>




    1. 五、Java中的getResourceAsStream有以下几种:
    2. 1. Class.getResourceAsStream(String path) path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由 ClassLoader(类加载器)(获取资源)
    3. 2. Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。
    4. 3. ServletContext. getResourceAsStream(String path):默认从WebAPP根目录下取资源,Tomcatpath是否以’/'开头无所谓,当然这和具体的容器实现有关。
    5. 4. Jsp下的application内置对象就是上面的ServletContext的一种实现。
    6. 其次,getResourceAsStream 用法大致有以下几种:
    7. 第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类me.class ,同时有资源文件myfile.xml
    8. 那么,应该有如下代码:
    9. me.class.getResourceAsStream("myfile.xml");
    10. 第二:在me.class目录的子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.y.file 目录下有资源文件myfile.xml
    11. 那么,应该有如下代码:
    12. me.class.getResourceAsStream("file/myfile.xml");
    13. 第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类me.class ,同时在 com.x.file 目录下有资源文件myfile.xml
    14. 那么,应该有如下代码:
    15. me.class.getResourceAsStream("/com/x/file/myfile.xml");
    16. 总结一下,可能只是两种写法
    17. 第一:前面有 /
    18. / ”代表了工程的根目录,例如工程名叫做myproject,“ / ”代表了myproject
    19. me.class.getResourceAsStream("/com/x/file/myfile.xml");
    20. 第二:前面没有 /
    21. 代表当前类的目录
    22. me.class.getResourceAsStream("myfile.xml");
    23. me.class.getResourceAsStream("file/myfile.xml");



    在java中获得文件的路径在我们做上传文件操作时是不可避免的。
    web 上运行
    1:
    this.getClass().getClassLoader().getResource("/").getPath();
    this.getClass().getClassLoader().getResource("").getPath();  得到的是 ClassPath的绝对URI路径。
    如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war/WEB-INF/classes/
    System.getProperty("user.dir");
    this.getClass().getClassLoader().getResource(".").getPath();    得到的是 项目的绝对路径。
    如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war

    2:
    this.getClass().getResource("/").getPath();
    this.getClass().getResource("").getPath(); 得到的是当前类文件的URI目录。不包括自己!
    如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war/WEB-INF/classes/com/jebel/helper/
    this.getClass().getResource(".").getPath();   X 不 能运行

    3:
    Thread.currentThread().getContextClassLoader().getResource("/").getPath()
    Thread.currentThread().getContextClassLoader().getResource("").getPath()  得到的是 ClassPath的绝对URI路径。
    如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war/WEB-INF/classes/
    Thread.currentThread().getContextClassLoader().getResource(".").getPath()  得到的是 项目的绝对路径。
    如:/D:/jboss-4.2.2.GA/server/default/deploy/hp.war

    在本地运行中
    1:
    this.getClass().getClassLoader().getResource("").getPath();
    this.getClass().getClassLoader().getResource(".").getPath();   得到的是 ClassPath的绝对URI路径。
    如:/D:/myProjects/hp/WebRoot/WEB-INF/classes
    this.getClass().getClassLoader().getResource(".").getPath();  X 不 能运行
    2:
    this.getClass().getResource("").getPath();
    this.getClass().getResource(".").getPath(); 得到的是当前类文件的URI目录。不包括自己!
    如:/D:/myProjects/hp/WebRoot/WEB-INF/classes/com/jebel/helper/
    /D:/myProjects/hp/WebRoot/WEB-INF/classes/    得到的是 ClassPath的绝对URI路径。
    如:/D:/myProjects/hp/WebRoot/WEB-INF/classes
    3:
    Thread.currentThread().getContextClassLoader().getResource(".").getPath()
    Thread.currentThread().getContextClassLoader().getResource("").getPath() 得到的是 ClassPath的绝对URI路径。。
    如:/D:/myProjects/hp/WebRoot/WEB-INF/classes
    Thread.currentThread().getContextClassLoader().getResource("/").getPath()    X 不 能运行

     
    最后
        在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。
    还有request.getContextPath();  在Weblogic中要用request.getServletContext().getContextPath();但如果打包成war部署到Weblogic服务器,项目内部并没有文件结构的概念,用这种方式是始终得到null,获取不到路径,目前还没有找到具体的解决方案。

     



  • 相关阅读:
    spring cloud中代理服务器zuul的使用
    springcloud断路器Dashboard监控仪表盘的使用
    Java中 final和static解析
    使用redis和thread告警并避免重复告警
    Windows 下redis的安装和使用
    服务端监控工具Nmon使用方法
    linux性能监控工具nmon生成HTML报告-EasyNmon
    接口测试用例设计
    RESTful API浅谈
    接口测试与总结
  • 原文地址:https://www.cnblogs.com/jarl/p/5893042.html
Copyright © 2020-2023  润新知