所以我遇到与java.io.IOException: mark/reset not supported相同的问题。
我希望它如何运作:
问题是什么:
不知何故,我编写的名为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();
}
}
}
答案 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();
}
}
}