1. 程式人生 > 其它 >java 呼叫本地應用程式 Java開啟(.word,.txt,.pdf)檔案

java 呼叫本地應用程式 Java開啟(.word,.txt,.pdf)檔案

我的java專案中需要開啟一些doc、ppt、rar等檔案,以前的方法是使用類似於Runtime.getRuntime().exec("應用程式路徑", "檔案路徑")的形式去開啟,發現可移植性很差,當專案移植到其他不同的機器時,由於應用程式可能安裝在不同的目錄,就會找不到路徑。

後來找到一種更好的方法,

Runtime.getRuntime().exec("rundll32 url.dll FileProtocolHandler " + filepath)

在測試了以上檔案型別後發現執行正確,類似與windows下預設開啟本地檔案一樣方便。

具體原理在一片文章上看的似懂非懂,原文如下:
windows系統提供了一個叫Rundll32.exe的檔案,顧名思義,它的作用是執行DLL檔案中的內部函式,這樣在程序當中,只會有rundll32.exe,而不會有DLL後門的程序,這樣,就實現了程序上的隱藏。rundll32.exe的具體使用方法如下:
Rundll32.exe DLLname,Functionname [Arguments]
DLLname為需要執行的DLL檔名;Functionname為前邊需要執行的DLL檔案的具體引出函式;[Arguments]為引出函式的具體引數。
結合url.dll和rundll32.exe,我們就可以通過在命令列中啟動相應程式開啟相應文件: 假設我有一個pdf文件,存放在c:\test.pdf 。開啟命令列, 執行如下 命令:
rundll32 url.dll FileProtocolHandler

下面是通過JFileChoose對話方塊,選中一個檔案之後,開啟所選的檔案,像直接雙擊開啟檔案一樣的,開啟選中的檔案

JFileChooser chooseFile = new JFileChooser();  
FileFilter filter = new FileFilter() {  
  
    //要過濾的檔案  
    public boolean accept(File f) {  
        //顯示的檔案型別  
        if (f.isDirectory()) {  
            return true;  
        }  
        //顯示滿足條件的檔案     
        return f.getName().endsWith(".txt") || f.getName().endsWith(".java");  
    }  
  
    /**   
     * 這就是顯示在開啟框中   
     */  
    public String getDescription() {  
  
        return "*.txt,*.java";  
    }  
};  
  
FileFilter filter1 = new FileFilter() {  
  
    public boolean accept(File f) {  
        if (f.isFile()) {  
            return true;  
        }  
        //顯示滿足條件的檔案     
        return f.getName().endsWith(".xls");  
    }  
  
    /**   
     * 這就是顯示在開啟框中   
     */  
    public String getDescription() {  
        return "*.xls";  
    }  
};  
  
   
chooseFile.addChoosableFileFilter(filter);  
chooseFile.addChoosableFileFilter(filter1);  
int open = chooseFile.showOpenDialog(this);  
if (open == JFileChooser.APPROVE_OPTION) {  
    File f = chooseFile.getSelectedFile();  
    Runtime runtime = Runtime.getRuntime();  
    try{  
        System.out.println(f.getAbsolutePath());  
        //開啟檔案  
        runtime.exec("rundll32 url.dll FileProtocolHandler "+f.getAbsolutePath());  
    }catch(Exception ex){  
        ex.printStackTrace();  
    }  
     
} 

實測可用!

轉自:java 呼叫本地應用程式 Java開啟(.word,.txt,.pdf)檔案_lebron3v的專欄-CSDN部落格