Program Club

java.io.IOException : 표시 / 재설정이 지원되지 않음

proclub 2020. 11. 23. 20:23
반응형

java.io.IOException : 표시 / 재설정이 지원되지 않음


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

한동안 허둥 대고이 페이지를 여러 번 참조한 후 나는 문제를 해결하는 데 도움 되는 이것을 발견했습니다 . 처음에는 wav 파일을로드 할 수 있었지만 이후에는 "mark / reset not supported"오류로 인해 되 감을 수 없기 때문에 한 번만 재생할 수있었습니다. 미친 짓이었다.

링크 된 코드는, 다음 BufferedInputStream을에 AudioInputStream를두고, 파일로부터 AudioInputStream를을 읽어두고 때문에 같은 AudioInputStream를 다시를 :

audioInputStream = AudioSystem.getAudioInputStream(new File(filename));
BufferedInputStream bufferedInputStream = new BufferedInputStream(audioInputStream);
audioInputStream = new AudioInputStream(bufferedInputStream, audioInputStream.getFormat(), audioInputStream.getFrameLength());

그리고 마지막으로 읽은 데이터를 PCM 인코딩으로 변환합니다.

audioInputStream = convertToPCM(audioInputStream);

convertToPCM을 다음과 같이 정의합니다.

private static AudioInputStream convertToPCM(AudioInputStream audioInputStream)
    {
        AudioFormat m_format = audioInputStream.getFormat();

        if ((m_format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) &&
            (m_format.getEncoding() != AudioFormat.Encoding.PCM_UNSIGNED))
        {
            AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                m_format.getSampleRate(), 16,
                m_format.getChannels(), m_format.getChannels() * 2,
                m_format.getSampleRate(), m_format.isBigEndian());
            audioInputStream = AudioSystem.getAudioInputStream(targetFormat, audioInputStream);
    }

    return audioInputStream;
}

BufferedInputStream이 audioInputStream보다 마크 / 리셋을 더 잘 처리하기 때문에 그렇게한다고 생각합니다. 이것이 누군가를 돕기를 바랍니다.


이 질문을 참조한 동일한 문제를 가진 다른 사람으로부터 방금이 질문을 받았습니다.

Oracle 버그 데이터베이스, # 7095006

InputStream 단계를 피하려면 다음 코드를 사용하십시오. 오류를 일으키는 것은 InputStream입니다.

URL url = AudioMixer.class.getResource(fileName); 
AudioInputStream ais =  AudioSystem.getAudioInputStream(url); 

짜잔-InputStream 없음

getAudioInputStream () 중 표시 / 재설정 예외


문제는 입력 스트림이 표시 및 재설정 메소드를 지원해야한다는 것입니다. 적어도 mark가 지원되는 경우 AudioInputStream # markSupported로 테스트 할 수 있습니다 .

따라서 다른 InputStream을 사용해야 할 수도 있습니다.

참고 URL : https://stackoverflow.com/questions/5529754/java-io-ioexception-mark-reset-not-supported

반응형