亲测将wav文件放到project文件下将9420.wav换成对用文件名即可播放
播放完毕后程序自动停止
1 package someOrdinaryThoughts; 2 3 //public File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。如果给定字符串是空字符串,那么结果是空抽象路径名。 4 import java.io.File; 5 //当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类。 6 import java.io.IOException; 7 //是在声音流中指定特定数据安排的类。通过检查以音频格式存储的信息,可以发现在二进制声音数据中解释位的方式。 8 import javax.sound.sampled.AudioFormat; 9 //音频输入流是具有指定音频格式和长度的输入流。长度用示例帧表示,不用字节表示。提供几种方法,用于从流读取一定数量的字节,或未指定数量的字节。音频输入流跟踪所读取的最后一个字节。可以跳过任意数量的字节以到达稍后的读取位置。音频输入流可支持标记。设置标记时,会记住当前位置,以便可以稍后返回到该位置。 10 import javax.sound.sampled.AudioInputStream; 11 //AudioSystem 类充当取样音频系统资源的入口点。此类允许查询和访问安装在系统上的混频器。 12 import javax.sound.sampled.AudioSystem; 13 //DataLine 将与介质相关的功能添加到其超接口 Line。此功能包括一些传输控制方法,这些方法可以启动、停止、消耗和刷新通过数据行传入的音频数据。 14 import javax.sound.sampled.DataLine; 15 //LineUnavailableException 是指示某一行因为不可用而无法打开的异常。此情况通常在请求的行已由另一个应用程序使用时发生 16 import javax.sound.sampled.LineUnavailableException; 17 //源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。混频器可以将这些样本与取自其他源的样本混合起来,然后将该混合物传递到输出端口之类的目标(它可表示声卡上的音频输出设备)。 18 import javax.sound.sampled.SourceDataLine; 19 //UnsupportedAudioFileException 是指示因为文件没有包含可识别文件类型和格式的有效数据而致使操作失败的异常。 20 import javax.sound.sampled.UnsupportedAudioFileException; 21 22 public class MusicTest { 23 public static final String MUSIC_FILE = "9420.wav";//将文件的路径转化为字符串 24 //throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。 25 public static void main(String[] args) throws LineUnavailableException,UnsupportedAudioFileException, IOException { 26 27 // 获取音频输入流,从提供的 File 获得音频输入流 28 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(MUSIC_FILE));//这里新建了一个File类型的对象指向我们的文件 29 // 获取音频编码对象 30 AudioFormat audioFormat = audioInputStream.getFormat();//获得此音频输入流中声音数据的音频格式。 31 32 // 设置数据输入 33 DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,audioFormat, AudioSystem.NOT_SPECIFIED);// AudioSystem.NOT_SPECIFIED代表未知数字值的整数。 34 SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo); //获得与指定 Line.Info 对象中的描述匹配的行。 35 sourceDataLine.open(audioFormat);//打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作。 36 sourceDataLine.start();//javax.sound.sampled.DataLine 继承的方法 37 38 /* 39 * 从输入流中读取数据发送到混音器 40 */ 41 int count; 42 byte tempBuffer[] = new byte[1024]; 43 //从音频输入流读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。利用while在输入结束前一直进行数据传入操作 44 while ((count = audioInputStream.read(tempBuffer, 0, tempBuffer.length)) != -1) { 45 if (count > 0) { 46 sourceDataLine.write(tempBuffer, 0, count);//通过此源数据行将音频数据写入混频器。 47 } 48 } 49 50 // 清空数据缓冲,并关闭输入 51 sourceDataLine.drain();//通过在清空数据行的内部缓冲区之前继续数据 I/O,排空数据行中的列队数据。 52 sourceDataLine.close();//关闭行,指示可以释放的该行使用的所有系统资源。如果此操作成功,则将行标记为 closed,并给行的侦听器指派一个 CLOSE 事件。 53 } 54 }
原文:https://www.cnblogs.com/peng-free/p/9017225.html