路径中带有特殊字符的Java类加载器getResource

路径中带有特殊字符的Java类加载器getResource,java,Java,我有以下问题。在我们的集成测试中,我们使用不同的配置,该配置将在测试之前从测试资源中加载以下代码: URL resource = ClassLoader.getSystemResource("application.conf"); 只要路径中没有特殊字符,这就可以正常工作。例如,具有以下正确路径 D:/Dev/projects/#FLI/flinsta/fgraph/build/resources/test/application.conf 将导致getSystemResource给出的以下

我有以下问题。在我们的集成测试中,我们使用不同的配置,该配置将在测试之前从测试资源中加载以下代码:

URL resource = ClassLoader.getSystemResource("application.conf");
只要路径中没有特殊字符,这就可以正常工作。例如,具有以下正确路径

D:/Dev/projects/#FLI/flinsta/fgraph/build/resources/test/application.conf
将导致
getSystemResource
给出的以下错误文件路径:

D:/Dev/projects/%23FLI/flinsta/fgraph/build/resources/test/application.conf
这将导致一个根本不存在的文件。我怎样才能确保这样的事情不会发生。重命名路径是一个选项。然而,我想找到一个解决方案,而不是解决办法


谢谢你的帮助

通过评论回答我自己的问题:

URL resource = ClassLoader.getSystemResource("application.conf");
String configPath = URLDecoder.decode(resource.getFile(), "UTF-8");

变量
configPath
则包含正确的路径。

@WeareBorg这与编码无关。哈希标记字符转义为其百分比编码版本,而不是“断开”字符。URL正确,应正确编码。之后需要对其进行解码。区别在于文件路径和URL
getSystemResource()
返回URL,而不是路径。一些URL将引用jar文件内或Web服务器上的位置(通常用于小程序)。类路径上的资源并不总是本地文件。@bayou.io是一个错误。Ofc解码帮助!非常感谢。我在詹金斯也有同样的问题,但不是我的本地人。在深入研究之后,我发现某些类加载器使用特殊字符构建java.net.URL,而有些加载器对其进行编码。例如,我使用的是maven failsafe插件,如果
useManifestOnlyJar
为真,则对特殊字符进行编码,否则不正确。知道哪些类加载器编码URL,哪些不编码吗?这可能不会在所有情况下都起作用。警告:“注意,URI类在某些情况下确实执行其组件字段的转义。管理URL编码和解码的建议方法是使用URI,并使用toURI()和URI.toURL()在这两个类之间进行转换。”他们提到URLDecover并不总是正确的解决方案。