`
lixin_2002
  • 浏览: 21563 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

java 路径解决方案

阅读更多
Java的路径问题,相对来说就比较繁杂。最近的工作涉及到创建和读取文件的工作,现将实际使用中遇到的问题总结如下:
一 相对路径的解释
   1.相对路径(即相对于当前用户目录的相对路径)均可通过以下方式获得(不论是一般的java项目还是web项目)
    String relativelyPath=System.getProperty("user.dir");
   对于一般的java项目中的文件是相对于项目的根目录,而对于web项目中的文件路径,可能是服务器的某个路径,同时不同的web服务器也不同(tomcat是相对于 tomcat安装目录\bin)。为此,个人认为,在web项目中,最好不要使用“相对于当前用户目录的相对路径”。然而默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在SE程序中可能还算正常,但是到了EE程序中,弄不好,就会带来问题一片哦。
   2.相对于classpath的相对路径
   如:相对于file:/D:/mywork/javaprj/MyTest/bin这个路径的相对路径。其中,bin是本项目的classpath。所有的Java源文件编译后的.class文件复制到这个目录中。

二 类加载目录(即当运行某一类时获得其装载目录)
   1.不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录   
        InputStream is=ReadWrite.class.getClassLoader().getResourceAsStream("DeviceNO");
    其中,DeviceNO文件的路径为 项目名\src\DeviceNO;类ReadWrite所在包的第一级目录位于src目录下。
    2.与1相似,不同的是此方法必须以'/'开头      
    InputStream is=ReadWrite.class.getResourceAsStream("DeviceNO");
    其中,DeviceNO文件的路径为 项目名\src\DeviceNO;类ReadWrite所在包的第一级目录位于src目录下。
     
三. web项目根目录获取
    1. 可建立一个servlet,在其init方法中写入如下语句
      ServletContext sc=this.getServletContext();
     String temp=sc.getRealPath("/");
     得到的输出路径结果类似:"D:\Apache\Tomcat6.0\webapps\windpower\ " (windpower为项目名字) ,如果是调用了s1.getRealPath("")则输出"D:\Apache\Tomcat6.0\webapps\windpower"(注意,在最后少了一个"\")

     2. 在httpServletRequest中,可以通过下面语句
             String cp=request.getSession().getServletContext().getRealPath("/"); 得到的输出路径结果类似:"D:\Apache\Tomcat6.0\webapps\windpower\ "

四 .类路径( classpath)的获取(在Eclipse/MyEclipse中,则为获得src或者classes目录的路径)

    方法1.  Thread.currentThread().getContextClassLoader().getResource("").getPath()
     例如:
     String path=Thread.currentThread().getContextClassLoader().getResource("").getPath();
     System.out.println(path);
     打印:“/D:/windpower/WebRoot/WEB-INF/classes/”
    方法2.   ParsingXML.class.getClassLoader().getResource("").getPath()(ParsingXML为src某一个包中的类,下同)
     例如:
      String path=ParsingXML.class.getClassLoader().getResource("").getPath();
     System.out.println("ParsingXML.class.getClassLoader().getResource--"+path);

     打印: “ParsingXML.class.getClassLoader().getResource--/D:/windpower/WebRoot/WEB-INF/classes/”

    另外,如果想把文件放在某一包中,则可以通过以下方式获得到文件所在目录,即先定位到该包的最后一级目录。
     ParsingXML.class.getResource("").getPath();
     例如:
      String path=ParsingXML.class.getResource("").getPath();
     System.out.println("ParsingXML.class.getResource---"+p2);

     打印: “ParsingXML.class.getResource---/D:/windpower/WebRoot/WEB-INF/classes/parsing/ ”(ParsingXML为src目录下parsing包中的类)

五. 属性文件的读取:

     方法1.
      static {
ps = new Properties();
try {
InputStream in = ReadWrite.class.getResourceAsStream("DeviceNO");
ps.load(in);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
          ps.getProperty("key")
    方法2.
        Locale locale = Locale.getDefault(); 
       ResourceBundle localResource = ResourceBundle.getBundle("windpower/DeviceNOProperties", locale); 
       String value = localResource.getString("1"); 
       System.out.println("DeviceNO: " + value);
       工程src目录下文件DeviceNOProperties.properties(名字后缀必须为properties)文件内容如下:1=3输出结果为:“DeviceNO:3”
六.编码转换问题:
    ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的中文及空格路径

例如:结果是file:/C:/Documents%20and%20Settings/%e5%ba%84%e6%99%93%e6%af%85  
  /Local%20Settings/Temp/temp0.jar!/db/dmozdata.mdb  
  而我们期望是 C:/Documents 路径p source  等等。这里我们只要在获取到路径之前把返回值decode下就可以了. 用utf-8编码. Java代码 :
    String configPath = this.getClass().getClassLoader().getResource("allowPath.xml").getFile();
    configPath = java.net.URLDecoder.decode(configPath,"utf-8");
   
    另外java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascript 中URL 的编码和解码函数escape(String s)和unescape(String s) ;  

七.总结:
     我们在使用相对路径时,应当使用相对于当前classpath的相对路径。
ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法,使用相对于当前项目的classpath的相对路径来查找资源。
读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。
通过查看ClassLoader类及其相关类的源代码,发现它实际上还是使用了URI形式的绝对路径。通过得到当前classpath的URI形式的绝对路径,再去构建相对路径的URI形式的绝对路径。
分享到:
评论

相关推荐

    java路径解决方案

    本文将深入探讨Java路径解决方案,旨在帮助开发者理解和解决与此相关的各种问题。 首先,我们来了解一下Java中的类路径(Classpath)。类路径是Java虚拟机(JVM)寻找类文件的路径集合,它决定了哪些目录和.jar文件...

    Java路径问题最终解决方案之一.

    ### Java路径问题最终解决方案之一 #### 一、引言与背景 在进行Java开发时,文件路径处理一直是令人头疼的问题之一。特别是在涉及跨平台或在不同环境中部署的应用程序时,路径问题更是频繁出现。本文旨在深入探讨...

    Java路径问题最终解决方案.doc

    Java路径问题一直是开发者在处理文件操作时经常遇到的挑战,主要涉及到如何正确地定位和访问文件资源。在Java中,路径分为绝对路径和相对路径,这两种路径又有不同的表现形式。 一、URI形式的绝对资源路径 例如:...

    Java路径问题最终解决方案之一.txt

    ### Java路径问题最终解决方案 #### 一、引言 在Java开发过程中,处理文件路径问题时常令人头痛。本文将深入探讨Java中的路径问题,并提供一个有效的解决方案,该方案旨在简化路径处理过程,使得开发者能够更加...

    Java路径问题最终解决方案 —可定位所有资源的相对路径寻址

    Java路径问题最终解决方案 —可定位所有资源的相对路径寻址 通过相对classpath路径实现自由寻找资源的助手类的源代码

    java常见异常的解决方案

    ### Java常见异常及其解决方案 #### 1. `java.lang.NullPointerException` **异常描述:** `NullPointerException`是最常见的运行时异常之一,通常发生在试图访问一个尚未初始化或者被设置为`null`的对象实例时。...

    Java路径问题最终解决方案(转) - lily的日志 - 网易博客.mht

    Java路径问题最终解决方案(转) - lily的日志 - 网易博客.mhtJava路径问题最终解决方案(转) - lily的日志 - 网易博客.mhtJava路径问题最终解决方案(转) - lily的日志 - 网易博客.mht

    车辆路径问题 (VRP),Java 上的遗传算法解决方案_java_代码_下载

    在这个Java实现的遗传算法解决方案中,我们首先需要理解遗传算法的基本步骤: 1. **初始化种群**:随机生成一组初始的车辆路线,每条路线可以看作是一个个体,形成种群。 2. **适应度函数**:为每个个体计算适应度...

    java 最短路径 问题 动态规划

    它通常用于优化问题,即寻找最佳解决方案。对于最短路径问题,动态规划的关键在于递推关系式的选择和状态的定义。在这个例子中,状态定义为从起点到达当前节点的最短距离,递推关系式则是根据当前节点到达所有邻居...

    Java常见错误及解决方案

    ### Java常见错误及解决方案 #### 1. 类定义未找到错误 `java.lang.NoClassDefFoundError` **原因分析** - **程序调用的JAVA类文件未正确上传:** 当程序试图加载一个不存在或未正确部署的类时,会出现此类错误。 ...

    java项目问题解决方案

    在Java项目开发中,尤其是基于Struts框架的应用,可能会遇到服务器启动时的异常问题,比如在本案例中遇到的“ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource”。这个问题通常出现在尝试加载...

    Java获取文件的路径及常见问题解决方案

    Java获取文件的路径及常见问题解决方案 Java获取文件的路径是Java编程中的一项基本操作,然而在实际开发中,文件路径的问题常常会引发各种问题。因此,本文将详细介绍Java获取文件的路径及常见问题解决方案。 一、...

    java日志解决方案java问题解决日志第一版.pdf

    Java日志解决方案是Java开发中不可或缺的一部分,它用于记录应用程序的运行情况,帮助开发者调试代码,定位错误,以及在生产环境中监控系统状态。本篇主要介绍一些基础的日志概念、常用的Java日志框架以及如何有效地...

    sonar-scanner连接sonarquebe7的sonar.java.binaries问题的解决方案

    本文主要探讨的是当SonarScanner在连接SonarQube 7版本时遇到`sonar.java.binaries`问题的解决方案。 首先,问题的起因是由于SonarQube的Java插件版本升级导致的。在4.12版本之后,SonarQube要求用户明确指定`sonar...

    总结一下java获取路径几种途径

    解决Java路径问题的方案 #### a. 定位所有资源的相对路径寻址 为了解决Java路径问题,特别是对于资源定位的需求,可以采用一种更灵活的方法,该方法允许使用相对路径定位classpath外面的资源。这意味着即使资源不...

    java或wed解决路径问题

    针对这种情况,Spring框架提供了一种解决方案。在`WEB-INF/web.xml`中,可以定义一个名为`webAppRootKey`的参数,设置一个默认值(如`webapp.root`)作为键,然后在Listener、Filter或Servlet中获取`ServletContext`...

    水晶报表应用在java解决方案

    标题中的“水晶报表应用在java解决方案”指的是将水晶报表(Crystal Reports)集成到基于Java的管理系统(MIS系统)中,以实现报表的生成、展示和导出功能。描述中提到,开发者面临的问题是如何在Java的JSP(Java ...

Global site tag (gtag.js) - Google Analytics