我试图通过点击按钮打开一个pdf文件。 路径实际上是正确的(我可以在浏览器中打开它),但它不工作。 问题究竟出在哪里?
以下是输出:
文件:/users/miladvosoughi/documents/prak/schach/target//mainmenu/ba.pdf
文件不存在!
private void openHelpPDF() {
try {
String adr = getClass()
.getResource("/mainMenu/ba.pdf").toString();
System.out.println(adr);
File pdfFile = new File(adr);
if (pdfFile.exists()) {
if (Desktop.isDesktopSupported()) {
Desktop.getDesktop().open(pdfFile);
} else {
System.out.println("Awt Desktop is not supported!");
}
} else {
System.out.println("File is not exists!");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
string adr=getClass()。getResource(“/mainmenu/ba.pdf”)。toString();
不返回文件名。 从Class.GetResource返回的对象是URL。
应用程序资源不是文件。 永远不能安全地假定它是一个文件。
如果要传递资源,必须将资源URL复制到临时文件,然后打开:
Path pdf = Files.createTempFile(null, ".pdf");
try (InputStream source =
getClass().getResourceAsStream("/mainMenu/ba.pdf")) {
Files.copy(source, pdf,
StandardCopyOption.REPLACE_EXISTING);
}
Desktop.getDesktop().open(pdf.toFile());
此问题是由于您在中使用.toString()
引起的
String adr = getClass().getResource("/mainMenu/ba.pdf").toString();
从而生成一个字符串,该字符串不是java.io.File API所定义的路径名。
基本上,生成的file:/users/.../ba.PDF
字符串中的前缀file:
(源自URL类型)并不将PDF文件的位置描述为路径名。 但是,您使用的file
构造函数需要一个字符串路径名。 因此,如果要将一个字符串传递给file
构造函数,它应该类似于/users/...//mainmenu/ba.pdf
,而不包含file:
部分。
如果您想坚持使用java.io.file
,API可以使用
URL adr = getClass().getResource("/mainMenu/ba.pdf");
System.out.println(adr);
File pdfFile = new File(adr.toURI());