2010-08-24 6 views
5

Tôi muốn sử dụng công cụ dòng lệnh linux từ chương trình Java của tôi. Tôi bắt đầu chương trình và nhận được đầu ra bằng cách sử dụng lớp Process (http://download.oracle.com/javase/6/docs/api/java/lang/Process.html):Giao tiếp với một công cụ dòng lệnh trong Java

/* @param args 
    * @throws IOException 
    */ 
public static void main(String[] args) throws IOException { 
    Process proc = Runtime.getRuntime().exec("octave"); 

    BufferedReader reader = 
     new BufferedReader(new InputStreamReader(proc.getInputStream())); 

    BufferedReader errorReader = 
     new BufferedReader(new InputStreamReader(proc.getInputStream())); 

    BufferedWriter writer = 
     new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 

    int c; 
    while((c = proc.getInputStream().read()) != -1) { 
     System.out.print((char)c); 
    } 
    System.out.println("End"); 
} 

tôi nhận được kết quả như sau:

octave, phiên bản 3.0.5 Bản quyền (C) 2008 John W Eaton và những người khác. Đây là phần mềm miễn phí; xem mã nguồn để sao chép các điều kiện. Có TUYỆT ĐỐI KHÔNG BẢO ĐẢM; thậm chí không cho TRÁCH NHIỆM BÁN HÀNG HOẶC PHÙ HỢP CHO MỘT SỐ MỤC ĐÍCH CỤ THỂ. Để biết chi tiết, hãy nhập 'bảo hành'.

Octave được định cấu hình cho "i486-pc-linux-gnu".

Thông tin bổ sung về Octave là có sẵn tại http://www.octave.org.

Vui lòng đóng góp nếu bạn tìm thấy phần mềm này hữu ích. Để biết thêm thông tin, lần http://www.octave.org/help-wanted.html

Báo cáo lỗi (nhưng đầu tiên, vui lòng đọc http://www.octave.org/bugs.html để học làm thế nào để viết một báo cáo hữu ích).

Để biết thông tin về các thay đổi từ các phiên bản trước, hãy nhập 'tin tức'.

Điều kỳ lạ là sản phẩm bình thường nếu tôi chạy quãng tám trong Terminal là như sau:

: ~/workspace/Console/src/c $ quãng tám
octave, phiên bản 3.0. 5 Bản quyền (C) 2008 John W. Eaton và những người khác. Đây là phần mềm miễn phí; xem mã nguồn để sao chép các điều kiện. Có TUYỆT ĐỐI KHÔNG BẢO ĐẢM; thậm chí không cho MERCHANTABILITY hoặc PHÙ HỢP CHO MỘT MỤC ĐÍCH CỤ THỂ. Để biết chi tiết, hãy nhập 'bảo hành'.

Octave được định cấu hình cho "i486-pc-linux-gnu".

Thông tin bổ sung về Octave có sẵn tại http://www.octave.org.

Vui lòng đóng góp nếu bạn thấy phần mềm này hữu ích. Để biết thêm thông tin, hãy truy cập http://www.octave.org/help-wanted.html

Báo cáo lỗi đến (nhưng trước tiên, vui lòng đọc http://www.octave.org/bugs.html để học cách viết báo cáo hữu ích).

Để biết thông tin về các thay đổi từ các phiên bản trước, hãy nhập 'tin tức'.

quãng tám: 1>

Vì vậy, các nhân vật trong dòng nơi đầu vào được yêu cầu không được gửi trong luồng đầu vào của tôi. Tại sao?Không phải là nó có thể phát hiện đầu vào được yêu cầu?

Cảm ơn câu trả lời của bạn!

Heinrich

Trả lời

1

tôi cuối cùng đã có thể giải quyết vấn đề: Dưới Linux, sử dụng Octave với --interactive và cuối cùng - tùy chọn chỉnh sửa không có dòng và đã hoạt động :)

Heinrich

7

Chương trình trên * nix có thể phát hiện xem họ đang nói chuyện với thiết bị đầu cuối hay luồng khác. Và nhiều chương trình kiểu shell tương tác phản ứng khác nhau dựa trên điều này (bằng cách thiết lập các nhắc nhở khác nhau, không đọc một số tệp init hoặc thậm chí không bắt đầu ở tất cả).

Bạn có thể gặp phải một trong các tình huống đó.

Ngoài ra, có thể sử dụng API Java cho quãng tám có thể là cách dễ dàng hơn: ví dụ: joPAS.

+0

Cảm ơn bạn đã liên kết đến joPAS. Tôi sẽ xem xét API. Dù sao, tôi vẫn còn tò mò tại sao tôi không nhận được các ký tự "octave: 1>" trong chương trình Java của tôi. – Erik

2

Vì vấn đề của bạn xuất hiện octave cụ thể, tôi đề nghị sử dụng tùy chọn --silent cho quãng tám và chuyển tất cả các tham số trên dòng lệnh trong một lần truy cập. Điều này sẽ làm việc xung quanh các vấn đề được đánh dấu trước đó về việc bắt đầu một phiên đầu cuối.

+0

Thật không may điều này là không thể cho tôi vì tôi muốn sử dụng octave với Java tương tác. – Erik

1

Có thể là nó sẽ mở một bộ mô tả tệp mới cho lời nhắc này?

Bạn có thể thấy rằng trong mã nguồn quãng tám (hoặc mã nguồn readline nếu octave sử dụng mã đó).

2

Bạn không nhận được lời nhắc, "octave: 1>", vì đầu ra quãng tám đang được lưu vào bộ đệm. Nhiều chương trình sử dụng stdio trên Unix/Linux sẽ làm điều tương tự nếu đầu ra không phải là một thiết bị tương tác. Bạn sẽ không nhận được đầu ra cho đến khi bộ đệm đầy (tự động xóa) hoặc bộ đệm được xóa hoàn toàn bởi chương trình gọi fflush (3).

Nếu bạn thực sự muốn tương tác với một chương trình dòng lệnh, thì bạn cần phải sử dụng một pty (cái mà tôi không biết là có thể với java vì tôi chưa bao giờ thử nó).

Trích từ "người đàn ông stdio" giải thích những gì đang xảy ra:

At program startup, three text streams are predefined and need not be 
    opened explicitly -- standard input (for reading conventional input), 
    standard output (for writing conventional input), and standard error 
    (for writing diagnostic output). These streams are abbreviated 
    stdin,stdout and stderr. When opened, the standard error stream is not 
    fully buffered; the standard input and output streams are fully 
    buffered if and only if the streams do not to refer to an interactive 
    device. 

    Output streams that refer to terminal devices are always line buffered 
    by default; pending output to such streams is written automatically 
    whenever an input stream that refers to a terminal device is read. In 
    cases where a large amount of computation is done after printing part 
    of a line on an output terminal, it is necessary to fflush(3) the stan- 
    dard output before going off and computing so that the output will 
    appear.