Java 获取字体文件作为文件对象或获取其路径

Java 获取字体文件作为文件对象或获取其路径,java,file,fonts,path,Java,File,Fonts,Path,我在Java中有一个字体对象用于字体文件。我需要将该对象转换为文件对象或获取字体文件路径 有办法做到这一点吗 我在这里所做的是从外部库调用一个方法,该库加载字体文件以在编写时使用它: loadTTF(PDDocument pdfFile, File fontfile); 因此,我想让用户从其操作系统中定义的字体中选择一种字体,使用: GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment(); Font[

我在Java中有一个字体对象用于字体文件。我需要将该对象转换为文件对象或获取字体文件路径

有办法做到这一点吗


我在这里所做的是从外部库调用一个方法,该库加载字体文件以在编写时使用它:

loadTTF(PDDocument pdfFile, File fontfile);
因此,我想让用户从其操作系统中定义的字体中选择一种字体,使用:

GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
Font[] fonts = e.getAllFonts();
然后,当用户选择字体时,我将其传递给
loadTTF(…)
方法以加载它

这里有坏习惯吗?

没有

Java中的A只是字符如何以图形方式显示的表示和定义。它与文件系统无关,技术上甚至不需要最终在文件中定义(例如,请参见获取任意输入流的方法,该输入流可以来自任何地方,例如网络套接字)。在任何情况下,对于您来说,能够获得定义字体的底层系统文件的路径肯定是一个荒谬的抽象突破


我建议,如果您依赖于接受文件,那么您可能在其他方法中做了错误的事情。或者,如果确实需要这样做,那么您在这种方法中做了错误的事情,认为
Font
对象与底层文件有简单的关联。如果您确实需要获取特定字体的文件路径,那么您需要从一个不涉及java.awt.font的不同角度来处理它。

好的。。。这将返回字体文件路径:

String fontFilePath = FontManager.getFontPath( true ) + "/" + FontManager.getFileNameForFontName( fontName );
我曾在Windows和Linux中尝试过这一点,但在这两种系统中效果都很好。

//在Font2D(PhysicalFont.platName)上使用反射,例如。
// use reflection on Font2D (<B>PhysicalFont.platName</B>) e.g.
Font f = new Font("Courier New", 0, 10);

Font2D f2d = FontManager.findFont2D(f.getFontName(), f.getStyle(),      
               FontManager.LOGICAL_FALLBACK).handle.font2D;

Field platName = PhysicalFont.class.getDeclaredField("platName");
platName.setAccessible(true);
String fontPath = (String)platName.get(f2d);
platName.setAccessible(false);

// that's it..
System.out.println(fontPath);
Font f=新字体(“信使新”,0,10); Font2D f2d=FontManager.findFont2D(f.getFontName(),f.getStyle(), FontManager.LOGICAL_FALLBACK).handle.font2D; Field platName=PhysicalFont.class.getDeclaredField(“platName”); platName.setAccessible(true); 字符串fontPath=(字符串)platName.get(f2d); platName.setAccessible(false); //就这样。。 System.out.println(fontPath);
这不会在Maven中编译,因为FontManager是内部API,内部API在Java 7中发生了更改。请参阅。这不适用于Java安装本身附带的字体。我用Gill/Peter O.的解决方案列出了所有可用的字体及其文件路径,其中一些不是在“C:\Windows\fonts”中,而是在“C:\Program Files\Java\jdk1.8.0\U 51\jre\lib\fonts\”中,这在这个解决方案中不起作用。我发现了一个获取Font2D的简单调用。我正在Windows上使用Oracle JRE,“1.8.0_51”。------“Font2D f2d=sun.font.FontUtilities.getFont2D(myJavaAWTFont);”------------另外,在我的个人实现中,我首先检查是否需要访问该字段。(形式。)“final boolean wasaccessable=platName.isAccessible();”,然后考虑布尔值设置/恢复可访问性。