无法通过URL访问.jar中的文件

无法通过URL访问.jar中的文件

问题描述:

我需要使用URL访问当前执行的.jar中的文件。无法通过URL访问.jar中的文件

URL url = BlockConverter.class.getResource("/test.txt"); 
System.out.println(url.toString()); 
InputStream is = url.openStream(); 

这就是我所做的。 输出是:

jar:file:/C:/Users/User/Desktop/SERVER/plugins/MyJar.jar!/test.txt 

我的InputStream最终总是抛出一个IOException异常被初始化的时候,即使URL被正确输出。 那怎么可能? 为什么我无法打开流?

编辑: 另外,请不要用“使用的getResourceAsStream”的答案,因为它使用相同类型的代码:

public InputStream getResourceAsStream(String name) { 
    URL url = getResource(name); 
    try { 
     return url != null ? url.openStream() : null; 
    } catch (IOException e) { 
     return null; 
    } 
} 
+0

什么来自IOException的消息?对于这个问题,你的jar的根目录下是否有test.txt? – Powerlord

+0

恩,非常感谢。在对代码进行一些更改后,我没有读取堆栈跟踪,结果证明文件名中的无效字符导致了IOException,而不是流。我非常感谢这个想法,我现在会去惭愧地哭泣。 –

+0

当我说你不是第一个错过堆栈跟踪消息的人时,请相信我。不是由一个长镜头。 :P – Powerlord

我会打开它作为流直接例如

InputStream is = BlockConverter.class.getResourceAsStream("/test.txt"); 

,上面的方法,我通常一个罐子内访问资源的方式(它会不管它被包装罐子内打开资源,或简称为包装的部署,注)

+0

我试过了,但是结果是一样的。除此之外,我需要记录URL,所以这看起来像是更干净的解决方案。 –

+0

另请注意,getResourceAsStream()在其源代码中使用url.openStream(),所以它没有区别。 –

+0

test.txt与BlockConverter的关系在哪里?以上建议它应该在jar文件的根目录下。如果你得到一个空流,我认为你的jar打包或对实体的引用是错误的 –