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 \n"+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;
    }

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Linux上编译GDAL和GEOS,并使用Java调用它们,您可以按照以下步骤进行操作: 1. 首先,按照前面提到的步骤在Linux上编译和安装GEOS。 2. 接下来,下载GDAL源代码并解压缩。您可以从GDAL的官方网站(https://gdal.org/)上找到最新版本的下载链接。 3. 进入解压后的GDAL源代码目录: ``` cd gdal-x.x.x ``` 4. 运行以下命令来配置GDAL的编译选项,并指定GEOS的路径: ``` ./configure --with-geos=/usr/local ``` 确保将`/usr/local`替换为您实际安装GEOS的路径。 5. 编译和安装GDAL: ``` make sudo make install ``` 6. 完成上述步骤后,GDAL将成功编译和安装在您的Linux系统中。 7. 使用Java调用GDAL和GEOS需要使用Java绑定库。安装Java绑定库可以通过以下步骤完成: - 下载Java绑定库(JavaGDAL)的源代码。您可以从GDAL官方网站(https://gdal.org/java/)上找到相应的下载链接。 - 解压缩下载的源代码文件,并进入解压后的目录。 - 编译和安装Java绑定库: ``` make sudo make install ``` 8. 在使用Java调用GDAL和GEOS之前,确保您的Java项目中已经正确设置了相关的类路径和依赖项。 例如,您可以使用以下命令设置类路径: ``` export CLASSPATH=/usr/local/share/java/gdal.jar:$CLASSPATH ``` 确保将`/usr/local/share/java/gdal.jar`替换为实际的gdal.jar文件路径。 9. 在您的Java代码中,您可以使用GDAL和GEOS的API来执行各种地理空间操作和分析。 例如,您可以使用以下示例代码加载一个矢量文件并执行缓冲区分析: ```java import org.gdal.ogr.DataSource; import org.gdal.ogr.Layer; public class GDALExample { public static void main(String[] args) { // 打开矢量文件 String filePath = "path/to/your/vector/file.shp"; DataSource dataSource = ogr.Open(filePath); // 获取第一个图层 Layer layer = dataSource.GetLayer(0); // 执行缓冲区分析等其他地理空间操作... } } ``` 请注意,以上步骤和示例代码仅提供了一个基本的指导,具体的设置和操作可能因您的环境和需求而有所不同。确保您在使用之前阅读并遵循相关的官方文档和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值