通过终止程序关闭流 - 通常的做法?

时间:2015-09-18 08:12:18

标签: java io stream

我有一个实现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();
        }
    }
}

4 个答案:

答案 0 :(得分:2)

undefined方法中打开流并在finally子句中关闭它们,或者实现run()以便您的类可以用作资源。

答案 1 :(得分:1)

直接回答你的问题:不,这不是常见的练习,而是不好的做法!

一般来说,获取资源并不明确释放资源是不好的做法。特别是对于流 - 可能有文件句柄,各种各样的东西。打开它们然后扔掉它们可能会起作用;但正如所说:只是不好的做法。并注意:对于任何旨在运行更长时间的程序......它不仅仅是好的"要释放资源,这是绝对的必须

特别是当人们认为Java 7几年前引入了try-with-resources时。

答案 2 :(得分:0)

我建议在使用后释放内存/资源,为此,存在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();
    }
}

答案 3 :(得分:0)

请注意:要确保清理所有内容,您可能需要将其编写为:

public interface HandlerExceptionResolver {
    ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}