• Java调用Linux命令(cd的处理)


    一、Java调用Linux系统的命令非常简单

    这是一个非常常用的调用方法示例:

     1     public String executeLinuxCmd(String cmd) {
     2         System.out.println("got cmd job : " + cmd);
     3         Runtime run = Runtime.getRuntime();
     4         try {
     5             Process process = run.exec(cmd);
     6             InputStream in = process.getInputStream();
     7             BufferedReader bs = new BufferedReader(new InputStreamReader(in));
     8             // System.out.println("[check] now size 
    "+bs.readLine());
             
    StringBuffer out = new StringBuffer();
             byte[] b = new byte[8192];
             for (int n; (n = in.read(b)) != -1;) {
               out.append(new String(b, 0, n));
            }
             System.out.println("job result [" + out.toString() + "]");
    14             in.close();
    15             // process.waitFor();
    16             process.destroy();
    17             return result;
    18         } catch (IOException e) {
    19             e.printStackTrace();
    20         }
    21         return null;
    22     }

    二、含有管道符(|)多级命令串联查询

    public List<String> executeLinuxCmd(String cmd) {
            System.out.println("got cmd job : " + cmd);
            Runtime run = Runtime.getRuntime();
            try {
    //            Process process = run.exec(cmd);
                Process process = run.exec(new String[] {"/bin/sh", "-c", cmd});
                InputStream in = process.getInputStream();
                BufferedReader bs = new BufferedReader(new InputStreamReader(in));
                List<String> list = new ArrayList<String>();
                String result = null;
                while ((result = bs.readLine()) != null) {
                    System.out.println("job result [" + result + "]");
                    list.add(result);
                }
                in.close();
                // process.waitFor();
                process.destroy();
                return list;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

    三、含有cd操作的方法示例

    1. 问题背景

    1.1 java程序运行在/home/lings目录下;

    1.2 希望删除/home/test目录下的文件proxy.log;

    1.3 调用上面的接口两次?

    executeLinuxCmd("cd /home/test");
    executeLinuxCmd("rm -fr /home/proxy.log");

    是不行的!

    1.4 这个接口的调用是单次事务型的,就是每次调用都是独立的事务或者说操作,没有关联的。

    那这种“复杂”一点的操作流程怎么办呢?

    1.5 方法a: 可以写一个独立的脚本,然后一次运行脚本,这样多复杂的逻辑都没问题。

    1.6 方法b: 可以启动一个shell长连接,保持连接,发送多条命令,最后释放连接。

    示例逻辑代码:

     1 public void executeNewFlow() {
     2         Runtime run = Runtime.getRuntime();
     3         File wd = new File("/bin");
     4         System.out.println(wd);
     5         Process proc = null;
     6         try {
     7             proc = run.exec("/bin/bash", null, wd);
     8         } catch (IOException e) {
     9             e.printStackTrace();
    10         }
    11         if (proc != null) {
    12             BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    13             PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
    14             out.println("cd /home/test");
    15             out.println("pwd");
    16             out.println("rm -fr /home/proxy.log");
    17             out.println("exit");//这个命令必须执行,否则in流不结束。
    18             try {
    19                 String line;
    20                 while ((line = in.readLine()) != null) {
    21                     System.out.println(line);
    22                 }
    23                 proc.waitFor();
    24                 in.close();
    25                 out.close();
    26                 proc.destroy();
    27             } catch (Exception e) {
    28                 e.printStackTrace();
    29             }
    30         }
    31     }

     三的优化和演进(返回值)

        public List<String> executeNewFlow(List<String> commands) {
            List<String> rspList = new ArrayList<String>();
            Runtime run = Runtime.getRuntime();
            try {
                Process proc = run.exec("/bin/bash", null, null);
                BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
                for (String line : commands) {
                    out.println(line);
                }
                // out.println("cd /home/test");
                // out.println("pwd");
                // out.println("rm -fr /home/proxy.log");
                out.println("exit");// 这个命令必须执行,否则in流不结束。
                String rspLine = "";
                while ((rspLine = in.readLine()) != null) {
                    System.out.println(rspLine);
                    rspList.add(rspLine);
                }
                proc.waitFor();
                in.close();
                out.close();
                proc.destroy();
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return rspList;
        }
  • 相关阅读:
    js动态生成表格
    My97DatePicker显示时间控件的使用方法
    理解Action,Service和Dao功能(转)
    Myeclipseforspring 10破解
    MySQL常用命令(参考资料,部分改动)
    Struts2---Result(传统Web应用程序与Ajax应用程序的异同)
    正则表达式笔记
    day5.字符串内置函数
    day5.数据类型简介
    day4.变量+程序交互
  • 原文地址:https://www.cnblogs.com/yoyotl/p/6914096.html
Copyright © 2020-2023  润新知