提问者:小点点

我试着在Java开一个pdf,但是没有用


我试图通过点击按钮打开一个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();
          }
        
    }

共2个答案

匿名用户

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());