Java 加载 PDF 文件文件不存在

Posted

技术标签:

【中文标题】Java 加载 PDF 文件文件不存在【英文标题】:Java Load PDF File File Doesnt Exist 【发布时间】:2015-08-20 16:38:30 【问题描述】:

我试图让我的 Java 应用程序在用户单击按钮时打开一个 PDF 文件。但是,我得到下面的堆栈跟踪,指出该文件不存在。基本上,我希望能够在用户进行选择时加载此文件。

下面是堆栈跟踪,然后是代码和路径的屏幕截图。

堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: The file: \RFBase-TD_Communications\src\pdf\RFTDAnalyzerHelpFile.pdf doesn't exist.
    at java.awt.Desktop.checkFileValidation(Unknown Source)
    at java.awt.Desktop.open(Unknown Source)
    at GUI.rfbgui.openPDF(rfbgui.java:787)
    at GUI.rfbgui.access$7(rfbgui.java:773)
    at GUI.rfbgui$6.actionPerformed(rfbgui.java:921)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

代码:

private static void openPDF()

    File pdfHelpFile = new File("/RFBase-TD_Communications/src/pdf/RFTDAnalyzerHelpFile.pdf");
    try
    
        Desktop.getDesktop().open(pdfHelpFile);

    catch(IOException ex)
    
        ex.printStackTrace();
    

【问题讨论】:

我也试过路径pdf/RFTDAnalyzerHelpFile.pdf Getting the inputstream from a classpath resource (XML file)的可能重复 如果您的资源(文件)在类路径中(例如 src 文件夹)。你应该使用另一种方法。请参阅我上面的评论... 【参考方案1】:

对于如何处理这些情况,我有一些一般性建议。文件是我开始学习编程时非常沮丧的事情之一。

    使用 System.getProperty("user.dir"); 这会非常有用,尤其是当您不知道程序将从哪里运行时,或者您有一个具体的文件结构。

    在 Java 中,我一般建议使用“\”而不是“/”。

    对您尝试加载的文件运行完整性检查。专门检查它是否为空,.isFile() 等。你永远不知道你可能会得到什么,所以最好在意外崩溃之前达到峰值。

这里有一些类似问题的链接,可能会对您有所帮助;

How should I load files into my Java application?

Getting the Current Working Directory in Java

Getting the inputstream from a classpath resource (XML file)

【讨论】:

我运行了 .isFile() 并返回 false。为什么我要退货?我没有正确指向文件吗? 如果返回false,表示不管它是什么,它不是一个文件。那可能是因为找不到它,或者它可能是一个文件夹等。此检查仅用于确保在您运行代码(并获得空指针异常)之前它验证它可以实际运行代码。回答你的问题 - 这是我的猜测。您可能没有正确的路径。 @Sh4d0wsPlyr- 感谢您的回复,我上面列出了我的路径,您能帮我确定正确的路径吗,我觉得我正确链接到文件。 我做了这个。java.net.URL link2=rfbgui.class.getResource("/pdf/RFTDAnalyzerHelpFile.pdf");【参考方案2】:

File myFile = new File(getClass().getResource("/files/test.pdf").toURI());

if (Desktop.isDesktopSupported()) 
try 
    File myFile = new File("/path/to/file.pdf");
    Desktop.getDesktop().open(myFile);
 catch (IOException ex) 
    // no application registered for PDFs

【讨论】:

以上是关于Java 加载 PDF 文件文件不存在的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery java api 无法加载数据 - “文件在云上不存在”

iOS 加载PDF问题无法显示电子章问题

程序包sun.jdbc.odbc不存在

如何通过 javascript 检查 chrome:// 文件是不是存在,而不实际加载文件?

网站加载不存在的 CSS 文件

JAVA 代码 使用PD4ML进行 html转换 PDF文档时,如果文档中存在 “~” 字符,则该字符转换的结果 不一致