Java调用命令行

java里面调用命令行语句 java使用命令行语句,进入指定文件夹后调用语句。 阅读详情

Runtime.exec() 不等同于直接执行command line命令!
啊,我算是在这里吃了苦头了。Runtime.exec()很有局限性,对有些命令不能直接把command line里的内容当作String参数传给exec().
比如重定向等命令。举个例子:
javap -l xxx > output.txt
这时要用到exec的第二种重载,即input 参数为String[]:
Process p = Runtime.getRuntime().exec(new String[]{“/bin/sh”,”-c”,”javap -l xxx > output.txt”});

import java.io.InputStreamReader;  
import java.io.LineNumberReader;  
import java.util.ArrayList;  
import java.util.List;  


public class test{  
/**  
     * 运行shell脚本  
     * @param shell 需要运行的shell脚本  
     */    
     public static void execShell(String shell){  

        try {    
            Runtime rt = Runtime.getRuntime();    
            rt.exec(shell);    
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
     }    
/**  
     * 运行shell  
     *   
     * @param shStr  
     *            需要执行的shell  
     * @return  
     * @throws IOException  
     */    
    public static List runShell(String shStr) throws Exception {    
        List<String> strList = new ArrayList();    

        Process process;    
        process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr},null,null);    
        //process = Runtime.getRuntime().exec(shStr);    
        InputStreamReader ir = new InputStreamReader(process    
                .getInputStream());    
        LineNumberReader input = new LineNumberReader(ir);    
        String line;    
        process.waitFor();    
        while ((line = input.readLine()) != null){    
            System.out.println(line);  
            strList.add(line);    
        }    

        return strList;    
    }  
    public static void main(String []arge)throws Exception {  

        test t=new test();  
        t.runShell("/home/ubuntu/soft/tomcat/bin/startup.sh")  
    }

获得输出值:
执行命令行获取返回值:
方法一

Process p = Runtime.getRuntime().exec("javac");
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine())!= null){
    System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();

方法二

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class TestCmd {
    public static void main(String[] args) {
        java.lang.Process process = null;
        try {
            process = Runtime.getRuntime().exec("net user");
            ByteArrayOutputStream resultOutStream = new ByteArrayOutputStream();
            InputStream errorInStream = new BufferedInputStream(
                    process.getErrorStream());
            InputStream processInStream = new BufferedInputStream(
                    process.getInputStream());
            int num = 0;
            byte[] bs = new byte[1024];
            while ((num = errorInStream.read(bs)) != -1) {
                resultOutStream.write(bs, 0, num);
            }
            while ((num = processInStream.read(bs)) != -1) {
                resultOutStream.write(bs, 0, num);
            }
            String result = new String(resultOutStream.toByteArray());
            System.out.println(result);
            errorInStream.close();
            errorInStream = null;
            processInStream.close();
            processInStream = null;
            resultOutStream.close();
            resultOutStream = null;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (process != null)
                process.destroy();
            process = null;
        }
    }
}

附项目实战代码:

DataOutputStream os = null;
    private Process process = null;
    private Handler mCaptureHanlder = new Handler(new Handler.Callback() {

        @Override
        public boolean handleMessage(Message msg) {
            return false;
        }
    });

    // 开始抓包
    private Runnable mCaptureRunnable = new Runnable() {
        public void run() {
            if (!TextUtils.isEmpty(ForkConstants.path)) {
                String commandPath = mContext.getFilesDir().getAbsolutePath() + "/tcpdump";
                String permissionCmd = "chmod 777 " + commandPath;

                try {  
                    Runtime.getRuntime().exec(permissionCmd);
                    process = Runtime.getRuntime().exec("su");
                    os = new DataOutputStream(process.getOutputStream());  
                    os.writeBytes(commandPath + " " + ForkConstants.parameters.trim() + " -w " + ForkConstants.path + "\n");  

                } catch (Exception e) {  
                        e.printStackTrace();  
                }  
            }
        }
    };

    // 停止抓包
    private Runnable mStopRunnable = new Runnable() {
        public void run() {
            if (!TextUtils.isEmpty(ForkConstants.path)) {
                try {
                    os.writeBytes("kill $(ps | grep tcpdump | tr -s ' ' | cut -d ' ' -f2)\n");
                    os.writeBytes("killall tcpdump\n");
                    os.writeBytes("busybox kill $(ps | grep tcpdump | tr -s ' ' | cut -d ' ' -f2)\n");
                    os.writeBytes("busybox killall tcpdump\n");
                    os.writeBytes("exit\n");
                    os.flush();
                    os.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    try {
                        process.getInputStream().close();
                        process.getOutputStream().close();
                        process.destroy();
                        process = null;
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    };
java调用命令行 封装 简化 在使用java原生库的java.lang.Runtime进行命令行调用的过程中,需要重复编写不少代码。 最近由于本人所在公司使用java调用命令行的操作比较多,于是基于java.lang.Runtime做了一套封装,以简化java调用命令行的编码。 本着工具的简单化,封装过程没有使用第三方插件,采用策略模式提供命令执行结果的判断自定义,采用builder模式提供E... 阅读详情

相关推荐

Win10系统下AppScan 10.0.0安装破解全流程(附百度网盘资源)

本文详细介绍了在Windows 10系统上安装和配置AppScan 10.0.0进行Web漏洞扫描的完整流程。内容涵盖环境准备、分步安装、核心文件部署、许可证配置及首次扫描实践,旨在帮助开发人员和安全爱好者快速搭建专业的Web应用安全扫描环境,并提升扫描效率。

u8v9w0x1y的博客 367

Java调用CMD命令

在Java开发中,有时候需要与操作系统的命令行交互,执行特定的CMD命令或脚本。然而,处理编码问题是调用CMD命令时常遇到的挑战。正确处理编码可以避免输出结果的乱码,确保程序的稳定运行。本文将介绍Java中调用CMD命令的方法,并重点解决编码问题,同时提供一些实用技巧和注意事项。

恋上、小幸福的博客 1万+

在国产麒麟V10(arm64)上离线部署Docker 24.0.6和Compose 2.30.1,保姆级避坑实录

本文详细介绍了在国产麒麟V10(arm64)操作系统上离线部署Docker 24.0.6和Compose 2.30.1的完整流程,包括环境准备、架构认知、安装步骤、系统服务优化及生产环境加固。特别针对ARM64架构的兼容性问题提供了解决方案,帮助用户在信创环境中高效部署容器化技术。

weixin_30342209的博客 484

java 调用命令行

主要针对win下java调用命令行操作基于java17开发,请注意jdk版本核心功能:执行基础的命令,建议批量命令写成bat,然后直调用。 拓展功能:有些命令行执行复杂牵扯到第三方调用,可能会卡住(无限期等待),因此需要配置执行超时时间,执行过程中,没有任何输出完全不响应时需要杀掉脚本进程完整代码:...

ahty的专栏 3378

看不懂分子动力学模拟的结果?一文读懂RMSD曲线

随后,将每一帧结构与初始模板进行叠合,计算对应原子的平均偏移量,即RMSD。总之,掌握 RMSD 的解读方法,就等于抓住了评估分子动力学模拟成败与质量的“总开关”。①在模拟初始阶段,RMSD会从0迅速上升,这是蛋白质从静态晶体或模型结构释放到溶液环境中并逐渐适应的正常过程。②经过一段时间后,曲线不再系统性上升或下降,而是围绕一个平均值,小幅度地上下波动,形成一个稳定的“平台”。这种情况下,RMSD 在初始快速上升后,并未进入平台,而是持续甚至加速上升,始终未见收敛。🔍 如何解读不同趋势的RMSD曲线。

weixin_46587777的博客 4893

51单片机STC8G1K08驱动ws2812记录

使用51单片机控制17个2812灯,这里选择STC8芯片,最大频率可以达到35M,参考网上的各种文章案例,使用定时器做的时候实测做不到规格书要求的245-345ns,STC8G1K08不带PWM,所以只能使用nop来做,好在单片机在这里只有做编程灯的功能,省略测试过程,下面是程序,使用的是24MHz内部晶振 //设置一个灯珠 void SendOnePix(unsigned char *ptr) { unsigned char i,j; unsigned char temp; fo...

的博客 7322

java调用命令行执行脚本

在 Java 中调用命令行可以通过 Runtime 类或 ProcessBuilder 类实现。

weixin_45985719的博客 819

DB2__基本概念——联邦

建立联邦 优点:优点是数据仍然保留在原来的存储位置,而不必建立一个集中的式数据仓储。  缺点:数据联邦查询反映会慢,不适合频繁查询,而且容易出现锁争用和资源冲突等问题 建立联邦表步骤 前提条件:知道两个数据库的ip,用户名,密码及被连数据库的版本 eg:  数据库  qqdb  ip: 22.5.225.225   端口:50000    密码:123456        数据库   ...

qq_38569524的博客 1257

Java 服务里调用命令行进行其他操作的几种实现方式对比

总的来说,如果需要一个稳定且功能丰富的库,推荐使用Apache Commons Exec;如果需要快速开发和简洁的API,推荐使用ZT-Exec。对于不需要额外依赖的简单场景,或者需要细粒度控制的场合,ProcessBuilder是一个不错的内置选项。

龙大的博客 696

GNSS-RTK/INS紧组合里,那个‘杆臂改正’到底怎么算?一个公式讲清INS与天线位置的关系

本文深入解析GNSS-RTK/INS紧组合导航系统中的杆臂改正(Lever Arm Correction)原理与实现方法。详细介绍了杆臂效应的物理本质、数学建模及误差扰动分析,揭示了IMU与GNSS天线位置关系的核心公式,并提供了工程实现中的常见误区与验证方法。通过Python代码示例和紧组合量测模型处理流程,帮助开发者准确理解并应用这一关键技术。

weixin_33137081的博客 357

Virtual Hard Disk version 2 (VHDX) 文件格式详解

VHDX 镜像格式详解 0. References windows github 1. Overview Microsoft 虚拟化产品中常用的映像格式是虚拟硬盘版本 2 (VHDX) 映像格式。该规范基于可用文档,并通过分析测试数据进行了增强。 VHDX 镜像格式种类 固定硬盘镜像 动态硬盘镜像 差异硬盘镜像 VHDX 镜像文件由以下元素构成: file (type) identifier 2x image headers 2x region tables log or metadata journ

圣三一 2697

Java、Python程序中命令行调用Python算法脚本

Java程序通过命令行形式调用Python脚本 主函数可以这样写 代码片. //写调用python脚本的cmd 例如python main.py -f filename public static void main(String[]args){ String cmd = "python main.py"; String results = algorithm(cmd); System.ou...

LongClaw的博客 492

GameFramework框架详解之 Network网络框架

NetworkManager只负责维护NetworkChannel,实际的有种我们简历网络连接的也是NetworkChannel作为一个网路频道,这样管理起来比较方便,比如:一个游戏可能有多个网络连接,那么我们建立多个网络频道即可,或者当我们一个网络频道断线后,我们可以直接再新建一个,防止数据混乱。/// /// 网络管理器。/// /// 网络频道。/// 用户自定义网络错误事件。/// 检查是否存在网络频道。/// 获取网络频道。/// 获取所有网络频道。

TxNet 3367

Java调用Python程序(命令行调用)(命令行向Python传递参数)

Java中调用Python程序(命令行调用)(命令行向Python传递参数) 实现代码 JavaCallPython.java import java.io.*; public class JavaCallPython { public static void main(String[] args) { BufferedReader bufferReader = null...

qq_44486439的博客 1797

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

如何在Java程序中调用命令行

当我们需要借助一些工具来进行大规模批量操作时,就会考虑通过Java程序直接命令行调用工具,并通过流的输出结果采取相应的操作,这样既能达到节省人力的目的,又能昼夜不断的运行,提高执行速度 此处以工作中需要用到解压工具批量解压大量压缩包文件为例: private static void unzip() { String exePath = "D:\\...

pandalovey的博客 1777

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

[Java/Python] Java 基于命令行调用 Python

目录。

weixin_36919049的博客 164

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java通过命令行调用yolov5代码等python

java调用python(yolov5) 由于相对路径等问题无法直接使用Java调用python,可以选择使用java调用命令行cmd命令曲线救国。 一、实现流程 1.创建可以使用的command命令,以cmd /c开头,使用**&&**分隔开各个命令,然后转成字符串格式。 StringBuffer command = new StringBuffer(); command.append("cmd /c E:"); command.append("&&

lqyi111的博客 2537

Java中用命令行调用mplayer

Mplayer;Java调用命令行;Java命令行调用Mplayer.

leather0906的专栏 4587

JAVA如何调用WINDOWS命令行

JAVA如何调用WINDOWS命令行2008-04-01 23:40用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式: ... Process process = Runtime.getRuntime().exec(".//p.exe"

smile_dyf的专栏 1万+
上一篇: 监听EditText
下一篇: 安卓心跳
ithouse
博客等级 码龄12年 200粉丝 212原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值