pdf文件无法从jar ubuntu 16.04打开

时间:2018-05-05 21:19:22

标签: java pdf jar ubuntu-16.04

我使用以下代码从java打开pdf文件。从IDE运行应用程序时代码工作。但是,在生成jar并执行它时,代码停止工作。我不知道我做错了什么。我试过更改文件夹的jar但它仍然无法正常工作。似乎问题是ubuntu 16.04如何处理路由,因为在Windows中这可以正常工作。该应用程序不会抛出异常

我获得pdf的方式我为另一个应用程序做同样的事情,但在其中我获得了一个图像,它既可以在jar中运行,也可以在ide中执行。

 jbTree.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/tree.png")));

Structure of the project

Application

按钮代码

   if (Desktop.isDesktopSupported()) {
        try { 
            File myFile = new File (getClass().getResource("/help/help.pdf").toURI());
            Desktop.getDesktop().open(myFile);
        } catch (IOException | URISyntaxException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

解决方案是通过控制台运行应用程序。试图以另一种方式运行它是行不通的。

1 个答案:

答案 0 :(得分:2)

当您从IDE运行项目时,项目的根目录是System.getProperty("user.dir"),例如,如果您的项目根文件夹是 PDFJar ,它将查找帮助PDFJar/src/project/help/文件夹中的.pdf

在将项目构建到jar文件之后,可以从dist或bin文件夹构建并执行可执行jar,现在System.getProperty("user.dir")将在dist/src/project/help/中找到 help.pdf {1}}文件夹。

您可以在dist或bin目录中使用 help.pdf 创建文件夹 / src / project / help / ,或将Jar文件放入项目根目录中

  

<强> EDITED

除了作为输入流之外,您无法将作为文件打包到JAR存档中的资源文件访问, IDE 的原因是因为该文件存在于src文件夹中因为执行的目录是您的项目文件夹。您需要在JAR achive之外创建文件,然后将流读入其中,以便您可以调用桌面来打开它。

package stackoverflow;

import java.awt.Desktop;
import java.awt.HeadlessException;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author thecarisma
 */
public class StackOverflow {

    public void openHelpFile() {
        OutputStream outputStream = null;
        try {
            File outFile = new File("./help.pdf"); 
            outFile.createNewFile(); //create the file with zero byte in same folder as your jar file or a folder that exists
            InputStream in = getClass().getResourceAsStream("/help/help.pdf");
            outputStream = new FileOutputStream(outFile);
            int read = 0;
            //now we write the stream into our created help file
            byte[] bytes = new byte[1024];
            while ((read = in.read(bytes)) != -1) {
                    outputStream.write(bytes, 0, read);
            }
            if (outFile.exists()) {
                String path= outFile.getAbsolutePath(); 
                JOptionPane.showMessageDialog(null, path);
                if (Desktop.isDesktopSupported()) {
                    JOptionPane.showMessageDialog(null, "Enter");
                    try { 
                        File myFile = new File (path);
                        Desktop.getDesktop().open(myFile);
                    } catch (IOException ex) {
                        JOptionPane.showMessageDialog(null, "Exception");
                    }
                }
            } else {
                JOptionPane.showMessageDialog(null, "Error Occur while reading file");
            }
        } catch (HeadlessException | IOException ex) {
            Logger.getLogger(StackOverflow.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                outputStream.close();
            } catch (IOException ex) {
                Logger.getLogger(StackOverflow.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        StackOverflow stackOverFlow = new StackOverflow();
        stackOverFlow.openHelpFile();
        //the bellow example works for file outside the JAR archive
        /**
        String path= new File("help.pdf").getAbsolutePath(); 
        JOptionPane.showMessageDialog(null, path);
        if (Desktop.isDesktopSupported()) {
            JOptionPane.showMessageDialog(null, "Enter");
            try { 
                File myFile = new File (path);
                Desktop.getDesktop().open(myFile);
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, "Exception");
            }
        } **/
    }

}
  

<强> DETAIL

当您的资源文件打包到JAR存档中时,除了作为文件流之外,它不能作为文件进行访问。文件的位置在JAR存档中是绝对的,例如/help/help.file。 如果你只想阅读conf,xml,text等资源的内容,你可以把它读成BufferReader

InputStream in = getClass().getResourceAsStream("/conf/conf.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

否则,如果是二进制文件,则需要使用0 byte在jar文件外创建文件,然后将资源流从JAR存档读取到创建的文件中。

注意:在从JAR存档读取之前,您应检查帮助文件是否已存在且大小相同,以防止多次读取并跳过该过程以增加运行时间。在创建文件时请注意,因为在 JAVA 中不存在的文件夹中创建文件是不可能的。

您可以向档案管理员打开.jar个文件,查看其结构