java程序执行dos命令或linux命令

2024-02-23 05:38

本文主要是介绍java程序执行dos命令或linux命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

尺有所短,寸有所长,这句话这次真的理解到了,最近碰到个需求,从几十万文件中找出几十万需要的文件,使用java的IO操作时服务器的CPU飙到140%服务卡住了,怎么优化都不行,后来朋友点了一下,可以考虑java调用linux命令操作文件(服务部署在linux服务器上),效率一下子提升很多,CPU也维持在30%以下,然后就有了下面这个工具类,需要的可以看看(顺带研究了下java调用dos命令,学习学习)。

/*** @description class* Create by sunlm* on 2022-01-08 14:03* Make small but daily progress*/
public class CommandUtil {/*** @描述  java在windows环境下执行cmd命令,然后返回命令的返回值。* @参数 [commandLine]    需要执行的dos命令* @返回值 java.util.Map<java.lang.String,java.lang.Object> 执行命令后的返回值* @创建人 sunlm* @创建时间 2022/1/9 12:46* @修改人和其它信息*/public static Map<String,Object> exeCmd(String commandLine){Map<String,Object> result = new HashMap<>();BufferedReader br = null;try {Process p = Runtime.getRuntime().exec(commandLine);//具体设置什么编码要看服务运行的机器dos窗口是什么编码//查看方法://      打开dos窗口执行chcp命令// dos编码://      ①65001 ---> utf-8;//      ②20936 ---> GB2312;//      ③936 ---> GBK;//      ④437 ---> 美国英语;// dos窗口的编码也可以修改,例如改为utf-8的命令:chcp 65001 这是临时修改,关闭再打开就失效了,永久修改需要修改注册表br = new BufferedReader(new InputStreamReader(p.getInputStream(),"GBK"));String line = null;StringBuilder sb = new StringBuilder();while ((line = br.readLine()) != null) {sb.append(line + "\n");}System.out.println(sb.toString());result.put("data",sb.toString());result.put("code",200);} catch (Exception e) {e.printStackTrace();result.put("code",500);result.put("data","执行失败");return result;}finally{if (br != null){try {br.close();return result;} catch (Exception e) {e.printStackTrace();result.put("code",500);result.put("data","执行失败");return result;}}result.put("code",500);result.put("data","执行失败");return result;}}/*** @描述* @参数 [commandLine] 需要执行的LINUX命令* @返回值 java.util.List<java.lang.String>* @创建人 sunlm* @创建时间 2022/1/8 13:47* @修改人和其它信息*/public static Map<String,Object> exeLinux(String commandLine) {long startTime = System.currentTimeMillis();Map<String,Object> result = new HashMap<>();result.put("code",500);Process process = null;InputStreamReader inputStreamReader = null;InputStreamReader errorStreamReader = null;LineNumberReader consoleInput = null;LineNumberReader consoleError = null;String consoleInputLine = "";String consoleErrorLine = "";List<String> sdrResult = new ArrayList<String>();List<String> sdrErrorResult = new ArrayList<String>();try {process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",commandLine});// 获取标准输出inputStreamReader = new InputStreamReader(process.getInputStream());consoleInput = new LineNumberReader(inputStreamReader);while ((consoleInputLine = consoleInput.readLine()) != null) {sdrResult.add(consoleInputLine);}// 获取错误输出errorStreamReader = new InputStreamReader(process.getErrorStream());consoleError = new LineNumberReader(errorStreamReader);while ((consoleErrorLine = consoleError.readLine()) != null) {sdrErrorResult.add(consoleErrorLine);}// 回调返回0时命令执行正常int resultCode = process.waitFor();if(resultCode > 0 && sdrErrorResult.size() > 0){result.put("data",sdrErrorResult);return result;}else{long endTime = System.currentTimeMillis();result.put("code",200);result.put("data",sdrResult.size()==0?"命令执行成功":sdrResult);result.put("time",(endTime-startTime)/60000);return result;}} catch (Exception e) {result.put("data",new ArrayList<String>().add(" with an error."+e));e.printStackTrace();return result;} finally {try {if (null != consoleInput) {consoleInput.close();}if (null != consoleError) {consoleError.close();}if (null != inputStreamReader) {inputStreamReader.close();}if (null != errorStreamReader) {errorStreamReader.close();}if (null != process) {process.destroy();process = null;}} catch (Exception e) {e.printStackTrace();}}}
}

这篇关于java程序执行dos命令或linux命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/737661

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Linux如何查看文件权限的命令

《Linux如何查看文件权限的命令》Linux中使用ls-R命令递归查看指定目录及子目录下所有文件和文件夹的权限信息,以列表形式展示权限位、所有者、组等详细内容... 目录linux China编程查看文件权限命令输出结果示例这里是查看tomcat文件夹总结Linux 查看文件权限命令ls -l 文件或文件夹

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream