NetBeans 在 JAR 文件中获取资源?
NetBeans getting resource inside JAR file?
我一直在尝试在我的 Netbeans Java 项目中包含一些图像和声音,并且我搜索了所有 google 寻找答案,所有这些我都尝试并实现了,但有些播放当 运行 音频文件在 Netbeans 中时正确,但当它实际构建为 JAR 文件时不正确。
我在执行 JAR 文件时很难播放声音。据我了解,项目中的 packages/folders 被编译并构建到 JAR 文件中。
任何人都可以指出我如何正确获取资源的正确方向吗?
我的代码如下:
public void SND_REQUEST() {
AudioInputStream clipNameAIS;
Clip clipNameClip = null;
try {
clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/Sounds/Cat.wav"));
clipNameClip = AudioSystem.getClip();
clipNameClip.open(clipNameAIS);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Request Button Sound Not Working");
}
clipNameClip.setFramePosition(0);
clipNameClip.start();
}
资源结构:
更新 - 22:45:
它似乎在 Netbeans 中 运行 时有效,但在可执行 Jar 文件中无效。
两种方法我都试过了,病 post 图片:
该文件肯定在那里,感谢您对 1 Nik 的帮助。
更新代码:
public void SND_REQUEST() {
AudioInputStream clipNameAIS;
Clip clipNameClip = null;
try {
clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav"));
clipNameClip = AudioSystem.getClip();
clipNameClip.open(clipNameAIS);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Request Button Sound Not Working");
}
clipNameClip.setFramePosition(0);
clipNameClip.start();
}
结果:
打印堆栈跟踪:
java.lang.NullPointerException
at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(SoftMidiAudioFileReader.java:134)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1113)
at overtimesystem.OvertimeSystem.SND_REQUEST(OvertimeSystem.java:293)
at overtimesystem.OvertimeSystem$ADD.actionPerformed(OvertimeSystem.java:148)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:702)
at java.awt.EventQueue.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue.run(EventQueue.java:724)
at java.awt.EventQueue.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
更新 - 作品::
啊哈,找到问题了,感谢您的帮助。没想到在 JOptionPane msgbox 中传递 E.printstack 跟踪 lol :) 看来我需要 BufferReader 才能正确流式传输。路径也是正确的。请查看适用于该项目的更新代码 :) 再次感谢!!!
public void SND_REQUEST() {
AudioInputStream clipNameAIS;
Clip clipNameClip = null;
try {
InputStream audioSrc = getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav");
InputStream bufferedIn = new BufferedInputStream(audioSrc);
AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn);
clipNameClip = AudioSystem.getClip();
clipNameClip.open(audioStream);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
return;
}
clipNameClip.setFramePosition(0);
clipNameClip.start();
}
Can anyone point me in the right direction as to how i correctly get a resource?
假设资源在创建的 jar 文件中,您可以将路径定义为相对于包根目录的绝对路径:
clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav"));
注意开头的/
,将路径定义为绝对路径(相对于包根目录)。您还可以定义相对路径(相对于调用 class)。例如,如果调用 class 在 /overtimesystem/Images/
包内,您可以使用 ../Sounds/Cat.wav
访问资源
我一直在尝试在我的 Netbeans Java 项目中包含一些图像和声音,并且我搜索了所有 google 寻找答案,所有这些我都尝试并实现了,但有些播放当 运行 音频文件在 Netbeans 中时正确,但当它实际构建为 JAR 文件时不正确。
我在执行 JAR 文件时很难播放声音。据我了解,项目中的 packages/folders 被编译并构建到 JAR 文件中。
任何人都可以指出我如何正确获取资源的正确方向吗?
我的代码如下:
public void SND_REQUEST() {
AudioInputStream clipNameAIS;
Clip clipNameClip = null;
try {
clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/Sounds/Cat.wav"));
clipNameClip = AudioSystem.getClip();
clipNameClip.open(clipNameAIS);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Request Button Sound Not Working");
}
clipNameClip.setFramePosition(0);
clipNameClip.start();
}
资源结构:
更新 - 22:45:
它似乎在 Netbeans 中 运行 时有效,但在可执行 Jar 文件中无效。 两种方法我都试过了,病 post 图片: 该文件肯定在那里,感谢您对 1 Nik 的帮助。
更新代码:
public void SND_REQUEST() {
AudioInputStream clipNameAIS;
Clip clipNameClip = null;
try {
clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav"));
clipNameClip = AudioSystem.getClip();
clipNameClip.open(clipNameAIS);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Request Button Sound Not Working");
}
clipNameClip.setFramePosition(0);
clipNameClip.start();
}
结果:
打印堆栈跟踪:
java.lang.NullPointerException
at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(SoftMidiAudioFileReader.java:134)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1113)
at overtimesystem.OvertimeSystem.SND_REQUEST(OvertimeSystem.java:293)
at overtimesystem.OvertimeSystem$ADD.actionPerformed(OvertimeSystem.java:148)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:751)
at java.awt.EventQueue.access0(EventQueue.java:97)
at java.awt.EventQueue.run(EventQueue.java:702)
at java.awt.EventQueue.run(EventQueue.java:696)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue.run(EventQueue.java:724)
at java.awt.EventQueue.run(EventQueue.java:722)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:721)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
更新 - 作品::
啊哈,找到问题了,感谢您的帮助。没想到在 JOptionPane msgbox 中传递 E.printstack 跟踪 lol :) 看来我需要 BufferReader 才能正确流式传输。路径也是正确的。请查看适用于该项目的更新代码 :) 再次感谢!!!
public void SND_REQUEST() {
AudioInputStream clipNameAIS;
Clip clipNameClip = null;
try {
InputStream audioSrc = getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav");
InputStream bufferedIn = new BufferedInputStream(audioSrc);
AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn);
clipNameClip = AudioSystem.getClip();
clipNameClip.open(audioStream);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
return;
}
clipNameClip.setFramePosition(0);
clipNameClip.start();
}
Can anyone point me in the right direction as to how i correctly get a resource?
假设资源在创建的 jar 文件中,您可以将路径定义为相对于包根目录的绝对路径:
clipNameAIS = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("/overtimesystem/Sounds/Cat.wav"));
注意开头的/
,将路径定义为绝对路径(相对于包根目录)。您还可以定义相对路径(相对于调用 class)。例如,如果调用 class 在 /overtimesystem/Images/
包内,您可以使用 ../Sounds/Cat.wav