4

我在 Netbeans 上创建了一个 Java 应用程序,我想在单击按钮时启动一个 PDF 文件。

我首先做的是将文件“manual.pdf”放在我有我的课程的目录中,我尝试了这段代码:

if(Desktop.isDesktopSupported()) {
     try {
          File file= new File("manual.pdf");
          Desktop.getDesktop().open(file);
     } catch(IOException ex) {...}

但是当我运行它时,它说该文件不存在,所以我把

System.out.println(file.getAbsolutePath());

为了查看它试图打开的文件的路径,它是

C:\Users\adrian\Documents\Mis Programas\Convertron\manual.pdf

但文件在

C:\Users\adrian\Documents\Mis Programas\Convertron\src\org\sicadcam\convertron\manual.pdf

它正在项目的根目录中寻找文件。

当我将文件manual.pdf放在根目录中时,它可以工作,但是,当我在 dist 目录中运行可执行 jar 时,它没有。

然后我尝试了

File file = new File(ConvertronController.class.getResource("manual.pdf").toExternalForm());

只是想看看会发生什么,但它没有用。

我怎样才能使它在类所在的同一目录中查找文件?

或者我应该将文件放在哪里,以便在构建应用程序时它可以继续工作?

4

2 回答 2

5

您可以将 PDF 文档放入 Java 包中,例如resources,像下一个项目结构:

TestProject
|
\---src
    |   
    +---org
    |   \---paulvargas
    |       \---test
    |               OpenTest.java
    |               
    \---resources
            manual.pdf

对于打开文件:

package org.paulvargas.test;

import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class OpenTest {
    public static void main(String[] args) throws Exception {
        if (Desktop.isDesktopSupported()) {
            // File in user working directory, System.getProperty("user.dir");
            File file = new File("manual.pdf");
            if (!file.exists()) {
                // In JAR
                InputStream inputStream = ClassLoader.getSystemClassLoader()
                                    .getResourceAsStream("resources/manual.pdf");
                // Copy file
                OutputStream outputStream = new FileOutputStream(file);
                byte[] buffer = new byte[1024];
                int length;
                while ((length = inputStream.read(buffer)) > 0) {
                    outputStream.write(buffer, 0, length);
                }
                outputStream.close();
                inputStream.close();
            }
            // Open file
            Desktop.getDesktop().open(file);
        }
    }
}
于 2013-06-03T22:41:27.830 回答
0

我用过这是过去的:

getClass().getResource("a_file.txt");

在这种情况下,调用 this 的类与a_file.txt.

于 2013-06-03T22:29:50.820 回答