2009-04-27 28 views
30

Tôi đang cố gắng để được giá rẻ và thực hiện một lệnh hệ thống cục bộ (uname -a) trong Java. Tôi đang tìm cách lấy đầu ra từ uname và lưu nó trong một String. Cách nào là tốt nhất để thực hiện việc này? mã hiện tại:Làm thế nào để thực hiện các lệnh hệ thống (linux/bsd) bằng cách sử dụng Java

public class lame { 

    public static void main(String args[]) { 
     try { 
      Process p = Runtime.getRuntime().exec("uname -a"); 
      p.waitFor(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line=reader.readLine(); 

      while (line != null) {  
       System.out.println(line); 
       line = reader.readLine(); 
      } 

     } 
     catch(IOException e1) {} 
     catch(InterruptedException e2) {} 

     System.out.println("finished."); 
    } 
} 

Trả lời

53

cách của bạn không phải là xa so với những gì tôi có thể làm:

Runtime r = Runtime.getRuntime(); 
Process p = r.exec("uname -a"); 
p.waitFor(); 
BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream())); 
String line = ""; 

while ((line = b.readLine()) != null) { 
    System.out.println(line); 
} 

b.close(); 

Xử lý bất cứ trường hợp ngoại lệ bạn quan tâm đến, tất nhiên.

+2

Bạn có thay đổi 'b.Close()' thành 'b.close()' không? Tôi muốn chỉnh sửa nó, nhưng tôi cần phải thay đổi "ít nhất sáu" ký tự. (Trừ khi các chỉnh sửa của bạn bị hạn chế theo cách đó) –

+1

@AndrewBreksa: đã hoàn tất! cảm ơn vì đã đánh cắp lỗi chính tả :) –

+1

'Không sao cả. :) –

2

Điều bạn đang làm có vẻ ổn. Nếu lệnh của bạn chỉ trả về một chuỗi, bạn không cần vòng lặp while, chỉ cần lưu trữ giá trị reader.readLine() trong một biến String đơn.

Ngoài ra, bạn có thể nên làm điều gì đó với những ngoại lệ đó, thay vì chỉ nuốt chúng.

+0

Vâng, tôi không cần vòng lặp phải không? Cảm ơn bạn! –

7

Đó là cách tốt nhất để làm điều đó. Ngoài ra bạn có thể sử dụng ProcessBuilder trong đó có một nhà xây dựng luận cứ biến, vì vậy bạn có thể tiết kiệm một hai mã dòng hoặc

+0

Nó không phải là cách * tốt nhất * vì lệnh được thực hiện bằng cách sử dụng shell và, kết quả là nó dễ bị tiêm lệnh hệ điều hành nếu các đối số lệnh được lấy từ đầu vào của người dùng. 'ProcessBuilder' chắc chắn an toàn hơn trong khía cạnh này. – kravietz

+0

"Tôi đang cố gắng để được giá rẻ và thực hiện một lệnh hệ thống địa phương (uname -a) ..." - đó là cách TỐT NHẤT để được giá rẻ và thực hiện một lệnh hệ thống địa phương. Những gì bạn đề cập đến là cách tốt nhất để không thể chấp nhận lệnh tiêm hệ điều hành;) – Azder

+2

Bạn biết đấy, nó giống như yêu cầu một lập trình viên cho * cách nhanh nhất * xuống vách đá ... :) Tôi đã tìm thấy lệnh tiêm OS trong một Các ứng dụng Java sử dụng mẫu thực thi lấy cảm hứng từ StackOverflow, vì vậy tôi nghĩ bất cứ điều gì đề cập đến Runtime.exec() xứng đáng là cảnh báo lớn, chất béo ở đây. – kravietz

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