Java调用bat sh脚本通用类

java调用bat、shell脚本通用类,工作记录。

package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

import test.ProcessUtil.Result.Judege;

public class ProcessUtil
{

	private static final ExecutorService EXECUTORS = Executors.newFixedThreadPool(4);

	public static ProcessRunner buildProcessRunner()
	{
		return new ProcessRunner();
	}

	public static class ProcessRunner
	{
		private int maxErrorLineNumb = 100;

		private int maxInputLineNumb = 500;

		/**
		 * 调用核心的命令
		 * 
		 * [@param](https://my.oschina.net/u/2303379) cmd
		 *            命令
		 * [@param](https://my.oschina.net/u/2303379) cmdInputParas
		 *            执行命令需要输入的参数,比如命令行登录数据库需要输入密码<br>
		 *            echo "password" | cmd
		 * [@return](https://my.oschina.net/u/556800) 返回值,包括错误回显,正确回显,整个脚本执行的返回码
		 * 
		 */
		public Result runCMD(List<String> cmd, List<String> cmdInputParas)
		{
			Process process = null;
			BufferedWriter bw = null;
			try
			{
				ProcessBuilder processBuilder = new ProcessBuilder(cmd);
				process = processBuilder.start();
				bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
				for (String p : cmdInputParas)
				{
					bw.write(p);
					bw.newLine();
				}
				bw.flush();
				bw.close();
				Callable<List<String>> inputRunner = new Runner(maxErrorLineNumb, process.getInputStream());
				FutureTask<List<String>> inputTask = new FutureTask<List<String>>(inputRunner);
				EXECUTORS.execute(inputTask);
				Callable<List<String>> errorRunner = new Runner(maxInputLineNumb, process.getErrorStream());
				FutureTask<List<String>> errorTask = new FutureTask<List<String>>(errorRunner);
				EXECUTORS.execute(errorTask);
				List<String> inputResult = inputTask.get();
				List<String> errorResult = errorTask.get();
				int returnCode = process.waitFor();
				return new Result(inputResult, errorResult, returnCode);

			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			catch (ExecutionException e)
			{
				e.printStackTrace();
			}
			finally
			{
				try
				{
					if (bw != null)
					{
						bw.close();
					}
				}
				catch (IOException e)
				{

				}
				if (process != null)
				{
					process.destroy();
				}

			}
			return new Result();
		}

		/**
		 * 调用核心的命令
		 * 
		 * [@param](https://my.oschina.net/u/2303379) cmd
		 *            命令
		 * 
		 * [@return](https://my.oschina.net/u/556800) 返回值,包括错误回显,正确回显,整个脚本执行的返回码
		 */
		public Result runCMD(List<String> cmd)
		{
			return runCMD(cmd, Arrays.asList());
		}

	}

	/**
	 * 执行命令类
	 * 
	 */
	private static class Runner implements Callable<List<String>>
	{

		private int maxLineNumb;

		private InputStream inputStream;

		public Runner(int maxLineNumb, InputStream inputStream)
		{
			super();
			this.maxLineNumb = maxLineNumb;
			this.inputStream = inputStream;
		}

		@Override
		public List<String> call()
		{
			List<String> result = new ArrayList<String>();
			BufferedReader br = null;
			try
			{
				br = new BufferedReader(new InputStreamReader(inputStream));
				int i = 0;
				String line = null;
				while (null != (line = br.readLine()) && (i++ < maxLineNumb))
				{
					result.add(line);
				}
				return result;
			}
			catch (IOException e)
			{

				e.printStackTrace();
			}
			finally
			{
				try
				{
					if (br != null)
					{
						br.close();
					}
				}
				catch (IOException e)
				{

				}
			}
			return result;
		}

	}

	/**
	 * 结果
	 * 
	 */
	public static class Result
	{
		// 回显
		private List<String> inputInfos;
		// 错误回显
		private List<String> errorInfos;
		// 返回码
		private int returnCode = -1;

		public Result(List<String> inputInfos, List<String> errorInfos, int returnCode)
		{
			this.inputInfos = inputInfos;
			this.errorInfos = errorInfos;
			this.returnCode = returnCode;
		}

		public Result()
		{

		}

		@Override
		public String toString()
		{
			return "Result [inputInfos=" + inputInfos + ", errorInfos=" + errorInfos + ", returnCode=" + returnCode + "]";
		}

		public boolean isSuccess(Judege j)
		{
			if (errorInfos == null || inputInfos == null || returnCode == -1)
			{
				return false;
			}
			return j.isSuccess(inputInfos, errorInfos, returnCode);
		}

		/**
		 * 判断结果接口可以通用化判断,防止组内人胡编乱写
		 */
		interface Judege
		{
			public boolean isSuccess(List<String> inputInfos, List<String> errorInfos, int returnCode);
		}
	}

	public static void main(String[] args)
	{
		ProcessRunner runner = ProcessUtil.buildProcessRunner();
		Result result = runner.runCMD(Arrays.asList("cmd", "/C", "ping 127.0.0.1 -n 1"));
		System.out.println(result);
		boolean isRight = result.isSuccess(new Judege()
		{
			@Override
			public boolean isSuccess(List<String> inputInfos, List<String> errorInfos, int returnCode)
			{
				return returnCode == 0 && errorInfos.size() == 0;
			}
		});
		System.out.println("result is " + isRight);
	}

}

转载于:https://my.oschina.net/u/1473861/blog/1930129

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过Java调用.sh脚本,你可以使用Runtime的exec方法来执行shell命令。可以使用以下代码来执行.sh脚本: String[] cmd = { "sh", "/path/to/script.sh", "parameter1", "parameter2" }; try { Process p = Runtime.getRuntime().exec(cmd); p.waitFor(); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println("line = " + line); } reader.close(); } catch (Exception e) { e.printStackTrace(); } 在这段代码中,我们定义了一个字符串数组cmd,其中第一个元素是"sh",表示使用shell来执行命令,第二个元素是"/path/to/script.sh",表示要执行的.sh脚本的路径,后面的参数可以根据需要进行更改。然后通过Runtime的exec方法执行这个命令,最后通过BufferedReader来读取命令的输出并打印出来。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [java调用shell脚本传参数](https://blog.csdn.net/weixin_57463074/article/details/127802692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [使用java执行batsh脚本文件](https://blog.csdn.net/gxy6661159/article/details/128615151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值