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)。
- 合并流:通过
redirectErrorStream(true)合并错误流到标准输出,简化代码(如示例2)。
-
超时控制
使用waitFor(long timeout, TimeUnit unit)(Java 8+)防止无限等待:if (!process.waitFor(30, TimeUnit.SECONDS)) {process.destroy(); // 强制终止进程System.out.println("命令执行超时"); } -
跨平台兼容性
- 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"); }
- Windows可能需要
-
资源释放
在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();}}
}
其他注意事项
-
强制命令行使用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) -
验证命令行编码
- Windows下运行
chcp命令查看活动代码页:936→GBK65001→UTF-8
- 根据实际代码页调整编码设置。
- Windows下运行
-
统一环境编码
在程序启动时指定JVM编码(如-Dfile.encoding=UTF-8),但需确保与命令行编码一致。
总结
- 简单命令:推荐
ProcessBuilder,代码更简洁。 - 复杂场景(如交互式输入、大量输出):结合多线程处理流,避免阻塞。
- 注意事项:正确处理参数、流、超时及跨平台问题。
相关文章:
java——执行linux/cmd命令
在Java中执行命令行命令可以通过Runtime.exec()或ProcessBuilder实现。以下是两种方法的详细说明和示例代码: 1. 使用 Runtime.exec() 适用于简单场景,但需手动处理输入/输出流。 try {// 执行命令(参数以数组形式传递,避免空格…...
VMware Fusion 虚拟机Mac版 安装CentOS 7 系统
介绍 CentOS是Community Enterprise Operating System的缩写,也叫做社区企业操作系统。是企业Linux发行版领头羊Red Hat Enterprise Linux的再编译版本(是一个再发行版本),而且在RHEL的基础上修正了不少已知的 Bug ,相…...
java练习(44)
ps:题目来自力扣 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 // 定义链表节点类,每个节…...
Deepseek 开源周第一天:FlashMLA
Deepseek 隆重开启开源周!第一天我们迎来了FlashMLA。我很高兴带大家了解这项创新,揭秘 FlashMLA 为何能成为 AI 和 GPU 优化领域的变革者。 Deepseek 开源周的热门话题有哪些?...
DeepSeek-OpenSourceWeek-第三天-Release of DeepGEMM
DeepGEMM:这是一款专为高效的 FP8(8 位浮点)通用矩阵乘法(GEMMs)而开发的尖端库。GEMMs 是许多 AI 工作负载(尤其是深度学习)中的基本操作。 特点: 支持稠密和 MoE GEMMs:它可以处理标准的稠密矩阵乘法以及混合专家(MoE)模型中使用的矩阵乘法。MoE 是一种神经网络架…...
Bitlocker取证之PXE降级取密钥
支持到微软Surface pro系列。...
【补阙拾遗】排序之冒泡、插入、选择排序
炉烟爇尽寒灰重,剔出真金一寸明 冒泡排序1. 轻量化情境导入 🌌2. 边界明确的目标声明 🎯3. 模块化知识呈现 🧩📊 双循环结构对比表★★★⚠️ 代码关键点注释 4. 嵌入式应用示范 🛠️5. 敏捷化巩固反馈 ✅ …...
跨AWS账户共享SQS队列以实现消息传递
在现代分布式系统中,不同的服务和组件通常需要进行通信和协作。Amazon Simple Queue Service (SQS)提供了一种可靠、可扩展且完全托管的消息队列服务,可以帮助您构建分布式应用程序。本文将介绍如何在一个AWS账户(账户A)中创建SQS队列,并授权另一个AWS账户(账户B)中的用户和角色…...
基于Python实现的【机器学习】小项目教程案例
以下是一个基于Python实现的【机器学习】小项目教程案例,结合的经典案例与最佳实践,涵盖数据预处理、模型训练与评估全流程,并附详细代码说明与结果分析: 案例1:鸢尾花分类(SVM算法) 数据集:Iris Dataset(含150个样本,4个特征,3个类别) 目标:根据花瓣与萼片长度…...
TDengine 中的数据库
数据库概念 时序数据库 TDengine 中数据库概念,等同于关系型数据库 MYSQL PostgreSQL 中的数据库,都是对资源进行分割管理的单位。 TDengine 数据库与关系型数据库最大区别是跨库操作,TDengine 数据库跨库操作除了少量几个SQL 能支持外&…...
.Net Core Visual Studio NuGet.Config 配置参考
Visual Studio 2022 NUGET NU1301 无法加载源 基础连接已关闭:无法建立SSL / TLS安全通道的信任关系;根据验证过程,远程证书无效,参考文章:https://blog.csdn.net/hefeng_aspnet/article/details/145780081 NuGet 行为…...
深入剖析 OpenCV:全面掌握基础操作、图像处理算法与特征匹配
深入剖析 OpenCV:全面掌握基础操作、图像处理算法与特征匹配 一、引言二、OpenCV 的安装(一)使用 pip 安装(二)使用 Anaconda 安装 三、OpenCV 基础操作(一)图像的读取、显示与保存(…...
帧率和带宽
帧率,通常指的是每秒传输的帧数,帧就是一段数据包。 带宽则是指在单位时间内可以传输的数据量,通常以比特每秒来衡量 帧率在ROS2中可能指的是每秒发布的消息数量。也就是说,一个节点发布话题的频率。比如,每秒发布10次…...
Immich自托管服务的本地化部署与随时随地安全便捷在线访问数据
文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们,你们好呀!今天要给大家揭秘一个超炫的技能——如何把自家电脑变成私人云相册,并…...
20250212:ZLKMedia 推流
1:资料 快速开始 ZLMediaKit/ZLMediaKit Wiki GitHub GitHub - ZLMediaKit/ZLMediaKit: WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11 文档里面提供了各个系…...
IDEA中.gitignore未忽略指定文件的问题排查与解决
IDEA 中.gitignore 未忽略.env 文件的问题排查与解决 在使用 IntelliJ IDEA 进行项目开发时,合理利用.gitignore文件来管理版本控制是非常重要的。它能帮助我们排除一些不需要纳入版本管理的文件,比如包含敏感信息的.env文件。然而,有时我们会遇到一种情况:明明已经将.env…...
Apache-iotdb 基本概念
问题背景 定义(写得太好了!) root 是整个树状结构的父节点, CirroData-TimeS 有存储组、设备、测点等概念,数据在存储的时候,不同的存储组的数据是存储在不同的文件夹中的。上图中有 root.sgcc、root.ln两…...
CryptoJS库中WordArray对象支持哪些输出格式?除了toString() 方法还有什么方法可以输出吗?WordArray对象的作用是什么?
前言:这里只说js用的CryptoJS库里的相关内容,只用js来进行代码操作和讲解。 这里网上相关的帖子很少,不得已问了很长时间AI 想引用CryptoJS库情况分两种,一种是html引用,另一种是在Nodejs里引用。 一、引用CryptoJS库…...
Java 面试题 20250227
Java 中序列化与反序列化是什么? 序列化:将 Java 对象转化成可传输的字节序列格式(字节流、JSON、XML),以便于传输和存储。 反序列化:将字节序列格式数据转化成 Java 对象的过程。 1、为什么需要序列化和…...
springboot浅析
springboot浅析 什么是springboot? 实际上springboot就是一个给我们提供了快速搭建使用spring的一种方式,让我们省去了繁琐的xml配置。 为什么无需进行大量的xml配置,就是因为springboot是基于约定优于配置的思想,简单来说就是遵循…...
【文件基础操作】小笔记
Step1: 现在项目文件夹(我的项目叫做RunPony)下创建一个a.txt文本文件,手动写入一些数字,保存 Step2: 现在在main.c内写一个基本的文件处理的程序 Step3: 现在已经知道如何打开关闭文件,下一步要搞懂如何读取txt内的…...
SSL 证书是 SSL 协议实现安全通信的必要组成部分
SSL证书和SSL/TLS协议有着密切的关系,但它们本质上是不同的概念。下面是两者的区别和它们之间的关系的表格: 属性SSL/TLS 协议SSL证书英文全称SSL(Secure Sockets Layer),TLS(Transport Layer Security&am…...
AI问答-供应链管理:排队模型M/D/5/100/m/FCFS代表的含义是什么
在供应链管理中,排队模型M/D/5/100/m/FCFS代表的含义如下: M: 表示顾客到达时间间隔服从负指数分布(Markov,负指数分布具有无记忆性),即顾客到达是随机的,且到达时间间隔服从指数分…...
迁移学习策略全景解析:从理论到产业落地的技术跃迁
(2025年最新技术实践指南) 一、迁移学习的范式革命与核心价值 在人工智能进入"大模型时代"的今天,迁移学习已成为突破数据瓶颈、降低训练成本的关键技术。本文基于2025年最新技术进展,系统梳理六大核心策略及其在产业实…...
Linux驱动学习(四)--字符设备注册
上一节讲到的字符设备注册与销毁是通过cdev_init、cdev_add、cdev_del等函数分步执行的,本小节用一种更简单的方式,来注册字符设备 register_chrdev 如果major为0,该函数将动态的分配一个主设备号并且返回对应的值如果major > 0ÿ…...
30天开发操作系统 第24天 -- 窗口操作
一、窗口切换 1.0 前天开始我们的应用程序可以显示自己的窗口了,现在画面上到处都是窗口,我们急需能够 切换窗口顺序的功能,使得在需要的时候可以查 看最下面的窗口的内容。这个功能看起来不难,我们马上来实现它。 不过…...
Visual Studio 中 C/C++ 函数不安全警告(C4996)终极解决方案:分场景实战指南
问题描述 在 Visual Studio 中编写 C/C 代码时,使用 scanf、strcpy、fopen 等传统函数会触发以下警告: C4996: xxx: This function or variable may be unsafe. Consider using xxx_s instead. 根本原因: 这些函数缺乏缓冲区溢出检查&#…...
【Go】十八、http 调用服务的编写
http接口框架的搭建 这个http接口框架的搭建参考之前的全量搭建,这里是快速搭建的模式: 直接对已有的http模块进行复制修改,主要修改点在于 proto部分与api、router 部分,剩余的要针对进行修改模块名称。 接口的具体编写 在 a…...
提升数据洞察力:五款报表软件助力企业智能决策
概述 随着数据量的激增和企业对决策支持需求的提升,报表软件已经成为现代企业管理中不可或缺的工具。这些软件能够帮助企业高效处理数据、生成报告,并将数据可视化,从而推动更智能的决策过程。 1. 山海鲸报表 概述: 山海鲸报表…...
Materials Studio MS2020在linux系统上的安装包下载地址 支持centos Ubuntu rocky等系统
下载地址:MS2020-linux官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 Materials Studio 2020是一款功能强大的材料科学计算模拟软件,以下是其详细介绍: 核心模块功能 CASTEP模块:采用平面波赝势方法,适用于周…...
