Witam.
Napisałem program m.in. który odtwarza pliki *.wav, jeżeli wykonuje program w kompilatorze tj. w NetBeans to działa bezproblemowo, problem jest gdy chce go uruchomić bezpośrednio z pliku jar, program zgłasza wyjątek przy użyciu metody getResourceAsStream(strFilename), metoda zwraca wartość null. Wydaje mi się że problem wynika ze złej ścieżki dostępu do pliku wav.
W programie używam także plików png, png jak odpale plik jar działają, pliki *wav znajdują się w tym samym miejscu do pliki *png.
klasa odpowiedzialna za odtwarzanie pliku *wav
class MakeSound extends Thread implements LineListener {
private final int BUFFER_SIZE = 128000;
private File soundFile;
private AudioInputStream audioStream;
private AudioFormat audioFormat;
private SourceDataLine sourceLine;
private String strFilename;
private boolean can_play;
private InputStream s_stream;
public MakeSound(String filename )
{
strFilename = filename;
can_play = false;
}
public void run()
{
while(true)
{
try
{
TimeUnit.NANOSECONDS.sleep(1);
}
catch (InterruptedException ex)
{
Logger.getLogger(Cnt_Thread.class.getName()).log(Level.SEVERE, null, ex);
}
if(can_play)
{
try
{
s_stream = this.getClass().getResourceAsStream(strFilename); strFilename - scieżka dostępu do pliku
// Tutaj program się wysypuje,dlatego że s_stream = null
}
catch(NullPointerException e)
{
}
try
{
audioStream = AudioSystem.getAudioInputStream(s_stream);
}
catch (Exception e)
{
e.printStackTrace();
System.exit(1);
}
audioFormat = audioStream.getFormat();
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
try {
sourceLine = (SourceDataLine) AudioSystem.getLine(info);
sourceLine.open(audioFormat);
} catch (LineUnavailableException e) {
e.printStackTrace();
System.exit(1);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
sourceLine.addLineListener(this);
sourceLine.start();
int nBytesRead = 0;
byte[] abData = new byte[BUFFER_SIZE];
while (nBytesRead != -1) {
try {
nBytesRead = audioStream.read(abData, 0, abData.length);
} catch (IOException e) {
e.printStackTrace();
}
if (nBytesRead >= 0) {
@SuppressWarnings("unused")
int nBytesWritten = sourceLine.write(abData, 0, nBytesRead);
}
}
sourceLine.drain();
sourceLine.close();
stop_sound();
}
}
}
wywołanie w metodzie main
move_drums = new MakeSound("res/sound/sound.wav");
Jak rozwiązać ten problem?