2012-07-23 68 views
5

我有一個簽名的小程序,它從Web服務檢索PDF文檔,然後將其存儲在臨時文件夾中,並在Adobe Reader上打開它。我想避免在本地存儲文件,但我真的不知道如何實現它(我是一個新手與Java小程序)。從Java小程序打開「字節數組文件」

如果它是一個web應用程序(即一個簡單的servlet),我可以通過ServletResponse寫PDF內容;那麼瀏覽器會將其存儲在其臨時文件夾中,並使用Adobe 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

+1

這種或那種方式,臨時文件將需要創建。我不確定'Desktop.open'有什麼問題。這是一種非常有效的做事方式。 – 2012-07-23 09:50:59

+0

+1。我不認爲你可以避免臨時文件,但也許有一種方法可以讓它通過瀏覽器進行管理(以便在完成時清理它)。 – Thilo 2012-07-23 09:51:22

+0

可以創建臨時文件,只要它由瀏覽器管理,就像使用ServletResponse示例一樣。我想避免的是在用戶的本地驅動器中創建幾個PDF文件(即C:/temp/a-document.pdf,C:/temp/another-one.pdf等) – AJPerez 2012-07-23 10:40:23

回答

2
  1. Adobe reader can handle URL:s,所以它可能是一種創建文檔臨時(?)URL的方式。

  2. 否則,您可以創建一個臨時文件使用File.createTempFile,從API:

    創建一個新的空文件在指定的目錄,使用給定的前綴和後綴字符串生成其名稱。如果此方法成功返回則保證:

    1. 由返回的抽象路徑名此方法之前不存在表示的文件被調用,並
    2. 無論這種方法也不是任何變體將返回相同在虛擬機的當前調用中再次提取抽象路徑名。

    此方法僅提供臨時文件設施的一部分。要安排由該方法創建的文件自動刪除,請使用deleteOnExit()方法。

    所以你的情況,而不是自己創建一個新的文件,你可以使用這個方法:

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

不完全是什麼我正在尋找......但它可能會解決問題。我會試一試。謝謝! – AJPerez 2012-07-23 11:18:39

+0

用另一個選項更新答案。但臨時文件並沒有那麼糟糕。 – dacwe 2012-07-23 11:23:00

+0

第二個選項不適用於我的情況:我無法存儲文件服務器端,所以無法使用URL打開它。無論如何,你的第一個選擇已經夠好了:) – AJPerez 2012-07-23 11:42:41