2009-10-06 77 views
4

看起來我不能在PDF文件上使用Desktop.open(),無論位置如何。這裏有一個小的測試程序:java.awt.Desktop.open不適用於PDF文件?

package com.example.bugs; 

import java.awt.Desktop; 
import java.io.File; 
import java.io.IOException; 

public class DesktopOpenBug { 
    static public void main(String[] args) 
    { 
     try { 
      Desktop desktop = null; 
      // Before more Desktop API is used, first check 
      // whether the API is supported by this particular 
      // virtual machine (VM) on this particular host. 
      if (Desktop.isDesktopSupported()) { 
       desktop = Desktop.getDesktop(); 
       for (String path : args) 
       { 
        File file = new File(path); 
        System.out.println("Opening "+file); 
        desktop.open(file); 
       } 
      }   
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

如果我帶參數運行c:\tmp\zz1.txt c:\tmp\zz.xml c:\tmp\ss.pdf DesktopOpenBug(3個文件我碰巧躺在附近)我得到這樣的結果:(的.txt和.xml文件開闢罰款)

Opening c:\tmp\zz1.txt 
Opening c:\tmp\zz.xml 
Opening c:\tmp\ss.pdf 
java.io.IOException: Failed to open file:/c:/tmp/ss.pdf. Error message: 
    The parameter is incorrect. 

at sun.awt.windows.WDesktopPeer.ShellExecute(Unknown Source) 
at sun.awt.windows.WDesktopPeer.open(Unknown Source) 
at java.awt.Desktop.open(Unknown Source) 
at com.example.bugs.DesktopOpenBug.main(DesktopOpenBug.java:21) 

這是怎麼回事?我正在運行WinXP,我可以在命令提示符下鍵入「c:\ tmp \ ss.pdf」,它打開就好了。

編輯:如果這是一個Sun Java bug #6764271的例子,請投票支持它。多麼痛苦。 > :(

+0

你應該真的編輯你的原始問題,而不是創建一個新的問題。 – 2009-10-06 18:10:09

+0

將有足夠的編輯,我決定投票結束我原來的問題+打開一個新的。這與UNC路徑無關,唯一的答案就是UNC路徑和空間。 – 2009-10-06 18:38:52

+0

事實上,甚至更好:我已經刪除了舊問題,因爲它在這一點上沒有任何價值。 – 2009-10-06 18:39:46

回答

2

如果您打開arugments的順序做這項事業的其他文件中的一個就搞定了。我不知道你是否需要調用文件構造函數之前修剪路徑的終點是同樣的錯誤。

umm ...是的,忽略那...檢查the documentation of Desktop.openopen如果指定的文件沒有關聯的應用程序或關聯的應用程序無法啓動,則拋出一個IO異常... ...也是從頁面的頂部開始的。 ..「註冊,訪問和啓動相關應用程序的機制取決於平臺。」


對於桌面級

代碼:http://fuseyism.com/classpath/doc/java/awt/Desktop-source.html

open方法調用DesktopPeer.open

DesktopPeer來源:http://www.jdocs.com/javase/7.b12/java/awt/peer/DesktopPeer.html

DesktopPeer是特定的實現。

這裏是特定的Windows的實現源: http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Platform/windows/sun/awt/windows/WDesktopPeer.java.htm

open->ShellExecute->(Native)ShellExecute

本地ShellExecute是爲Win32 ShellExecute的包裝。這裏是關於功能的信息。 http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx

我對變通的建議是編寫自己的ShellExecute函數。這是來自執行此操作的人的來源。 http://www.heimetli.ch/shellexec.html

+0

嗯...是的,忽略了...檢查此鏈接http://java.sun.com/javase/6/docs/api/java/awt/Desktop.html#open(java.io.File).. .open會拋出一個IO異常「,如果指定的文件沒有關聯的應用程序或關聯的應用程序無法啓動」...也是從頁面頂部開始的......「註冊,訪問和啓動關聯應用程序的機制是平臺依賴的。「 – Jon 2009-10-06 19:04:25

+0

你可以編輯你的答案嗎? – 2009-10-06 19:21:10

+0

PDF文件在我的機器上有一個關聯的應用程序,我不知道如何調試正在進行的操作。它所說的是「參數不正確」,這聽起來像是一個Microsoft COM/ActiveX錯誤。 – 2009-10-06 19:22:18

8

我從來不知道這個桌面命令,直到最近通過這個帖子:
would Java's Runtime.getRuntime().exec() run on windows 7?

此前我一直在使用:

Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL "+ myfile); 

,它一直爲我工作。如果你的方法不起作用,可能你可以考慮試試這個命令。

+1

它有幫助,但只在Windows上。 (我使用MacOS和Windows。) – 2011-01-01 12:29:29