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 关闭数据库连接
Java8 Try-with-resource/JDBC/Play 框架:这是正确的吗?