• Java执行cmd或者shell命令,并获取结果


    已经做了处理,兼容windows和linux系统和编码,不会乱码。 

    1. import java.io.BufferedReader;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.io.InputStreamReader;
    5. import java.nio.charset.Charset;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. public class CommandExecutorUtils {
    9. public static String executeCommand(String command) {
    10. Charset charset = System.getProperty("os.name").toLowerCase().contains("win") ? Charset.forName("GBK") : Charset.defaultCharset();
    11. String os = System.getProperty("os.name").toLowerCase();
    12. List commands = new ArrayList<>();
    13. // 判断操作系统类型,并准备命令
    14. if (os.contains("win")) {
    15. // Windows
    16. commands.add("cmd");
    17. commands.add("/c");
    18. } else {
    19. // Unix/Linux/MacOS
    20. commands.add("/bin/sh");
    21. commands.add("-c");
    22. }
    23. commands.add(command);
    24. // 执行命令并获取结果
    25. try {
    26. ProcessBuilder processBuilder = new ProcessBuilder(commands);
    27. Process process = processBuilder.start();
    28. // 获取输出
    29. String output = readStream(process.getInputStream(), charset);
    30. // 等待进程结束
    31. int exitCode = process.waitFor();
    32. if (exitCode == 0) {
    33. return output;
    34. } else {
    35. String error = readStream(process.getErrorStream(), charset);
    36. throw new IOException("Command execution failed with exit code " + exitCode + " and error: " + error);
    37. }
    38. } catch (IOException | InterruptedException e) {
    39. Thread.currentThread().interrupt();
    40. return "Error: " + e.getMessage();
    41. }
    42. }
    43. private static String readStream(InputStream inputStream, Charset charset) throws IOException {
    44. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
    45. StringBuilder builder = new StringBuilder();
    46. String line;
    47. while ((line = reader.readLine()) != null) {
    48. builder.append(line);
    49. builder.append(System.getProperty("line.separator"));
    50. }
    51. return builder.toString();
    52. }
    53. public static void main(String[] args) {
    54. // 示例命令
    55. String command = "ping www.a.shifen.com";
    56. // 在Windows上使用GBK编码读取输出,在Linux上使用系统默认编码
    57. String result = CommandExecutorUtils.executeCommand(command);
    58. System.out.println(result);
    59. }
    60. }

  • 相关阅读:
    linux内核模块符号导出
    【C++】C++11新特性之右值引用与移动语义
    Mysql 数据类型、运算符
    细说 List、顺序表、ArrayList类(附 add 源码解读)—— 数据结构
    System.gc() 和 Runtime.getRuntime().gc()
    5 分钟教你搭建「视频动作分类」系统
    观察者模式——解决解耦的钥匙
    2022年,软件测试已经不吃香了吗?
    在 Navicat 中执行数据库范围搜索
    工业智能网关BL110应用之七十三: 实现西门子S7-300 PLC 接入亚马逊云平台
  • 原文地址:https://blog.csdn.net/LYXlyxll/article/details/134294691