我即将完成计算机科学课程的程序开发。然而,其中一个要求是在应用程序中拥有用户手册。我将用户手册保存为PDF文件,并存储在Eclipse的工作区中。
它存储在“/Documents/PDF Manual.pdf”下。我最初使用了以下代码:
URL url = getClass().getResource( fileSeparator + "Documents" + fileSeparator + "PDF Manual.pdf");
//fileSeparator = '/' on mac, & '\\' on windows
File userManual = new File (url.toURI());
if (userManual.exists())
{
Desktop.getDesktop().open(userManual);
}
在从eclipse运行项目时,这个方法可以正常工作,但是当程序被导出为jar文件时,URI会返回一个非层次结构的异常(如预期所示)。我想通过使用substring和replaceAll()来玩弄url.toString()以去除不需要的字符(%20代表空格),然而这样会得到奇怪的结果,并且当它不是jar文件时代码将无法正常工作。
我尝试使用InputStream,但这只用于从文件中读取数据,而我不能使用桌面应用程序打开该文件。
由于提交过程的原因,PDF必须保存在项目文件夹内。
此外,我的代码必须是平台独立的(或者至少在Windows和Mac上工作),因此操纵文件名变得更加复杂。有什么建议吗?
编辑:
在@SubOptimal的帮助下,我现在正在使用以下代码:
String inputPdf = "Documents" + fileSeparator + "PDF Manual.pdf";
InputStream manualAsStream = getClass().getClassLoader().getResourceAsStream(inputPdf);
Path tempOutput = Files.createTempFile("TempManual", ".pdf");
tempOutput.toFile().deleteOnExit();
Files.copy(manualAsStream, tempOutput, StandardCopyOption.REPLACE_EXISTING);
File userManual = new File (tempOutput.toFile().getPath());
if (userManual.exists())
{
Desktop.getDesktop().open(userManual);
}
这在mac上可行。然而,在Windows上,由于某些未知原因,manualAsStream为空。
java.io.tmpdir
),因为桌面应用程序可能无法打开存档文件中的文件。 - SubOptimalurl.toURI()
创建新文件时,会返回错误,因此我无法将 PDF 放入临时文件夹中,因为在 JAR 中时根本无法访问其路径。 我的想法是,我需要调用Files.copy()
将 PDF 放置在临时目录中,这样正确吗? - flynn96