首页 > 解决方案 > 如何最小化多个音频代码

问题描述

我正在尝试为不止一种音频最小化我的代码。这看起来很糟糕。我怎样才能将这些代码最小化为一个清晰易读的代码。

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;
    } 

标签: javaaudio

解决方案


首先,结合您的例外情况:

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();
    }
}

推荐阅读