【問題解答】關於類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的任何問題,都可以私信我,希望可以幫到大家,同時也是對我的一種信賴,一種支持,一種動力。

捐贈

若你感覺讀到這篇文章對你有啓發,能引起你的思考。請不要吝嗇你的錢包,你的任何打賞或者捐贈都是對我莫大的鼓勵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章