zoukankan      html  css  js  c++  java
  • JAVA_file(2)

    几种不太安全的:

    1. new File(path),这个方法的路径到底在那里取决于调用java命令的起始位置定义在哪里,

      tomcat/bin下面的catalina.bat调用了java,所以在tomcat下相对起始位置是tomcat/bin,但是eclipse启动时,起始位置 是eclipse的项目路径。 

    2.类.class.getClassLoader().getResource("").getPath()

      如果使用了此方法,这把决定权交给了类加载器,例如tomcat的类加载是非委托机制的,而weblogic的类加载是委托的。大部分情况下是安全的。

    3.类.class.getResource("")

      这是个好方法,但局限性在于如果类文件在jar中的话,那么在打jar包时需要将文件夹一起打进去,否则会返回null,jar文件实际上就是zip文件,zip文件中:文件就是文件,文件夹是文件夹,不是关联在一起的,很多开源的jar包就没有把目录打进去只打了classes文件,虽然你能年到目录层次结构,但是调用类.class.getResource("")会返回null.因为文件的目录结构和文件夹本身是两回事。 

    *******************************************************************************************************************************

    Java中使用的路径,分为两种:绝对路径和相对路径。归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!

     在开发Web方面的应用时, 经常需要获取服务器中当前WebRoot的物理路径。
    
      如果是Servlet , Action , Controller, 或者Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通过ServletContext.getRealPath("/")来获取当前应用在服务器上的物理地址。
    
      如果在类中取不到ServletContext时,有两种方式可以做到:
    
      1)利用Java的类加载机制:调用 XXX.class.getClassLoader().getResource(""); 方法来获取到ClassPath , 然后处理获得WebRoot目录。
      这种方式只能是该class在WebRoot/WEB-INF/classes下才能生效, 如果该class被打包到一个jar文件中, 则该方法失效。这时就应该用下面一种方式。
    
      2)spring框架的思路,在WEB-INF/web.xml中,创建一个webAppRootKey的param,指定一个值(默认为webapp.root)作为键值,然后通过Listener, 或者Filter,或者Servlet 执行String webAppRootKey = getServletContext().getRealPath("/"); 并将webAppRootKey对应的webapp.root 分别作为Key,Value写到System Properties系统属性中。之后在程序中通过System.getProperty("webapp.root")来获得WebRoot的物理路径。
    
      根据第二种的思路,我们还可以再扩展一下。不过对于在部署在一台服务器中的应用来说,若还不是你所需请再往下看。
    
      下面是一些得到classpath和当前类的绝对路径的一些方法。你可使用其中的一些方法来得到你需要的资源的绝对路径:
    
      1.DebitNoteAction.class.getResource("")
      得到的是当前类FileTest.class文件的URI目录。不包括自己!
      如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
      atacarnet/src/com/evi/modules/atacarnet/action/
    
      2.DebitNoteAction.class.getResource("/")
      得到的是当前的classpath的绝对URI路径。
      如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
    
      3.Thread.currentThread().getContextClassLoader().getResource("")
      得到的也是当前ClassPath的绝对URI路径
      如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
      推荐使用该方法获取。
    
      4.DebitNoteAction.class.getClassLoader().getResource("") 或ClassLoader.getSystemResource("")
      得到的也是当前ClassPath的绝对URI路径。
      如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/
    
      5.取得服务器相对路径
      System.getProperty("user.dir")
      例如:E:apache-tomcat-5.5.16apache-tomcat-5.5.16in
    
      6.取得项目中的绝对路径
      一般用request.getRealPath("/")或request.getRealPath("/config/")
    
      但现在不提倡使用request.getRealPath("/")了,大家可试用ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。
    
      要取得src的文件非常容易,因为src是默认的相对目录,比如你说要取得src下com目录的test.java文件,你只需要这样就够了
      File f = new File(com/test.java);
    
      但如果我要取得不在src目录或者WebRoot目录下的文件呢,而是要从src或者WebRoot同级的目录中取呢,比如说doc吧。
      我的硬方法是这样实现的:
      String path = this.getServletContext().getRealPath("/");
      Properties p = new Properties();
      p.load(new FileInputStream(new File(path.substring(0,(path.lastIndexOf("\WebRoot") + 1)) + "doc/db.properties")));
      System.out.println(p.getProperty("driverName"));
    -------------------------------
    另:Request中getContextPath、getServletPath、getRequestURI、getRequestURL、getRealPath的区别
    
      假定你的web application 名称为news,你在浏览器中输入请求路径:http://localhost:8080/news/main/list.jsp
    
      则执行下面向行代码后打印出如下结果:
    
    1、 System.out.println(request.getContextPath());
      打印结果:/news
    
    2、System.out.println(request.getServletPath());
      打印结果:/main/list.jsp
    
    3、 System.out.println(request.getRequestURI());
      打印结果:/news/main/list.jsp
    
    4、System.out.println(request.getRequestURL());
      打印结果:http://localhost:8080/news/main/list.jsp
    
    5、 System.out.println(request.getRealPath("/"));
      打印结果:F:Tomcat 6.0webapps
    ews	est
  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/caroline4lc/p/4433518.html
Copyright © 2011-2022 走看看