尝试从 jar 内部加载文件时出现问题



我一直在寻找这个问题的一些解决方案,但似乎没有任何帮助。

我正在尝试加载一个文件("soundfile.wav"),以便我可以在我的 playSound 方法中使用它。我希望它在导出时从jar文件加载,这样您在下载时看不到该文件。

package soundplayer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.sound.sampled.*;
import javax.swing.*;
import java.io.*;
public class SoundPlayer extends JFrame
{
    private static final long serialVersionUID = 1L;
    public String code = "up up down down left right left right b a";
    static SoundPlayer soundPlayer;
    public static void main(String[] args)
    {
        soundPlayer = new SoundPlayer();
        soundPlayer.setVisible(true);
    }
    public SoundPlayer()
    {
        //Look and feel
        String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
        try {
        UIManager.setLookAndFeel(lookAndFeel);
        } catch (ClassNotFoundException | InstantiationException| IllegalAccessException | UnsupportedLookAndFeelException e2) {e2.printStackTrace();}
        //Window Stuff
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(50, 50, 250, 80);
        setTitle("Sound Player Test");
        getContentPane().setLayout(null);
        //Components
        final JTextField typingArea = new JTextField(1);
        typingArea.setText("up up down down left right left right b a");
        typingArea.setBounds(10, 10, 100, 25);
        getContentPane().add(typingArea);
        final JLabel label = new JLabel("Now playing: ");
        label.setBounds(10, 40, 400, 25);
        label.setVisible(false);
        getContentPane().add(label);
        JButton button = new JButton("Check");
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e) 
            {
                if(typingArea.getText().equals(code))
                {
                    setBounds(50, 50, 250, 110);
                    label.setVisible(true);
                    File file = new File("sound.wav");
                    playSound(file);
                }
            }
        });
        button.setBounds(125, 10, 100, 25);
        getContentPane().add(button);
    }
    public static void playSound(File file)
    {
        try
        {
            Clip clip = AudioSystem.getClip();
            clip.open(AudioSystem.getAudioInputStream(file));
            clip.start();
        }
        catch (Exception exc)
        {
            exc.printStackTrace(System.out);
        }
    }
}

问题是这条线

File file = new File("sound.wav");

这是直接访问文件系统。相反,您想要从 JAR 加载资源。这可以使用类装入器来完成:

getClass().getResource("sound.wav");

然后,您将拥有一个提供getInputStream的资源,因此您不会将文件传递给playSound,而是将资源传递给该资源。

最新更新