Java加载src目录wav音频报FileNotFoundException问题求助
问题原因
- 使用
new File("noise.wav")读取文件时,Java会直接从程序启动的工作目录(即运行java命令时所在的磁盘目录)查找独立的磁盘文件,既不会去源码src目录搜索,也无法读取jar包内部打包的压缩资源。 - 你把
noise.wav放在src目录下,构建项目时该文件会随编译后的class文件一起放入classpath路径,最终被打包进jar文件。这类内置在程序包内的资源不存在独立的磁盘路径,File类根本无法定位到它,这既是你开发阶段运行就报文件不存在的原因,也是如果不改逻辑后续打包后必然无法播放的核心问题。

修复方法
只需要替换音频读取的代码逻辑,改用类加载器读取classpath下的资源流即可,该方式同时兼容开发环境运行和jar包内资源读取:
- 删除原有基于
File读取音频的两行代码 - 替换为如下代码,直接从classpath获取音频输入流:
// 读取classpath根路径下的noise.wav资源 AudioInputStream audioStream = AudioSystem.getAudioInputStream( Main.class.getClassLoader().getResourceAsStream("noise.wav") );
注意事项
- 确认IDE的构建规则没有过滤
.wav后缀的资源文件:主流Java IDE默认会将src目录下非.java后缀的文件一并复制到编译输出目录,你当前把wav放在src根目录的存放方式不需要额外调整目录结构。 - 资源路径不要加前置斜杠,
"noise.wav"就对应classpath根目录的文件,和你当前的文件存放位置完全匹配。 - 如果后续把音频文件移到src下的子目录,比如src/audio/noise.wav,只需要把路径改成
"audio/noise.wav"即可。
修改后核心代码片段(仅替换音频读取部分,其余Swing逻辑不需要改动):
public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException { // 替换原File读取逻辑,支持jar包内资源读取 AudioInputStream audioStream = AudioSystem.getAudioInputStream( Main.class.getClassLoader().getResourceAsStream("noise.wav") ); clip = AudioSystem.getClip(); clip.open(audioStream); // 原有Swing初始化逻辑保持不变 frame = new JFrame("times killed"); panel = new JPanel(); frame.setSize(420,420); frame.add(panel); panel.setLayout(null); bText = new JLabel("Times killed:"); bText.setBounds(150,130,120,25); panel.add(bText); damn = new JLabel("0"); damn.setBounds(210,158,120,25); panel.add(damn); button = new JButton("Lmao you bad"); button.setBounds(140,190,150,25); button.addActionListener(new Main()); panel.add(button); frame.setVisible(true); // 建议补上关闭窗口退出程序的逻辑,避免进程残留 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
小提示:原代码没有设置窗口关闭操作,点击窗口叉号后程序进程会在后台持续运行,补上上述代码里的关闭逻辑即可避免这个问题。
内容的提问来源于stack exchange,提问作者alexM
相关产品推荐
相关产品推荐

