java.io.IOException:不支持标记/重置

2024-03-11

我知道这个问题已经被问过很多次了,但在某些情况下有所不同,所以我无法弄清楚。当我在 Eclipse 中运行游戏时,一切都很顺利,游戏运行完美,但在导出后,它崩溃了。我可以打开游戏并在菜单中移动,但没有播放任何声音,并且在我点击播放后,游戏就冻结了,并且它用 cmd 给了我这个错误(我可以粘贴任何必要的类,但希望只有 Audio 类是必要的) :

java.io.IOException: mark/reset not supported
    at java.util.zip.InflaterInputStream.reset(Unknown Source)
    at java.io.FilterInputStream.reset(Unknown Source)
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
    at com.neet.Audio.JukeBox.load(JukeBox.java:26)
    at com.neet.GameState.IntroState.<init>(IntroState.java:28)
    at com.neet.GameState.GameStateManager.loadState(GameStateManager.java:48)
    at com.neet.GameState.GameStateManager.setState(GameStateManager.java:72)
    at com.neet.GameState.GameStateManager.<init>(GameStateManager.java:31)
    at com.neet.Main.GamePanel.init(GamePanel.java:70)
    at com.neet.Main.GamePanel.run(GamePanel.java:75)
    at java.lang.Thread.run(Unknown Source)

这是音频类:`

package com.neet.Audio;

import java.util.HashMap;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

public class JukeBox {

    private static HashMap<String, Clip> clips;
    private static int gap;
    private static boolean mute = false;

    public static void init() {
        clips = new HashMap<String, Clip>();
        gap = 0;
    }

    public static void load(String s, String n) {
        if(clips.get(n) != null) return;
        Clip clip;
        try {           
            AudioInputStream ais =
                AudioSystem.getAudioInputStream(
                    JukeBox.class.getResourceAsStream(s)
                );
            AudioFormat baseFormat = ais.getFormat();
            AudioFormat decodeFormat = new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                baseFormat.getSampleRate(),
                16,
                baseFormat.getChannels(),
                baseFormat.getChannels() * 2,
                baseFormat.getSampleRate(),
                false
            );
            AudioInputStream dais = AudioSystem.getAudioInputStream(decodeFormat, ais);
            clip = AudioSystem.getClip();
            clip.open(dais);
            clips.put(n, clip);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void play(String s) {
        play(s, gap);
    }

    public static void play(String s, int i) {
        if(mute) return;
        Clip c = clips.get(s);
        if(c == null) return;
        if(c.isRunning()) c.stop();
        c.setFramePosition(i);
        while(!c.isRunning()) c.start();
    }

    public static void stop(String s) {
        if(clips.get(s) == null) return;
        if(clips.get(s).isRunning()) clips.get(s).stop();
    }

    public static void resume(String s) {
        if(mute) return;
        if(clips.get(s).isRunning()) return;
        clips.get(s).start();
    }

    public static void loop(String s) {
        loop(s, gap, gap, clips.get(s).getFrameLength() - 1);
    }

    public static void loop(String s, int frame) {
        loop(s, frame, gap, clips.get(s).getFrameLength() - 1);
    }

    public static void loop(String s, int start, int end) {
        loop(s, gap, start, end);
    }

    public static void loop(String s, int frame, int start, int end) {
        stop(s);
        if(mute) return;
        clips.get(s).setLoopPoints(start, end);
        clips.get(s).setFramePosition(frame);
        clips.get(s).loop(Clip.LOOP_CONTINUOUSLY);
    }

    public static void setPosition(String s, int frame) {
        clips.get(s).setFramePosition(frame);
    }

    public static int getFrames(String s) { return clips.get(s).getFrameLength(); }
    public static int getPosition(String s) { return clips.get(s).getFramePosition(); }

    public static void close(String s) {
        stop(s);
        clips.get(s).close();
    }

}`

来自 Javadoc(我的重点):

public static AudioInputStream getAudioInputStream(InputStream stream)
                                        throws UnsupportedAudioFileException,
                                               IOException

从提供的输入流获取音频输入流。该流必须指向有效的音频文件数据。此方法的实现可能需要多个解析器来检查流以确定它们是否支持它。这些解析器必须能够标记流,读取足够的数据以确定它们是否支持该流,如果不支持,则将流的读取指针重置为其原始位置。如果输入流不支持这些操作,则此方法可能会失败并出现 IOException。

您似乎正在从包含代码和声音文件的 jar 文件运行。这InputStream从返回getResourceAsStream()不会起作用,因为它将由ZipInputStream,它处理mark()作为空操作,并抛出IOException for reset().

要解决这个问题,您只需要将输入流包装在BufferedInputStream.

AudioInputStream ais =
    AudioSystem.getAudioInputStream(
        new BufferedInputStream(
            JukeBox.class.getResourceAsStream(s)
        )
    };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.io.IOException:不支持标记/重置 的相关文章

随机推荐

  • 如何将 Istio Service Mesh 从 http 升级到 http2?

    我们使用 Kubernetes 并使用 Istio Service Mesh 目前 网关中存在针对 HTTPS 的 SSL 终止 我在 istio proxy 日志中看到 HTTP 协议是 HTTP 1 1 由于 HTTP2 的各种优点 我
  • 如何在python的tkinter中设置Treeview的宽度

    最近 我使用tkinter TreeView显示许多列Python 具体来说 树视图中有 49 列数据 我用grid管理我的小部件 我发现树视图的宽度仅取决于列的宽度 我的问题是 如何设置 Treeview 的宽度 默认宽度是所有列宽度的总
  • 循环地址对齐如何影响 Intel x86_64 上的速度?

    我发现相同的 C 代码编译为完全相同的机器指令但位于不同对齐的地址时性能下降了 15 当我的小主循环从 0x415220 开始时 它比从 0x415250 开始时要快 我在 Intel Core2 Duo 上运行它 我在 x86 64 Ub
  • 在 Mac OS 下设置 COBOL 编译器?

    在我的大学里 我们正在学习 COBOL 我正努力在明年上课之前抢先学习 COBOL C 和 Java 问题是 COBOL 是so旧的 很难在 mac 中获得对它的支持 我的笔记本电脑是 mac 我知道它在 Mac 上运行良好 但找到可以解释
  • 如何以全屏模式启动 NSWindow

    我正在 Xcode 5 中为 Macos 开发一个应用程序 我想全屏显示我的第一个窗口 没有工具栏 只有我的视图 我找到了一种在角落显示全屏按钮的方法 AppDelegate m void applicationDidFinishLaunc
  • BCL(基类库)与 FCL(框架类库)

    两者有什么区别 我们可以互换使用它们吗 基类库 BCL 字面意思就是基础 它包含基本的基本类型 例如System String and System DateTime 框架类库 FCL 是更广泛的库 包含全部内容 ASP NET WinFo
  • 使用 docker-compose 时无法连接到 postgres

    我是 docker 的新手 仍在学习如何使用它 我正在尝试使用 docker compose 一起运行 Django 和 Postgres 它们运行完美 迁移完成 一切顺利 但我有一个问题 无法使用 pgAdmin4 连接到数据库来查看数据
  • C# 序列化到文件,如果存在则覆盖

    我有以下方法 如下 您可以看到它将对象序列化为 XML 文件 我遇到的主要问题是我想获得覆盖文件 如果存在 的函数 我知道如果该文件确实存在 我可以先删除该文件 但这也意味着我可能会导致一些错误拖入我的应用程序 所以我想要一个全有或全无的覆
  • volley 磁盘缓存内存不足问题

    在我的 Android 应用程序中 我使用 Volley 在自定义列表视图中加载图像 当我多次刷新 删除所有项目并加载 tiem 列表视图时 我的应用程序被这条消息杀死 我该如何修复它 04 26 13 08 01 038 E dalvik
  • tmux:挂起并且不加载,并且不响应任何选项命令

    我已经在 Fedora 的本地空间上从源代码安装了 tmux 到目前为止 它运行良好 但突然无法再运行它 当运行 tmux 时 它就停止了 尝试了不同的命令选项 例如 ls sessions 但没有任何效果 杀死我的用户的所有进程 删除 t
  • maven 编译无法识别我的本地存储库依赖项

    我有一个本地 jar 文件要导入到我的文件夹中 并且我已经运行了 mvn install mvn install install file Dfile C myapp Development core target api core 1 0
  • 如何在启动 iex 会话时执行一些命令?

    假设我想在项目的根路径中启动 iex 时实现一些命令 例如 Logger configure level info require Ecto Query alias MyApp User and so on 我想在每次启动 iex 时自动执
  • SimpUserRegistry 不包含任何会话对象

    我是 Websockets 新手 我一直在尝试使用 SimpUserRegistry 来查找主体的会话对象 我编写了一个自定义握手处理程序 将匿名用户转换为经过身份验证的用户 并且我能够从 Websocket 会话对象访问主体名称 自定义握
  • EWS:日历共享邀请和扩展属性

    好的 到目前为止 我获得的有关该主题的最佳信息是在这个线程上 EWS API 创建日历并与审阅者共享权限 https stackoverflow com questions 7503613 ews api create calendar a
  • PHP + PDF,如何使用curl保存下载的PDF?

    Welcome 我在页面上保存下载的 pdf 时遇到了一些问题 要下载 pdf 我使用 Curl CurlConnect curl init curl setopt CurlConnect CURLOPT URL http website
  • PHP内存限制锁定为256MB?

    我试图将内存限制设置为 512M 但它被锁定为 256M ini set memory limit 512M ini get memory limit gt Returns 256M 我可以完全控制我的服务器 这是专用的 请注意 512M
  • REST WebAPI 接口作为 API 调用中的参数

    我正在使用 ASP NET WebAPI 构建 REST API 一切工作正常 但后来我想到了在所有方法调用中使用接口的好主意 更改所有方法后 我注意到将控制器方法中的参数设置为接口后 我的 API 调用不起作用 我正在使用 OWIN Se
  • 访问类中的会话变量

    当需要检索或保留会话值时 在类构造函数上使用 session start 是否被认为是正常的 最佳实践 除非从 construct 调用 session start 否则无法从类中检索会话变量 session start if isset
  • 在Google云平台上使用FFMPEG

    我将音频文件存储在 Google Cloud Storage 上 通过 Firebase 存储 我需要使用 FFMPEG 将音频文件从立体声 两个通道 转换为单声道 一个通道 如何在 Google Cloud Platform 上进行上述转
  • java.io.IOException:不支持标记/重置

    我知道这个问题已经被问过很多次了 但在某些情况下有所不同 所以我无法弄清楚 当我在 Eclipse 中运行游戏时 一切都很顺利 游戏运行完美 但在导出后 它崩溃了 我可以打开游戏并在菜单中移动 但没有播放任何声音 并且在我点击播放后 游戏就