Java 无法打开文件名包含冒号的资源

Java 无法打开文件名包含冒号的资源,java,classloader,Java,Classloader,我在笔记本电脑上遇到了一个奇怪的问题 笔记本电脑: OSX 版本:10.11.6-El Capitan Java: java版本“1.8.0_91” Java(TM)SE运行时环境(build 1.8.0_91-b14) Java HotSpot(TM)64位服务器虚拟机(构建25.91-b14,混合模式) 我试图使用ClassLoader#getResource打开以下格式的文件名app-2016-08-13T22:55:00Z.1.log.gz 我已经将文件放在/src/main/test/

我在笔记本电脑上遇到了一个奇怪的问题

笔记本电脑: OSX 版本:10.11.6-El Capitan

Java: java版本“1.8.0_91” Java(TM)SE运行时环境(build 1.8.0_91-b14) Java HotSpot(TM)64位服务器虚拟机(构建25.91-b14,混合模式)

我试图使用
ClassLoader#getResource
打开以下格式的文件名
app-2016-08-13T22:55:00Z.1.log.gz

我已经将文件放在/src/main/test/resources下,但是我总是返回
null

如果我将该文件重命名为任何不带冒号的文件,代码将正常工作。 发生什么事了

@Test
public void testColonFile() throws Exception {
    String resourceFilename = "app-2016-08-13T22:55:00Z.1.log.gz";
    InputStream is = TestClass.class.getClassLoader().getResourceAsStream(resourceFilename);
    //InputStream is null here!
 }

我的猜测是
toURI
是对冒号进行编码的URL,而
文件的构造函数并不期望这样

请添加一行,如

System.err.println(Resources.getResource(resourceFilename).toURI());

查看。

我建议删除
toURI()
。关于HFS+和冒号有很多讨论。问题是
被用作文件路径分隔符。因此,您应该避免在文件名中使用
。因此,系统无法找到指定的文件。请参见:下面是文件系统及其限制的比较。您的代码无效。资源不是文件。它们可以在JAR或WAR文件中,而不是在文件系统中。您应该直接使用URI,或者
getResourceAsStream()
。如果我只使用
newfile(absolutePath)
它可以正常工作。因此,它可以清楚地找到它。它在
toURI
之前失败了<代码>输入流为=BlingPublisherTest.class.getClassLoader().getResourceAsStream(resourceFilename)也为inputstream返回null