从jar文件中获取资源文件

Get resource file from jar file

启动 jar,控制台显示找不到文件且未加载字体。 我该如何解决这个问题?

我得到了这个代码:

public class FontLoader {
    
    public static Font load(){
        String fontFilePath = Paths.get(System.getProperty("user.dir"), "prova.jar", "Retro Gaming.ttf").toString();
        int fontStyle = Font.BOLD;
        int fontSize = CenterOnDefaultScreen.center().height*2/100;
        Font font = null;
        int fontTypeResource = Font.TRUETYPE_FONT;

        if((fontFilePath == null || fontFilePath.isEmpty()) || fontSize < 1) {
            throw new IllegalArgumentException("load() Method Error! Arguments " +
                                                "passed to this method must contain a file path or a numerical " +
                                                "value other than 0!" + System.lineSeparator());
        }

        try {
            font = Font.createFont(fontTypeResource, new FileInputStream(
                   new File(fontFilePath))).deriveFont(fontStyle, fontSize);
        }
        catch (FileNotFoundException ex) {
            System.out.println("FileNotFoundException: " + fontFilePath);
        }
        catch (FontFormatException | IOException ex) {
            System.out.println("Exception thrown");
        }
        return font;
    }
}

String fontFilePath = Paths.get(System.getProperty("user.dir"), "prova.jar", "Retro Gaming.ttf").toString();

那..显然行不通。

您需要使用gRAS (getResourceAsStream) 系统。 java 中的 File(如 new FileInputStream 需要的 java.io.File 对象)是实际文件。 jar 文件中的条目不算数。 不可能File对象引用那个ttf文件,也不可能用FileInputStream打开它。

幸运的是,createFont 方法不要求您传递 FileInputStream;任何旧的 InputStream 都可以。

ttf 文件需要与您正在编写的 class 位于相同的 classpath root 中(例如,相同的 jar)。一旦确定是这种情况,就可以使用 gRAS:

try (var fontIn = FontLoader.class.getResourceAsStream("/Retro Gaming.ttf")) {
  Font.createFont(Font.TRUETYPE_FONT, fontIn).deriveFont(.., ...);
}

gRAS 看起来与 FontLoader.class 居住的地方相同。从您的代码片段来看,您似乎将 ttf 放在了 jar 的 'root' 中,而不是在 FontLoader 旁边。 getResourceAsStream 的字符串参数中的前导斜杠表示:相对于 FontLoader 所在位置的根目录(因此,大概是您的 jar)。