You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Compose Desktop中无法播放音频文件的问题求助

解决Jar包内WAV文件播放的问题

问题根源:File(uri)无法访问Jar包内的资源,因为Jar内的资源并非文件系统中的真实文件,而是Jar归档内的条目,因此不能通过File类直接读取。

以下是可行的解决方法:

  • 直接通过资源流读取(推荐)
    利用Compose MultiResources提供的readBytes方法获取资源字节流,无需依赖文件路径:

    val inputStream = Res.readBytes("files/frog.wav").inputStream()
    val audioInputStream = AudioSystem.getAudioInputStream(inputStream)
    val clip: Clip = AudioSystem.getClip()
    clip.open(audioInputStream)
    clip.start()
    
  • 通过ClassLoader获取资源流
    使用类加载器直接读取Jar内的资源,注意路径需匹配Jar内的实际资源结构:

    val classLoader = Thread.currentThread().contextClassLoader
    val resourceStream = classLoader.getResourceAsStream("files/frog.wav")
    resourceStream?.let {
        val audioInputStream = AudioSystem.getAudioInputStream(it)
        val clip: Clip = AudioSystem.getClip()
        clip.open(audioInputStream)
        clip.start()
    }
    

    若路径不生效,可根据报错信息调整为composeResources/romshelper.composeapp.generated.resources/files/frog.wav测试。

  • 提取资源到临时文件(适配必须用File的场景)
    如果必须使用File对象,可将Jar内的资源复制到临时文件后再读取:

    val tempFile = File.createTempFile("frog", ".wav")
    tempFile.deleteOnExit()
    
    Res.readBytes("files/frog.wav").inputStream().use { input ->
        FileOutputStream(tempFile).use { output ->
            input.copyTo(output)
        }
    }
    
    val audioInputStream = AudioSystem.getAudioInputStream(tempFile)
    val clip: Clip = AudioSystem.getClip()
    clip.open(audioInputStream)
    clip.start()
    

内容的提问来源于stack exchange,提问作者NullPointerException

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:49:50