目录

  • 1.添加工程依赖
  • 2. 依赖工具类
  • 3. 使用
  • PS:工具类代码
    • model
      • Cpu.java
      • Jvm.java
      • Mem.java
      • Sys.java
      • SysFile.java
    • utils
      • Arith.java
      • Convert.java
      • DateUtils.java
      • EscapeUtil.java
      • HtmlFilter.java
      • IpUtils.java
      • StrFormatter.java
      • ServerStringUtils.java
    • ServerInfo.java

1.添加工程依赖

<!-- 父工程中-->
<properties><oshi.version>5.8.2</oshi.version>
</properties><!-- 获取系统信息 -->
<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>${oshi.version}</version>
</dependency><!-- 子工程中--><!-- 获取系统信息 -->
<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId>
</dependency>

2. 依赖工具类

代码在最后边。(或者直接下载:下载地址)

目录结构展示:

- domain- ServerInfo.java- model- Cpu.java- Jvm.java- Mem.java- Sys.java- SysFile.java- utils- Arith.java- Convert.java- DateUtils.java- EscapeUtil.java- HTMLFilter.java- IpUtils.java- StrFormatter.java- ServerStringUtils.java

3. 使用

    @PostMapping("cc")public Result cc() throws Exception {ServerInfo info = new ServerInfo();info.copyInfo();return new Result(info);}

PS:工具类代码

model

Cpu.java
package com.sq.common.domain.model;import com.sq.common.domain.utils.Arith;
/*** CPU相关信息*/
public class Cpu {/*** 核心数*/private int cpuNum;/*** CPU总的使用率*/private double total;/*** CPU系统使用率*/private double sys;/*** CPU用户使用率*/private double used;/*** CPU当前等待率*/private double wait;/*** CPU当前空闲率*/private double free;public int getCpuNum() {        return cpuNum;    }public void setCpuNum(int cpuNum) {        this.cpuNum = cpuNum;    }public double getTotal() {        return Arith.round(Arith.mul(total, 100), 2);    }public void setTotal(double total) {        this.total = total;    }public double getSys() {        return Arith.round(Arith.mul(sys / total, 100), 2);    }public void setSys(double sys) {        this.sys = sys;    }public double getUsed() {        return Arith.round(Arith.mul(used / total, 100), 2);    }public void setUsed(double used) {        this.used = used;    }public double getWait() {        return Arith.round(Arith.mul(wait / total, 100), 2);    }public void setWait(double wait) {        this.wait = wait;    }public double getFree() {        return Arith.round(Arith.mul(free / total, 100), 2);    }public void setFree(double free) {        this.free = free;    }
}
Jvm.java
package com.sq.common.domain.model;import com.sq.common.domain.utils.Arith;
import com.sq.common.domain.utils.DateUtils;import java.lang.management.ManagementFactory;/*** JVM相关信息*/
public class Jvm {/*** 当前JVM占用的内存总数(M)*/private double total;/*** JVM最大可用内存总数(M)*/private double max;/*** JVM空闲内存(M)*/private double free;/*** JDK版本*/private String version;/*** JDK路径*/private String home;public double getTotal() {        return Arith.div(total, (1024 * 1024), 2);    }public void setTotal(double total) {        this.total = total;    }public double getMax() {        return Arith.div(max, (1024 * 1024), 2);    }public void setMax(double max) {        this.max = max;    }public double getFree() {        return Arith.div(free, (1024 * 1024), 2);    }public void setFree(double free) {        this.free = free;    }public double getUsed() {        return Arith.div(total - free, (1024 * 1024), 2);    }public double getUsage() {        return Arith.mul(Arith.div(total - free, total, 4), 100);    }/*** 获取JDK名称*/public String getName() {        return ManagementFactory.getRuntimeMXBean().getVmName();    }public String getVersion() {return version;}public void setVersion(String version) {        this.version = version;    }public String getHome() {        return home;    }public void setHome(String home) {        this.home = home;    }/*** JDK启动时间*/public String getStartTime() {        return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate());    }/*** JDK运行时间*/public String getRunTime() {        return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate());    }
}
Mem.java
package com.sq.common.domain.model;import com.sq.common.domain.utils.Arith;/*** 內存相关信息*/
public class Mem {/*** 内存总量*/private double total;/*** 已用内存*/private double used;/*** 剩余内存*/private double free;public double getTotal() {        return Arith.div(total, (1024 * 1024 * 1024), 2);    }public void setTotal(long total) {        this.total = total;    }public double getUsed() {        return Arith.div(used, (1024 * 1024 * 1024), 2);    }public void setUsed(long used) {        this.used = used;    }public double getFree() {        return Arith.div(free, (1024 * 1024 * 1024), 2);    }public void setFree(long free) {        this.free = free;    }public double getUsage() {        return Arith.mul(Arith.div(used, total, 4), 100);    }
}
Sys.java
package com.sq.common.domain.model;/*** 系统相关信息*/
public class Sys {/*** 服务器名称*/private String computerName;/*** 服务器Ip*/private String computerIp;/*** 项目路径*/private String userDir;/*** 操作系统*/private String osName;/*** 系统架构*/private String osArch;public String getComputerName() {        return computerName;    }public void setComputerName(String computerName) {        this.computerName = computerName;    }public String getComputerIp() {        return computerIp;    }public void setComputerIp(String computerIp) {        this.computerIp = computerIp;    }public String getUserDir() {        return userDir;    }public void setUserDir(String userDir) {        this.userDir = userDir;    }public String getOsName() {        return osName;    }public void setOsName(String osName) {        this.osName = osName;    }public String getOsArch() {        return osArch;    }public void setOsArch(String osArch) {        this.osArch = osArch;    }
}
SysFile.java
package com.sq.common.domain.model;/*** 系统文件相关信息*/
public class SysFile {/*** 盘符路径*/private String dirName;/*** 盘符类型*/private String sysTypeName;/*** 文件类型*/private String typeName;/*** 总大小*/private String total;/*** 剩余大小*/private String free;/*** 已经使用量*/private String used;/*** 资源的使用率*/private double usage;public String getDirName() {        return dirName;    }public void setDirName(String dirName) {        this.dirName = dirName;    }public String getSysTypeName() {        return sysTypeName;    }public void setSysTypeName(String sysTypeName) {        this.sysTypeName = sysTypeName;    }public String getTypeName() {        return typeName;    }public void setTypeName(String typeName) {        this.typeName = typeName;    }public String getTotal() {        return total;    }public void setTotal(String total) {        this.total = total;    }public String getFree() {        return free;    }public void setFree(String free) {        this.free = free;    }public String getUsed() {        return used;    }public void setUsed(String used) {        this.used = used;    }public double getUsage() {        return usage;    }public void setUsage(double usage) {        this.usage = usage;    }
}

utils

Arith.java
package com.sq.common.domain.utils;import java.math.BigDecimal;
import java.math.RoundingMode;/*** 精确的浮点数运算*/
public class Arith {/*** 默认除法运算精度*/private static final int DEF_DIV_SCALE = 10;/*** 这个类不能实例化*/private Arith() {}/*** 提供精确的加法运算。** @param v1 被加数* @param v2 加数* @return 两个参数的和*/public static double add(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2).doubleValue();}/*** 提供精确的减法运算。** @param v1 被减数* @param v2 减数* @return 两个参数的差*/public static double sub(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.subtract(b2).doubleValue();}/*** 提供精确的乘法运算。** @param v1 被乘数* @param v2 乘数* @return 两个参数的积*/public static double mul(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2).doubleValue();}/*** 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到* 小数点以后10位,以后的数字四舍五入。** @param v1 被除数* @param v2 除数* @return 两个参数的商*/public static double div(double v1, double v2) {return div(v1, v2, DEF_DIV_SCALE);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指* 定精度,以后的数字四舍五入。** @param v1    被除数* @param v2    除数* @param scale 表示表示需要精确到小数点以后几位。* @return 两个参数的商*/public static double div(double v1, double v2, int scale) {if (scale < 0) {throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));if (b1.compareTo(BigDecimal.ZERO) == 0) {return BigDecimal.ZERO.doubleValue();}return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();}/*** 提供精确的小数位四舍五入处理。** @param v     需要四舍五入的数字* @param scale 小数点后保留几位* @return 四舍五入后的结果*/public static double round(double v, int scale) {if (scale < 0) {throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b = new BigDecimal(Double.toString(v));BigDecimal one = BigDecimal.ONE;return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();}
}
Convert.java
package com.sq.common.domain.utils;import org.apache.commons.lang3.ArrayUtils;import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;/*** 类型转换器*/
public class Convert {/*** 将对象转为字符串<br>*/public static String utf8Str(Object obj) {return str(obj, StandardCharsets.UTF_8);}/*** 将对象转为字符串<br>*/public static String str(Object obj, Charset charset) {if (null == obj) {return null;}if (obj instanceof String) {return (String) obj;} else if (obj instanceof byte[]) {return str((byte[]) obj, charset);} else if (obj instanceof Byte[]) {byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj);return str(bytes, charset);} else if (obj instanceof ByteBuffer) {return str((ByteBuffer) obj, charset);}return obj.toString();}/*** 解码字节码*/public static String str(byte[] data, Charset charset) {if (data == null) {return null;}if (null == charset) {return new String(data);}return new String(data, charset);}/*** 将编码的byteBuffer数据转换为字符串*/public static String str(ByteBuffer data, Charset charset) {if (null == charset) {charset = Charset.defaultCharset();}return charset.decode(data).toString();}}
DateUtils.java
package com.sq.common.domain.utils;import java.lang.management.ManagementFactory;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 时间工具类*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {public static String YYYY_MM_DD = "yyyy-MM-dd";public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";/*** 获取当前Date型日期*/public static Date getNowDate() {return new Date();}/*** 获取当前日期, 默认格式为yyyy-MM-dd*/public static String getDate() {return dateTimeNow(YYYY_MM_DD);}public static final String getTime() {return dateTimeNow(YYYY_MM_DD_HH_MM_SS);}public static final String dateTimeNow(final String format) {return parseDateToStr(format, new Date());}public static final String parseDateToStr(final String format, final Date date) {return new SimpleDateFormat(format).format(date);}/*** 获取服务器启动时间*/public static Date getServerStartDate() {long time = ManagementFactory.getRuntimeMXBean().getStartTime();return new Date(time);}/*** 计算两个时间差*/public static String getDatePoor(Date endDate, Date nowDate) {long nd = 1000 * 24 * 60 * 60;long nh = 1000 * 60 * 60;long nm = 1000 * 60;// long ns = 1000;// 获得两个时间的毫秒时间差异long diff = endDate.getTime() - nowDate.getTime();// 计算差多少天long day = diff / nd;// 计算差多少小时long hour = diff % nd / nh;// 计算差多少分钟long min = diff % nd % nh / nm;// 计算差多少秒//输出结果// long sec = diff % nd % nh % nm / ns;return day + "天" + hour + "小时" + min + "分钟";}
}
EscapeUtil.java
package com.sq.common.domain.utils;/*** 转义和反转义工具类*/
public class EscapeUtil {private static final char[][] TEXT = new char[64][];static {for (int i = 0; i < 64; i++) {TEXT[i] = new char[]{(char) i};}// special HTML charactersTEXT['\''] = "'".toCharArray(); // 单引号TEXT['"'] = """.toCharArray(); // 双引号TEXT['&'] = "&".toCharArray(); // &符TEXT['<'] = "<".toCharArray(); // 小于号TEXT['>'] = ">".toCharArray(); // 大于号}/*** 转义文本中的HTML字符为安全的字符** @param text 被转义的文本* @return 转义后的文本*/public static String escape(String text) {return encode(text);}/*** 还原被转义的HTML特殊字符** @param content 包含转义符的HTML内容* @return 转换后的字符串*/public static String unescape(String content) {return decode(content);}/*** 清除所有HTML标签,但是不删除标签内的内容** @param content 文本* @return 清除标签后的文本*/public static String clean(String content) {return new HTMLFilter().filter(content);}/*** Escape编码** @param text 被编码的文本* @return 编码后的字符*/private static String encode(String text) {if (ServerStringUtils.isEmpty(text)) {return ServerStringUtils.EMPTY;}final StringBuilder tmp = new StringBuilder(text.length() * 6);char c;for (int i = 0; i < text.length(); i++) {c = text.charAt(i);if (c < 256) {tmp.append("%");if (c < 16) {tmp.append("0");}tmp.append(Integer.toString(c, 16));} else {tmp.append("%u");if (c <= 0xfff) {// issue#I49JU8@Giteetmp.append("0");}tmp.append(Integer.toString(c, 16));}}return tmp.toString();}/*** Escape解码** @param content 被转义的内容* @return 解码后的字符串*/public static String decode(String content) {if (ServerStringUtils.isEmpty(content)) {return content;}StringBuilder tmp = new StringBuilder(content.length());int lastPos = 0, pos = 0;char ch;while (lastPos < content.length()) {pos = content.indexOf("%", lastPos);if (pos == lastPos) {if (content.charAt(pos + 1) == 'u') {ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);tmp.append(ch);lastPos = pos + 6;} else {ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);tmp.append(ch);lastPos = pos + 3;}} else {if (pos == -1) {tmp.append(content.substring(lastPos));lastPos = content.length();} else {tmp.append(content.substring(lastPos, pos));lastPos = pos;}}}return tmp.toString();}
}
HtmlFilter.java
package com.sq.common.domain.utils;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** HTML过滤器,用于去除XSS漏洞隐患。*/
public final class HTMLFilter {/*** regex flag union representing /si modifiers in php**/private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);private static final Pattern P_END_ARROW = Pattern.compile("^>");private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");private static final Pattern P_AMP = Pattern.compile("&");private static final Pattern P_QUOTE = Pattern.compile("\"");private static final Pattern P_LEFT_ARROW = Pattern.compile("<");private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");private static final ConcurrentMap<String, Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>();private static final ConcurrentMap<String, Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>();/*** set of allowed html elements, along with allowed attributes for each element**/private final Map<String, List<String>> vAllowed;/*** counts of open tags for each (allowable) html element**/private final Map<String, Integer> vTagCounts = new HashMap<>();/*** html elements which must always be self-closing (e.g. "<img />")**/private final String[] vSelfClosingTags;/*** html elements which must always have separate opening and closing tags (e.g. "<b></b>")**/private final String[] vNeedClosingTags;/*** set of disallowed html elements**/private final String[] vDisallowed;/*** attributes which should be checked for valid protocols**/private final String[] vProtocolAtts;/*** allowed protocols**/private final String[] vAllowedProtocols;/*** tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />")**/private final String[] vRemoveBlanks;/*** entities allowed within html markup**/private final String[] vAllowedEntities;/*** flag determining whether comments are allowed in input String.*/private final boolean stripComment;private final boolean encodeQuotes;/*** flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "<b text </b>"* becomes "<b> text </b>"). If set to false, unbalanced angle brackets will be html escaped.*/private final boolean alwaysMakeTags;/*** Default constructor.*/public HTMLFilter() {vAllowed = new HashMap<>();final ArrayList<String> a_atts = new ArrayList<>();a_atts.add("href");a_atts.add("target");vAllowed.put("a", a_atts);final ArrayList<String> img_atts = new ArrayList<>();img_atts.add("src");img_atts.add("width");img_atts.add("height");img_atts.add("alt");vAllowed.put("img", img_atts);final ArrayList<String> no_atts = new ArrayList<>();vAllowed.put("b", no_atts);vAllowed.put("strong", no_atts);vAllowed.put("i", no_atts);vAllowed.put("em", no_atts);vSelfClosingTags = new String[]{"img"};vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};vDisallowed = new String[]{};vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp.vProtocolAtts = new String[]{"src", "href"};vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};stripComment = true;encodeQuotes = true;alwaysMakeTags = false;}private void reset() {vTagCounts.clear();}public static String chr(final int decimal) {return String.valueOf((char) decimal);}public static String htmlSpecialChars(final String s) {String result = s;result = regexReplace(P_AMP, "&amp;", result);result = regexReplace(P_QUOTE, "&quot;", result);result = regexReplace(P_LEFT_ARROW, "&lt;", result);result = regexReplace(P_RIGHT_ARROW, "&gt;", result);return result;}public String filter(final String input) {reset();String s = input;s = escapeComments(s);s = balanceHTML(s);s = checkTags(s);s = processRemoveBlanks(s);// s = validateEntities(s);return s;}private String escapeComments(final String s) {final Matcher m = P_COMMENTS.matcher(s);final StringBuffer buf = new StringBuffer();if (m.find()) {final String match = m.group(1); // (.*?)m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));}m.appendTail(buf);return buf.toString();}private String balanceHTML(String s) {if (alwaysMakeTags) {s = regexReplace(P_END_ARROW, "", s);// 不追加结束标签s = regexReplace(P_BODY_TO_END, "<$1>", s);s = regexReplace(P_XML_CONTENT, "$1<$2", s);} else {s = regexReplace(P_STRAY_LEFT_ARROW, "&lt;$1", s);s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", s);s = regexReplace(P_BOTH_ARROWS, "", s);}return s;}private String checkTags(String s) {Matcher m = P_TAGS.matcher(s);final StringBuffer buf = new StringBuffer();while (m.find()) {String replaceStr = m.group(1);replaceStr = processTag(replaceStr);m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));}m.appendTail(buf);final StringBuilder sBuilder = new StringBuilder(buf.toString());for (String key : vTagCounts.keySet()) {for (int ii = 0; ii < vTagCounts.get(key); ii++) {sBuilder.append("</").append(key).append(">");}}s = sBuilder.toString();return s;}private String processRemoveBlanks(final String s) {String result = s;for (String tag : vRemoveBlanks) {if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) {P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));}result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) {P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));}result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);}return result;}private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) {Matcher m = regex_pattern.matcher(s);return m.replaceAll(replacement);}private String processTag(final String s) {// ending tagsMatcher m = P_END_TAG.matcher(s);if (m.find()) {final String name = m.group(1).toLowerCase();if (allowed(name)) {if (!inArray(name, vSelfClosingTags)) {if (vTagCounts.containsKey(name)) {vTagCounts.put(name, vTagCounts.get(name) - 1);return "</" + name + ">";}}}}m = P_START_TAG.matcher(s);if (m.find()) {final String name = m.group(1).toLowerCase();final String body = m.group(2);String ending = m.group(3);if (allowed(name)) {final StringBuilder params = new StringBuilder();final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);final List<String> paramNames = new ArrayList<>();final List<String> paramValues = new ArrayList<>();while (m2.find()) {paramNames.add(m2.group(1)); // ([a-z0-9]+)paramValues.add(m2.group(3)); // (.*?)}while (m3.find()) {paramNames.add(m3.group(1)); // ([a-z0-9]+)paramValues.add(m3.group(3)); // ([^\"\\s']+)}String paramName, paramValue;for (int ii = 0; ii < paramNames.size(); ii++) {paramName = paramNames.get(ii).toLowerCase();paramValue = paramValues.get(ii);if (allowedAttribute(name, paramName)) {if (inArray(paramName, vProtocolAtts)) {paramValue = processParamProtocol(paramValue);}params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\"");}}if (inArray(name, vSelfClosingTags)) {ending = " /";}if (inArray(name, vNeedClosingTags)) {ending = "";}if (ending == null || ending.length() < 1) {if (vTagCounts.containsKey(name)) {vTagCounts.put(name, vTagCounts.get(name) + 1);} else {vTagCounts.put(name, 1);}} else {ending = " /";}return "<" + name + params + ending + ">";} else {return "";}}m = P_COMMENT.matcher(s);if (!stripComment && m.find()) {return "<" + m.group() + ">";}return "";}private String processParamProtocol(String s) {s = decodeEntities(s);final Matcher m = P_PROTOCOL.matcher(s);if (m.find()) {final String protocol = m.group(1);if (!inArray(protocol, vAllowedProtocols)) {s = "#" + s.substring(protocol.length() + 1);if (s.startsWith("#//")) {s = "#" + s.substring(3);}}}return s;}private String decodeEntities(String s) {StringBuffer buf = new StringBuffer();Matcher m = P_ENTITY.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.decode(match).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));}m.appendTail(buf);s = buf.toString();buf = new StringBuffer();m = P_ENTITY_UNICODE.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.valueOf(match, 16).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));}m.appendTail(buf);s = buf.toString();buf = new StringBuffer();m = P_ENCODE.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.valueOf(match, 16).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));}m.appendTail(buf);s = buf.toString();s = validateEntities(s);return s;}private String validateEntities(final String s) {StringBuffer buf = new StringBuffer();// validate entities throughout the stringMatcher m = P_VALID_ENTITIES.matcher(s);while (m.find()) {final String one = m.group(1); // ([^&;]*)final String two = m.group(2); // (?=(;|&|$))m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));}m.appendTail(buf);return encodeQuotes(buf.toString());}private String encodeQuotes(final String s) {if (encodeQuotes) {StringBuffer buf = new StringBuffer();Matcher m = P_VALID_QUOTES.matcher(s);while (m.find()) {final String one = m.group(1); // (>|^)final String two = m.group(2); // ([^<]+?)final String three = m.group(3); // (<|$)// 不替换双引号为&quot;,防止json格式无效 regexReplace(P_QUOTE, "&quot;", two)m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three));}m.appendTail(buf);return buf.toString();} else {return s;}}private String checkEntity(final String preamble, final String term) {return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&amp;" + preamble;}private boolean isValidEntity(final String entity) {return inArray(entity, vAllowedEntities);}private static boolean inArray(final String s, final String[] array) {for (String item : array) {if (item != null && item.equals(s)) {return true;}}return false;}private boolean allowed(final String name) {return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);}private boolean allowedAttribute(final String name, final String paramName) {return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));}
}
IpUtils.java
package com.sq.common.domain.utils;import java.net.InetAddress;
import java.net.UnknownHostException;/*** 获取IP方法*/
public class IpUtils {public static String getHostIp() {try {return InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {}return "127.0.0.1";}public static String getHostName() {try {return InetAddress.getLocalHost().getHostName();} catch (UnknownHostException e) {}return "未知";}
}
StrFormatter.java
package com.sq.common.domain.utils;import java.util.Collection;
import java.util.Map;/*** 字符串工具类*/
public class ServerStringUtils extends org.apache.commons.lang3.StringUtils {/*** 空字符串*/private static final String NULLSTR = "";/*** * 判断一个Collection是否为空, 包含List,Set,Queue*/public static boolean isEmpty(Collection<?> coll) {return isNull(coll) || coll.isEmpty();}/*** * 判断一个对象数组是否为空*/public static boolean isEmpty(Object[] objects) {return isNull(objects) || (objects.length == 0);}/*** * 判断一个Map是否为空*/public static boolean isEmpty(Map<?, ?> map) {return isNull(map) || map.isEmpty();}/*** * 判断一个字符串是否为空串*/public static boolean isEmpty(String str) {return isNull(str) || NULLSTR.equals(str.trim());}/*** * 判断一个对象是否为空*/public static boolean isNull(Object object) {return object == null;}/*** 截取字符串*/public static String substring(final String str, int start) {if (str == null) {return NULLSTR;}if (start < 0) {start = str.length() + start;}if (start < 0) {start = 0;}if (start > str.length()) {return NULLSTR;}return str.substring(start);}/*** 截取字符串*/public static String substring(final String str, int start, int end) {if (str == null) {return NULLSTR;}if (end < 0) {end = str.length() + end;}if (start < 0) {start = str.length() + start;}if (end > str.length()) {end = str.length();}if (start > end) {return NULLSTR;}if (start < 0) {start = 0;}if (end < 0) {end = 0;}return str.substring(start, end);}}
ServerStringUtils.java
package com.sq.common.domain.utils;/*** 字符串格式化*/
public class StrFormatter {public static final String EMPTY_JSON = "{}";public static final char C_BACKSLASH = '\\';public static final char C_DELIM_START = '{';public static final char C_DELIM_END = '}';/*** 格式化字符串<br>* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>* 例:<br>* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>** @param strPattern 字符串模板* @param argArray   参数列表* @return 结果*/public static String format(final String strPattern, final Object... argArray) {if (ServerStringUtils.isEmpty(strPattern) || ServerStringUtils.isEmpty(argArray)) {return strPattern;}final int strPatternLength = strPattern.length();// 初始化定义好的长度以获得更好的性能StringBuilder sbuf = new StringBuilder(strPatternLength + 50);int handledPosition = 0;int delimIndex;// 占位符所在位置for (int argIndex = 0; argIndex < argArray.length; argIndex++) {delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);if (delimIndex == -1) {if (handledPosition == 0) {return strPattern;} else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果sbuf.append(strPattern, handledPosition, strPatternLength);return sbuf.toString();}} else {if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) {if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) {// 转义符之前还有一个转义符,占位符依旧有效sbuf.append(strPattern, handledPosition, delimIndex - 1);sbuf.append(Convert.utf8Str(argArray[argIndex]));handledPosition = delimIndex + 2;} else {// 占位符被转义argIndex--;sbuf.append(strPattern, handledPosition, delimIndex - 1);sbuf.append(C_DELIM_START);handledPosition = delimIndex + 1;}} else {// 正常占位符sbuf.append(strPattern, handledPosition, delimIndex);sbuf.append(Convert.utf8Str(argArray[argIndex]));handledPosition = delimIndex + 2;}}}// 加入最后一个占位符后所有的字符sbuf.append(strPattern, handledPosition, strPattern.length());return sbuf.toString();}
}

ServerInfo.java

package com.sq.common.domain;import com.sq.common.domain.model.*;
import com.sq.common.domain.utils.Arith;
import com.sq.common.domain.utils.IpUtils;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.CentralProcessor.TickType;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;/*** 服务器相关信息*/
public class ServerInfo {private static final int OSHI_WAIT_SECOND = 1000;/*** CPU相关信息*/private Cpu cpu = new Cpu();/*** 內存相关信息*/private Mem mem = new Mem();/*** JVM相关信息*/private Jvm jvm = new Jvm();/*** 服务器相关信息*/private Sys sys = new Sys();/*** 磁盘相关信息*/private List<SysFile> sysFiles = new LinkedList<SysFile>();public Cpu getCpu() {return cpu;}public void setCpu(Cpu cpu) {this.cpu = cpu;}public Mem getMem() {return mem;}public void setMem(Mem mem) {this.mem = mem;}public Jvm getJvm() {return jvm;}public void setJvm(Jvm jvm) {this.jvm = jvm;}public Sys getSys() {return sys;}public void setSys(Sys sys) {this.sys = sys;}public List<SysFile> getSysFiles() {return sysFiles;}public void setSysFiles(List<SysFile> sysFiles) {this.sysFiles = sysFiles;}public void copyInfo() throws Exception {SystemInfo si = new SystemInfo();HardwareAbstractionLayer hal = si.getHardware();setCpuInfo(hal.getProcessor());setMemInfo(hal.getMemory());setSysInfo();setJvmInfo();setSysFiles(si.getOperatingSystem());}/*** 设置CPU信息*/private void setCpuInfo(CentralProcessor processor) {// CPU信息long[] prevTicks = processor.getSystemCpuLoadTicks();Util.sleep(OSHI_WAIT_SECOND);long[] ticks = processor.getSystemCpuLoadTicks();long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;cpu.setCpuNum(processor.getLogicalProcessorCount());cpu.setTotal(totalCpu);cpu.setSys(cSys);cpu.setUsed(user);cpu.setWait(iowait);cpu.setFree(idle);}/*** 设置内存信息*/private void setMemInfo(GlobalMemory memory) {mem.setTotal(memory.getTotal());mem.setUsed(memory.getTotal() - memory.getAvailable());mem.setFree(memory.getAvailable());}/*** 设置服务器信息*/private void setSysInfo() {Properties props = System.getProperties();sys.setComputerName(IpUtils.getHostName());sys.setComputerIp(IpUtils.getHostIp());sys.setOsName(props.getProperty("os.name"));sys.setOsArch(props.getProperty("os.arch"));sys.setUserDir(props.getProperty("user.dir"));}/*** 设置Java虚拟机*/private void setJvmInfo() throws UnknownHostException {Properties props = System.getProperties();jvm.setTotal(Runtime.getRuntime().totalMemory());jvm.setMax(Runtime.getRuntime().maxMemory());jvm.setFree(Runtime.getRuntime().freeMemory());jvm.setVersion(props.getProperty("java.version"));jvm.setHome(props.getProperty("java.home"));}/*** 设置磁盘信息*/private void setSysFiles(OperatingSystem os) {FileSystem fileSystem = os.getFileSystem();List<OSFileStore> fsArray = fileSystem.getFileStores();for (OSFileStore fs : fsArray) {long free = fs.getUsableSpace();long total = fs.getTotalSpace();long used = total - free;SysFile sysFile = new SysFile();sysFile.setDirName(fs.getMount());sysFile.setSysTypeName(fs.getType());sysFile.setTypeName(fs.getName());sysFile.setTotal(convertFileSize(total));sysFile.setFree(convertFileSize(free));sysFile.setUsed(convertFileSize(used));sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100));sysFiles.add(sysFile);}}/*** 字节转换** @param size 字节大小* @return 转换后值*/public String convertFileSize(long size) {long kb = 1024;long mb = kb * 1024;long gb = mb * 1024;if (size >= gb) {return String.format("%.1f GB", (float) size / gb);} else if (size >= mb) {float f = (float) size / mb;return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);} else if (size >= kb) {float f = (float) size / kb;return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);} else {return String.format("%d B", size);}}
}

java监测服务器信息(cpu,内存,运行时间等),springboot监控服务器信息相关推荐

  1. aix服务器如何查看cpu信息,aix服务器查看cpu内存

    aix服务器查看cpu内存 内容精选 换一换 查询该租户下,所有资源的配额信息,包括已使用配额.GET /v1/{project_id}/baremetalservers/limits参数说明请参见表 ...

  2. 如何获取服务器的CPU,内存进行限流

    文章目录 如何获取服务器的CPU,内存进行限流 如何获取服务器的CPU,内存进行限流 需要包名 "github.com/shirou/gopsutil/v3/cpu""g ...

  3. 2020年8月腾讯云服务器收费标准(CPU/内存/带宽/磁盘价格表)

    2020年8月腾讯云服务器收费标准(CPU/内存/带宽/磁盘价格表) 腾讯云服务器价格是由CPU.内存.公网带宽.云硬盘组成的,云服务器配置不同.CVM实例规格不同云服务器价格也不同,腾讯云公网带宽价 ...

  4. Jmeter分布式压测-windows(master控制机)多个linux(slaves负载机)监测服务器资源(cpu、内存等)

    为什么进行jmeter分布式压测? 一.干货解释原因: **原因一:**一台压力机的 Jmeter 默认最大支持 1000 左右的并发用户数(线程数),再大的话,容易造成卡顿.无响应等情况,这是受限于 ...

  5. java 解决服务器上 关于内存泄露的实战

    1. 编写.sh脚本 在脚本中添加如下语句 启动脚本 #!/bin/bash #要运行的类的全路径类名 CLASS="com.kafka.TTThread" #先把之前启动的进程杀 ...

  6. centOS7下实践查询版本/CPU/内存/硬盘容量等硬件信息

    https://www.cnblogs.com/zy-plan/p/8617202.html 1.系统 1.1版本 uname -a 能确认是64位还是32位,其它的信息不多 [root@localh ...

  7. SpringBoot监控服务器信息以及SpringBoot自带Health Indicator

    SpringBoot监控服务器内存信息简介 /** * 定时任务监控服务器内存信息 */ @Component public class OsMonitorScheduleTask implement ...

  8. java获取服务器的cpu和内存使用率

    使用的是sigar.jar包 sigar.jar下载地址密码1j2r 使用方法这三个文件放到jdk安装目录的bin下: Sigar sigar = new Sigar();Mem mem = siga ...

  9. 怎么查看服务器的CPU内存使用情况

    Linux 查看CPU,内存使用情况 Top第一行: 14:29:00-当前系统时间 up 4 days,4:23-系统已经运行了4天4小时23分钟(在这期间没有重启过) 1user-当前有1个用户登 ...

最新文章

  1. Git commit message和工作流规范
  2. linux c 运行命令 popen 简介
  3. KUDU--秒级查询的数据仓库
  4. boost install on prinse 12.04 ubuntu
  5. 随机抽样java_java生成抽样随机数的多种算法
  6. Linux学习笔记(6)
  7. linux系统调用的使用例子,Linux增加系统调用步骤和实例
  8. think-cell丨Images图像丨教程
  9. 23个平台短视频去水印解析下载接口
  10. Fuji-ImageJ分割中央凹无血管区
  11. 在Mac环境下查看附近路由器的MAC地址
  12. Minecraft Mod开发:1-配置工作环境
  13. ios APP加密探究几维安全iOS 代码混淆效果参考
  14. php jsp显示数据排序,JSP_SQL数据库开发中的一些精典代码,1.按姓氏笔画排序: select * From T - phpStudy...
  15. 初学C语言一些知识点的整理
  16. Android人脸识别技术
  17. 关于证明PAC可学习
  18. 上海58同城区域小区请清单(数据)
  19. 沪指暴跌200点 两市超过四分之一股票跌停
  20. 全面了解Beam Search 2:一些改进点

热门文章

  1. 行式数据库 VS 列式数据库
  2. 利用人工势场法的最短路径寻找
  3. android之broadcastreceiver 耳机按键,Android BroadcastReceiver 实时监听耳机拔出事件
  4. python人物关系可视化百年孤独_利用python对《乘风破浪的姐姐》可视化
  5. XJTU第十三周大计基编程作业
  6. java多线程归并排序_并行计算实验-串、并行排序算法
  7. 基于ARM9多串口工控主板的嵌入式开发方案
  8. 辗转相除法的原理,一看就懂,一学就会
  9. vue + prerender + html-webpack-plugin 打包商桥项目报错
  10. 静态工厂方法优缺点个人理解