`

Java路径问题解决方案收集

 
阅读更多

Java路径中的空格问题

1, TestURL().class.getResource("").getPath()或TestURL().class.getResource("").getFile()获得的路径,不能被FileReader()和FileWriter()直接应用。 
  原因是URL对空格,特殊字符(%,#,[]等)和中文进行了编码处理。 
  例如:空格变为%20。 
  有解决方法(1),使用repaceAll("%20",' ')替换后,只能解决空格问题。但是路径中包含%和中文就不行了。 
  有解决方法(2),使用URLDecoder.decode(str,"UTF-8")解码,但是只能解决一部分,若路径中含有+,也是不能解决的,原因是URL并不是完全用URLEncoder.encode(str,"UTF-8")编码的,+号被解码后,却变成了空格。 
方法(3),可以解决所有的问题,用TestURL().class.getResource("").toURI().getPath(),但是需要处理URISyntaxException异常,比较麻烦点。

 

java 路径中的空格问题

若路径中带空格,则 
1. uri.getpath();返回的路径中的空格仍以“空格”的形式出现,如/F:/MyEclipse Workspace/project/bin/... 
除此之外,URL返回的一切路径中的空格都以“%20”的形式出现,uri.toString()也以“%20”的形式出现。

2. new File(String filePath);接受正确URI格式的参数和带“空格”(非20%)的正确相对/绝对字符串路径,否则即使给的路径是正确的也会出现找不到文件的异常。

3. URL/URI返回的路径分隔符都是“/”,File返回的路径分隔符都为“\”。对于存在的文件返回的路径字符串,空格都以"空格"出现,而不存在的路径new出的file,getPath()返回的路径中的空格,仍是new File(String filePath)的参数中原有的形式,即若filePath中是空格的getPath()返回的仍是空格,是“%20”的仍是“%20”。

4.new URL();的参数可以为正确的URI,或者为URI格式的字符串;若字符串是非完整的URI格式,则创建失败。

5.File.toURI()会将file的路径名中的“空格”转化为“%20”,然后在路径前加protocol:"file:/",而File.toURL()只会在file路径前简单的加上protocol:"file:/",而不会将“空格”转化为“%20”,原来的无论是“空格”还是“%20”都只会原样保留!

6.Woden 中WSDLReader.readWSDL(String s)的实现要将参数s转化为URL,所以字符串参数s中一定不能有空格,应以“20%”代替。参数s最好为标准的URI格式的字符串。

 

 

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,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java开源包11

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包6

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包9

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包101

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包4

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包5

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包8

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包10

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包3

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包1

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。  《java jdk 7学习笔记》针对java se 7新功能全面改版,无论是...

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本...这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() ...

    java开源包2

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java开源包7

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    Java资源包01

    JSTUN 是另外一个用来解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现。 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持。目前它包含一...

    java 面试题 总结

    GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存...

    超爽的自学课件(java)

    也讲述了与Java 1.1的“Java数据库连接”(JDBC)和“远程方法调用”(RMI)有关的问题。 <br>(16) 第16章 设计范式 本章将讨论非常重要、但同时也是非传统的“范式”程序设计概念。大家会学习设计进展过程的...

Global site tag (gtag.js) - Google Analytics