当前位置: 首页 > wzjs >正文

中小企业网站建设与管理 王耀建立网站的服务器

中小企业网站建设与管理 王耀,建立网站的服务器,有口碑的装修设计公司,热点营销案例在Java中执行命令行命令可以通过Runtime.exec()或ProcessBuilder实现。以下是两种方法的详细说明和示例代码: 1. 使用 Runtime.exec() 适用于简单场景,但需手动处理输入/输出流。 try {// 执行命令(参数以数组形式传递,避免空格…

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


总结

  • 简单命令:推荐ProcessBuilder,代码更简洁。
  • 复杂场景(如交互式输入、大量输出):结合多线程处理流,避免阻塞。
  • 注意事项:正确处理参数、流、超时及跨平台问题。

文章转载自:

http://PUtSNiYf.Ltpzr.cn
http://WpB3AUGV.Ltpzr.cn
http://G1b0IMv5.Ltpzr.cn
http://8ncTOpB5.Ltpzr.cn
http://IqLk9AsK.Ltpzr.cn
http://T3fhIQJa.Ltpzr.cn
http://ul7IT0y8.Ltpzr.cn
http://1eJ7Xxn1.Ltpzr.cn
http://CWKTEXzd.Ltpzr.cn
http://gc2DJF57.Ltpzr.cn
http://qzFm6pHd.Ltpzr.cn
http://TB64Fhb6.Ltpzr.cn
http://6qKB6yv0.Ltpzr.cn
http://DFPDYp0I.Ltpzr.cn
http://RI3emAje.Ltpzr.cn
http://aK5rBVWQ.Ltpzr.cn
http://rAMELRiD.Ltpzr.cn
http://Z0UJM9X6.Ltpzr.cn
http://jW9JuoJI.Ltpzr.cn
http://DMZwrXBs.Ltpzr.cn
http://3jrtLzqu.Ltpzr.cn
http://cAgKVFhM.Ltpzr.cn
http://LaW8WadN.Ltpzr.cn
http://2kGlcfZy.Ltpzr.cn
http://p3IXuZVB.Ltpzr.cn
http://WBlud4Kq.Ltpzr.cn
http://PAz6iguc.Ltpzr.cn
http://JuhRlnmu.Ltpzr.cn
http://YWb8MZF0.Ltpzr.cn
http://t6rRCmrm.Ltpzr.cn
http://www.dtcms.com/wzjs/648725.html

相关文章:

  • 哪个cms方便快速建站房屋设计在线设计网站
  • 地方志网站建设方案网站建设项目可行性研究报告
  • 衡水建网站wordpress标签拼音
  • 网站改版方案案例网站空间域名一次性收费还是一年一算
  • 怎么修改网站首页logo网站建设毕业设计中期检查
  • 校园电子商务网站建设有网站怎么做app
  • 企业网站定制开发网站优化排名
  • 宁波高新区网站制作网站建设网站系统选择
  • 广东商城网站建设多少钱我是一条龙怎么停更了
  • 淘宝价格网站建设贵阳网站建设三思网络
  • 定制网站开发app费用南京工商注册核名查询系统
  • 网站制作建设公司哪家好沈阳网站建设工作室
  • 快速搭建外贸网站网站运营软件
  • 关于机场建设的网站宜宾建设网
  • 做外贸soho要做网站吗网站建设公司怎么算专业
  • 绥化建设网站服务器2003怎么做网站
  • 网站建设常出现的问题wordpress禁用admin用户
  • 可以直接打开网站的方法著名食品包装设计的案例
  • 网站建设案例算命网站有服务器如何做网站
  • 南京网站开发公司哪家好上海网络公司网站建设
  • wordpress建站优缺点高端网站开发费用
  • 镇平微网站建设西安关键词优化服务
  • 广州做礼物的网站wordpress中文免费模板下载地址
  • 任务发布网站建设浙江省房屋建筑工程资料表格久久建筑网
  • 微餐饮网站建设用途sae wordpress 主题
  • 桂林百度网站建设辽宁城乡建设厅网站
  • 苏州网站建设联系苏州梦易行免费咨询个税
  • 零食天堂 专做零食推荐的网站静态网站设计与制作书籍
  • 服务器如何架设网站石家庄网页设计师培训班
  • 做网站如何被收录wordpress新界面