java.io.IOException:不支持mark / reset(对于静态)

时间:2012-02-17 03:54:13

标签: java wav ioexception javasound

所以我遇到与java.io.IOException: mark/reset not supported相同的问题。

我希望它如何运作:

  • 让程序打开一个弹出按钮,说“点按我播放”
  • 一旦点击光标将永远播放2MB_sound.wav(是的,它的大小为2MB)

问题是什么:

不知何故,我编写的名为backgroundPlayer的代码在我的uni comps中的某个桌面上完全正常,但在我的笔记本电脑中却没有。在我的笔记本电脑上运行代码时,弹出按钮可以工作,但是当我点击它时...它会出现错误“java.io.IOException:mark / reset not supported”。

我尝试解决问题但失败了(从上面的链接回答):

InputStream audioSrc = getClass().getResourceAsStream("2MB_sound.wav");
InputStream bufferedIn = new BufferedInputStream(audioSrc);
AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn);

我尝试完全按照上面的代码添加代码(使用相关的导入)但它给了我一个不同的错误,说“不能从类型Object中对非静态方法getClass()进行静态引用”。所以现在我被困住了,回到我原来的代码,如下所示。

请帮我解决我的问题。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JButton;
import javax.swing.JFrame;

public class backgroundPlayer {

public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.setSize(200,200);
    JButton button = new JButton("Click me to play");
    frame.add(button);
    button.addActionListener(new AL());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

public static class AL implements ActionListener {
    public final void actionPerformed (ActionEvent e) {
            music();
    }
}

public static void music () {
    try {
    Clip clip = AudioSystem.getClip();
    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new FileInputStream("85046_newgrounds_parago.wav"));
    clip.open(inputStream);
    clip.loop(Clip.LOOP_CONTINUOUSLY);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (LineUnavailableException e) {
        e.printStackTrace();
    } catch (UnsupportedAudioFileException e) {
        e.printStackTrace();
    }
}

}

3 个答案:

答案 0 :(得分:2)

我不得不处理一个非常类似的问题,并将其发布在这里:

mark/reset exception during getAudioInputStream()

此格式:.getResourceAsStream(fileName)返回一个InputStream,如果文件不可标记,则抛出标记/重置异常。我得到的解释是,曾经有一个默认的“第一次猜测”.wav,但这不再是第一个猜测(从Java 7开始)。在#7095006的Oracle错误数据库中有一个更好,更全面的描述。

使用此表单,您应该没问题,因为它不需要需要支持标记的中间步骤(InputStream)。复位:

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

答案 1 :(得分:1)

在链接的问题中,底层基础数据流的构造略有不同,因此您必须调整解决方案。

而不是:

InputStream audioSrc = getClass().getResourceAsStream("2MB_sound.wav");

使用此:

InputStream audioSrc = new FileInputStream("85046_newgrounds_parago.wav");

答案 2 :(得分:0)

此代码编译。

import java.awt.event.*;
import javax.swing.*;
import javax.sound.sampled.*;
import java.io.*;

public class backgroundPlayer {

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setSize(200,200);
    JButton button = new JButton("Click me to play");
    frame.add(button);
    button.addActionListener(new AL());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

public static class AL implements ActionListener {

    backgroundPlayer bp = new backgroundPlayer();

    public final void actionPerformed (ActionEvent e) {
        bp.music();
    }
}

public void music () {
    try {
    InputStream audioSrc = getClass().
        getResourceAsStream("85046_newgrounds_parago.wav");
    InputStream bufferedIn = new BufferedInputStream(audioSrc);
    AudioInputStream audioStream =
        AudioSystem.getAudioInputStream(bufferedIn);

    Clip clip = AudioSystem.getClip();
    clip.open(audioStream);
    clip.loop(Clip.LOOP_CONTINUOUSLY);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (LineUnavailableException e) {
        e.printStackTrace();
    } catch (UnsupportedAudioFileException e) {
        e.printStackTrace();
    }
}
}