簡體   English   中英

Java - Desktop.open()不會打開視頻或音樂

[英]Java - Desktop.open() won't open videos or music

我有以下方法應該打開在關聯程序中傳遞的文件。 它適用於大多數文件,但如果我傳遞任何視頻或音樂文件,則會打印java.io.IOException: Failed to open file:/C:/8GB/Bruno%20Mars%20-%20It%20will%20rain.mp3. Error message: Access is denied. java.io.IOException: Failed to open file:/C:/8GB/Bruno%20Mars%20-%20It%20will%20rain.mp3. Error message: Access is denied. (例如)並且不打開文件,即使它與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 ...

Desktop.open(File)文檔說明:

拋出: IOException - 如果指定的文件沒有關聯的應用程序關聯的應用程序無法啟動

嘗試將另一個應用程序與相關文件相關聯,看看是否有效。 另外,檢查“Windows事件日志”以查看WMP在打開時是否可能崩潰。


另一種方法(至少在Windows上可以使用)是使用Runtime.exec(String) -method和start [file]命令來啟動給定文件及其關聯的應用程序。

Runtime.exec("start \"C:\\Your\\Path with spaces\\file.whatever\"");

注意 :當您的路徑中包含空格時,請將路徑放在雙引號中(需要在String中進行轉義)。 此外,由於反斜杠是字符串的轉義字符,因此也需要進行轉義。

另請注意 ,當沒有為給定文件類型分配應用程序時,此方法將打開“選擇適當的應用程序”-dialog。

我遇到了同樣的問題。 不知道原因,但找到了解決方案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM