java - 如何最小化多个音频代码
问题描述
我正在尝试为不止一种音频最小化我的代码。这看起来很糟糕。我怎样才能将这些代码最小化为一个清晰易读的代码。
public class Sound {
public static int playerSound (char[][] gameBoard) {
try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Spieler x.wav")) ){
Clip clip = AudioSystem.getClip();
clip.open(inStream);
clip.start();
} catch (LineUnavailableException lue) {
System.out.println("Spieler x.wav" + lue.getMessage());
lue.printStackTrace();
} catch (UnsupportedAudioFileException uafe) {
System.out.println("Spieler x.wav" + uafe.getMessage());
uafe.printStackTrace();
} catch (IOException ioe) {
System.out.println("Spieler x.wav" + ioe.getMessage());
ioe.printStackTrace();
}
return 0;
}
public static int computerSound (char[][] gameBoard) {
try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Bot.wav")) ){
Clip clip = AudioSystem.getClip();
clip.open(inStream);
clip.start();
} catch (LineUnavailableException lue) {
System.out.println("Bot.wav" + lue.getMessage());
lue.printStackTrace();
} catch (UnsupportedAudioFileException uafe) {
System.out.println("Bot.wav" + uafe.getMessage());
uafe.printStackTrace();
} catch (IOException ioe) {
System.out.println("Bot.wav" + ioe.getMessage());
ioe.printStackTrace();
}
return 0;
}
解决方案
首先,结合您的例外情况:
try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream("Spieler x.wav")) ){
Clip clip = AudioSystem.getClip();
clip.open(inStream);
clip.start();
} catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
System.out.println("Spieler x.wav " + e);
e.printStackTrace();
}
其次,将两种方法中相同的代码移动到单独的private
方法中:
private static void play(String resourcePath) {
try (AudioInputStream inStream = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream(resourcePath)) ){
Clip clip = AudioSystem.getClip();
clip.open(inStream);
clip.start();
} catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
System.out.println(resourcePath + ": " + e);
e.printStackTrace();
}
}
public static int playerSound(char[][] gameBoard) {
play("Spieler x.wav");
return 0;
}
public static int computerSound(char[][] gameBoard) {
play("Bot.wav");
return 0;
}
第三,由于您总是返回相同的值(零),因此根本没有返回值:
public static void playerSound(char[][] gameBoard) {
play("Spieler x.wav");
}
public static void computerSound(char[][] gameBoard) {
play("Bot.wav");
}
您永远不会使用gameBoard
,因此可以从方法中删除该参数:
public static void playerSound() {
play("Spieler x.wav");
}
public static void computerSound() {
play("Bot.wav");
}
作为旁注,您可能不应该在 Clip 完成播放之前自动关闭 AudioInputStream,因为 Clip 可能仍在从中读取:
private static void play(String resourcePath) {
try {
AudioInputStream inStream = AudioSystem.getAudioInputStream(
Sound.class.getResourceAsStream(resourcePath));
Clip clip = AudioSystem.getClip();
clip.addLineListener(e -> {
if (e.getType().equals(LineEvent.Type.STOP)) {
clip.close();
try {
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
clip.open(inStream);
clip.start();
} catch (LineUnavailableException | UnsupportedAudioFileException | IOException e) {
System.out.println(resourcePath + ": " + e);
e.printStackTrace();
}
}
推荐阅读
- ios - Xcode 中的文件位置参考问题
- fullcalendar - fullCalendar 从 0 开始的 24 小时时间格式
- python - 我希望 request.POST[variable name] 只有在模板输入中存在变量名时才执行
- python - 存储 numpy 数据的最紧凑方式是什么?
- python - 名称“get_pages_count”未定义
- c++ - 从链表程序中的 insert_node 函数返回指向我当前对象的指针或引用
- spring - 身份验证异常
- python - How can I connect front-end with back-end?
- python - 应用组卷积,其中每个组都被限制为具有相同的权重
- seaborn - 如何摆脱 Seaborn 热图中的 x-ticks 和轴之间的空间?