首页 > 编程语言 >java中运行指令浅析

java中运行指令浅析

时间:2023-05-23 14:12:36浏览次数:56  
标签:RuntimeUtil java cmd ping 192.168 指令 浅析 运行

后续业务可能需要在程序中运行指令, 所以这里简单探究了一下, 分别从win和linux两个平台进行研究, 又以为java是跨平台语言, 可能二者之间的区别应该只是返回内容与输入指令的不同. (还不是在win上开发)

1. 如何使用

  • Runtime.getRuntime().exec("notepad");

  • RuntimeUtil.exec("notepad"); // hutool

    了解了使用方法, 接下来探究几个问题.

2. 如何获取返回值

  • 参考: java执行cmd命令并获取返回结果字符串

    public static String execCMD(String command) {
        StringBuilder sb = new StringBuilder();
        try {
            Process process = Runtime.getRuntime().exec(command);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                sb.append(line).append("\n");
            }
        } catch (Exception e) {
            return e.toString();
        }
        return sb.toString();
    }
    
  • hutool中用法1: String str = RuntimeUtil.execForStr("ipconfig");

  • hutool中用法2: List<String> ss = RuntimeUtil.execForLines("ipconfig");

    需要注意一点:

    参数command: a string array containing the program and its arguments.

    以上所有的command 并不是cmd命令行中的命令, 而是在运行窗口(win+r)可以运行的, 比如dir这个典型的cmd命令, 在win+r的运行窗口就不能运行. 可以使用cmd /c dir 来运行.

    /c 是运行完不显示窗口, /k是运行完显示, 其他参数可在cmd指令中打出 cmd /? 查看

3. 模拟在取结果时候堵塞进程

  • 代码

    System.err.println(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
    System.err.println(RuntimeUtil.execForStr("ping 192.168.0.222 /n 2"));
    System.err.println(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
    
  • 输出:

    2022-07-15 16:34:50.523
    
    正在 Ping 192.168.0.222 具有 32 字节的数据:
    来自 192.168.0.222 的回复: 字节=32 时间=49ms TTL=128
    来自 192.168.0.222 的回复: 字节=32 时间=16ms TTL=128
    
    192.168.0.222 的 Ping 统计信息:
        数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
        最短 = 16ms,最长 = 49ms,平均 = 32ms
    
    2022-07-15 16:34:51.575
    
  • 结论

    确实可以看到两个时间相差1s左右. 可以将 ping ** /n 2中的2调大一些查看区别.

    接下来我们把ping命令换成notepadcmd /c notepad, 可以看到直接堵死了.

    在linux系统的终端运行firefox, 在终端会显示对应日志.

    对应到我们例子中, 执行exec方法时候会有返回一个进程p,

    我们就是从进程p的输入流中拿到的程序/指令返回的内容(写在命令行中的内容)

    正常情况下程序执行完就自动结束了, 但是记事本/firefox不会自动停止,

    所以线程会一直占用着, 与是否写日志无关.

    如果这种情况下获取返回内容, 可以将返回内容写入全局数组

    另外使用线程异步进行读取.

4. 刨析进程的从属关系

  • 代码(放在接口中测试)

    ThreadUtil.execAsync(() -> 
            RuntimeUtil.execForStr("notepad"));
    ThreadUtil.execAsync(() -> 
            RuntimeUtil.execForStr("ping 192.168.0.222 /t"));
    ThreadUtil.execAsync(() -> 
            RuntimeUtil.execForStr("notepad"));
    
  • 运行, 使用Process Explorer软件查看

    image

    运行一次.

    image

    运行3次.

    可以看到执行的这些都是java.exe的子线程, 那么当我们停止java.exe程序时候, 其下的子程序也会一起被杀掉吗?

    其实不会, 这些线程会被移动到根目录下

    image

    这很疑惑, 接下来来一个对比类型, 打开命令行输入`ping localhost \t, 查看进程

    image

    可以看到cmd是在explorer.exe下的进程, 就是我们的资源管理器(包括桌面这些, 并不只是我的电脑),

    而且不同之处是ping.exe, 代码生成的会自带一个conhost, 手动执行的则平级生成的.

    然后又测试了使用Runtime.getRuntime().exec("ping 192.168.0.111 /t");生成, 发现当关闭java.exe时还是会移动到最后.

    image

    手动杀掉java也不会影响(树影响), 但是手动命令行中启动的ping在只杀掉命令行时候会一同将子目录杀掉


    尚未在实际中应用, 暂时到此为止.

标签:RuntimeUtil,java,cmd,ping,192.168,指令,浅析,运行
From: https://www.cnblogs.com/Ddlm2wxm/p/16482374.html

相关文章

  • Java 局部变量
     局部变量声明在方法、构造方法或者语句块中。局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁。局部变量必须在使用前声明,并且不能被访问修饰符修饰,因为它们的作用域已经被限制在了声明它们的方法、代码块或构造函数中。局部变量只在......
  • JavaScript正则获取a标签中的path路径值-流程引擎-计算引擎
    直接上代码://获取附件中的链接地址functionget_file_path_from_encode_value(x){vararrLink=[];x.replace(/<a[^>]*path=['"]([^'"]+)[^>]*/gi,function(match,capture){arr......
  • 关于AI与api-Java接口的区别应用点
    AI和API是目前互联网技术中的两个趋势,它们在许多领域都发挥了重要作用。在技术的领域中,AI代表的是人工智能,而API代表的是应用程序接口。在本文中,将讨论AI和API的详细分析。AI是人工智能的简称,是指通过计算机技术模拟人类智能的一种技术体系。AI可以学习数据并自我改进,以达到更好的......
  • Java中的普通类和抽象类有什么区别?
    1.实例化对象:普通类可以被实例化,而抽象类不能被直接实例化。2.成员:普通类中可以有成员变量、成员方法和构造方法,而抽象类中也可以有这些成员,但是抽象类中还可以有抽象方法。3.抽象方法:抽象类中有抽象方法,这些方法没有实现体,需要在子类中被实现和重写。而普通类中没有抽象方法......
  • JAVA设计模式之责任链模式
    文章目录一、责任链(ChainofResponsibility)模式二、责任链模式的结构三、源码四、纯的与不纯的责任链模式五、总结一、责任链(ChainofResponsibility)模式顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发......
  • 微信分享+java后台
    ​微信分享很多人都接触过,我只是把我自己的方法写了一下。不好之处,敬请原谅!先来一张流程图,很实用,也是网上找的,感谢这位博主。​编辑 公众号配置那些就不写了,直接上代码吧!1)、官方上面有相应的签名代码,下载下来就行 进入官方文档 https://mp.weixin.qq.com/wiki?t=resourc......
  • 支付宝APP支付(java后台版)
    ​本实例是基于springBoot框架编写  一、流程步骤      1.执行流程        当手机端app在支付页面时,调起服务端创建订单(自己公司业务接口)接口,后台把需要调起支付宝支付的参数返回给手机端,手机端得到参数后,调起支付宝支付环境支付,完成支付后后会调异......
  • Java开发Lombok使用详解
    转:https://www.jb51.net/article/198920.htm什么是LombokLombok是一款Java开发插件,可以通过它定义的注解来精简冗长和繁琐的代码,主要针对简单的Java模型对象(POJO)。好处就显而易见了,可以节省大量重复工作,特别是当POJO类的属性增减时,需要重复修改的Getter/Setter、构造器方法、eq......
  • Java开发笔记之将一个List拷贝到另一个List的问题
    0x00概述在对List数据进行不同的数据操作的时候,例如分支1将List按照A来排序,分支2将List按照B来排序,需要将List进行数据层面的拷贝; 0x01错误的操作仅仅是List的引用,并没拷贝List内的数据进行处理List<String>list1=newArrayList<>();List<String>list2=newArrayL......
  • 用chatGPT快速开发java后端功能
     接到一个紧急需求如图常规无非是建表,写接口,写测试类,最后造数据进行自测。突发奇想,要不用GPT4试一下快速写业务代码? 写句子1分钟,建表和得到代码1分钟第一步:建表,直接复制excel中内容到GPT中 第二步:要求转为下划线:  第三步:给出条件和想要的结果(下面第一幅图是自己写......