Java 使用 Clip 和 Try - with - resources 块,结果没有声音

Posted

技术标签:

【中文标题】Java 使用 Clip 和 Try - with - resources 块,结果没有声音【英文标题】:Java Use a Clip and a Try - with - resources block which results with no sound 【发布时间】:2014-08-29 08:59:42 【问题描述】:

我正在为我的学校项目重写我的 AudioManager 类,但遇到了问题。我的教授告诉我使用 Try-with-resources 块加载我的所有资源,而不是使用 try/catch(参见下面的代码)。我正在使用 javax.sound.sampled.Clip 中的 Clip 类,如果我不 close() Clip,一切都与我的 PlaySound(String path) 方法完美配合,该方法使用 try/catch/。我知道如果我关闭()剪辑我不能再使用它了。我已阅读有关 Clip 和 Try-with-resources 的 Oracle 文档,但找不到解决方案。所以我想知道的是:

是否可以使用 Try-with-resource 块在剪辑关闭之前播放/听到剪辑中的声音?

// Uses Try- with resources. This does not work.
public static void playSound(String path) 
try 
    URL url = AudioTestManager.class.getResource(path);
    try (Clip clip = Audiosystem.getClip())
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);
    clip.open(ais);
    clip.start();
    
 catch( LineUnavailableException | UnsupportedAudioFileException  | IOException  e) 
    e.printStackTrace();


// Does not use Try- with resources. This works.

public static void playSound2(String path) 
Clip clip = null;
try 
    URL url = AudioTestManager.class.getResource(path);
    clip = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);
    clip.open(ais);
    clip.start();


catch( LineUnavailableException | UnsupportedAudioFileException  | IOException  e) 
    e.printStackTrace();
finally 
   // if (clip != null) clip.close();


提前致谢!

【问题讨论】:

【参考方案1】:

问题是try-with-resources 块会在块完成时自动关闭其中创建的Clip,从而导致播放停止。

在您的另一个示例中,由于您没有手动关闭它,因此可以继续播放。

如果你想在Clip播放完毕后关闭它,你可以用addLineListener()添加一个LineListener,当你收到STOP这样的事件时关闭它:

final Clip clip = AudioSystem.getClip();
// Configure clip: clip.open();
clip.start();

clip.addLineListener(new LineListener() 
    @Override
    public void update(LineEvent event) 
        if (event.getType() == LineEvent.Type.STOP)
            clip.close();
    
);

【讨论】:

感谢您的快速评论!但是可以延迟 close() 操作吗?我尝试了 Thread.sleep(sometime) 并播放了声音,但它也停止了游戏线程。 已编辑。添加了在剪辑结束时关闭它的正确方法。 谢谢,所以没有办法使用try-with-resources?坦率地说,我更愿意使用像你这样的解决方案,但由于我的教授说我们要对所有(尽可能多的)资源使用 try-with-resources,我想在决定不使用它之前确定一下。谢谢 @Towni0 剪辑在单独的线程上播放,因此您不能使用 try-with-resources。如果您的教授建议以这种方式将 try-with-resources 与 Clip 一起使用,那他们就错了。一般来说,try-with-resources 是一种很好的风格,但在这里不起作用。 好的,谢谢你们俩

以上是关于Java 使用 Clip 和 Try - with - resources 块,结果没有声音的主要内容,如果未能解决你的问题,请参考以下文章

java中的try-with-resources和return语句

使用 try-with-resources java 关闭数据库连接

java try-with-resource语句使用

Java8 Try-with-resource/JDBC/Play 框架:这是正确的吗?

Java 7 使用TWR(Try-with-resources)完成文件copy

java 7 try-with-resource 语法错误