我努力解决一个对我来说很奇怪的问题。我在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);
答案 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
。