Buon giorno a tutti quanti, oggi ho un nuovo quesito da porre.
Ho un programma principale, che al verificarsi di un evento deve riprodurre una serie di suoni, appoggiandosi ad una seconda classe che vi posto sotto. fin qui nessun problema, tutto gestito correttamente. dopo un tempo x variabile però mi dà il seguente errore:
la classe che utilizzo è la seguente:Codice PHP:Exception in thread "Timer-1" java.lang.OutOfMemoryError: Java heap space
at AePlayWave.run(AePlayWave.java:45)
at AePlayWave.initAudio(AePlayWave.java:11)
at MyTimerTask.run(EasyMonitor.java:5109)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Mi sapreste spiegare perchè, ed eventualmente suggerire una soluzione migliore e performante, considerando che il programma potrebbe dover essere attivo parecchie ore consecutive?Codice PHP:import java.io.File;
import java.io.IOException;
import javax.sound.sampled.*;
public class AePlayWave extends Thread {
private String filename;
private int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
public void initAudio(String wavfile) {
filename = wavfile;
run();
}
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;
}
auline.start();
int nBytesRead = 0;
//riga che genera errore
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 {
//System.out.println();
auline.drain();
auline.close();
}
}
}

Rispondi quotando