【问题标题】:Open "byte array document" from a Java applet从 Java 小程序打开“字节数组文档”
【发布时间】:2012-07-23 09:45:24
【问题描述】:

我有一个签名的小程序,它从 Web 服务检索 PDF 文档,然后将其存储在临时文件夹中,然后在 Adob​​e Reader 上打开它。我想避免将文件存储在本地,但我真的不知道如何实现它(我是 Java 小程序的新手)。

如果它是一个 Web 应用程序(即一个简单的 servlet),我可以将 PDF 内容写入ServletResponse;然后浏览器会将其存储在其临时文件夹中,并使用 Adob​​e Reader(或与 MIME 类型关联的任何应用程序)打开它。

在 Java 小程序上是否有类似的方法来执行此操作?

这是我目前的代码:

public class MyListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        // Retrieve the document contents
        byte[] content = webService.getPdfDocument(...);

        // Write to file
        File f = new File("my-document-filename.pdf");
        FileOutputStream fos = new FileOutputStream(f);
        fos.write(content);
        fos.close();

        // Open the file
        Desktop.getDesktop().open(new File("my-document-filename.pdf"));
    }
}

Desktop.open(File) 的任何替代方案,允许我通过 byte[] 而不是 File

【问题讨论】:

  • 无论如何,都需要创建临时文件。我不确定Desktop.open 有什么问题。这是一种非常有效的做事方式。
  • +1。我不认为你可以避免临时文件,但也许有一种方法可以让浏览器管理它(以便在完成后清理它)。
  • 创建临时文件是可以的,只要它由浏览器管理,就像使用 ServletResponse 示例一样。我想避免的是在用户的本地驱动器“某处”创建几个 PDF 文件(即 C:/temp/a-document.pdf、C:/temp/another-one.pdf 等)

标签: java applet


【解决方案1】:
  1. Adobe reader can handle URL:s,因此可以为文档创建一个临时 (?) URL。

  2. 否则,您可以从 API 使用 File.createTempFile 创建一个临时文件:

    在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。如果此方法成功返回,则保证:

    1. 返回的抽象路径名表示的文件在调用此方法之前不存在,并且
    2. 此方法及其任何变体都不会在虚拟机的当前调用中再次返回相同的抽象路径名。

    此方法仅提供临时文件功能的一部分。要安排自动删除由此方法创建的文件,请使用 deleteOnExit() 方法。

    因此,在您的情况下,您可以使用以下方法,而不是自己创建新文件:

    File f = File.createTempFile("tmp", ".pdf");
    f.deleteOnExit(); // deletes the file on exit
    ...
    

【讨论】:

  • 不完全是我想要的......但它可能会解决问题。我会试一试。谢谢!
  • 用另一个选项更新了答案。但是临时文件还不错。
  • 第二个选项不适用于我的情况:我无法在服务器端存储文件,因此无法使用 URL 打开它。无论如何,你的第一个选择已经足够好了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 2021-07-08
相关资源
最近更新 更多