package com.feeyo.redis.virtualmemory; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.text.NumberFormat; import java.util.zip.CRC32; import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author yangtao from rocketmq * */ public class Util { private static final Logger log = LoggerFactory.getLogger( Util.class ); final static char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); } public static String bytes2string(byte[] src) { char[] hexChars = new char[src.length * 2]; for (int j = 0; j < src.length; j++) { int v = src[j] & 0xFF; hexChars[j * 2] = HEX_ARRAY[v >>> 4]; hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; } return new String(hexChars); } public static byte[] string2bytes(String hexString) { if (hexString == null || hexString.equals("")) { return null; } hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; } public static String offset2FileName(final long offset) { final NumberFormat nf = NumberFormat.getInstance(); nf.setMinimumIntegerDigits(20); nf.setMaximumFractionDigits(0); nf.setGroupingUsed(false); return nf.format(offset); } public static long computeEclipseTimeMilliseconds(final long beginTime) { return System.currentTimeMillis() - beginTime; } public static byte[] uncompress(final byte[] src) throws IOException { byte[] result = src; byte[] uncompressData = new byte[src.length]; ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(src); InflaterInputStream inflaterInputStream = new InflaterInputStream(byteArrayInputStream); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(src.length); try { while (true) { int len = inflaterInputStream.read(uncompressData, 0, uncompressData.length); if (len <= 0) { break; } byteArrayOutputStream.write(uncompressData, 0, len); } byteArrayOutputStream.flush(); result = byteArrayOutputStream.toByteArray(); } catch (IOException e) { throw e; } finally { try { byteArrayInputStream.close(); } catch (IOException e) { log.error("Failed to close the stream", e); } try { inflaterInputStream.close(); } catch (IOException e) { log.error("Failed to close the stream", e); } try { byteArrayOutputStream.close(); } catch (IOException e) { log.error("Failed to close the stream", e); } } return result; } public static byte[] compress(final byte[] src, final int level) { byte[] result = src; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(src.length); java.util.zip.Deflater defeater = new java.util.zip.Deflater(level); DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(byteArrayOutputStream, defeater); try { deflaterOutputStream.write(src); deflaterOutputStream.finish(); deflaterOutputStream.close(); result = byteArrayOutputStream.toByteArray(); } catch (IOException e) { defeater.end(); e.printStackTrace(); } finally { try { byteArrayOutputStream.close(); } catch (IOException ignored) { } defeater.end(); } return result; } public static double getDiskPartitionSpaceUsedPercent(final String path) { if (null == path || path.isEmpty()) return -1; try { File file = new File(path); if (!file.exists()) return -1; long totalSpace = file.getTotalSpace(); if (totalSpace > 0) { long freeSpace = file.getFreeSpace(); long usedSpace = totalSpace - freeSpace; return usedSpace / (double) totalSpace; } } catch (Exception e) { return -1; } return -1; } public static int crc32(byte[] array) { if (array != null) { return crc32(array, 0, array.length); } return 0; } public static int crc32(byte[] array, int offset, int length) { CRC32 crc32 = new CRC32(); crc32.update(array, offset, length); return (int) (crc32.getValue() & 0x7FFFFFFF); } }