2012-02-11 97 views
0

下面的代碼打開狀態非常精細,在記事本:麻煩與的ProcessBuilder

import java.util.*; 
class test 
{ 
public static void main(String args[]) 
{ 
    try{ 
    ProcessBuilder pb=new ProcessBuilder("notepad","F:/status"); 
    pb.start(); 
    }catch(Exception e) 
    { 
     System.out.println(e); 
    } 
} 
} 

下面的代碼does'not播放歌曲:

import java.util.*; 
class test 
{ 
public static void main(String args[]) 
{ 
    try{ 
    ProcessBuilder pb=new ProcessBuilder("C:/Program Files (x86)/VideoLAN/VLC/vlc","D:/02 Tu Jaane Na"); 
    pb.start(); 
    }catch(Exception e) 
    { 
     System.out.println(e); 
    } 
} 
} 
+0

試試用這個'C:\\ Program Files(x86)\\ VideoLAN \\ VLC \\ vlc.exe'和'D:\\ 02 Tu Jaane Na。MP3'並看看這個http://stackoverflow.com/questions/7171840/launch-vlc-player-through-java – RanRag 2012-02-11 10:11:36

+0

會發生什麼?它是否打印出異常?它是否啓動VLC?此外,通常'e.printStackTrace();'比'System.out.println(e);'提供更多的信息。 – 2012-02-11 10:20:28

+0

@ RanRag:但爲什麼它沒有與(/)? – 2012-02-11 10:22:21

回答

2

對於1.6+代碼,使用Desktop.open(File)代替。


當然,在打電話之前要做的明智事情是檢查File.exists()

OTOH,Desktop.open(File)拋出異常方便的轉換,包括:

  • NullPointerException - 如果文件是空
  • IllegalArgumentException - 如果指定的文件不存在
  • UnsupportedOperationException - 如果當前平臺不支持Desktop.Action.OPEN動作
  • IOException - 如果指定的文件沒有關聯的應用程序開啓或關聯的應用程序無法啓動

處理得當,例外情況會顯示緊急問題。


順便說一句,該Desktop類被設計成跨平臺的,並且將處理的關聯被定義爲其中任何類型的文件。從這個意義上說,它比這樣的東西更有用,比嘗試使用Process更有用。

+0

Desktop.open將打開一個關聯的應用程序。在Windows中,關聯僅通過文件擴展名完成,而他(?)試圖打開的文件名爲'D:/ 02 Tu Jaane Na',因此Desktop.open將失敗 – 2012-02-11 11:20:10

+0

請參閱編輯... – 2012-02-11 11:22:47

2

我認爲問題在於你忽略了你試圖打開的文件有filename extensions的事實。

Windows資源管理器默認不顯示文件擴展名 - 這可能是您不知道它們存在的原因。

記事本在你的第一個例子中工作的原因是記事本自動爲其文件名參數添加.txt擴展名,以防你自己沒有提供。所以實際上正在打開的文件不是status而是status.txt

VLC沒有這種「高級」功能,因爲它沒有專門設計用於處理的文件擴展名。

因此,您需要查找dir命令輸出並添加完整的文件名作爲參數。

如果這是真正的問題 - 你可能需要修改您的Windows Explorer設置爲它顯示文件擴展名:

enter image description here

,或者哪個更好,切換到更程序員友好OS :)