有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在jar中加载资源文件

从分布式jar文件中加载资源(声音、图像、xml数据)的最佳方式是什么

我需要加载一些声音、图像和xml数据,以便在我的程序中使用。使用

AudioInputStream ais = AudioSystem.getAudioInputStream(new File("~/src/com/example/package/name/assets/TestSound.wav"));

不在jar中工作,原因很明显,包括src不在jar中

编辑:

(A)MWE:http://pastebin.com/CNq6zgPw


共 (2) 个答案

  1. # 1 楼答案

    {}类有两个相关的方法:

    • getResource(path)为类路径上的任何资源提供URL
    • getResourceAsStream(path)为资源提供一个输入流

    您可以将这些方法与AudioSystem.getAudioInputStream(...)方法的重载一起使用,以获取读取JAR文件中资源的音频流


    请注意,如果在ClassLoader对象上调用这些方法,那么路径将在类路径上的JAR文件的名称空间中解析。。。而不是开发平台的文件系统名称空间

  2. # 2 楼答案

    这段代码对我很有用:

    Clip clip = null;
    ClassLoader cl = this.getClass().getClassLoader();
    AudioInputStream ais;
    URL url = cl.getResource("com/example/project/assets/TestSound.wav");
    System.out.println(url);
    try {
        ais = AudioSystem.getAudioInputStream(url);
    clip = AudioSystem.getClip();
    clip.open(ais);
    }
    catch (Exception e) {
        e.printStackTrace();
        System.exit(1);
    }
    

    重要的是不要将/src/文件夹添加到类路径中

    关键的变化是将cl.getResource("/com/example/project/assets/TestSound.wav")更改为cl.getResource("com/example/project/assets/TestSound.wav"); 因为/com/...表示路径是绝对的,而com/...表示路径是相对的

    比如

    System.out.println(new File("/Test.File").getAbsolutePath());
    System.out.println(new File("Test.File").getAbsolutePath());
    

    返回

    /Test.File
    /Users/alphadelta/Documents/Workspace/TestProject/Test.File
    

    分别

    创建的第一个文件是使用"/Test.File"创建的,这是绝对的。第二个是使用"Test.File"创建的,它与eclipse中的项目根有关