我为我的Java程序编写了一个简短的文档。点击菜单帮助 - >文档操作系统的默认PDF阅读器应打开documentation.pdf
。
我试图在src/doc
中使用Desktop.getDesktop().open(new File("doc/documentation.pdf"));
打开位于Controller.java
目录中的PDF。
但是,Java找不到该文件。当我使用primaryStage.getIcons().add(new Image("icon/icon_512x512.png"));
打开该计划的图标时,它在Main.java
中完美运行。
在这里您可以看到我的IntelliJ项目的布局。
src
├── META-INF
├── de
│ └── myapp
│ ├── model
│ │ └── *.java
│ ├── view
│ │ └── *.java
│ ├── Main.java
│ └── Controller.java
├── doc
│ └── documentation.pdf
└── icon
└── icon_512x512.png
我的筹码
答案 0 :(得分:1)
如果您的应用程序在jar存档中汇编,第三方应用程序无法访问您应用程序中的src目录。您应该将文件与src分开放置。
当然,java找到图标,因为它是java API。 您可以通过以下方法访问src文件夹中的任何资源:
URL url = getClass().getResource("/path/in/src");
InputStream is = getClass().getResourceAsStream("/path/in/src");
如果你的应用程序没有在JAR中组装 - 尝试提供如下文件的完整路径:
URL url = getClass().getResource("/path/in/src");
File file = new File(url.toURI());
答案 1 :(得分:1)
它与new Image("icon/icon_512x512.png")
一起使用,因为内部获取来自上下文ClassLoader
,而不是new File("doc/documentation.pdf")
的情况,如果是相对路径,则从用户工作目录获取它,所以你可以简单地应用相同的逻辑。
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
URL resource = contextClassLoader.getResource("doc/documentation.pdf");
Desktop.getDesktop().open(new File(resource.toURI()));
答案 2 :(得分:1)
可以使用ClassLoader
&n; getResourceAsStream
方法加载Classpath中的文件。
因此,您可以尝试生成输入流对象
InputStream is = Controller.class.getClassLoader().getResourceAsStream("doc/documentation.pdf");
生成输入流后,您可以通过Java程序读取它。