Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 导出的jar会找到一些文件(不是全部),即使路径相同_Java_Eclipse_Jar - Fatal编程技术网

Java 导出的jar会找到一些文件(不是全部),即使路径相同

Java 导出的jar会找到一些文件(不是全部),即使路径相同,java,eclipse,jar,Java,Eclipse,Jar,当我从eclipse运行我的程序时,它显示得很好,Resources\中的图像显示得很好,来自同一位置的声音也显示得很好,并且文本文件被正确地找到。但是,当我导出jar并用7Zip将资源复制到jar中时,图像可以工作,但是声音和文本文件无法找到,即使它们位于同一文件夹中,并且在代码中使用相同的路径查找它们。我可以通过在名为Resources的jar文件旁边放置一个文件夹来解决这个问题,并将所有内容都放在其中,但我想知道为什么仅仅将其放在jar文件中只对图像有效,以及如何使其与文本和音频文件一起工

当我从eclipse运行我的程序时,它显示得很好,Resources\中的图像显示得很好,来自同一位置的声音也显示得很好,并且文本文件被正确地找到。但是,当我导出jar并用7Zip将资源复制到jar中时,图像可以工作,但是声音和文本文件无法找到,即使它们位于同一文件夹中,并且在代码中使用相同的路径查找它们。我可以通过在名为Resources的jar文件旁边放置一个文件夹来解决这个问题,并将所有内容都放在其中,但我想知道为什么仅仅将其放在jar文件中只对图像有效,以及如何使其与文本和音频文件一起工作。 举个例子来说明我的意思:

File inventory = new File("Resources/inv.txt");
threadpath = "Resources/threads.wav";
enemy1 = new Sprite(new Texture("Resources/miniForestGolem.png"));
当我在eclipse中运行它时,这三个都可以正常工作,但是当我导出它并将resources文件夹放入jar文件时,只有图像可以工作

编辑:


我知道如何包含我的资源,并且已经这样做了,我想问的是,即使在添加了一些资源之后,如何/为什么有些资源无法被访问。

好的,从您的评论中,我们可以推断从eclipse执行它和从.jar执行它之间的区别

  • 来自eclipse:它是有效的,因为所有的
    新文件(…)
    都在参考资料中找到了一个实际的文件/
  • 来自.jar:它不会工作,因为在应用程序的执行路径的相对./Resources/path中没有文件
实现这一目标的方法是:

  • 确保Eclipse将Resources/识别为源文件夹(右键单击项目属性、Java构建路径,并将其添加为源路径)
  • 寻找API方法的替代方法,使用
    InputStreams
    而不是
    File
    对象。一旦拥有了它,就可以从类路径中获取所有资源作为InputStreams。如果您在MyClass.java中,请执行以下操作:
    MyClass.class.getClassLoader().getResourceAsStream(“Resources/inv.txt”)
    ,等等

通过这样做,您获得了什么:您将直接从java应用程序类路径检索
InputStreams
读取,而不是在实际操作系统文件上构建的
File
对象。通过这种方式,您可以将它们打包到jar中,或者打包到WEB应用程序中的WEB-INF/classes目录中,或者打包到某些应用程序服务器中的库文件夹中。。。只要它进入应用程序类路径,您就可以在任何地方使用它。如果我必须以可移植和可用的方式打包您的应用程序,我会这样做。

请向我们展示您用于检索资源的代码。您是否使用您的class.class.getClassLoader().getResourceAsStream()来检索它们?文件清单=新文件(“Resources/inv.txt”);对于文本filethreadpath=“Resources/threads.wav”;threadpath=“Resources/threads.wav”;对于wav文件和enemy1=新精灵(新纹理(“Resources/minifestgolem.png”);对于PNG,请添加您在注释中输入的代码作为问题的编辑(而不是无法编译的示例)。包含文件夹层次结构可能也很有用。谢谢!这似乎是可行的,现在我该如何写一个文件,如Resources/inv.txt?现在这是一个不同的问题。使用我刚才给出的解决方案,您无法再次打开、编辑和保存该特定文件。在这种情况下,您应该单独提供该文件,并且可能会显示一个
JFileChooser
或类似的内容,以便用户能够在其硬盘中选择现有的inv.txt是的,这很有意义,也是一个好主意,非常感谢您的帮助!