java.io.IOException:不支持标记/重置
当我从netbeans运行应用程序时,这段代码运行良好。声音响起,没有例外。但是,当我从dist文件夹运行它时,声音不会播放,我在消息对话框中得到java.io.IOException:不支持标记/重置,java,audio,ioexception,Java,Audio,Ioexception,当我从netbeans运行应用程序时,这段代码运行良好。声音响起,没有例外。但是,当我从dist文件夹运行它时,声音不会播放,我在消息对话框中得到java.io.IOException:mark/reset not supported 如何解决此问题?问题是您的输入流必须支持标记和重置方法。至少在支持标记的情况下,您可以使用测试: 因此,您可能应该使用不同的输入流。的文档说明: 此方法的实现可能会 需要多个解析器来检查 检查流以确定它们是否正确 支持它。这些解析器必须能够 要标记流,请读取足够的
java.io.IOException:mark/reset not supported
如何解决此问题?问题是您的输入流必须支持标记和重置方法。至少在支持标记的情况下,您可以使用测试: 因此,您可能应该使用不同的输入流。的文档说明: 此方法的实现可能会 需要多个解析器来检查 检查流以确定它们是否正确 支持它。这些解析器必须能够 要标记流,请读取足够的数据 以确定他们是否支持 流,如果没有,则重置 流的读指针指向其原始 位置。如果输入流没有 支持这些操作,这个方法 可能会因IOException而失败 因此,提供给此方法的流必须支持可选功能。用一个新的图标装饰你的资源流
在挣扎了一段时间并多次引用此页面后,我无意中发现了帮助我解决问题的方法。我最初能够加载一个wav文件,但后来只能播放一次,因为由于“mark/reset not supported”(标记/重置不受支持)错误,它无法回放。真让人发疯 链接代码从文件中读取AudioInputStream,然后将AudioInputStream放入BufferedInputStream,然后将其放回AudioInputStream,如下所示:
//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);
最后,它将读取的数据转换为PCM编码:
audioInputStream = AudioSystem.getAudioInputStream(new File(filename));
BufferedInputStream bufferedInputStream = new BufferedInputStream(audioInputStream);
audioInputStream = new AudioInputStream(bufferedInputStream, audioInputStream.getFormat(), audioInputStream.getFrameLength());
convertToPCM定义为:
audioInputStream = convertToPCM(audioInputStream);
我相信他们这样做是因为BufferedInputStream比audioInputStream更好地处理标记/重置。希望这对其他人有所帮助。刚刚从引用它的具有相同问题的其他人那里遇到这个问题 Oracle错误数据库#7095006 使用以下代码避免InputStream步骤。导致错误的是InputStream
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;
}
瞧,没有输入流
Ty,这起作用了。我修改了如下代码:
BufferedInputStream myStream=new BufferedInputStream(getClass().getResourceAsStream(“mySound.au”);AudioInputStream audio2=AudioSystem.getAudioInputStream(myStream)代码>现在它可以工作了=)P.S.如果有人能格式化这个评论,那就太好了=/这就是mark/reset的意思吗?一条可以找到的小溪@McDowell,你能在回答中显示修饰过的代码吗?@Shurane-mark/reset允许在调用reset时将“未读”数据流回标记点(通常是通过在RAM中缓冲mark调用时的数据)。这还不够。无法找出为什么我的音频没有从文件中正确加载。因为我是从一个文件加载的,所以这样做对我来说比较容易:FileInputStream fs=newfileinputstream(filename);BufferedInputStream myStream=新的BufferedInputStream(fs);AudioInputStream AudioInputStream=AudioSystem.getAudioInputStream(myStream);嘿@SauceMaster我使用了这种方法,因为我也试图打开一个文件,但它仍然无法编译。我得到:“java.io.IOException:streamclosed”。当它面对320kbps的比特率时,它似乎是这样工作的,而在112中它工作得很好。我在哪里可以买到音频混音器?我尝试了你在类似帖子中的链接,但它指向了其他地方。@Potney对此表示抱歉。AudioMixer看起来确实可能是一个核心Java类的名称,但它只是我编写的一个类。我使用它在代码源中的目录位置作为定位“文件名”的起点。如果您还不熟悉,请参阅上述教程中的“使用getResource加载图像”部分。这里的其他解决方案对我的问题不起作用,但这一个解决了!谢谢
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;
}
URL url = AudioMixer.class.getResource(fileName);
AudioInputStream ais = AudioSystem.getAudioInputStream(url);