1. ホーム
  2. java

[解決済み] java.io.IOException: マークとリセットはサポートされていません。

2023-07-06 12:35:05

質問

try {
    //String location = dir1.getCanonicalPath()+"\\app_yamb_test1\\mySound.au";
    //displayMessage(location);
    AudioInputStream audio2 = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("mySound.au"));
    Clip clip2 = AudioSystem.getClip();
    clip2.open(audio2);
    clip2.start();
} catch (UnsupportedAudioFileException uae) {
    System.out.println(uae);
    JOptionPane.showMessageDialog(null, uae.toString());
} catch (IOException ioe) {
    System.out.println("Couldn't find it");
    JOptionPane.showMessageDialog(null, ioe.toString());
} catch (LineUnavailableException lua) {
    System.out.println(lua);
    JOptionPane.showMessageDialog(null, lua.toString());
}

このコードは、netbeansからアプリケーションを実行すると正常に動作します。音は再生され、例外はありません。しかし、distフォルダから実行すると、サウンドは再生されず、以下のようになります。 java.io.IOException: mark/reset not supported をメッセージダイアログに表示します。

どうすればこれを修正できますか?

どのように解決するのですか?

のドキュメントは AudioSystem.getAudioInputStream(InputStream) は言う。

このメソッドの実装では 複数のパーサーが がサポートするかどうかを判断するために、複数のパーサーがストリームを をサポートするかどうかを決定するために、複数のパーサーを必要とする場合があります。これらのパーサーは ストリームをマークし、十分なデータを読み取り ストリームをサポートしているかどうかを判断するために ストリームをサポートしているかどうかを判断するのに十分なデータを読み込み、サポートしていない場合は ストリームの読み取りポインタを元の位置に戻し の位置に戻します。入力ストリームがこれらの操作をサポートしていない場合 がこれらの操作をサポートしていない場合、このメソッド はIOExceptionで失敗する可能性があります。

したがって、このメソッドに提供するストリームは、オプションの マーク/リセット 機能をサポートする必要があります。リソースストリームを BufferedInputStream .

//read audio data from whatever source (file/classloader/etc.)
InputStream audioSrc = getClass().getResourceAsStream("mySound.au");
//add buffer for mark/reset support
InputStream bufferedIn = new BufferedInputStream(audioSrc);
AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn);