我使用以下代码从java打开pdf文件。从IDE运行应用程序时代码工作。但是,在生成jar并执行它时,代码停止工作。我不知道我做错了什么。我试过更改文件夹的jar但它仍然无法正常工作。似乎问题是ubuntu 16.04如何处理路由,因为在Windows中这可以正常工作。该应用程序不会抛出异常
我获得pdf的方式我为另一个应用程序做同样的事情,但在其中我获得了一个图像,它既可以在jar中运行,也可以在ide中执行。
jbTree.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/tree.png")));
按钮代码
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);
}
}
解决方案是通过控制台运行应用程序。试图以另一种方式运行它是行不通的。
答案 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
个文件,查看其结构