您当前的位置:中关科技网行业新闻正文

求助:关于JAVA应用程序中引入声音的问题

2018-09-11 11:57:38  阅读:6676+ 来源:本站原创 作者:汪明荃
思想者蹲着提问: 为什么用JAVA引入声音后,用按钮触发,第一次正常,再次按按钮就没有声音了? 引入声音的源代码如下:
import java.io.FileInputStream;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

public class Voice {
AudioStream start;

AudioStream end;

AudioStream wrong;

AudioStream play;

AudioStream timer;

AudioStream clock;

AudioStream select;

public Voice() {
try {
start = new AudioStream(new FileInputStream("voice/start.wav"));
end = new AudioStream(new FileInputStream("voice/end.wav"));
wrong = new AudioStream(new FileInputStream("voice/wrong.wav"));
play = new AudioStream(new FileInputStream("voice/play.wav"));
timer = new AudioStream(new FileInputStream("voice/timer.wav"));

} catch (Exception e) {
e.printStackTrace();
}
}

public void play(AudioStream as) {
AudioPlayer.player.start(as);
}
}

触发事件的时候调用的play方法。
请问这是怎么回事啊?谢谢指教小编推荐答案:

楼上这个流可没有被close,很简单的方式就能够证明

import java.io.FileInputStream;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

public class Voice {

private class MyFis extends FileInputStream{
public MyFis(String file) throws FileNotFoundException{
super(file);
}
public void close() throws IOException{
System.out.println("关闭");
super.close();

}
}

AudioStream start;

AudioStream end;

AudioStream wrong;

AudioStream play;

AudioStream timer;

AudioStream clock;

AudioStream select;


public Voice() {
try {
start = new AudioStream(new MyFis("voice/start.wav"));
end = new AudioStream(new MyFis("voice/end.wav"));
wrong = new AudioStream(new MyFis("voice/wrong.wav"));
play = new AudioStream(new MyFis("voice/play.wav"));
timer = new AudioStream(new MyFis("voice/timer.wav"));

} catch (Exception e) {
e.printStackTrace();
}
}

public void play(AudioStream as) {
AudioPlayer.player.start(as);
}
}
你无法看到"关闭"字样,所以close没有被调用!

很遗憾,这个流并不支持mark,所以是个单向流,用过之后只能丢弃,从新载入!所以楼上的方法是可行的。


======================================
回答人的补充2010-04-15 16:57

注意到AudioPlayer、AudioStream来自同一个包,我觉得产生这个问题的原因是有些包内的属性或者方法能够控制AudioPlayer不去重复播放同一个对象!

我原来以为是由于这个流不支持Mark的原因,因此我试着使用ByteArrayInputStream来代替FileInputStream,然后我利用这些标记来“重置流”,这样做我成功了。

import java.io.FileInputStream;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

public class Voice {
A

相关阅读
小生意大爆发|巨量引擎商家双11全局抢量,生意爆发秘籍

小生意大爆发|巨量引擎商家双11全局抢量,生意爆发秘籍

日常单爆品模式无法实现大促爆发、爆品爆发力衰减新品无法衔接、内容力不足无法高效种草与破圈、投放跑量不稳定导致投入产出…

2024-11-21
成功转型成为计算平台公司,Arm 年度技术大会展现强劲实力

成功转型成为计算平台公司,Arm 年度技术大会展现强劲实力

Arm Tech Symposia年度技术大会今日在上海举行。作为Arm一年一度的技术盛会,本届大会以“让我们携手重塑未来”为主题,吸引…

2024-11-20
进博会对话高通钱堃,混合AI是未来,5G-A发挥重要作用

进博会对话高通钱堃,混合AI是未来,5G-A发挥重要作用

最近,高通公司全球高级副总裁钱堃在第七届中国国际进口博览会期间接受媒体专访时介绍,高通公司做基础研发,然后把技术贡献给国…

2024-11-10
进博会孟樸分享,从3G到5G,高通携手中国伙伴在全球市场合作共赢

进博会孟樸分享,从3G到5G,高通携手中国伙伴在全球市场合作共赢

11月5日至10日,第七届中国国际进口博览会在上海举办。作为七年进博会“全勤生”,高通公司今年继续参展,展示最新技术以及与产…

2024-11-10

“如果发现本网站发布的资讯影响到您的版权,可以联系本站!同时欢迎来本站投稿!