我有一个实现Runnable
的Audioplayer。它开始一个声音,然后结束。这是一种常见的做法,还是我应该自己关闭它,就像最后一种方法,目前没有使用。在我看来,让它终止并自动强制关闭其余部分是个好主意。
public class AudioPlayer implements Runnable {
AudioInputStream audioIn;
Clip clip;
public AudioPlayer (String res) {
try {
URL url = this.getClass().getResource(res);
audioIn = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
clip.open(audioIn);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
clip.start();
}
public void close() throws IOException {
try {
clip.close();
audioIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
打开run()
方法中的流并在finally子句中关闭它们,或者实现AutoCloseable
,以便您的类可以用作资源
直接回答你的问题:不,那不是常见的做法,而是不好的做法!
一般来说,获取资源而不显式地释放它们是不好的做法。特别是对于流——可能会有文件句柄,诸如此类的东西。只是打开它们然后扔掉可能有用;但如前所述:这是一种糟糕的做法。注意:对于任何一种旨在运行较长时间的程序……释放资源不仅"好",而且绝对是必须这样做。特别是考虑到Java 7在几年前就引入了"带资源尝试"。
我建议在使用它之后释放内存/资源,为此,存在finally
块:
public AudioPlayer (String res) {
try {
URL url = this.getClass().getResource(res);
audioIn = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
clip.open(audioIn);
} catch (Exception e) {
e.printStackTrace();
} finally {
close();
}
}
但是,如果你的音频流在完成后自动关闭,如果没有错误,你不需要强制关闭:
public AudioPlayer (String res) {
try {
URL url = this.getClass().getResource(res);
audioIn = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
clip.open(audioIn);
} catch (Exception e) {
e.printStackTrace();
close();
}
}
注意:为了确保清理所有内容,您可能希望这样写:
public void close() throws IOException {
try {
clip.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
audioIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}