【问题解答】关于类AudioInputStream找不到文件的异常

感谢

非常感谢可以私信问我一些问题,这是一种信赖,一种支持,一种动力。真的非常感谢。

问题

源码

import java.io.File;
import java.util.*;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
public class Test{

	/**
	 * @param args
	 */
	
	public static void main(String[] args) {
		Test lx = new Test();
		lx.run();
		Thread sy=new Thread();
		 sy.start();
		
	}
	

	public void run() {

		//File wjl = new File(wjm);
		AudioInputStream ypsrl = null;
		try {
			 ypsrl = AudioSystem.getAudioInputStream(new File("image/诗翼梦环 - 日本短信铃声.mp3"));
		} catch (Exception e) {
			System.out.println("文件为空");
		}

		AudioFormat format = ypsrl.getFormat();
		SourceDataLine aqsj = null;
		DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

		try {
			aqsj = (SourceDataLine) AudioSystem.getLine(info);// 格式化包装
			aqsj.open(format);
		} catch (Exception e) {
		}
		aqsj.start();

		int zjtj = 0;
		byte[] hczj = new byte[1024];// 小需要缓冲
		try {
			while (zjtj != -1) {
				zjtj = ypsrl.read(hczj, 0, hczj.length);
				if (zjtj >= 0)
					aqsj.write(hczj, 0, zjtj);
			}
		} catch (Exception e) {
		} finally {
			aqsj.drain();// 将残留部分处理干净
			aqsj.close();
		}
	}

	


}

问题分析和解决

  1. 看到问题之后,能想到是关于播放音频方面的。
  2. 看到源码之后,第一感觉这个没弄过,但不慌。
  3. 尝试运行,将文件替换(源码中的文件我肯定没有),找了一个自己喜欢的mp3文件,去掉中文(有些中文问题可以避免掉),new File("image/thatgirl.mp3")。然后通过javac编译,java运行,结果如下:
  4. 结果打印了文件为空,并且有一个空指针(NullPointerException)的异常。观察源码,这个文件为空是自己写的打印语句,并没有打印真正的异常信息,于是加上异常打印语句。
try {
			 ypsrl = AudioSystem.getAudioInputStream(new File("image/thatgirl.mp3"));
		} catch (Exception e) {
			e.printStackTrace();  // 加上打印异常语句,查看真正的异常信息
			System.out.println("文件为空");
		}
  1. 再次运行,查看真正的异常信息。结果如下:
  2. 看到了真正的异常信息,javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file,看这个异常并不是java.io的找不到文件的异常,于是尝试将文件路径改为一个不存在的路径,new File("image/thatgirlxxx.mp3"),运行查看结果,如下:
  3. 可以看到,这个异常java.io.FileNotFoundException才是找不到文件的异常。
  4. 既然不是找不到文件,就证明是其他问题,查看源码,看用到的类,都是javax.sound类,这就不怕了,是java标准类库中的,不是小众的第三方类库,于是准备查看一下相关文档。如何查看文档请看之前博文【java基础(十)】查阅API文档
  5. 找到AudioSystem.getAudioInputStream(File file)方法,如下:
  6. 在文档中可以看到对异常UnsupportedAudioFileException的描述,如果不是系统中合法的音频文件数据。(基本接近真相)。于是在想,合法的音频文件是什么?于是百度这个异常:
  7. 第一个结果就是:https://blog.csdn.net/qq_25827845/article/details/79026786,详细请进博文具体查看。结果就是发现AudioFileFormate支持wav文件格式,于是下载了一个wav文件格式音频。
  8. 替换为wav格式文件new File("image/river.wav"),替换后运行程序,一切正常,可以播放音频。

建议

  • 注意编码缩进规范,不要有太多多余的空行,一个好看的源码会给人很好的心情。
  • 有问题不怕,学会解决问题才是进步。敢于问问题,是一种很好的表现。
  • 不要自己写一些自己都不能确定的代码。如,这个源码中的System.out.println("文件为空");这个应该会对你造成很大的误解,误解为找不到文件,文件路径问题。
  • 使用try...catch尽量不要直接最大的异常(catch Exception),如果能够明确抛出的异常,就直接catch可能抛出的异常。如果不明确会抛出什么异常,应该将异常信息打印出来,使用e.printStackTrace();
  • 使用try...catch应该在catch中做异常时候的处理,想源码中并没有做处理,还不如直接将异常throw出去,交给上层做处理。

有问题可以随时问我

如果大家有关于java的任何问题,都可以私信我,希望可以帮到大家,同时也是对我的一种信赖,一种支持,一种动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值