使用Java';找不到文件;s获取资源
我试图从我的类中加载一个名为使用Java';找不到文件;s获取资源,java,file,Java,File,我试图从我的类中加载一个名为Test的文件,但不知何故Java说,该文件不存在,而它显然存在,URL对象URL既不是空的,也不包含无效路径,当我调试程序时,文件对象file中存储了正确的路径。当我打印出文件.getPath()并将其粘贴到Windows资源管理器中时,它会很好地打开。我正在运行Eclipse,但我尝试在控制台中运行该程序,但它也不起作用 public static void main(String[] args) { URL url = Test.class.getRes
Test
的文件,但不知何故Java说,该文件不存在,而它显然存在,URL对象URL
既不是空的,也不包含无效路径,当我调试程序时,文件对象file
中存储了正确的路径。当我打印出文件.getPath()
并将其粘贴到Windows资源管理器中时,它会很好地打开。我正在运行Eclipse,但我尝试在控制台中运行该程序,但它也不起作用
public static void main(String[] args) {
URL url = Test.class.getResource("/Test");
File file = new File(url.toExternalForm());
if (!file .exists()) {
System.out.println("File does not exist: " + file.getPath());
System.exit(-1);
}
}
我也用getResource(“Test”)
、File(“Test”)
和File(“/Test”)
试过了,但也没用。我不知道为什么会发生这种情况,因为我经常处理文件,从来没有遇到过问题
我要加载的文件位于源文件夹中,是的,我选中了,它在Eclipse中被识别为源文件夹,并且位于类路径中。顺便说一下,该文件实际上只是被称为Test
,没有扩展名
Bin文件夹:
bin/
|___package/Test.class
|___Test
输出(项目称为“其他”):
使用
Test.class.getResource(“/Test”)
会造成很多麻烦,因为您永远不知道资源是普通文件还是JAR文件中的资源是无法直接访问的
因此,首选的方法是使用getResourceAsStream(String)
,它返回一个可直接读取的InputStream
以下示例使用了Java 9+功能:
byte[] data = null;
try (InputStream in = Test.class.getResourceAsStream("/Test")) {
if (in == null) {
System.out.println("Resource '/Test' does not exist");
System.exit(-1);
}
data = in.readAllBytes();
}
FilePath不应该有“file:\”前缀。谢谢@shan,多亏了你,我找到了修复方法。我错误地使用了
url.toExternalForm()
而不是url.getFile()
请告诉我们您真正想要做什么。通过getResource(..)
访问资源是一种方法,但非常复杂且容易出错。如果您想读取文件getresourceastream(..)
是更好的选择。您可以假设getResource
返回的URL是一个文件:
;这听起来是个坏主意。如果资源不存在,getResource
将返回null。您不能使用url.openStream()
读取文件吗?您提供的“/Test”字符串没有文件扩展名。这是什么类型的文件?将类似“Test.txt”或“Test.pdf”的内容作为参数更有意义。而且,它应该是!file.exists()
而不是!文件exists()
-不应该有空格。为什么getResource()
会在JAR中造成问题?我认为这两者之间唯一的区别是getResource
返回一个URL
,而getresourceastream
返回一个InputStream
,是getResource
@Sheldon的简写。Jar文件中的文件不能使用file
类直接访问。因此,对于每种情况,您都必须实施特定的方法<代码>getResourceAsStream()为您做一切。
byte[] data = null;
try (InputStream in = Test.class.getResourceAsStream("/Test")) {
if (in == null) {
System.out.println("Resource '/Test' does not exist");
System.exit(-1);
}
data = in.readAllBytes();
}