Java-Desktop.open()赢得';不要打开视频或音乐

Java-Desktop.open()赢得';不要打开视频或音乐,java,file,windows-7,desktop,Java,File,Windows 7,Desktop,我有下面的方法来打开在相关程序中传递的文件。它适用于大多数文件,但如果我传递任何视频或音乐文件,它会打印java.io.IOException:无法打开文件:/C:/8GB/Bruno%20Mars%20-%20It%20will%20rain.mp3。错误消息:访问被拒绝。(例如)并且不会打开该文件,即使该文件与Windows Media Player关联 private static void openFileinAssociate(File toOpen){ // Open

我有下面的方法来打开在相关程序中传递的文件。它适用于大多数文件,但如果我传递任何视频或音乐文件,它会打印
java.io.IOException:无法打开文件:/C:/8GB/Bruno%20Mars%20-%20It%20will%20rain.mp3。错误消息:访问被拒绝。
(例如)并且不会打开该文件,即使该文件与Windows Media Player关联

private static void openFileinAssociate(File toOpen){
        // Open it using the operating system/environment
        Desktop environment = Desktop.getDesktop();
        if(toOpen.exists()){
            if(!toOpen.isDirectory())
                try{
                    environment.open(new File(toOpen.getAbsolutePath()));
                }catch(Exception ex){
                    ex.printStackTrace();
                    JOptionPane.showMessageDialog(null, "An error occured whilst trying to open the file.", applicationName, JOptionPane.ERROR_MESSAGE);
                }
        }
}
这是请求的堆栈跟踪的其余部分。对不起,我真的可以发布更多的实际代码了

at sun.awt.windows.WDesktopPeer.ShellExecute(WDesktopPeer.java:77)
at sun.awt.windows.WDesktopPeer.open(WDesktopPeer.java:54)
at java.awt.Desktop.open(Desktop.java:272)
at main.GraphicUI.openFileinAssociate(GraphicUI.java:1930)
at main.GraphicUI.access$12(GraphicUI.java:1924)
at main.GraphicUI$17.mouseReleased(GraphicUI.java:837)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
我正在使用Windows 7,我有最新版本的Java…

桌面的
打开(文件)
声明:

抛出:IOException-如果指定的文件没有关联的应用程序则关联的应用程序无法启动

尝试将另一个应用程序与所讨论的文件关联,看看是否有效。此外,请检查“Windows事件日志”,查看WMP在打开时是否会崩溃


另一种方法(至少在Windows上有效)是使用-method和
start[file]
-命令启动给定文件及其相关应用程序

Runtime.exec("start \"C:\\Your\\Path with spaces\\file.whatever\"");
注意:当路径中有空格时,请将路径用双引号引起来(需要在字符串中转义)。此外,由于反斜杠是字符串的转义字符,因此也需要对其进行转义


另请注意当没有为给定文件类型分配应用程序时,此方法将打开“选择适当的应用程序”对话框。

我遇到同样的问题。不知道原因,但找到了解决办法

Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL \"" + StringEscapeUtils.escapeJava(f.getAbsolutePath()) + "\"");

请张贴完整的StackTrace。@LukasKnuth对延迟表示抱歉。我已按要求编辑了我的答案。很抱歉延迟回复。我刚刚关联了VLC播放器而不是WMP,文件打开时没有错误!我不知道如何检查WMP是否崩溃,但我从来没有真正想出如何使Windows事件查看器的头尾。。。不管发生什么,如果我能阻止的话,我会更喜欢它!有没有一种更“防弹”的方法可以在他们的关联程序中打开文件?@Andy short:没有。Long:你甚至不能依靠
桌面
-类来工作(跨操作系统思维)。捕获异常并给出一个合理的错误消息。真的吗<代码>桌面是唯一的方法吗?没有其他方法使用命令行吗?我不介意mac和windows有两种方法…您可以尝试使用
Runtime.exec(String)
-methid,并使用
start[yourfile]
作为命令。我不能在这里尝试,但它可能会工作。看起来该命令会工作,但当路径中有空格时,我无法让它工作!我会继续努力,但同时你有什么建议吗?