Java 从Main.class.getResource()获取文件

Java 从Main.class.getResource()获取文件,java,file,jar,javasound,getresource,Java,File,Jar,Javasound,Getresource,我正在用Java做一个小游戏。对于这个游戏,我只是添加了声音。所以我想把我所有的图像和音频文件都放在罐子里。对于图片,这很简单: new ImageIcon(Main.class.getResource("images/machgd2.png")).getImage() 但对于音频,它只在Eclipse中运行程序时才起作用,而不是从jar运行。我使用: File soundFile = new File(Main.class.getResource(filename).getFile());

我正在用Java做一个小游戏。对于这个游戏,我只是添加了声音。所以我想把我所有的图像和音频文件都放在罐子里。对于图片,这很简单:

new ImageIcon(Main.class.getResource("images/machgd2.png")).getImage()
但对于音频,它只在Eclipse中运行程序时才起作用,而不是从jar运行。我使用:

File soundFile = new File(Main.class.getResource(filename).getFile());
那么如何从.jar文件中获取这个文件呢

更新:

好的,谢谢安德鲁,它成功了!
为了播放声音,我使用了我在网上找到的一个类,我发现这个类只使用文件来获取音频输入流,所以我放弃了文件的东西。

当它在jar文件中时,它不是文件系统中的文件,是吗?您必须将文件从jar文件复制到某个临时位置,或者使用不需要文件的API(例如,只需要
InputStream
URL
,这两种API都可以通过
getResourceAsStream
getResource
从jar文件轻松获得)


您还没有显示您在哪里使用
声音文件
-如果您向我们显示您尝试使用的API,我们可以尝试建议适当的替代方案。

当它位于jar文件中时,它不是文件系统中的文件,是吗?您必须将文件从jar文件复制到某个临时位置,或者使用不需要文件的API(例如,只需要
InputStream
URL
,这两种API都可以通过
getResourceAsStream
getResource
从jar文件轻松获得)

您还没有显示您在哪里使用
声音文件
-如果您向我们显示您尝试使用的API,我们可以尝试建议一个合适的替代方案。

请参见“播放
剪辑

import java.net.URL;
import javax.swing.*;
import javax.sound.sampled.*;

public class LoopSound {

    public static void main(String[] args) throws Exception {
        URL url = new URL(
            "http://pscode.org/media/leftright.wav");
        Clip clip = AudioSystem.getClip();
        // getAudioInputStream() also accepts a File or InputStream
        AudioInputStream ais = AudioSystem.
            getAudioInputStream( url );
        clip.open(ais);
        // loop continuously
        clip.loop(-1);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // A GUI element to prevent the Clip's daemon Thread
                // from terminating at the end of the main()
                JOptionPane.showMessageDialog(null, "Close to exit!");
            }
        });
    }
}
您可能注意到,它使用的是
URL
(由
getResource()
返回)而不是
文件。该方法被重载以同时接受
文件
输入流
,但我最常用的是基于
URL
的版本。

请参见“从此处播放
剪辑

import java.net.URL;
import javax.swing.*;
import javax.sound.sampled.*;

public class LoopSound {

    public static void main(String[] args) throws Exception {
        URL url = new URL(
            "http://pscode.org/media/leftright.wav");
        Clip clip = AudioSystem.getClip();
        // getAudioInputStream() also accepts a File or InputStream
        AudioInputStream ais = AudioSystem.
            getAudioInputStream( url );
        clip.open(ais);
        // loop continuously
        clip.loop(-1);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // A GUI element to prevent the Clip's daemon Thread
                // from terminating at the end of the main()
                JOptionPane.showMessageDialog(null, "Close to exit!");
            }
        });
    }
}

您可能注意到,它使用的是
URL
(由
getResource()
返回)而不是
文件。该方法被重载以同时接受
文件
输入流
,但我最常用的是基于
URL
的版本。

只需要输入流或URL的版本,因为getResource()返回URL@JBNizet:是的,这就是为什么它只是一个“例如”-我不想给出太多的选项。将进行编辑,因为URL在这里可能更有用…只需要InputStream或URL,因为getResource()返回URL@JBNizet:是的,这就是为什么它只是一个“例如”-我不想给出太多的选项。不过会编辑,因为URL在这里可能更有用…“好的,开始工作了”,很高兴听到这个消息。“谢谢安德鲁!”很高兴听到这个消息。“好的,开始工作了。”。“谢谢安德鲁!”请随意回答。