(Java)尝试使用getResourceAsStream()从JAR文件加载剪辑,但仅适用于我的IDE

(Java)尝试使用getResourceAsStream()从JAR文件加载剪辑,但仅适用于我的IDE,java,swing,jar,Java,Swing,Jar,我试图从我的JAR文件加载一个剪辑,但它只在我的IDE(NetBeans)中工作,而在我运行它的JAR可执行文件时不工作 下面是我正在使用的返回剪辑的代码: public static Clip getClipFromJar(String filePath) { try { Clip clip = AudioSystem.getClip(); clip.open(AudioSystem.getAudioInputStream(FileLoader.clas

我试图从我的JAR文件加载一个剪辑,但它只在我的IDE(NetBeans)中工作,而在我运行它的JAR可执行文件时不工作

下面是我正在使用的返回剪辑的代码:

public static Clip getClipFromJar(String filePath) {
    try {
        Clip clip = AudioSystem.getClip();
        clip.open(AudioSystem.getAudioInputStream(FileLoader.class.getResourceAsStream(filePath)));
        return clip;
    } catch (Exception error) {
        System.exit(-1);
        return null;
    }
}
我真的被卡住了,使用getResourceAsStream()似乎可以处理其他事情,比如图像,但它不适用于获取剪辑

谢谢大家的帮助!我从你们那里学到的技巧对一般编程都很有用,所以谢谢!)

getResourceAsStream()
在类路径上查找其资源,从类本身的位置开始——因此,如果您的片段(或任何资源)与类位于同一文件夹中,它将在那里找到它。如果它不在那里,您必须确保它在类路径中的某个位置,这听起来可能是IDE环境和程序运行时之间的区别

看看你的“文件路径”——如果它以斜杠开头,当然是绝对的,等等。;我假设你知道绝对路径和相对路径


调试建议——消除所有调用的“堆叠”。打一个电话获取流;再次调用以获取音频输入流,第三次调用以打开它。然后,您至少可以放入跟踪语句以查看其中哪一个出现故障(因为您无法在IDE之外进行调试,而且IDE也没有出现故障)。

获取URL,处理
AudioInputStream
AudioSytem
,然后返回
剪辑。然后可以像
clip.start()一样启动
clip

try{ 
    URL soundURL = getClass().getResource(filePath); 
    AudioInputStream AIS = AudioSystem.getAudioInputStream(soundURL); 
    Clip clip = AudioSystem.getClip(); 
    clip.open(AIS);
    return clip;
} catch (Exception ex) {
    ex.printStackTrace();
}

注意:我试过这段代码,它在IDE和外部都能正常工作

@asdf特别是如果它应该在jar中,请使用
jar t
查看jar,以确保它在jar中,并且使用您试图打开的路径名。此外,如果你得到一个异常,它几乎总是包含有用的信息;不要扔掉它,把它输出到你能看到的地方(可能但不一定是
System.out
)。@dave我不确定jar t是什么意思,但我知道我试图访问的声音文件在jar文件中(我用WinRAR来确保)。@arcy是的,我知道绝对路径和相对路径之间的区别。另外,我会记住调试的事情!如果可以的话,我一直试图缩短我的代码,但我想情况并非总是如此。xD谢谢:)“缩短”代码——如果,f这么说,你的意思是在一行上放上也可以放在3-4-8行中的东西——就其本身而言,不应该是一个目标。代码被读的次数比被写的次数多;它应该写得便于阅读。如果一行的版本更容易阅读,那就好了,但很少有这么简单。当你得到stacktrace时,它只能告诉你线路号,而不是线路上哪个呼叫引发了异常我们似乎还没有回答你的问题;转储您的文件路径并让我们知道它是什么。@asdf
jar
是JDK实用程序,它对jar文件执行各种操作,如创建、修改、提取和列出,由您指定的选项控制
t
是列出现有jar内容的选项。换句话说,在jar文件上运行带有
t
选项的
jar
程序(由
f
选项指定),以查看并确认文件中所需条目的(确切)名称。将
}catch(异常错误){
更改为
}catch(异常错误){e.printStackTrace();
。现在,我们只能猜测它失败的原因,(我有一个理论,但stacktrace将证明或反驳它。)@MadProgrammer我的文件路径设置为“/Resources/bgm/title screen.wav”谢谢!我会试试这个。如果它对我不起作用,那肯定是我这边的文件定位错误。我使用的是静态类,所以我不得不将getClass()更改为MyClass.class。不过效果很好,非常感谢!:)close()一旦你使用完剪辑,它将释放资源。如果你处理的是大文件,这一点非常重要。如果我更改了剪辑的引用,我仍然需要关闭它,对吗?