
cn.bestwu.lang.util.StringUtil Maven / Gradle / Ivy
package cn.bestwu.lang.util;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.InflaterInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 字符串工具类
*
* @author Peter Wu
*/
public class StringUtil {
private static Logger log = LoggerFactory.getLogger(StringUtil.class);
private static ObjectMapper objectMapper = new ObjectMapper();
static {
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_INDEX);
objectMapper.disable(SerializationFeature.WRITE_NULL_MAP_VALUES,
SerializationFeature.FAIL_ON_EMPTY_BEANS);
objectMapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
}
/**
* @param str 字符
* @return 是否有长度
*/
public static boolean hasLength(CharSequence str) {
return (str != null && str.length() > 0);
}
/**
* @param str 字符
* @return 是否有字符
*/
public static boolean hasText(CharSequence str) {
if (!hasLength(str)) {
return false;
}
int strLen = str.length();
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(str.charAt(i))) {
return true;
}
}
return false;
}
/**
* @param s 字符串
* @return 转换为带下划线的小写字符
*/
public static String addUnderscores(String s) {
StringBuilder buf = new StringBuilder(s.replace('.', '_'));
for (int i = 1; i < buf.length() - 1; i++) {
if (
Character.isLowerCase(buf.charAt(i - 1)) &&
Character.isUpperCase(buf.charAt(i)) &&
Character.isLowerCase(buf.charAt(i + 1))
) {
buf.insert(i++, '_');
}
}
return buf.toString().toLowerCase(Locale.ROOT);
}
/**
* 转换为字符串
*
* @param object 对象
* @return 字符串
*/
public static String valueOf(Object object) {
return valueOf(object, false);
}
/**
* 转换为字符串
*
* @param object 对象
* @param format 是否格式化输出
* @return 字符串
*/
public static String valueOf(Object object, boolean format) {
if (object == null) {
return "null";
}
Class> clazz = object.getClass();
if (clazz.isArray()) {
int length = Array.getLength(object);
int iMax = length - 1;
if (iMax == -1) {
return "[]";
}
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(valueOf(Array.get(object, i), format));
if (i == iMax) {
return b.append(']').toString();
}
b.append(", ");
}
} else if (Enumeration.class.isAssignableFrom(clazz)) {
Enumeration> es = (Enumeration>) object;
if (!es.hasMoreElements()) {
return "[]";
}
StringBuilder b = new StringBuilder();
b.append('[');
while (es.hasMoreElements()) {
Object e = es.nextElement();
b.append(valueOf(e, format));
if (!es.hasMoreElements()) {
return b.append(']').toString();
}
b.append(", ");
}
} else {
try {
if (format) {
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
}
String string = null;
if (string == null) {
string = objectMapper.writeValueAsString(object);
}
if (format) {
objectMapper.disable(SerializationFeature.INDENT_OUTPUT);
}
return string;
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
return String.valueOf(object);
}
/**
* 截取一定长度的字符
*
* @param str 字符串
* @param length 长度
* @return 截取后的字符串
*/
public static String subString(String str, int length) {
if (str == null) {
return null;
}
int l = str.length();
if (l > length) {
return str.substring(0, length);
} else {
return str;
}
}
/**
* 截取一定长度的字符,结果以...结尾
*
* @param str 字符串
* @param length 长度
* @return 截取后的字符串
*/
public static String subStringWithEllipsis(String str, int length) {
if (str == null) {
return null;
}
int l = str.length();
if (l > length) {
return str.substring(0, length - 3) + "...";
} else {
return str;
}
}
/**
* 计算字符串包含子字符串的个数
*
* @param str 字符串
* @param sub 子字符串
* @return 个数
*/
public static int countSubString(String str, String sub) {
if (str.contains(sub)) {
return splitWorker(str, sub, -1, false).length - 1;
} else {
return 0;
}
}
/**
* 分割字符串
*
* @param str 字符串
* @param separatorChars 分隔符
* @param max 最大数量
* @param preserveAllTokens preserveAllTokens
* @return 分割后数组
*/
private static String[] splitWorker(final String str, final String separatorChars, final int max,
final boolean preserveAllTokens) {
// Performance tuned for 2.0 (JDK1.4)
// Direct code is quicker than StringTokenizer.
// Also, StringTokenizer uses isSpace() not isWhitespace()
if (str == null) {
return null;
}
final int len = str.length();
if (len == 0) {
return new String[0];
}
final List list = new ArrayList<>();
int sizePlus1 = 1;
int i = 0, start = 0;
boolean match = false;
boolean lastMatch = false;
if (separatorChars == null) {
// Null separator means use whitespace
while (i < len) {
if (Character.isWhitespace(str.charAt(i))) {
if (match || preserveAllTokens) {
lastMatch = true;
if (sizePlus1++ == max) {
i = len;
lastMatch = false;
}
list.add(str.substring(start, i));
match = false;
}
start = ++i;
continue;
}
lastMatch = false;
match = true;
i++;
}
} else if (separatorChars.length() == 1) {
// Optimise 1 character case
final char sep = separatorChars.charAt(0);
while (i < len) {
if (str.charAt(i) == sep) {
if (match || preserveAllTokens) {
lastMatch = true;
if (sizePlus1++ == max) {
i = len;
lastMatch = false;
}
list.add(str.substring(start, i));
match = false;
}
start = ++i;
continue;
}
lastMatch = false;
match = true;
i++;
}
} else {
// standard case
while (i < len) {
if (separatorChars.indexOf(str.charAt(i)) >= 0) {
if (match || preserveAllTokens) {
lastMatch = true;
if (sizePlus1++ == max) {
i = len;
lastMatch = false;
}
list.add(str.substring(start, i));
match = false;
}
start = ++i;
continue;
}
lastMatch = false;
match = true;
i++;
}
}
if (match || preserveAllTokens && lastMatch) {
list.add(str.substring(start, i));
}
return list.toArray(new String[list.size()]);
}
/**
* 压缩字符
*
* @param str 待压缩字符
* @return 压缩后字符
*/
public static String compress(String str) {
if (str == null || str.length() == 0) {
return str;
}
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
DeflaterOutputStream gzip = new DeflaterOutputStream(out);
gzip.write(str.getBytes());
gzip.close();
return new String(out.toByteArray(), "ISO-8859-1");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static String decompress(String str) {
if (str == null || str.length() == 0) {
return str;
}
try {
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
str.getBytes("ISO-8859-1"));
InflaterInputStream zipInputStream = new InflaterInputStream(byteArrayInputStream);
return copyToString(zipInputStream, Charset.forName("ISO-8859-1"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static String copyToString(InputStream in, Charset charset) throws IOException {
StringBuilder out = new StringBuilder();
InputStreamReader reader = new InputStreamReader(in, charset);
char[] buffer = new char[4096];
int bytesRead;
while ((bytesRead = reader.read(buffer)) != -1) {
out.append(buffer, 0, bytesRead);
}
return out.toString();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy