从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)。
启动 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)。