尺有所短,寸有所长,这句话这次真的理解到了,最近碰到个需求,从几十万文件中找出几十万需要的文件,使用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();
}
}
}
}