Java 读取Jar中的文件(ZipInputStream等)

Java 读取Jar中的文件(ZipInputStream等),java,file,jar,embedded-resource,Java,File,Jar,Embedded Resource,我正在用java编写一个游戏,正如您在编写代码时所期望的那样,一切都或多或少运行良好,但我遇到的一个问题是将图像和声音文件读取到游戏中。我编写了一个在Eclipse中运行得非常好的方法,但是当我尝试在一个可运行的jar(使用Eclipse导出)中测试它时,我的游戏就会在加载屏幕上卡住,因为它无法读取文件。我意识到问题在于不能在Jar中创建文件对象,必须使用流。这可能有效,但图像/声音位于文件夹中,我不太确定如何读取包含流的文件夹中的文件(即不知道文件的数量)。因此,我尝试使用ZipInputSt

我正在用java编写一个游戏,正如您在编写代码时所期望的那样,一切都或多或少运行良好,但我遇到的一个问题是将图像和声音文件读取到游戏中。我编写了一个在Eclipse中运行得非常好的方法,但是当我尝试在一个可运行的jar(使用Eclipse导出)中测试它时,我的游戏就会在加载屏幕上卡住,因为它无法读取文件。我意识到问题在于不能在Jar中创建文件对象,必须使用流。这可能有效,但图像/声音位于文件夹中,我不太确定如何读取包含流的文件夹中的文件(即不知道文件的数量)。因此,我尝试使用ZipInputStream重写该方法(我在发布之前寻找解决方案时发现了这一点)。这就是该方法现在的样子:

imageMap = new HashMap<String, BufferedImage>();
    String imagebase = "/images";
    CodeSource src = PlatformerCanvas.class.getProtectionDomain().getCodeSource();
    if(src != null)
    {
        URL jar = src.getLocation();
        try
        {
            ZipArchiveInputStream zip = new ZipArchiveInputStream(jar.openStream());
            ZipArchiveEntry ze = null;
            while((ze = zip.getNextZipEntry()) != null)
            {
                System.out.println(ze.getName());
                if(ze.getName().startsWith(imagebase) && ze.getName().endsWith(".png"))
                {
                    loading++;
                    imageMap.put(ze.getName().replaceAll(imagebase + "/", ""), ImageIO.read(this.getClass().getResource(ze.getName())));
                }
            }
            zip.close();
            System.out.println("Finished Loading Images");
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
所以我的问题是:为什么当前的方法不起作用,我如何修复它?或者,如何以不同的方式加载图像/声音? 我研究了许多其他问题,尝试了许多不同的方法,但没有一种方法对我有效

或者,如何以不同的方式加载图像/声音

一种常见的技术是在Jar中的已知位置包含资源列表。阅读列表,然后迭代行(假定每个资源一行)&以这种方式读取路径

或者,如何以不同的方式加载图像/声音


一种常见的技术是在Jar中的已知位置包含资源列表。阅读列表,然后迭代行(假定每个资源一行)并以这种方式读取路径。

您的游戏基于GUI,对吗?不100%确定您的意思,但我使用缓冲区策略在画布上绘制@JtheRockerWhat's name of jar/zip file you want extract?如果您将所有内容嵌入jar中,为什么不将资源保存在resource文件夹中?您的游戏基于GUI,对吗?不是100%确定您的意思,但我使用缓冲区策略在画布上绘制@JtheRockerWhat's name of jar/zip file you want extract?如果您将所有内容都嵌入到jar中,为什么不将资源保存在resource文件夹中?我可能最终会这样做,但是有没有办法让方法检查我是从jar还是从Eclipse运行它(检查单词“jar”的路径有效吗?)所以我做的是制作了一个小类,将所有图像和声音“打包”到一个.txt文件中,如果游戏是从Jar运行的(if(checkJar.rsrc)),该文件将被读取。我现在有另一个问题,但这个问题已经解决了。谢谢:)我可能会这样做,但是有没有办法让这个方法检查我是从jar还是从Eclipse运行它(检查“jar”这个词的路径有效吗?),所以我做了一个小类,将所有图像和声音“打包”到一个.txt文件中,如果游戏是从jar运行的(如果(checkJar.rsrc))。我现在有另一个问题,但这个问题已经解决了。谢谢:)
Jar
/game/gameClasses
/images/imageFiles
/sounds/soundFiles
/whateverOtherFoldersEclipseCreated