java——执行linux/cmd命令

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

本文介绍了在Java中执行Linux/Cmd命令的方法,包括使用不同方式的详细说明及示例代码。阐述了参数传递、流处理、超时控制等关键点,分析了中文乱码的原因并给出解决方案,还提供了完整优化代码示例及其他注意事项,最后给出不同场景的使用建议。

在Java中执行命令行命令可以通过Runtime.exec()或ProcessBuilder实现。以下是两种方法的详细说明和示例代码:


1. 使用 Runtime.exec()

适用于简单场景,但需手动处理输入/输出流。

try {
    // 执行命令(参数以数组形式传递,避免空格问题)
    Process process = Runtime.getRuntime().exec(new String[]{"ping", "-n", "3", "127.0.0.1"});
    
    // 读取标准输出流
    BufferedReader inputReader = new BufferedReader(
        new InputStreamReader(process.getInputStream())
    );
    // 读取错误流
    BufferedReader errorReader = new BufferedReader(
        new InputStreamReader(process.getErrorStream())
    );
    
    // 打印输出和错误信息
    String line;
    while ((line = inputReader.readLine()) != null) {
        System.out.println("输出: " + line);
    }
    while ((line = errorReader.readLine()) != null) {
        System.out.println("错误: " + line);
    }
    
    // 等待命令执行完成并获取退出码
    int exitCode = process.waitFor();
    System.out.println("退出码: " + exitCode);
    
} catch (IOException | InterruptedException e) {
    e.printStackTrace();
}

2. 使用 ProcessBuilder

更灵活,支持错误流合并、工作目录设置等。

try {
    // 构建命令及参数
    ProcessBuilder pb = new ProcessBuilder();
    pb.command("ping", "-n", "3", "127.0.0.1");
    
    // 合并标准输出和错误流(简化处理)
    pb.redirectErrorStream(true);
    
    // 设置工作目录(可选)
    // pb.directory(new File("path/to/dir"));
    
    // 启动进程
    Process process = pb.start();
    
    // 读取输出流
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(process.getInputStream())
    );
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
    
    // 等待命令结束
    int exitCode = process.waitFor();
    System.out.println("退出码: " + exitCode);
    
} catch (IOException | InterruptedException e) {
    e.printStackTrace();
}

关键点说明

  1. 参数传递
    将命令和参数拆分为字符串数组,避免空格导致的解析错误。

  2. 流处理

    • 必须读取输出流:否则进程可能因缓冲区满而阻塞。
    • 多线程处理:若需同时处理标准输出和错误流,可使用多线程(如示例1)。
    • 合并流:通过redirectErrorStream(true)合并错误流到标准输出,简化代码(如示例2)。
  3. 超时控制
    使用waitFor(long timeout, TimeUnit unit)(Java 8+)防止无限等待:

    if (!process.waitFor(30, TimeUnit.SECONDS)) {
        process.destroy(); // 强制终止进程
        System.out.println("命令执行超时");
    }
    
  4. 跨平台兼容性

    • Windows可能需要cmd /c前缀:
      pb.command("cmd", "/c", "dir");
      
    • 根据系统属性调整命令:
      String os = System.getProperty("os.name").toLowerCase();
      if (os.contains("win")) {
          pb.command("cmd", "/c", "mycommand");
      } else {
          pb.command("sh", "-c", "mycommand");
      }
      
  5. 资源释放
    在finally块中关闭流或使用Try-with-Resources(需自定义处理)。

乱码


在Java中读取命令行输出时出现中文乱码,通常是因为系统默认编码与命令行输出的编码不一致(例如,Windows的cmd默认使用GBK编码,而程序可能使用UTF-8)。以下是解决方案及优化后的代码:


原因分析

  • Windows命令行编码:默认使用GBK(对应代码页CP936)。
  • Linux/macOS终端编码:通常为UTF-8。
  • Java程序默认编码:可能与系统编码不同(例如,IDE运行时默认UTF-8)。

解决方案

1. 显式指定字符编码

在创建InputStreamReader时,明确指定与命令行输出一致的编码(如Windows下使用GBK)。

// Windows示例:使用GBK编码读取
BufferedReader inputReader = new BufferedReader(
    new InputStreamReader(process.getInputStream(), "GBK")
);

// Linux/macOS示例:使用UTF-8
BufferedReader inputReader = new BufferedReader(
    new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)
);

2. 自动检测系统编码(推荐)

动态判断操作系统类型,自动选择编码:

import java.nio.charset.Charset;

public class CharsetHelper {
    // 获取命令行输出的默认编码(Windows为GBK,其他系统为UTF-8)
    public static Charset getConsoleCharset() {
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("win")) {
            return Charset.forName("GBK");
        } else {
            return StandardCharsets.UTF_8;
        }
    }
}

// 使用示例:
Charset charset = CharsetHelper.getConsoleCharset();
BufferedReader inputReader = new BufferedReader(
    new InputStreamReader(process.getInputStream(), charset)
);

完整优化代码示例(以ProcessBuilder为例)


import org.apache.commons.lang3.StringUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        //System.out.println("Hello, World!");
        RuntimeExec("ping 127.0.0.1");
        RuntimeExec2("ping www.baidu.com");
    }

    public static void RuntimeExec(String cmd) {
        try {
            if (StringUtils.isBlank(cmd)) {
                return;
            }
            String[] cmds = cmd.split(" ");
            // 出去空格
            for (int i = 0; i < cmds.length; i++)
                cmds[i] = cmds[i].trim();
            // 执行命令(参数以数组形式传递,避免空格问题)
            Process process = Runtime.getRuntime().exec(cmds); /*, null, new File("C:\\Windows\\System32")*/  //new String[]{"ping", "-n", "3", "127.0.0.1"});

            // 读取标准输出流
            BufferedReader inputReader = new BufferedReader(
                    new InputStreamReader(process.getInputStream(), "GB2312")
            );
            // 读取错误流
            BufferedReader errorReader = new BufferedReader(
                    new InputStreamReader(process.getErrorStream(), "GB2312")
            );

            // 打印输出和错误信息
            String line;
            while ((line = inputReader.readLine()) != null) {
                System.out.println("out: " + line);
            }
            while ((line = errorReader.readLine()) != null) {
                System.out.println("err: " + line);
            }

            // 等待命令执行完成并获取退出码
            int exitCode = process.waitFor();
            System.out.println("out: " + exitCode);

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void RuntimeExec2(String cmd) {
        try {
            if (StringUtils.isBlank(cmd)) {
                return;
            }
            String[] cmds = cmd.split(" ");
            // 出去空格
            for (int i = 0; i < cmds.length; i++)
                cmds[i] = cmds[i].trim();
            // 构建命令及参数
            ProcessBuilder pb = new ProcessBuilder();
            pb.command(cmds);

            // 合并标准输出和错误流(简化处理)
            pb.redirectErrorStream(true);

            // 设置工作目录(可选)
            // pb.directory(new File("path/to/dir"));

            // 启动进程
            Process process = pb.start();

            // 读取输出流
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getInputStream(),"GB2312")
            );
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }

            // 等待命令结束
            int exitCode = process.waitFor();
            System.out.println("退出码: " + exitCode);

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

其他注意事项

  1. 强制命令行使用UTF-8(Windows)
    在Windows中,可以通过/U参数让cmd输出UTF-8编码:

    pb.command("cmd", "/U", "/c", "chcp 65001 && ping -n 3 127.0.0.1");
    

    此时需将编码设置为UTF-8:

    new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8)
    
  2. 验证命令行编码

    • Windows下运行chcp命令查看活动代码页:
      • 936 → GBK
      • 65001 → UTF-8
    • 根据实际代码页调整编码设置。
  3. 统一环境编码
    在程序启动时指定JVM编码(如-Dfile.encoding=UTF-8),但需确保与命令行编码一致。


总结

  • 简单命令:推荐ProcessBuilder,代码更简洁。
  • 复杂场景(如交互式输入、大量输出):结合多线程处理流,避免阻塞。
  • 注意事项:正确处理参数、流、超时及跨平台问题。
Java调用Linux命令的两种方式示例 本文介绍了两种常见的方式来实现Java调用Linux命令:使用Runtime类和ProcessBuilder类。通过这些方式,你可以在Java程序中执行各种Linux命令,并处理命令的输出结果。请注意,在使用这些方式时,要谨慎处理命令的参数和输出流,以避免潜在的安全问题和资源泄漏。上述代码通过执行Linux的ls命令,获取命令执行的输出结果,并将结果打印出来。Java中的Runtime类提供了执行系统命令的方法,可以使用它来执行Linux命令。方式二:使用ProcessBuilder类。 阅读详情

相关推荐

java执行Linux命令的方法

主要介绍了java执行Linux命令的方法,涉及对Java中Runtime.exec()函数的应用,具有一定的参考借鉴价值,需要的朋友可以参考下

Java调用CMD命令

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

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

尚硅谷课程【笔记】——大数据之Shell【一】

【【尚硅谷】Shell脚本从入门到实战】笔记

n04j04h06的博客 1319

java程序用调用linux命令执行,可以直接执行linux命令

java程序用调用linux命令执行,可以直接执行linux命令

qq_43567055的博客 2865

【计算机视觉学习03】全景图像拼接

文章目录一、基本原理1.1 图像拼接的几何原理1.2 直线,圆,复杂曲线方程拟合1.3 RANSAC算法1.4 APAP算法1.5 寻找最佳拼接缝(Seam Finding)1.5.1 最大流问题1.5.2 最大流问题的增广链算法1.5.3 最大流最小割定理二、 图像拼接具体实现2.1 代码2.2 运行结果 一、基本原理 将两幅或多幅具有重叠区域的图像,通过特征匹配将具有相同的特征点(SIFT特征点)的图像拼接在一起,将来自多个不同视角拍摄的图像变换到同一视角下,拼接成一张宽视野图像。 图像拼接基础流程

一个正在努力学习的iter 7787

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP+ 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器拨号后再回接到交换机,这样就可以替换掉光猫了。

啦啦啦啦 la 1万+

java实现linux/cmd命令通过代码执行

java实现linux/cmd命令通过代码执行

yushun的博客 770

华为OD机试真题 新系统 2026-05-13 Python&JS语言 实现【查找能被整除的最大整数】

给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大且能被给定正整数整除的数。

MISAYAONE的博客 224

使用java代码执行linux/cmd命令(解决 waitFor() 阻塞/锁死 问题)

场景: java在企业级项目开发中,需要调用exe、shell这样的程序或脚本。 在Java中提供了两种方法来启动其他程序: (1) 使用Runtime的exec()方法 (2) 使用ProcessBuilder的start()方法 。 Runtime和ProcessBulider提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录。但是这两种方法都会返回一个用于管理操作系统进程...

丶自定义 4042

目标检测YOLO实战应用案例100讲-基于YOLOv7的番茄采摘机械手场景感知及试验(下)

根据软件系统的设计需求,制定系统的可行性方案分析,编写系统的相关程序和 调试运行环境,对系统进行测试,以实现对番茄数据的采集及监测。登陆界面登陆后,进入选择界面,菜单包括了对番茄种植棚室的固定相机数据的监测、 对番茄采摘机械手的双目相机采集的番茄的静态、动态数据的获取、对番茄静态、动态数 据处理的功能菜单等选项。与利用人工去进行对于番茄果实的识别和数目的统计相比,番茄视觉系统自动记录番 茄数量以及红色已经成熟的番茄、青色未成熟番茄的数量,减轻人工记录的工作量,减少 人工记录的误差,从经济方面是可行的。

qq_36130719的博客 812

汽车IVI中控开发入门及进阶(九):显示屏

显示屏Display panel和触控屏Touch panel,可以说随着汽车四化的进展,屏越来越多,越来越大,越来越高清,成为IVI中控、智能座舱系统的重要组成部分。比如如下一个电阻触摸屏。正文:显示屏主要功能就是显示,车载内容和信息的传递全靠显示屏,目前车载显示屏的种类可以分为:LCD液晶显示屏(TFT(薄膜晶体管)驱动的有源矩阵液晶显示,再细分IPS、TFT、SLCD,这几个子类)、LED显示屏(用 LED发光二极管作为背光光源)、OLED 显示屏。

码农17年的博客 2526

java中执行cmd命令_Java执行CMD命令

参见:https://blog.youkuaiyun.com/lixingshi/article/details/50467840public static void runtimeCommand() throws Exception {Process process = Runtime.getRuntime().exec("cmd.exe /c dir");int status = process.wait...

weixin_36159662的博客 969

倾斜摄影数据转换为3DTile格式的方法:基于CesiumLab GIS

通过使用CesiumLab GIS,倾斜摄影数据可以方便地转换为3DTile格式,并在CesiumJS等3D地理信息可视化工具中进行展示和分析。一旦成功导入3DTile数据,就可以在CesiumLab GIS中利用其强大的可视化和分析功能进行进一步的处理。转换完成后,可以将生成的3DTile数据导入到CesiumLab GIS中进行可视化和分析。启动CesiumLab GIS应用程序,并按照界面上的指导导入转换后的3DTile数据。脚本将开始执行,并将倾斜摄影数据转换为3DTile格式。

ObDjango的博客 1076

Runtime.getRuntime().exec()执行linuxshell脚本

linux下: String[] command = { "/bin/sh", "-c", cmmd }; Process ps = Runtime.getRuntime().exec(command ); windows下:  String[] command = { "cmd", "/c", cmmd }; Process ps = Run

north_easter的专栏 5975

C# ScottPlot 5.0 WinForms 十字光标示例:轻松实现动态数值显示,你学会了吗?

ScottPlot是一个免费、开源的.NET交互式绘图库,能够轻松地实现大型数据集的交互式显示。它支持多种图表类型,如折线图、柱状图、饼图、散点图等。ScottPlot的性能非常出色,即使是处理千万级别的数据也游刃有余。

java专栏 2216

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

解决Java执行cmd命令报错 Cannot run program “xxx组件名“: CreateProcess error=2, 系统找不到指定的文件。

解决Java执行cmd命令报错 Cannot run program "xxx组件名": CreateProcess error=2, 系统找不到指定的文件。

tbaclg的博客 6279

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

windows使用dd.exe的原理_命令执行底层原理探究-PHP(一)

前言针对不同平台/语言下的命令执行是不相同的,存在很大的差异性。因此,这里对不同平台/语言下的命令执行函数进行深入的探究分析。文章开头会对不同平台(Linux、Windows)下:终端的指令执行、语言(PHP、Java、Python)的命令执行进行介绍分析。后面,主要以PHP语言为对象,针对不同平台,对命令执行函数进行底层深入分析,这个过程包括:PHP内核源码的编译、运行、调试、审计等,其它语言分...

weixin_33384949的博客 873

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java 使用Runtime.getRuntime().exec(command)执行命令和脚本

1.执行脚本 (1) linux和mac String cmd = "sh "+path+ File.separator+"sh/containisenable.sh redis"; String[] command = {"/bin/sh", "-c", cmd}; System.out.println(cmd); Process exec = Runtime.getRuntime().exec(command); (2)Windows String[] command = { "cmd.exe", "/

qq_53205955的博客 2053

java Runtime如何执行多条命令

操作linux系统使用"/bin/sh", "-c"操作windows系统使用"cmd", "/c"//指定目录解压,有重复文件进行覆盖。java Runtime如何执行多条命令。//解压压缩包到指定目录。使用 && 分隔命令。

m0_73570288的博客 1716

ProcessBuilder的使用(执行多行命令,实时获取日志)

ProcessBuilder用来创建操作系统进程,可以在指定位置,执行指定命令。这里通过process实现java执行shell,python脚本的功能。 1.通过ProcessBuilder执行多行命令 由于需要在命令中设置Path,试了多种方式后,使用cmd/bash封装为一整个命令实现,其中windows环境下使用cmd,linux环境下使用/bin/bash。 windows代码如下:多行命令通过分号分割 List<String> commandList = new Array

qq_36874177的博客 9466

Linux命令 /bin/sh -c ps -ef|grep XX

/bin/sh:指向当前shell的符号链接 /bin/sh -c命令表示后面的参数将会作为字符串读入作为执行的命令。 ps -ef|grep ps命令将某个进程显示出来 grep命令是查找 中间的|是管道命令 是指ps命令与grep同时执行 PS是LINUX下最常用的也是非常强大的进程查看命令 以下这条命令是检查java 进程是否存在:ps -ef |grep nmap 字段含义如下: UID PID PPID C STIME TTY ...

m0_61377301的博客 3825

Java执行外部命令,并把结果回显到控制台

JAVA现在执行外部命令,主要的方式,还是通过调用所以平台的SHELL去完成,WINDOWS下面就用CMD,LINUX或者是UNIX下面就用SHELL,下面演示一个对BAT文件的调用,并把结果回显到控制台上,其它的应用程序类。 说明: 一个调用SHELL执行外部 取得外部程序的输出流,采用适当的READER读回来,并显示出来就OK了 下面是源程序: [code] import ...

laiseeme 189

Linux 环境Runtime.getRuntime().exec()执行报文件无权限

问题 最近项目使用了Runtime.getRuntime().exec()方法,这个方法返回的返回值的含义如下。 在使用过程中,发现直接exec(cmd)执行scp命令没问题,但是执行ssh命令时报错 比如 scp local remote,scp remote local都成功。 ssh root@ip "cp a1 a2" 报错 解决办法 String[] cmds ={"/bin/sh"."-c",cmd}; Runtime.getRuntime().exec(cmds); 原因 这

kimichen123的专栏 8450

Java 解决 Process 执行命令行命令报【CreateProcess error=2, 系统找不到指定的文件。】错误问题

使用 Process 执行命令行命令时,报CreateProcess error=2, 系统找不到指定的文件。但明明指定的文件是存在的。

8341

java调用批处理命令

java调用批处理命令: windows中的.bat和.cmd文件。 linux中的sh文件。 java实例demo: String cmd = "E:\\Test\\hello.cmd"; Process process = null; InputStream fis = null; InputStreamReader isr = null; BufferedReader br = nu...

quietbxj的博客 477

Java Runtime.exec()方法的使用(很实用)

转载于:https://www.cnblogs.com/mingforyou/p/3551199.html Sun的doc里其实说明还有其他的用法: exec(String[] cmdarray, String[] envp, File dir) Executes the specified command and arguments in a separate process with the specified environment and working directory. 那个d

junior77的专栏 1万+
上一篇: 算法——后缀自动机
下一篇: 算法——序列自动机
夏子曦
夏子曦 优质创作者: 产品设计技术领域 优质创作者: 产品设计技术领域
博客等级 码龄15年 8289粉丝 427原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值