java.awt.Desktop.open doesn’t work with PDF files?

匿名 (未验证) 提交于 2019-12-03 02:30:02

问题:

It looks like I cannot use Desktop.open() on PDF files regardless of location. Here's a small test program:

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();         }     } } 

If I run DesktopOpenBug with arguments c:\tmp\zz1.txt c:\tmp\zz.xml c:\tmp\ss.pdf (3 files I happen to have lying around) I get this result: (the .txt and .xml files open up fine)

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) 

What the heck is going on? I'm running WinXP, I can type "c:\tmp\ss.pdf" at the command prompt and it opens up just fine.

edit: if this is an example of Sun Java bug #6764271 please help by voting for it. What a pain. >:(

回答1:

I never knew about this Desktop command, untill recently through this post:
would Java's Runtime.getRuntime().exec() run on windows 7?

Previously i have been using:

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

And it has always worked for me. If your method does not work, may be you can think about try this command.



回答2:

If you switch the order of your arugments does that cause one of the other files to get that same error. I wonder if you need to trim the end of the path before calling the File constructor.

umm...yeah ignore that... check the documentation of Desktop.open. open throws an IO exception "if the specified file has no associated application or the associated application fails to be launched " ... also from the top of the page... "The mechanism of registereing, accessing, and launching the associated application is platform-dependent. "


code for the Desktop class: http://fuseyism.com/classpath/doc/java/awt/Desktop-source.html

The open method calls DesktopPeer.open.

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

DesktopPeer is implementation specific.

Here is source for a Windows-specific implementation: http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Platform/windows/sun/awt/windows/WDesktopPeer.java.htm

open->ShellExecute->(Native)ShellExecute

Native ShellExecute is a wrapper for Win32 ShellExecute. Here is info on the function. http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx

My suggestion for a work around would be to write your own implmentation of the ShellExecute function. Here is source from someone who did it. http://www.heimetli.ch/shellexec.html



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!