FileNotFoundException虽然文件已就位且路径正确

时间:2015-07-09 10:41:48

标签: java

我努力解决一个对我来说很奇怪的问题。我在StackOverflow上看到了至少五个类似的主题,但他们都没有提供答案。但对于问题本身:我想阅读应用程序启动时的文件。当我在IDE(IntelliJ Idea)中运行应用程序时,一切正常。虽然当我使用Gradle Java构建它时会抛出FileNotFoundException:

java.io.FileNotFoundException: file:/home/user/IdeaProjects/time-keeper/build/libs/time-keeper-0.7-beta.jar!/data.csv (No such file or directory)

文件的路径是正确的,文件存在,jar具有适当的权限。 声明:

File dataFile = new File(ClassLoader.getSystemResource("data.csv").getFile());
Handle<TimeTask> dataHandle = new FileHandle(dataFile);

1 个答案:

答案 0 :(得分:11)

只要data.csv是一个文件本身,一切正常。只要您在IDE中运行应用程序,这可能就是这样。在那种情况下,

ClassLoader.getSystemResource("data.csv").getFile()

返回文件系统上文件的路径。但是,一旦gradle生成包含文件data.csv的JAR,上面的调用就会生成

/home/user/IdeaProjects/time-keeper/build/libs/time-keeper-0.7-beta.jar!/data.csv

虽然这在技术上是正确的路径(JAR中的data.csv),但它不再是有效的文件系统路径。 java.io.File实用程序无法处理归档中的任意URL或文件。 data.csv根本不是File,而是归档中的条目。

如果您想阅读“文件”,可以使用getSystemResourceAsStream打开资源(无论是否是“真实”文件)InputStream