1

我希望能够在鼠标单击时打开帮助 PDF 文件,PDF 文件包含在.jar(并导入到 Eclipse)中。

我正在Help();使用 mouseListener 调用(通过 windowbuilder 添加)。鼠标事件正常工作。我遇到的问题是我不确定如何访问 PDF 文件,我不断收到NullPointerException报告。

我当前的代码是;

if (Desktop.isDesktopSupported()) {
    try {     
        java.io.InputStream is = getClass().getResourceAsStream("/nullpdf.pdf");
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        StringBuffer sb = new StringBuffer();
        String line;

        while ((line = br.readLine()) !=null){
            sb.append(line);
        }

        br.close();
        isr.close();
        is.close();
        File afile =new File(line);
        Desktop.getDesktop().open(afile);
    }

    catch (IOException ex) {
      System.out.println("NO PDF READER INSTALLED");
    }
}

我还尝试了一个更完整的 nullpdf 文件路径(即“package/co/uk/TabSync/nullpdf.pdf”),但具有相同的NullPointerException.

我现在已经编辑了代码来编写一个临时文件,但它仍然无法正常工作:

public void Help() {
         if (Desktop.isDesktopSupported()) {
              try {
String tempFile = "nullpdf";
              System.out.println(tempFile);
            File temp =File.createTempFile(tempFile, "/home/geeky/Desktop/nullpdf.pdf");
              Desktop.getDesktop().open(temp);
              }
              catch (IOException ex) {
                  ex.printStackTrace();
                  System.out.println("NO PDF READER INSTALLED");
              }
         }
    }

我还尝试了桌面上 pdf 文件的绝对路径以及 nullpdf.pdf。如果我只使用 nullpdf.pdf,那么我会得到一个打开的 Leafpad 窗口,其中没有任何内容。如果我尝试使用我的 dekstop 的直接文件路径,我会得到以下信息:

NO PDF READER INSTALLED
java.io.IOException: No such file or directory
    at java.io.UnixFileSystem.createFileExclusively(Native Method)
    at java.io.File.checkAndCreate(File.java:1717)
    at java.io.File.createTempFile0(File.java:1738)
    at java.io.File.createTempFile(File.java:1850)

我是否需要做一些事情来授予应用程序写入我的文件系统的权限(我习惯于 android dev。这通常是一个问题)。

谢谢你的帮助。

4

3 回答 3

0
InputStream input = getClass().getResourceAsStream("/classpath/to/file");

路径必须以“ /”开头,因为它在您的classpath. 因此,如果您的文件在com.test并且您的文件在myPDF.pdf,那么您的路径应该是/com/test/myPDF.pdf.

于 2013-03-27T08:10:27.887 回答
0
File afile =new File(line);
Desktop.getDesktop().open(afile);

在文件被物理写入磁盘之前,上面的代码不会打开文件。你错过了文件编写代码。

的用法File(line)是错误的。File()构造函数采用String的是文件路径而不是数据。第create()一个文件,在其上写入数据。并传递Filetoopen()方法

编辑: 另外,不是在随机位置创建文件,而是创建一个临时文件

File temp = File.createTempFile(tempFile, ".pdf"); 

在其上写入数据并将其传递给Desktop.open()

编辑:2 *首先,您不应将阅读器/编写器用于任何非纯文本文件。PDF 不是纯文本。它是格式化的。您应该仅将其作为流阅读。* 下面的代码有效。但请确保将其包含在 jar 文件中。在 Eclipse 中执行此操作的一种方法是转到 project-properties>java-build-path>source 在此处添加一个文件夹并将 pdf 文件保存在其中。

public void Help() {
        if (Desktop.isDesktopSupported()) {
            try {
            InputStream is = getClass().getResourceAsStream("/test.pdf");
            byte[] data = new byte[is.available()];
            is.read(data);
            is.close();
            String tempFile = "file";
            File temp = File.createTempFile(tempFile, ".pdf");
            FileOutputStream fos = new FileOutputStream(temp);
            fos.write(data);
            fos.flush();
            fos.close();
            Desktop.getDesktop().open(temp);
        } catch (IOException ex) {
            ex.printStackTrace();
            System.out.println("NO PDF READER INSTALLED");
        }
    }
}

Ps:这里是如何将文件写入磁盘http://www.mkyong.com/java/how-to-write-to-file-in-java-bufferedwriter-example/

于 2013-03-27T08:10:38.417 回答
0

此代码工作正常使用此

try {
    // TODO add your handling code here:
    String path = jTextField1.getText();
    System.out.println(path);
    Path tempOutput = null;
    String tempFile = "myFile";
    tempOutput = Files.createTempFile(tempFile, ".pdf");
    tempOutput.toFile().deleteOnExit();
    InputStream is = getClass().getResourceAsStream("/JCADG.pdf");
    Files.copy(is,tempOutput,StandardCopyOption.REPLACE_EXISTING);
    if(Desktop.isDesktopSupported())
    {
        Desktop dTop = Desktop.getDesktop();
        if(dTop.isSupported(Desktop.Action.OPEN))
        {
            dTop.open(tempOutput.toFile());
        }
    }
} catch (IOException ex) {}
于 2016-02-23T01:53:48.467 回答