2016-03-03 110 views
2

請原諒,這是我第一次提出問題。我正在尋找使用Java打印當前在我的計算機上運行的所有應用程序的方法。打印所有正在運行的應用程序Java

例如:

Google Chrome 
Microsoft Word 
Microsoft Outlook 
Netbeans 8.0.2 
Etc. 

目前,我開始一個新的進程和運行命令ps -e然後分析其輸出。雖然我認爲我通過使用命令行正處於正確的軌道,但我認爲我需要一個不同的命令。 這裏是我的代碼:

try { 
      String line; 
      Process p = Runtime.getRuntime().exec("ps -e"); 
      BufferedReader input = 
      new BufferedReader(new InputStreamReader(p.getInputStream())); 
      while ((line = input.readLine()) != null) { 

      for(int i = 0; i < line.length(); i++){ 

       try{ 
       if(line.substring(i, i + 13).equals(".app/Contents")){ 

        //System.out.println(line.substring(i - 5, i + 3)); 
        int j = 0; 
        String app = ""; 

        while(!(line.charAt(i + j) == '/')){ 

         app = app + line.charAt(i + j); 

         //System.out.print(line.charAt(i + j)); 
         j--; 

        } 

        String reverse = new StringBuffer(app).reverse().toString(); 
        System.out.println(reverse); 
        //System.out.println(""); 

       }/*System.out.println(line.substring(i, i + 13));*/}catch(Exception e){} 

      } 

      //System.out.println(line); //<-- Parse data here. 
     } 
    input.close(); 
    } catch (Exception err) { 
     err.printStackTrace(); 
    } 

所以,這是正確的做法,是那裏只是一個不同的命令,我需要使用或是否有更好的方法的整體?

+1

http://stackoverflow.com/questions/54686/how-to-get-a-list-of-current-open-windows-process-with-java類似於你在做什麼 –

+0

這就是我開始了,但這隻會給我所有的流程。我嘗試使用.app/Contents解析所有內容,但這不起作用。 – dsiegler19

回答

0

這是很難優化,但產生一個貌似合理的清單。排除/System//Library/等內容的啓發式方法似乎會產生良好的結果,但這取決於您。這實際上取決於你想要對列表做什麼,無論這是你希望放在用戶面前的東西。

package test; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Set; 
import java.util.TreeSet; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Program { 

    public static void main(String[] args) throws IOException { 

     final Pattern APP_PATTERN = Pattern.compile("\\/([^/]*)\\.app\\/Contents"); 

     Set<String> apps = new TreeSet<>(); 

     String line; 
     Process p = Runtime.getRuntime().exec("ps -e"); 
     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     while (((line = input.readLine()) != null)) { 
      if (!line.contains(" /System/") && 
       !line.contains("/Library/") && 
       !line.contains("/Application Support/")) { 
       Matcher m = APP_PATTERN.matcher(line); 
       if (m.find()) { 
        apps.add(m.group(1)); 
       } 
      } 
     } 
     System.out.println("Apps: " + apps); 
     input.close(); 
    } 
} 
+0

它適用於我的用途,但出於好奇,有沒有什麼辦法可以告訴哪些應用程序在碼頭上運行(即不是背景助手應用程序)。 – dsiegler19

+0

我在編寫代碼時嘗試着解決這個問題,但不認爲它可能來自Java,因此也是啓發式的。也許有Darwin API調用或.plist列出Dock內容?不太可能是一門精確的科學,但如果我找到更好的東西,我會編輯答案。 –

相關問題