URL包⾥的path()对路径中空格识别为%20的处理url编码处理
办法
⽅法(1),使⽤repaceAll("%20",' ')替换后,只能解决空格问题。但是路径中包含%和中⽂就不⾏了。
⽅法(2),使⽤URLDecoder.decode(str,"UTF-8")解码,但是只能解决⼀部分,若路径中含有+,也是不能解决的,原因是URL并不是完全⽤de(str,"UTF-8")编码的,+号被解码后,却变成了空格。
⽅法(3),可以解决所有的问题,⽤TestURL().Resource("").toURI().getPath(),但是需要处理URISyntaxException异常,⽐较⿇烦点。
若路径中带空格,则
1. path();返回的路径中的空格仍以“空格”的形式出现,如/F:/MyEclipse Workspace/project/bin/...
除此之外,URL返回的⼀切路径中的空格都以“%20”的形式出现,String()也以“%20”的形式出现。
2. new File(String filePath);接受正确URI格式的参数和带“空格”(⾮20%)的正确相对/绝对字符串路径,否则即使给的路径是正确的也会出现不到⽂件的异常。
3. URL/URI返回的路径分隔符都是“/”,File返回的路径分隔符都为“\”。对于存在的⽂件返回的路径字符串,空格都以"空格"出现,⽽不存在的路径new出的file,getPath()返回的路径中的空格,仍是new File(String filePath)的参数中原有的形式,即若filePath中是空格的getPath()返回的仍是空格,是“%20”的仍是“%20”。
URI()会将file的路径名中的“空格”转化为“%20”,然后在路径前加protocol:"file:/",⽽URL()只会在file路径前简单的加上protocol:"file:/",⽽不会将“空格”转化为“%20”,原来的⽆论是“空格”还是“%20”都只会原样保留!
6.Woden 中adWSDL(String s)的实现要将参数s转化为URL,所以字符串参数s中⼀定不能有空格,应以“20%”代替。参数s最好为标准的URI格式的字符串。
Java的路径问题,相对来说就⽐较繁杂。最近的⼯作涉及到创建和读取⽂件的⼯作,现将实际使⽤中遇到的问题总结如下:
⼀ 相对路径的解释
1.相对路径(即相对于当前⽤户⽬录的相对路径)均可通过以下⽅式获得(不论是⼀般的java项⽬还是web项⽬)
String Property("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=ClassLoader().getResourceAsStream("DeviceNO");
其中,DeviceNO⽂件的路径为 项⽬名\src\DeviceNO;类ReadWrite所在包的第⼀级⽬录位于src⽬录下。
2.与1相似,不同的是此⽅法必须以'/'开头
InputStream is=ResourceAsStream("DeviceNO");
其中,DeviceNO⽂件的路径为 项⽬名\src\DeviceNO;类ReadWrite所在包的第⼀级⽬录位于src⽬录下。
三. web项⽬根⽬录获取
1. 可建⽴⼀个servlet,在其init⽅法中写⼊如下语句
ServletContext ServletContext();
String RealPath("/");
得到的输出路径结果类似:"D:\Apache\Tomcat6.0\\windpower\ " (windpower为项⽬名字) ,如果是调⽤了s1.getRealPath("")则输出"D:\Apache\Tomcat6.0\webapps\windpower"(注意,在最后少了⼀个"\")
2. 在httpServletRequest中,可以通过下⾯语句
String Session().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. ClassLoader().getResource("").getPath()(ParsingXML为src某⼀个包中的类,下同)
例如:
String path=ClassLoader().getResource("").getPath();
System.out.println("ClassLoader().getResource--"+path);
打印: “ClassLoader().getResource--/D:/windpower/WebRoot/WEB-INF/classes/”
另外,如果想把⽂件放在某⼀包中,则可以通过以下⽅式获得到⽂件所在⽬录,即先定位到该包的最后⼀级⽬录。
Resource("").getPath();
例如:
String path=Resource("").getPath();
System.out.println("Resource---"+p2);
打印: “Resource---/D:/windpower/WebRoot/WEB-INF/classes/parsing/ ”(ParsingXML为src⽬录下parsing包中的类)
五. 属性⽂件的读取:
⽅法1.
static {
ps = new Properties();
try {
InputStream in = ResourceAsStream("DeviceNO");
ps.load(in);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
⽅法2.
Locale locale = Default();
ResourceBundle localResource = Bundle("windpower/DeviceNOProperties", locale);
String value = String("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 = Class().getClassLoader().getResource("l").getFile();
configPath = java.URLDecoder.decode(configPath,"utf-8");
另外java中URL 的编码和解码函数de(String s)和java.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形式的绝对路径。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。