首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 打包后资源文件读取失败:Class.getResourceAsStream 替代 FileInputStream

     編輯:程式設計綜合問答

问题现场

// 开发环境正常,打包 JAR 后失效
FileInputStream file = new FileInputStream("./src/music/001.mid");
BufferedInputStream buf = new BufferedInputStream(file);
AudioStream audio = new AudioStream(buf);
AudioPlayer.player.start(audio);

项目结构:

代码结构图

核心原因

JAR 包内资源非文件系统路径。打包后 ./src/music/001.mid 变为 JAR 内部条目 /music/001.mid,FileInputStream 只能读取外部文件。

统一资源加载方案

// 任意类中均可调用,开发/打包环境通用
String resourcePath = "/music/001.mid"; // 以 / 开头表示 classpath 根
InputStream input = this.getClass().getResourceAsStream(resourcePath);
if (input == null) {
    throw new IllegalStateException("资源未找到: " + resourcePath);
}
BufferedInputStream buf = new BufferedInputStream(input);
AudioStream audio = new AudioStream(buf);
AudioPlayer.player.start(audio);

资源路径解析规则

调用方式路径前缀查找基准示例
Class.getResourceAsStream()无 /当前类包目录getResourceAsStream("music/001.mid") → com/example/music/001.mid
Class.getResourceAsStream()/Classpath 根目录getResourceAsStream("/music/001.mid") → /music/001.mid
ClassLoader.getResourceAsStream()无 /(忽略前导 /)Classpath 根目录getClassLoader().getResourceAsStream("music/001.mid")

Maven 资源配置确保打包包含

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.mid</include>
                <include>**/*.wav</include>
            </includes>
        </resource>
    </resources>
</build>

将音乐文件放置于 src/main/resources/music/001.mid,编译后自动进入 target/classes/music/ 并打包进 JAR。

进阶:大文件流式播放避免内存溢出

// 使用 AudioSystem 获取流式音频输入
AudioInputStream ais = AudioSystem.getAudioInputStream(
    this.getClass().getResourceAsStream("/music/001.mid")
);
Clip clip = AudioSystem.getClip();
clip.open(ais);
clip.start();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved