【问题标题】:Using URL or File (in ImageIO.read)使用 URL 或文件(在 ImageIO.read 中)
【发布时间】:2012-11-05 11:19:30
【问题描述】:

我制作了一个使用多个图像的应用程序。我有 2 种方式来运行我的应用程序:
- 在想法中按run
- 制作一个胖 jar 文件并从控制台运行它java -jar app.jar

如果我想从 Idea 运行它,我必须使用:

BufferedImage backgroundImage = ImageIO.read(new File("res/field.png"));

而不是

BufferedImage backgroundImage = ImageIO.read(getClass().getClassLoader().getResource("res/field.png"));

为什么?我以为他们差不多。我的情况有什么通用方法吗?

【问题讨论】:

    标签: java file url javax.imageio


    【解决方案1】:

    我总是用:

    BufferedImage backgroundImage = ImageIO.read(getClass().getResource("res/field.png"));
    

    它可以在 IDE 和 jar 中工作。 .getResource(...) 返回一个 URL,jar:// 或 file://

    请注意,路径要么以 / 开头(在这种情况下,它相对于包根目录),要么相对于类包 - 如果你的类是 com.example.Test,/res/ 指文件夹 com/example/Test/res/。

    您甚至可以使用静态版本 - YourClassName.class.getResource(...),它允许您轻松访问包树的其他“分支”(您可以使用来自位于不同分支中的类的引用)

    【讨论】:

    • 它可以工作,但我必须将我的图像存储在类文件夹中......还有其他方法可以使用项目根目录吗?
    • 如果您的路径以斜杠开头,则该路径相对于源文件夹的根目录。即,如果您的包是 com.something,您可以访问与 com/ 处于同一级别的文件和文件夹
    • 我需要访问项目的根目录,其中包含 src、res 等...我没明白你的意思。
    • 打包 jar 时,Res 文件夹要么不包含,要么包含在与直接放在 src/ 下相同的级别。如果您希望以统一的方式访问它,则标准是将其保留为 SRC/,因此在 jar 和 IDE 中,文件夹位于同一位置
    • 所以.. 如果我希望以统一的方式访问我的res 文件夹,我必须将其保留在src 文件夹中吗?还有没有别的办法?
    【解决方案2】:

    使用java.io,相对路径取决于当前工作目录。 使用 getResource,您必须在 classpath 中拥有该资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 2016-09-27
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多