2011-12-13 58 views
90

Có cách nào để chạy dòng lệnh này trong một ứng dụng Java không?Chạy dòng lệnh trong Java

java -jar map.jar time.rel test.txt debug 

Tôi có thể chạy bằng lệnh nhưng tôi không thể thực hiện điều đó trong Java.

+0

Tôi đã thử, Runtime rt = Runtime.getRuntime(); Process proc = rt.exec ("ping localhost"); – Ataman

+0

Bạn có muốn khởi động máy ảo từ bên trong một máy ảo khác không? – chance

Trả lời

141
Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec("java -jar map.jar time.rel test.txt debug"); 

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

+0

là bình thường khi tôi cố gắng xuất nó ra bàn điều khiển, nó chỉ xuất ra một cái gì đó như thế này: [email protected] – Ataman

+7

Sử dụng 'pr.getInputStream()'. Dưới đây là ví dụ chi tiết: http://www.linglom.com/2007/06/06/how-to-run-command-line-or-execute-external-application-from-java/ – kol

+5

Sẽ hữu ích khi kiểm tra xem quá trình trả về với. Bạn có thể nhận được điều đó với pr.waitFor(). Vì vậy, nó trông như thế này: 'int retVal = pr.waitFor()'. Vì vậy, nếu nó không phải là 0, bạn có thể hủy bỏ/dọn dẹp. – Shiki

3
Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 
5
Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 
8
import java.io.*; 

Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 

Cân nhắc những điều sau nếu bạn chạy vào bất kỳ vấn đề hơn nữa, nhưng tôi đoán rằng ở trên sẽ làm việc cho bạn:

Problems with Runtime.exec()

41

Bạn có thể cũng xem kết quả như sau:

final Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 

new Thread(new Runnable() { 
    public void run() { 
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = null; 

    try { 
     while ((line = input.readLine()) != null) 
      System.out.println(line); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    } 
}).start(); 

p.waitFor(); 

Và đừng quên, nếu bạn đang chạy trong Windows, bạn cần phải đặt "cmd/c" trước lệnh của bạn.

+4

Bạn cũng có thể sử dụng p.getErrorStream để hiểu tại sao lệnh của bạn bị hỏng! – jakebeal

+0

@Craigo: bất kỳ tham chiếu nào về câu lệnh "cmd/c" của bạn? thx – Campa

+2

Thực ra, tôi nghĩ bạn chỉ cần "cmd/c", nếu bạn muốn chạy lệnh windows, như "copy". Xin lỗi vì sự nhầm lẫn. – Craigo

14

Để tránh quá trình được gọi bị chặn nếu nó xuất nhiều dữ liệu về đầu ra tiêu chuẩn và/hoặc lỗi, bạn phải sử dụng giải pháp do Craigo cung cấp. Cũng lưu ý rằng ProcessBuilder tốt hơn Runtime.getRuntime(). Exec(). Điều này là cho một vài lý do: nó tokenizes tốt hơn các đối số, và nó cũng sẽ chăm sóc đầu ra tiêu chuẩn lỗi (kiểm tra cũng here).

ProcessBuilder builder = new ProcessBuilder("cmd", "arg1", ...); 
builder.redirectErrorStream(true); 
final Process process = builder.start(); 

// Watch the process 
watch(process); 

Tôi sử dụng chức năng mới "xem" để thu thập dữ liệu này trong một chuỗi mới. Chủ đề này sẽ kết thúc trong quá trình gọi khi quá trình được gọi kết thúc.

private static void watch(final Process process) { 
    new Thread() { 
     public void run() { 
      BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      String line = null; 
      try { 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }.start(); 
} 
3

gì về

public class CmdExec { 

public static Scanner s = null; 


public static void main(String[] args) throws InterruptedException, IOException { 
    s = new Scanner(System.in); 
    System.out.print("$ "); 
    String cmd = s.nextLine(); 
    final Process p = Runtime.getRuntime().exec(cmd); 

    new Thread(new Runnable() { 
     public void run() { 
      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line = null; 

      try { 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 

    p.waitFor(); 
    } 

} 
Các vấn đề liên quan