通过终止程序来关闭流-常见做法



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

相关内容

  • 没有找到相关文章

最新更新