getResourceAsStream在图像路径上返回null

时间:2014-04-01 03:19:19

标签: java jar

我已经阅读了很多关于这个问题的其他问题和资源,但我仍然无处可去。前几天我问了一个关于这个的问题,并再次提到了其他问题。也许我只是没有得到它,但我一直在尝试为我的java项目getResourceAsStream 2天,所以我可以让jar工作无济于事。

我的项目中有两个地方会导致问题。我的缓冲图像类:

public static BufferedImage loadImage(String fileName) {
        try { 
            File file = new File(fileName);           
            //System.out.println("Is the file there for " + fileName + " : "  + file.exists());
            BufferedImage sub = ImageIO.read(file); 
            return toCompatibleImage(sub);
        }
        catch (IOException e) { 
            System.out.println("Image load failed: " +fileName);
//          e.printStackTrace();
            return null;
        }
    }

我的GifHandler课程:

public enum GifHandler {
    Mouse("Resources/Images/cursor/", ".gif", 45, 45),
    Coaster("Resources/Images/animatedCoaster/", ".gif", Carnies.PWIDTH, Carnies.PHEIGHT/2),
    Fire("Resources/Images/fire/", ".gif", 100, 100);

    public BufferedImage[] sequence;
    int playing = 0;

    GifHandler(String dir_name, String type, int width, int height) {
        int numImgs = new File(dir_name).list().length;
        if (sequence == null) {
            sequence = new BufferedImage[numImgs];
            for (int i = 0; i < numImgs; i++) {
                sequence[i] = ImageLoader.loadScaledImage(dir_name + i + type, width, height, false);
            }
        }
    }
}

我已将resources文件夹添加到构建路径库中。我的项目文件结构如下: &#34;项目/ SRC / defaultpackage /类文件&#34; &#34;项目/资源/图片/图像文件中&#34; 我想明确地从类文件中引用图像文件。 我尝试过更改为getResourceAsStream,但始终在路径上获取null。

例如,如图所示更改imageLoader类,返回null:

String path = ImageLoader.class.getResourceAsStream(fileName).toString(); 其中fileName作为&#34; resource / Images / alphabet.png&#34;传入例如。 我已经尝试了添加和删除/的每个组合,只引用/alphabet.png而没有引导文件夹等。我在我的绳子的最后。请帮忙。如果我没有链接足够的代码来理解它,那么它的回购是在github.com/madamsmall/carnies

1 个答案:

答案 0 :(得分:3)

  

我的项目文件结构如下:“Project / src / defaultpackage / classfiles”“Project / resources / Images / imagefiles”

当您使用getClass().getResourceAsStream()时,程序将从调用类的位置开始搜索。因此,通过传递"resource/Images/alphabet.png",您说resources位于classfiles,而不是/。要修复它,您需要允许遍历搜索。您可以通过在路径中添加getClass().getResourceAsStream("/resource/Images/alphabet.png")来实现。所以/

另一种选择是使用类加载器,它将从根搜索。在这种情况下,您不需要额外的getClass().getClassLoader().getResourceAsStream("resource/Images/alphabet.png");,并且您当前的路径是正确的。 getClass()

注意: ImageLoader.classgetClass()在大多数情况下都是可以互换的,如果您想知道我使用import java.awt.Image; import java.io.*; import javax.imageio.ImageIO; import javax.swing.*; public class ImageLoader { public static void main(String[] args) throws IOException { InputStream is = ImageLoader.class.getResourceAsStream("/resource/images/alphabet.png"); Image image = ImageIO.read(is); JLabel label = new JLabel(new ImageIcon(image)); JOptionPane.showMessageDialog(null, label); } } 的原因


<强>更新

将此示例用作测试

resource

更新2

我刚注意到src不在private String[] getFileNames() throws URISyntaxException { URL url = getClass().getResource("/resources/images/"); File file = new File(url.toURI()); String[] fileNames = file.list(); for (String s : fileNames) { System.out.println(s); } return fileNames; } 中,因此当它构建时,它会内置到类路径中。


更新3

如果要获取所有文件名的列表,可以使用此方法。然后,您可以使用这些文件名执行任何操作。

{{1}}