2013-07-18 68 views
0

我試圖捕獲控制檯程序的輸出,並將輸出的覆蓋行寫入到另一個程序將讀取的文件,行我寫入這個文件(該文件一次只能包含一行),但是當我創建這個代碼並嘗試運行它時,它不起作用。該過程開始完美,但該文件沒有被創建,寫入,我沒有得到任何System.out.println的「流:等等等等等等」Java:無法捕獲控制檯程序的控制檯輸出(Blockland.exe)

您可以閱讀下面的代碼或使用此pastebin: http://pastebin.com/raw.php?i=Yahsqxma

import java.io.*; 
    import java.util.Scanner; 



    public class OpenRC { 
static BufferedReader consoleInput = null; 
static String os = System.getProperty("os.name").toLowerCase(); 
static Process server; 
public static void main(String[] args) throws IOException { 
    // OpenRC by Pacnet2013 
    System.out.println(System.getProperty("user.dir")); 
    if(os.indexOf("win") >= 0) { 
     os = "Windows"; 
    } 
    else if(os.indexOf("mac") >= 0) { 
     os = "Mac"; 
    } 
    else if(os.indexOf("nux") >= 0) { 
     os = "Linux"; 
    } 
    switch(os){ 
     case "Linux" : //cause I need WINE  
      File file = new File(System.getProperty("user.dir") + "/OpenRC.txt"); 

      try { 

       Scanner scanner = new Scanner(file); 
        String path = scanner.nextLine(); 
        System.out.println("Got BlocklandEXE - " + path); 
        String port = scanner.nextLine(); 
        System.out.println("Got port - " + port); 
       scanner.close(); 
       server = new ProcessBuilder("wine", path + "Blockland.exe", "ptlaaxobimwroe", "-dedicated", "-port" + port).start();   
       if(consoleInput != null) 
        consoleInput.close(); 
       consoleInput = new BufferedReader(new InputStreamReader(server.getInputStream())); 
       streamLoop(); 
      } catch (FileNotFoundException e) { 
       System.out.println("You don't have an OpenRC Config file OpenRC.txt in the directory of this program"); 
      } 

    } 
} 
public static void streamConsole() 
{ 
    String line = ""; 
    int numLines = 0; 
    try 
    { 
     if (consoleInput != null) 
     { 
      while((line = consoleInput.readLine()) != null && consoleInput.ready()) 
      { 
       numLines++; 
      } 
     } 
    } 
    catch (IOException e) 
    { 
     System.out.println("There may be a problem - An IOException (java.io.IOException) was caught so some lines may not display/display correctly"); 
    } 
    if(!line.equals("") && !(line == null)) 
    { 
     System.out.println("Streaming" + numLines + line); 
     writeToFile(System.getProperty("user.dir"), line); 
    } 
} 
public static void streamLoop() 
{ 
    try 
    { 
     Thread.sleep(5000); 
    } 
    catch (InterruptedException e) 
    { 
     System.out.println("A slight problem may have happened while trying to read a command"); 
    } 
    streamConsole(); 
    streamLoop(); //it'll go on until you close this program 
} 
public static void writeToFile(String filePath, String content) 
{ 
    try { 

     File file = new File(filePath); 
     if (!file.exists()) { 
      file.createNewFile(); 
      System.out.println("Creating new stream text file"); 
     } 

     FileWriter writer = new FileWriter(file.getAbsoluteFile()); 
     BufferedWriter bw = new BufferedWriter(writer); 
     bw.write(content); 
     bw.close(); 

     System.out.println("Wrote stream text file"); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
    } 

回答

0

您正在運行一個DOS控制檯應用程序,這並不一定寫到標準輸出或標準錯誤,但它寫入「控制檯」。捕捉「控制檯」輸出幾乎是不可能的。我見過的唯一一款能夠捕獲控制檯輸出的工具是Don Libes的expect,並且可以做各種各樣的黑客攻擊。