2010-10-14 28 views
25

Tôi đang cố gắng để có được OutputStream của Process được khởi xướng bởi exec() vào bảng điều khiển. Điều này có thể giải quyết như thế nào?Printing Runtime exec() OutputStream đến bàn điều khiển

Dưới đây là một số mã không đầy đủ:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintStream; 
import java.io.Reader; 

public class RuntimeTests 
{ 
    public static void main(String[] args) 
    { 
     File path = new File("C:\\Dir\\Dir2"); 
     String command = "cmd /c dir"; 
     Reader rdr = null; 
     PrintStream prtStrm = System.out; 
     try 
     { 
      Runtime terminal = Runtime.getRuntime(); 

      OutputStream rtm = terminal.exec(command, null, path).getOutputStream(); 
      prtStrm = new PrintStream(rtm); 
      prtStrm.println(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

Trả lời

2

Bạn cần bắt đầu một chủ đề mới mà có thể đọc dòng đầu ra thiết bị đầu cuối và sao chép nó vào giao diện điều khiển, sau khi bạn gọi process.waitFor()

+3

Đối với tất cả mọi người đến câu hỏi này ngày nay: di chuyển xuống, có một câu trả lời tốt hơn dưới – forresthopkinsa

32

tôi tin rằng đây là những gì bạn đang tìm kiếm:

String line; 
    Process p = Runtime.getRuntime().exec(...); 
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    while ((line = input.readLine()) != null) { 
    System.out.println(line); 
    } 
    input.close(); 
+1

Tôi có một câu hỏi để giải pháp của bạn: Không cần sử dụng process.waitFor()? Nó cũng hoạt động mà không có nhưng tại sao? InputStreamReader có đợi cho đến khi luồng kết thúc không? –

+2

Có, API: _Nếu không có byte nào có sẵn vì đã kết thúc luồng, giá trị -1 được trả về. Phương pháp này chặn cho đến khi dữ liệu đầu vào có sẵn, kết thúc của luồng được phát hiện hoặc ngoại lệ được ném._ –

+0

thêm 'redirectErrorStream (true)' để hoàn thành. –

74

Gần đây tôi đã gặp sự cố này và chỉ muốn đề cập rằng vì java 7 process builder api đã được mở rộng. Vấn đề này có thể được giải quyết với:

ProcessBuilder pb = new ProcessBuilder("yourcommand"); 
pb.redirectOutput(Redirect.INHERIT); 
pb.redirectError(Redirect.INHERIT); 
Process p = pb.start(); 

Tôi hy vọng điều này sẽ giúp :)

+2

Câu trả lời hoàn hảo và thanh lịch. Nếu bạn có thể sử dụng Java 7, đây hoàn toàn là cách để đi. – Shane

+0

Đây là câu trả lời hay nhất, mặc dù có những câu trả lời hay ở trên, luôn cố gắng sử dụng các công cụ có sẵn trong hộp công cụ Java theo mặc định. Java 7/8 là một ngôn ngữ cực kỳ có khả năng và mạnh mẽ - với một bộ công cụ chưa bao giờ mở rộng, nhưng hiệu quả. – DtechNet

11

tôi phải đối mặt với vấn đề tương tự và tôi đang sử dụng đoạn mã sau.

Process p = Runtime.getRuntime().exec("....."); 
p.waitFor(); 

String line; 

BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
while((line = error.readLine()) != null){ 
    System.out.println(line); 
} 
error.close(); 

BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
while((line=input.readLine()) != null){ 
    System.out.println(line); 
} 

input.close(); 

OutputStream outputStream = p.getOutputStream(); 
PrintStream printStream = new PrintStream(outputStream); 
printStream.println(); 
printStream.flush(); 
printStream.close(); 
2

Hãy thử VerboseProcess từ jcabi-log:

String output = new VerboseProcess(new ProcessBuilder("foo.bat")).stdout(); 

Lớp bắt đầu một sợi nền, lắng nghe dòng đầu ra, và các bản ghi đó.

0

Nếu bạn có thể sử dụng org.apache.commons.io.IOUTils từ commons-io,

System.out.println(IOUtils.toString(process.getInputStream())); 
System.err.println(IOUtils.toString(process.getErrorStream())); 
Các vấn đề liên quan