2013-10-15 3 views
0

Я искал некоторые решения для этой проблемы, но похоже, что это не помогло.Проблемы при попытке загрузить файл из контейнера

Я пытаюсь загрузить файл («soundfile.wav»), чтобы затем использовать его в методе playSound. Я хочу, чтобы он загружался из jarfile при его экспорте, поэтому вы не видите файл при загрузке.

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); 
     } 
    } 
} 

ответ

2

Проблема заключается линия

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

Это прямой доступ к файловой системе. Вместо этого вы должны загрузить ресурс из JAR. Это может быть достигнуто с помощью ClassLoader:

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

Вам будет иметь ресурс, который обеспечивает getInputStream, а также, так что вам не передать файл на PlaySound, но ресурс.

Смежные вопросы