在Java程序中打开另一个包中的文件

时间:2014-12-22 20:20:15

标签: java file package

我想在我的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());

1 个答案:

答案 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);