从项目Java的子文件夹中加载资源流

3

我很确定这是一个基础问题,但我就是想不通。

我正在尝试加载项目中 images 子文件夹中的一堆图片。

以下是我的代码:

package com.ieml.swt.diploma;

import java.io.InputStream;



public class loadTest
{


    public static void main(String[] args) 
    {

System.out.println(getResourceImage("marks.png"));
    }


    public static InputStream getResourceImage(String fileName) {

        return loadTest.class.getResourceAsStream("./images/" + fileName);
    }
}

我有两个文件夹用于存放源代码和类文件,因此.java文件位于src/com/ieml/swt/diploma文件夹中,而.class文件位于bin/com/ieml/swt/diploma文件夹中。
我正在尝试加载这里的文件,这些文件存在于"loadTest/images"子文件夹中,其中loadTest是我的项目根目录,但它只打印null,就好像没有加载这个文件一样。我是否漏掉了什么?

4个回答

7
loadTest.class.getResourceAsStream("./images/" + fileName);

这将会查找位于bin/com/ieml/swt/diploma/images下的图片,即相对于.class文件而言。如果你不在开头加上点,它将在bin/images中查找。

但无论你做什么,Class.getResourceAsStream()用于从类路径中加载资源,即在bin文件夹内部。没有办法访问外部任何内容,这也不会很有意义,因为它被设计为也适用于JAR文件。通常情况下,您实际上将资源放置在src文件夹中,并在构建期间将其复制到bin中(eclipse会自动执行此操作)。


我在这种情况下考虑了复制文件的想法,但如果我的文件很大,比如每个文件都有5-10 MB呢?这就是为什么我决定将它们放在一个单独的文件夹中而不是bin文件夹中的原因。所以我尝试了loadTest.class.getClassLoader().getResourceAsStream("./images/" + fileName);和loadTest.class.getClassLoader().getResourceAsStream("/images/" + fileName);但都没有成功。请问您能解释一下在最后两种情况下它试图查找文件的位置吗? - usmazat
@usmazat:在这两种情况下,它都会在bin/images中查找。正如我所说的:无论你做什么,getResourceAsStream() 都不能超出类路径范围。复制几个10 MB的文件并不是太大的问题,特别是如果你使用一个好的IDE,通常不需要频繁进行完整构建。 - Michael Borgwardt

1

getResourceAsStream() 方法可以加载classpath资源,请确保图像目录在您的classpath中。


0

我相信Class.getResourceAsStream将采用相对于类文件位置的路径,对于您的情况是classes/com/ieml/swt/diploma文件夹。您可以尝试

  loadTest.class.getClassLoader().getResourceAsStream("../images/" + filename);

我假设你的图片文件夹与你的bin或classes文件夹处于同一级别。基本思想是,您可以通过相对路径从类加载器根目录(即类路径根目录)获取资源。

这并不总是一个好主意,但由于这看起来像是一个学校项目,所以我认为这不会成为问题。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接