java获取classpath文件路径空格转变成了转义字符%20的问题

这个问题很纠结,服务器的文件路径带有空格,空格被转化是%20了,悲剧就出现了

下面展示一段代码
String path = getClass().getResource("/").getPath();

String path = getClass().getClassLoader.getResource("").getPath();  
如果当前路径中包含了空格,则返回的路径字符串空格则被转义为(%20),如何解决这个问题呢?

String path = getClass().getResource("/").toURI().getPath();

String path = getClass().getClassLoader.getResource("").toURI().getPath();

也可以   java.net.URLDecoder.decode(path,"UTF-8 ");其他编码也是可以的哈。

到这个地方其实还有两个疑问1.getClass().getResource("/")与getClass().getClassLoader.getResource("/")有什么区别;
2.toURI()是什么;

Class().getResource与ClassLoader.getResource

Class().getResource,如果以 “/”开始则查找的路径是以classpath指向的绝对路径,包括jar文件路径,
如果不是以“/”开始,则查找的路径是从当前包路径开始查找,故jar文件查找不到

ClassLoader.getResource,查找的时候不能以“/”开头,查找的路径必须是绝对路径,查找范围包括jar文件

例子:可以在任意包路径下运行,然后根据结果得出以上结论

System.out.println(getClass().getResource(""));
System.out.println(getClass().getResource("/"));
System.out.println(getClass().getClassLoader().getResource(""));
System.out.println(getClass().getClassLoader().getResource("/"));

PS:查看一下Class.getResource源代码,会发现最终都是以ClassLoader.getResource获取资源位置

WEB应用中也可以这样用:
URL url = (URL) ServletActionContext.getServletContext().getResource("/WEB-INF/classes/config/chen wei/jdbc.properties");
// URL url = (URL)req.getSession().getServletContext().getResource("/WEB-INF/webinffile.txt");

URI与URL

ClassLoader.getResource("/").toURI()或Class().getResource("/").toURI()

getResource方法返回的是一个URL对象,toURI()是将RUL对象转换为URI对象.

查看了 URL和URI 对于getPath()方法的源代码,前者是没有对转义字符的解码的过程,而后则是有一个解码的过程
java.net.URLDecoder.decode;

URI与URL区别,我只是简单说说我简单的理解的

URI统一资源标识符,是针对整个资源的一个属性的管理对象,包括了URL

URL统一资源定位符,是对资源的管理,如获取资源文件流等

详细的自己看JDK API,估计看完了你脑壳也昏了

详细的是就自己看吧你看看额,我觉得还是不错的哟,肯定很好耍,

java获取classpath文件路径空格转变成了转义字符%20的问题的更多相关文章

  1. java获取当前文件路径 [转]

    1.如何获得当前文件路径 常用: 字符串类型:System.getProperty("user.dir"); 综合: package com.zcjl.test.base; imp ...

  2. java获取当前文件路径的方法

    第一种: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); ...

  3. JAVA获取Classpath根路径的方法

    方法一: String path = Test.class.getResource("/").toString(); System.out.println("path = ...

  4. Java 获取资源文件路径

    1 问题描述 通过源码运行时,一般使用如下方式读取资源文件: String str = "1.jpg"; 资源文件与源码文件放在同一目录下,或者拥有同一父级目录: String s ...

  5. JAVA获取当前文件路径this.getClass().getResource方法详细讲解

    public class Test { public void run() { // TODO Auto-generated method stub System.out.println(" ...

  6. java 获取classpath下文件多种方式

    java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...

  7. Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结

    Atitit,通过pid获取进程文件路径 java php  c#.net版本大总结 1. 通过PID获取进程路径的几种方法2 1.1. GetModuleFileNameEx 想获得进程可执行文件的 ...

  8. java 获取class文件所在路径

      java 获取class文件所在路径 CreateTime--2017年11月14日15:14:32 Author:Marydon 1.获取class文件所在路径(磁盘路径.绝对路径) // 获取 ...

  9. 如何获取启动文件路径 GetModuleFileName

    如何获取启动文件路径 GetModuleFileName CString GetExeDirPath() { }; CString strExeDirPath; GetModuleFileName(N ...

随机推荐

  1. Visual paradigm Db Archtecture Database config

  2. vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)

    上一篇php7环境的搭建 真是火爆,仅仅两天时间,就破了我之前swagger系列的一片文章,看来,大家对搭建环境真是情有独钟. 为了访问量,我今天再来一篇Redis的搭建.当然不能仅仅是redis的搭 ...

  3. C语言提供了几个标准库函数 itoa() atoi()

    C语言提供了几个标准库函数C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转换为字符串的一个例子: # include <s ...

  4. C++中的预处理

    一.预处理的由来:      在C++的历史发展中,有很多的语言特征(特别是语言的晦涩之处)来自于C语言,预处理就是其中的一个.C++从C语言那里把C语言预处理器继承过来(C语言预处理器,被Bjarn ...

  5. Ubuntu修改hosts方法

    1.修改hostssudo gedit /etc/hosts如果不喜欢使用gedit命令,而且当前帐户为非root帐户,那么可把/etc/hosts复制到桌面上,然后手动编辑后保存,再使用命令copy ...

  6. args

    java 中args一般存在main主类方法内,String args[ ]或者String[ ] args表示给主方法传一个字符串数组. 而args是一个字符串数组的变量名,不是关键字,是argum ...

  7. 开发中用到的开源框架汇总(Updating)

    SuperWebSocket SuperSocket NPOI 官网:http://npoi.codeplex.com/ 实例讲解:http://www.cnblogs.com/yutian/p/52 ...

  8. [原创]Matlab之按位操作

    在硬件语言Verilog中按位操作是相对容易的,在C语言中一样的用好逻辑符号“|”.“!”.“&”.“>>”等即可.但是在Matlab中一些类似的操作是判断或者逻辑用法,不能用在按 ...

  9. java内存分析

    链接:http://blog.csdn.net/chana1101/article/details/5632393

  10. PHP declare(ticks=N); 的作用

    一般用法是 declare(ticks=N);拿declare(ticks=1)来说,这句主要作用有两种: 1.Zend引擎每执行1条低级语句就去执行一次 register_tick_function ...