首页 > 解决方案 > 如何从java中的资源文件夹中读取文件?

问题描述

你好:我在网上没有找到任何有用的东西,所以我问这个问题。如何从资源文件夹中读取文件?我有一个源文件夹 (src) 和一个资源文件夹 (res)。两者都在 Java 中指定为源文件夹。我尝试使用:new File(Main.class.getClassLoader().getResource("shader.glsl").getFile()); 但它没有用。请不要太严格,只要问我是否忘记了要提的内容。

这些是我得到的错误:

java.io.FileNotFoundException: shader.glsl (Das System kann die angegebene Datei nicht finden)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileReader.<init>(Unknown Source)
    at com.leocat.game.shader.ShaderProgram.loadShader(ShaderProgram.java:54)
    at com.leocat.game.shader.ShaderProgram.init(ShaderProgram.java:18)
    at com.leocat.game.shader.StaticShader.init(StaticShader.java:8)
    at com.leocat.game.states.GameState.init(GameState.java:29)
    at com.leocat.game.Game.init(Game.java:91)
    at com.leocat.game.Game.updateGLFW(Game.java:60)
    at com.leocat.game.Game.run(Game.java:132)
    at java.lang.Thread.run(Unknown Source)

提前致谢!

标签: java

解决方案


不要使用FileAPI 来获取资源文件,因为它可能会在 IDE 开发期间工作(因为所有编译的文件都放在磁盘上)并且在构建和部署 JAR 后将无法工作(因为本机文件系统无法访问 JAR 内容)

直接获取资源流,而不是获取文件。无论如何,使用文件 API,您必须FileInputStream在某个时候获得。所以要让它在任何地方都可以使用

InputStream in = Main.class.getClassLoader().getResourceAsStream("shader.glsl");

在这种情况下,shader.glsl必须存在于resource文件夹中(如果您使用的是 maven)或更准确和通用,它必须编译到 JAR 文件的根目录中。如果它嵌套在 JAR 中,您将不得不使用它/path/to/resource/shader.glsl来获取该资源


推荐阅读