Java调用Linux系统命令

Java利用ImageMagick调用linux系统命令实现Ai或者PSD文件转化为jpg或者png文件  利用ImageMagick调用linux系统命令得方式实现了这个需求。所有的操作都在centeros 6.5下进行。  ImageMagick安装1、确保系统已经安装以下包可以通过下面的命令进行查看rpm -qa |grep libjpeg安装yum install libjpegyum install libjpeg-develyum install libpngyum install lib... 阅读详情

Java调用Linux系统命令

有时候,我们在使用Java做一些操作时,可能性能上并不能达到我们满意的效果,就拿最近工作中的遇到的一个场景来说,需要对大量的小文件进行合并成一个大文件。

最开始的想法是使用Java做文件操作,遍历所有小文件然后往一个文件写(可以做成并发写),但是发现操作过程中遇到个问题,写一千多个小文件在本机Windows下需要花费几十秒的时间,即使在Linux环境下高配置的机器也需要将近十秒,这明显对接口的响应时间产生重要影响。这块怎么优化下呢?

我们都知道在Linux下可以进行大文件的分割和合并,分别采用split和cat命令,于是做了个实验,在Linux下对相同的一个1G文件进行切割成1000个小文件,然后对这一千多个小文件进行合并。效果是惊人的!!!竟然瞬间就能合成完成了!这更加让我坚定了应该使用系统命令进行批量小文件进行合并的想法。

我们这里封装一个类,用来调用系统命令,然后得到系统调用的返回结果。

我们先封装了一个返回结果类:

package com.majing.learning.fileupload.common.process;

  

public class ProcessResult {

 private boolean success = false;

 private String errorMessage;

 private String outputMessage;

 public boolean isSuccess() {

  return success;

 }

 public void setSuccess(boolean success) {

  this.success = success;

 }

 public String getErrorMessage() {

  return errorMessage;

 }

 public void setErrorMessage(String errorMessage) {

  this.errorMessage = errorMessage;

 }

 public String getOutputMessage() {

  return outputMessage;

 }

 public void setOutputMessage(String outputMessage) {

  this.outputMessage = outputMessage;

 }

  

}

接着我们给出封装的系统调用实现类:

package com.majing.learning.fileupload.common.process;

  

import java.io.IOException;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.ExecutorService;

  

import org.apache.commons.lang3.StringUtils;

  

public class CommandUtils {

  

 public static ProcessResult runCmdTest(ExecutorService executorService, String command) throws IOException, InterruptedException {

  StringBuilder queryInputResult = new StringBuilder();

  StringBuilder queryErroInputResult = new StringBuilder();

  ProcessResult processResult = new ProcessResult();

  String[] cmd = { "/bin/sh", "-c", command};

  Process pro = Runtime.getRuntime().exec(cmd);

  CountDownLatch lock = new CountDownLatch(2);

  executorService.submit(new ProcessCheckTask(queryInputResult, lock, pro.getInputStream()));

  executorService.submit(new ProcessCheckTask(queryErroInputResult, lock, pro.getErrorStream()));

  boolean done = false;

  while (!done) {

   lock.await();

   done = true;

  }

  processResult.setOutputMessage(queryInputResult.toString());

  processResult.setErrorMessage(queryErroInputResult.toString());

  processResult.setSuccess(StringUtils.isBlank(processResult.getErrorMessage()));

  return processResult;

 }

}

其中ProcessCheckTask类如下:

package com.majing.learning.fileupload.common.process;

  

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.concurrent.CountDownLatch;

  

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

  

import com.majing.learning.fileupload.common.ConstValues;

  

public class ProcessCheckTask implements Runnable {

  

 private static Logger logger = LoggerFactory.getLogger(ProcessCheckTask.class);

  

 /** 锁 */

 private CountDownLatch lock;

  

 /** 执行结果输入流 */

 private InputStream inputStream;

  

 /** 字符拼接 */

 private StringBuilder queryInputResult;

  

 public ProcessCheckTask(StringBuilder queryInputResult, CountDownLatch lock, InputStream inputStream) {

  super();

  this.lock = lock;

  this.inputStream = inputStream;

  this.queryInputResult = queryInputResult;

 }

  

 @Override

 public void run() {

  try {

   BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));

   String line = null;

   while ((line = bf.readLine()) != null && line.length() > 0) {

    queryInputResult.append(line).append("\n");

   }

  } catch (Exception e) {

   logger.error(ConstValues.EXCEPTION_OCCURED, e);

  } finally {

   lock.countDown();

  }

 }

}

上面是一个简单实现,但是可能会存在一个问题,那就是执行系统命令的时间如果本身比较长,如果不想一直等待到系统命令执行完,而是在一段时间没有返回就直接认为失败,所以需要增加过期时间的考虑。这里我借助于Future框架,将上面的调用系统命令的方法封装成一个Callable对象。

package com.majing.learning.fileupload.common.process;

  

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutorService;

  

public class CommandTask implements Callable<ProcessResult>{

  

 private ExecutorService executorService;

  

 private String command;

  

 public CommandTask(ExecutorService executorService, String command){

  this.executorService = executorService;

  this.command = command;

 }

  

 @Override

 public ProcessResult call() throws Exception {

  return CommandUtils.runCmdTest(executorService, command);

 }

  
}

然后在上面的CommandUtils的基础上再封装一层变成CommandHelper,具体实现如下:

package com.majing.learning.fileupload.common.process;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.majing.learning.fileupload.common.ConstValues;

  

 public class CommandHelper {

 private static Logger logger = LoggerFactory.getLogger(CommandHelper.class);

 private static ExecutorService executorService=Executors.newFixedThreadPool(50);

 private static long default_timeout = 8000;

 public static ProcessResult process(String command){

  return process(command, default_timeout, TimeUnit.MILLISECONDS);

 }

  

 public static ProcessResult process(String command, long timeout, TimeUnit unit){

  CommandTask commandTask = new CommandTask(executorService, command);

  Future<ProcessResult> processResult = executorService.submit(commandTask);

  ProcessResult result = null;

  try{

   result = processResult.get(timeout, unit);

  }catch(Exception e){

   logger.error(ConstValues.EXCEPTION_OCCURED, e);

  }

  return result;

 }

}

至此,我们在需要调用系统命令时直接调用CommandHelper.process(command)就可以了,然后拿到返回结果ProcessResult。我也是自己做个记录,有需要的朋友可以直接拿去用。

顺便说一句,采用封装的这个类在完成上面相同的任务时,时间都在相同的机器上,耗时从原来的10s瞬间减少至200ms以内,由此可见,在适当的场景调用系统命令是多么重要啊。

java执行Linux命令,支持通配符(*)

java执行linux或者windows命令,这个需求比较常见。

但是若使用 Runtime.getRuntime().exec(cmd); 会发现,若cmd中含有通配符,则无法执行,如cp /dira/*.txt /dirb

可用如下方式执行:

1

2

3

4

5

String[] cmdArr = new String[3];

        cmdArr[0] = "/bin/sh";

        cmdArr[1] = "-c";

        cmdArr[2] = command;

process = Runtime.getRuntime().exec(cmdArr);

Java调用Linux命令的两种方式示例 本文介绍了两种常见的方式来实现Java调用Linux命令:使用Runtime类和ProcessBuilder类。通过这些方式,你可以在Java程序中执行各种Linux命令,并处理命令的输出结果。请注意,在使用这些方式时,要谨慎处理命令的参数和输出流,以避免潜在的安全问题和资源泄漏。上述代码通过执行Linux的ls命令,获取命令执行的输出结果,并将结果打印出来。Java中的Runtime类提供了执行系统命令的方法,可以使用它来执行Linux命令。方式二:使用ProcessBuilder类。 阅读详情

相关推荐

Java与Linux/Unix交互:调用系统命令指南

Commons Exec库让我们能够更细粒度地控制外部进程。它提供了灵活的接口来管理进程的输入输出,并且能够更好地处理错误信息。上述代码展示了如何使用Commons Exec库来执行一个外部命令。

weixin_42602726的博客 1099

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

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

qq_43567055的博客 2865

java执行Linux命令的方法

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

Java应用程序中执行Linux指令(无第三方jar包)

在一些Java应用程序中,需要执行一些Linux系统命令,例如服务器资源查看、文件操作等。为了实现这样的需求,本文将介绍如何在Java应用程序中执行Linux指令,并提供一些实用的示例。此外,本文不使用第三方jar包,完全基于Java自带的API库。

b___w的博客 6222

EPLAN 设备接线图模板制作

属性摆放 设备连接图设置(选项 - - 设置) 连接图生成

weixin_36447711的博客 7862

KEPServerEX6教程:IoT Gateway与MQTT Client实现工业数据双向通信

工业物联网的核心挑战在于异构设备协议与云端平台之间的数据互通。Modbus、S7、OPC UA等现场协议纷繁复杂,而上层应用普遍偏好MQTT、REST等轻量接口,此时需要一个可靠的协议转换层。MQTT作为低带宽、高可靠的发布/订阅消息协议,天然适合工业数据采集与远程控制场景。KEPServerEX6作为工业网关软件,内置IoT Gateway与MQTT Client组件,分别承担数据上行发布与指令下行订阅的职责,形成完整的双向闭环。通过配置Modbus TCP设备驱动、创建Tag、设置MQTT Broker

weixin_33787529的博客 386

java执行linux命令

将命令组成字符串传入即可,多段命令中间使用&&隔开。

dwagrds的博客 1617

某讯天御滑块验证码逆向实战:从参数解析到环境对抗

本文详细解析了某讯天御滑块验证码的逆向工程实战技巧,从关键参数解析到浏览器环境模拟对抗。重点介绍了collect、eks等参数的逆向思路,以及如何通过puppeteer等工具补全环境检测,帮助开发者有效突破验证码防护。文章还提供了常见错误解决方案和性能优化建议,是验证码逆向领域的实用指南。

weixin_29325007的博客 437

使用Java调用Linux系统命令

有时候,我们在使用Java做一些操作时,可能性能上并不能达到我们满意的效果,就拿最近工作中的遇到的一个场景来说,需要对大量的小文件进行合并成一个大文件。 最开始的想法是使用Java做文件操作,遍历所有小文件然后往一个文件写(可以做成并发写),但是发现操作过程中遇到个问题,写一千多个小文件在本机Windows下需要花费几十秒的时间,即使在Linux环境下高配置的机器也需要将近十秒,这明显对接口的响...

马靖的个人技术博客 5585

使用JAVA代码转word文档之动态生成数据填充(图文详解)

今天跟公司对接了业务,根据业务需求,乙方需求文档是word格式的,而我们的数据是动态数据,每生成一份数据,就要以word的形式给乙方一份邮件!这就给了我们的工作一定的难度和挑战! 通过阅读资料,团队的帮助以及自我测试,终于实现了这个功能!因为在搜索资料方面,发现各位博主讲的比较模糊,自己碰到了很多bug,浪费了很多宝贵的时间,所以今天写了这篇文章,希望对自己以后或者他人有所帮助! 操作第一步:先准...

huaiyan 7719

手撕代码系列:Conv2D

在实际的神经网络中,每个卷积核都会对应一个偏置值。这意味着如果网络有多个卷积核,每个卷积核的输出都可以加上对应的偏置。

qq_55794606的博客 907

java调用linux设备,使用Java调用Linux系统命令

有时候,咱们在使用Java作一些操做时,可能性能上并不能达到咱们满意的效果,就拿最近工做中的遇到的一个场景来讲,须要对大量的小文件进行合并成一个大文件。java最开始的想法是使用Java作文件操做,遍历全部小文件而后往一个文件写(能够作成并发写),可是发现操做过程当中遇到个问题,写一千多个小文件在本机Windows下须要花费几十秒的时间,即便在Linux环境下高配置的机器也须要将近十秒,这明显对接...

weixin_39528289的博客 282

SAP SD销售订单的ATP检查简介

如果可用性检查组设置为01(汇总需求),系统将更新销售订单需求到汇总表VBBS,该表中未记录销售订单号码,因此在MD04中不会显示销售订单号码,而是按天汇总显示销售需求。如果物料的可用性检查组设置为02(单个需求),系统将更新销售订单需求到表VBBE,该表中记录了销售订单号码,因此在MD04显示销售订单的号码以及需求,前面的文章中我们解释了PP模块中的ATP检查,也解释了MM模块中的ATP的检查,本文将说明一下SD模块中的ATP检查。可用性检查用的最多的就是02,有兴趣的同学可以测试一下可用性检查01。

我小时候很黑的博客 4288

java 调用linux系统命令_Java调用执行Linux系统命令

Java 可以通过 Runtime 调用Linux命令,形式如下:Runtime.getRuntime().exec(command)但是这样执行时没有任何输出,因为调用 Runtime.exec 方法将产生一个本地的进程,并返回一个Process子类的实例(注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例)该实例可用于控制进程或取得进程...

weixin_29658015的博客 880

【WRF-Urban数据集】 WRF 模型城市冠层参数 GloUCP 的使用

【数据集】 WRF 模型城市冠层参数 GloUCP 的使用

WW、forever的博客 478

滤波算法实现大全——基于匀速直线运动模型的kalman滤波算法

滤波算法实现大全——基于匀速直线运动模型的kalman滤波算法

jane0819的博客 521

java调用linux系统命令

参照: http://benjaminwhx.com/2015/12/24/Java-exec%E8%AF%A6%E8%A7%A3-%E8%B0%83%E7%94%A8%E7%B3%BB%E7%BB%9F%E5%91%BD%E4%BB%A4%E4%BB%A5%E5%8F%8A%E8%BF%9B%E7%A8%8B/ 转载于:https://www.cnblogs.com/Forrest...

weixin_30568715的博客 291

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

在 Java 中调用 Linux 服务器系统命令

这段Java代码实现了一个Linux命令执行器,通过ProcessBuilder类执行Shell命令并获取输出结果。核心方法exec()接收命令字符串,使用ProcessBuilder启动子进程执行命令,将标准错误流重定向到标准输出流,并通过BufferedReader读取命令执行结果。最后调用waitFor()等待命令执行完成。main()方法演示了执行"uname -a"命令并打印输出。代码处理了可能的异常并返回执行结果字符串。

m0_59061013的博客 270

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java调用linux系统命令_java 调用linux系统命令

用户需要用这些stream来向子进程输入数据或获取子进程的输出,下面的代码可以取到 linux 命令的执行结果:try {String[] cmd = new String[]{”/bin/sh”, “-c”, ” ls “};Process ps = Runtime.getRuntime().exec(cmd);BufferedReader br = new BufferedReader(new...

weixin_29017445的博客 576

Java程序在linux上调用系统命令或命令行应用程序

一般来说在java程序中调用linux系统命令用如下方法: [code="java"]Process exec(String command) [/code] 在单独的进程中执行指定的字符串命令。 不过,遇到复杂点的linux系统命令或者应用程序的命令行稍复杂点,就可能无法分正确调用。比如:应用程序命令带了命令行选项,指定的文件名中包含了空格。这时可以用另一个重载方法...

samwalt的博客 717

Java调用linux系统命令

Java可以直接调用Linux命令,形式如下: Runtime.getRuntime().exec(command) 与用java调用windows命令形式类似,并且比windows的写法上稍微简略一些。 举例:java执行Linux的ls命令可以这样: [code="java"]Runtime.getRuntime().exec("ls");[/code] java执行window...

翡翠梦境 652

Java调用执行Linux系统命令

Java 可以通过 Runtime 调用Linux命令,形式如下: Runtime.getRuntime().exec(command) 但是这样执行时没有任何输出,因为调用 Runtime.exec 方法将产生一个本地的进程,并返回一个Process子类的实例(注意:Runtime.getRuntime().exec(command)返回的是 一个Process类的实例)该实例可用于控制进程

做技术,贵在学习与坚持! 1331

java调用Linux/Windows系统命令

haha

clouderpig的博客 2703

Java调用linux系统命令(转载)

[code="java"] Java可以直接调用Linux命令,形式如下: Runtime.getRuntime().exec(command) 与用java调用windows命令形式类似,并且比windows的写法上稍微简略一些。 举例:java执行Linux的ls命令可以这样: Java代码 Runtime.getRuntime().exec("ls"); ...

lrz1011的专栏 215

JAVA在linux系统下导入脚本,Linux下实现JAVA程序调用系统命令及脚本

一个简单的例子前提准备Linux 环境+jdk环境vim TestLinux.javaimportjava.io.BufferedReader;importjava.io.InputStreamReader;public classTestLinux {public static voidmain(String[] args) {try{Process process= Runtime.getRu...

weixin_29854111的博客 327
上一篇: yt-dlp 8k下载神器使用简介
下一篇: SEO人员必懂的几个高级搜索指令
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值