Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Emissione di suoni[Java]

    Salve a tutti, io lavoro con eclipse, e mi sono inceppato in un piccolo problemino con questo pezzo di codice

    codice:
    package Codice;
    
    import javax.sound.sampled.*;
    import java.io.*;
    import javax.swing.JOptionPane;
    
    public class Suoni {
    
    	public Suoni(String nome)  {
    		
    		try{
    			File file = new File("");
    			AudioInputStream in = AudioSystem.getAudioInputStream(file);
    			Clip clip = AudioSystem.getClip();
    			clip.open(in);
    			clip.start();
    		}catch(IOException e){	
    			
    			JOptionPane.showMessageDialog(null, "Errore");
    			
    		}catch(UnsupportedAudioFileException e){
    			
    			JOptionPane.showMessageDialog(null, "Errore");
    			
    		}catch(LineUnavailableException e){
    			
    			JOptionPane.showMessageDialog(null, "Errore");
    			
    		}
    		
    	}
    
    }
    dunque questo è un codice che ho trovato su internet, sinceramente ora non mi ricordo dove quindi non posso postare il link comunque, quando dobbiamo inizializzare la variabile file riscontro un problema, se il file lo ricerco dal computer quindi un esempio C:/users/desktop.. ec... il file lo apre perfettamente, io ho creato un package chiamato Suoni e ho messo al so interno il file audio interessati, se provo a scrivere questo per esempio mi da errore con i JOptionPane new File("/Suoni/nomefile.wav"); esiste un modo per avviare il file dal mio package all'interno del file jar? inoltre un'altra piccola curiosità perchè sono nuovo in questo settore, io avvio il file utilizzando il comando clip.start(); è necessario poi utilizzare clip.close(); per non provocare sovraccarico di memoria? o non è necessario?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Emissione di suoni[Java]

    Originariamente inviato da Scofield095
    se il file lo ricerco dal computer quindi un esempio C:/users/desktop.. ec... il file lo apre perfettamente, io ho creato un package chiamato Suoni e ho messo al so interno il file audio interessati, se provo a scrivere questo per esempio mi da errore con i JOptionPane new File("/Suoni/nomefile.wav"); esiste un modo per avviare il file dal mio package all'interno del file jar?
    Se usi java.io.File o comunque se passi a qualunque API un "filename" (anche in String), questi sono sul file-system e possono essere: assoluti oppure relativi e in quest'ultimo caso sono "relativi" alla directory che è "corrente" quando la JVM è stata avviata.

    Se in C:\Prove hai un suono.wav e un app.jar (che carica il file specificando solo "suono.wav") e avendo come directory "corrente" C:\Prove lanci:

    java -jar app.jar

    questo funziona perfettamente, C:\Prove + suono.wav lo trova.

    Se hai come directory corrente C:\ e lanci:

    java -jar Prove\app.jar

    La applicazione parte ma il file non lo trova, perché il filename "suono.wav" è relativo alla directory corrente che ora è C:\

    Credo ti sia chiaro ora che specificare file con percorsi "relativi" implica il fatto di dover conoscere e/o poter controllare quale è la directory corrente.
    E mettere path "assoluti" nei sorgenti è ancora peggio (e non va fatto) perché la tua applicazione potrebbe al limite essere valida solo sulla tua macchina e basta.

    Se non vuoi implicazioni con la directory corrente e vuoi magari poter leggere un file dentro lo stesso jar della applicazione, devi trattare il file come "risorsa" e usare i getResource/getResourceAsStream di java.lang.Class.

    Questi si basano sullo stesso criterio che la JVM usa per trovare le classi, ovvero cercando le risorse "lungo il classpath".

    Se hai una classe com.esempio.Prova e da qualche parte fai:

    InputStream is = Prova.class.getResourceAsStream("suono.wav");

    La JVM cerca un com/esempio/suono.wav solo che la cartella "com" non centra nulla con la directory corrente, perché viene cercata alla "radice" di tutte le cartelle/jar eventualmente presenti in classpath.

    Originariamente inviato da Scofield095
    è necessario poi utilizzare clip.close(); per non provocare sovraccarico di memoria? o non è necessario?
    Sì, sarebbe meglio che lo chiudi. Visto che start è "asincrono", puoi registrare un LineListener sul Clip e all'evento che ha getType() a LineEvent.Type.STOP chiudi il Clip.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie 1000 mi sei tornato utilissimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.