getResource () à l'intérieur de.classe de lecteur de son wav


Application GUI simple pour lire des clips sonores après que l'utilisateur en ait sélectionné un avec un bouton radio et appuyé sur le bouton de lecture. Après le nettoyage et la construction, l'exécution à partir du fichier JAR ne produit aucun son lorsqu'un clip est sélectionné et que le bouton de lecture est enfoncé.

Conditions: NetBeans ID, les sons jouent avec succès dans l'E pathé vers le paquet, chemin vers .les fichiers wav dans JAR sont corrects, les fichiers sont dans le JAR exécutable dans le répertoire correct, utilise 2 classes: une pour l'interface graphique et une .classe de gestionnaire wav (les deux fonctionnent avec succès dans l'E. Plus de détails dans les captures d'écran. Je pense qu'il devrait y avoir un appel de méthode getResource() dans le lecteur calss mais je ne sais pas comment l'écrire.

Répertoire du Projet

Sortie CMD après le chargement du pot et tentative de lecture du son

Répertoire du contenu à l'intérieur du POT en utilisant WINRAR pour ouvrir

L'extrait de code utilisé pour appeler la ressource à partir de la classe GUI. La base est nouveau joueur ("whateverthefilepathis").commencer(). (cela fonctionne bien dans l'E, donc pas de problème là-bas):

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    if (jRadioButton1.isSelected()){
            URL file = QuotesButtonUI.class.getResource("/my/sounds/fear_converted.wav");
            new Player (file.getFile()).start();
    }
    else if (jRadioButton2.isSelected()){

            URL file = QuotesButtonUI.class.getResource("/my/sounds/initiated_converted.wav");
            new Player (file.getFile()).start();
    }

C'est la classe de joueur utilisée pour traiter le .WAV. Dans la classe GUI, j'utilise le nouveau lecteur ().start() de l'appel. Je pense qu'il devrait y avoir un appel getResource() dans la classe Player mais je ne sais pas avec certitude.

package my.quotesbutton;

import java.io.File; 
import java.io.IOException; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.FloatControl; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 
import javax.sound.sampled.UnsupportedAudioFileException; 

public class Player extends Thread { 

    private String filename;

    private Position curPosition;

    private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb 

    enum Position { 
        LEFT, RIGHT, NORMAL
    };

    public Player(String wavfile) { 
        filename = wavfile;
        curPosition = Position.NORMAL;
    } 

    public Player(String wavfile, Position p) { 
        filename = wavfile;
        curPosition = p;
    } 

    public void run() { 

        File soundFile = new File(filename);
        if (!soundFile.exists()) { 
            System.err.println("Wave file not found: " + filename);
            return;
        } 

        AudioInputStream audioInputStream = null;
        try { 
            audioInputStream = AudioSystem.getAudioInputStream(soundFile);
        } catch (UnsupportedAudioFileException e1) { 
            e1.printStackTrace();
            return;
        } catch (IOException e1) { 
            e1.printStackTrace();
            return;
        } 

        AudioFormat format = audioInputStream.getFormat();
        SourceDataLine auline = null;
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

        try { 
            auline = (SourceDataLine) AudioSystem.getLine(info);
            auline.open(format);
        } catch (LineUnavailableException e) { 
            e.printStackTrace();
            return;
        } catch (Exception e) { 
            e.printStackTrace();
            return;
        } 

        if (auline.isControlSupported(FloatControl.Type.PAN)) { 
            FloatControl pan = (FloatControl) auline
                    .getControl(FloatControl.Type.PAN);
            if (curPosition == Position.RIGHT) 
                pan.setValue(1.0f);
            else if (curPosition == Position.LEFT) 
                pan.setValue(-1.0f);
        } 

        auline.start();
        int nBytesRead = 0;
        byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];

        try { 
            while (nBytesRead != -1) { 
                nBytesRead = audioInputStream.read(abData, 0, abData.length);
                if (nBytesRead >= 0) 
                    auline.write(abData, 0, nBytesRead);
            } 
        } catch (IOException e) { 
            e.printStackTrace();
            return;
        } finally { 
            auline.drain();
            auline.close();
        } 

    } 
} 
Author: Joel, 2013-11-15

1 answers

Vous ne pouvez pas accéder à quoi que ce soit dansun fichier jar en utilisant l'API java.io.File, simplement parce que les éléments dans un jar ne sont pas des fichiers .

Vous devez en effet, comme vous le soupçonniez, utiliser une méthode getResource () (ou getResourceAsStream ()): http://docs.oracle.com/javase/tutorial/deployment/webstart/retrievingResources.html

Cela peut sembler contre-intuitif au début, mais getResource() fonctionne avec files ainsi que jars (ou même distant ressources dans le cas d'une application Web, comme dans le tutoriel lié), le ClassLoader traitera les détails sales de la façon dont la ressource est physiquement accessible. En bref: n'utilisez jamais l'API de fichiers pour les ressources - les ressources ne doivent être accessibles qu'à l'aide de l'API de ressources.

 1
Author: Durandal, 2013-11-15 18:31:43