我想在我的java代码中打开一个pdf文件。 pdf(名为" test.pdf")保存在packageA中。尝试打开文件的类(ClassB)在packageB中。我使用以下代码:
try {
File pdfFile = new File(ClassB.class.getResource("/packageA/test.pdf").getPath());
if (pdfFile.exists()) {
if (Desktop.isDesktopSupported()) {
Desktop.getDesktop().open(pdfFile);
}
}
else {
//error
}
catch (Exception e) {
//error
}
当我在eclipse中运行它时,这是有效的,但是当我将程序导出为可执行jar时,它不起作用。我找不到文件。我做了一些研究并尝试使用以下也没有在eclipse之外工作:
ClassLoader cl = this.getClass().getClassLoader();
File pdfFile = new File(cl.getResource("packageA/test.pdf").getFile());
答案 0 :(得分:0)
正如本other Stack Overflow question
所述URI不是分层的,因为jar文件中资源的URI很可能看起来像这样:file:/example.jar!/file.txt。您无法读取jar(zip文件)中的条目,就像它是一个普通的旧文件。
而是将文件字节作为InputStream
InputStream pdf = ClassB.class.getResourceAsStream("packageA/test.pdf");
这应该在eclipse(它仍在从filesytem读取文件)和可执行jar
中工作修改强>
由于无论如何都需要使用File
,获取文件的唯一可靠方法是制作临时文件:
// Copy file
File tmpFile = File.createTempFile(...);
tmpFile.deleteOnExit();
try(OutputStream outputStream = new FileOutputStream(tmpFile);
InputStream pdf = ClassB.class.getResourceAsStream("packageA/test.pdf"); ){
byte[] buffer = new byte[1024];
int length;
while ((length = pdf.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
}//autoClose
//now tmpFile is the pdf
Desktop.getDesktop().open(tmpFile);