Java可以直接调用Linux命令,形式如下:
Runtime.getRuntime().exec(command) 举例:运行ls,top命令可以这样:
 Runtime.getRuntime().exec("ls"); 但是这样执行时没有任何输出,原因: 
   调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,
(注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例),
该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 可以采用如下方法: *****************************************************************************************现在遇到一个问题,写了一个程序,调用top命令,并把输出结果打印出来,如下
try
{
 Process process = Runtime.getRuntime().exec ("top -n 1"); // 表示只执行一次就自动退出,
 InputStreamReader ir=newInputStreamReader(process.getInputStream());
 LineNumberReader input = new LineNumberReader (ir); String line;
 while ((line = input.readLine ()) != null){
  System.out.println(line);  
}
catch (java.io.IOException e){
 System.err.println ("IOException " + e.getMessage());

可是结果并不乐观,input.readLine ())总是为空,读不到,
我把Runtime.getRuntime().exec ("ls"); 是可以正常打印出列表信息的,top就不行,
请问大家这个是怎么回事?我该如何实现?

解决方案 »

  1.   

    import java.util.*;
    import java.io.*;class StreamGobbler extends Thread
    {
        InputStream is;
        String type;
        
        StreamGobbler(InputStream is, String type)
        {
            this.is = is;
            this.type = type;
        }
        
        public void run()
        {
            try
            {
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line=null;
                while ( (line = br.readLine()) != null)
                    System.out.println(type + ">" + line);    
                } catch (IOException ioe)
                  {
                    ioe.printStackTrace();  
                  }
        }
    }public class GoodWindowsExec
    {
        public static void main(String args[])
        {
            if (args.length < 1)
            {
                System.out.println("USAGE: java GoodWindowsExec <cmd>");
                System.exit(1);
            }
            
            try
            {            
                String osName = System.getProperty("os.name" );
                String[] cmd = new String[3];
    System.out.println( osName);
                     cmd[0] = "top" ;
                    cmd[1] = "" ;
                    cmd[2] = args[0];
                
                
                Runtime rt = Runtime.getRuntime();
                System.out.println("Execing " + cmd[0] + " " + cmd[1] 
                                   + " " + cmd[2]);
                Process proc = rt.exec(cmd);
                // any error message?
                StreamGobbler errorGobbler = new 
                    StreamGobbler(proc.getErrorStream(), "ERROR");            
                
                // any output?
                StreamGobbler outputGobbler = new 
                    StreamGobbler(proc.getInputStream(), "OUTPUT");
                    
                // kick them off
                errorGobbler.start();
                outputGobbler.start();
                                        
                // any error???
                int exitVal = proc.waitFor();
                System.out.println("ExitValue: " + exitVal);        
            } catch (Throwable t)
              {
                t.printStackTrace();
              }
        }
    }
      

  2.   

    可能是top命令不在当前能搜索到的范围里?猜想