📄 archiveutils.java
字号:
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, second); calendar.set(Calendar.MILLISECOND, milliseconds); return calendar; } /** * @param timestamp A 14-digit timestamp or the suffix for a 14-digit * timestamp: E.g. '20010909014640' or '20010101' or '1970'. * @return Seconds since the epoch as a string zero-pre-padded so always * Integer.MAX_VALUE wide (Makes it so sorting of resultant string works * properly). * @throws ParseException */ public static String secondsSinceEpoch(String timestamp) throws ParseException { return zeroPadInteger((int) (getSecondsSinceEpoch(timestamp).getTime()/1000)); } /** * @param timestamp A 14-digit timestamp or the suffix for a 14-digit * timestamp: E.g. '20010909014640' or '20010101' or '1970'. * @return A date. * @see #secondsSinceEpoch(String) * @throws ParseException */ public static Date getSecondsSinceEpoch(String timestamp) throws ParseException { if (timestamp.length() < 14) { if (timestamp.length() < 10 && (timestamp.length() % 2) == 1) { throw new IllegalArgumentException("Must have year, " + "month, date, hour or second granularity: " + timestamp); } if (timestamp.length() == 4) { // Add first month and first date. timestamp = timestamp + "01010000"; } if (timestamp.length() == 6) { // Add a date of the first. timestamp = timestamp + "010000"; } if (timestamp.length() < 14) { timestamp = timestamp + ArchiveUtils.padTo("", 14 - timestamp.length(), '0'); } } return ArchiveUtils.parse14DigitDate(timestamp); } /** * @param i Integer to add prefix of zeros too. If passed * 2005, will return the String <code>0000002005</code>. String * width is the width of Integer.MAX_VALUE as a string (10 * digits). * @return Padded String version of <code>i</code>. */ public static String zeroPadInteger(int i) { return ArchiveUtils.padTo(Integer.toString(i), MAX_INT_CHAR_WIDTH, '0'); } /** * Convert an <code>int</code> to a <code>String</code>, and pad it to * <code>pad</code> spaces. * @param i the int * @param pad the width to pad to. * @return String w/ padding. */ public static String padTo(final int i, final int pad) { String n = Integer.toString(i); return padTo(n, pad); } /** * Pad the given <code>String</code> to <code>pad</code> characters wide * by pre-pending spaces. <code>s</code> should not be <code>null</code>. * If <code>s</code> is already wider than <code>pad</code> no change is * done. * * @param s the String to pad * @param pad the width to pad to. * @return String w/ padding. */ public static String padTo(final String s, final int pad) { return padTo(s, pad, DEFAULT_PAD_CHAR); } /** * Pad the given <code>String</code> to <code>pad</code> characters wide * by pre-pending <code>padChar</code>. * * <code>s</code> should not be <code>null</code>. If <code>s</code> is * already wider than <code>pad</code> no change is done. * * @param s the String to pad * @param pad the width to pad to. * @param padChar The pad character to use. * @return String w/ padding. */ public static String padTo(final String s, final int pad, final char padChar) { String result = s; int l = s.length(); if (l < pad) { StringBuffer sb = new StringBuffer(pad); while(l < pad) { sb.append(padChar); l++; } sb.append(s); result = sb.toString(); } return result; } /** check that two byte arrays are equal. They may be <code>null</code>. * * @param lhs a byte array * @param rhs another byte array. * @return <code>true</code> if they are both equal (or both * <code>null</code>) */ public static boolean byteArrayEquals(final byte[] lhs, final byte[] rhs) { if (lhs == null && rhs != null || lhs != null && rhs == null) { return false; } if (lhs==rhs) { return true; } if (lhs.length != rhs.length) { return false; } for(int i = 0; i<lhs.length; i++) { if (lhs[i]!=rhs[i]) { return false; } } return true; } /** * Converts a double to a string. * @param val The double to convert * @param precision How many characters to include after '.' * @return the double as a string. */ public static String doubleToString(double val, int maxFractionDigits){ return doubleToString(val, maxFractionDigits, 0); } private static String doubleToString(double val, int maxFractionDigits, int minFractionDigits) { NumberFormat f = NumberFormat.getNumberInstance(Locale.US); f.setMaximumFractionDigits(maxFractionDigits); f.setMinimumFractionDigits(minFractionDigits); return f.format(val); } /** * Takes a byte size and formats it for display with 'friendly' units. * <p> * This involves converting it to the largest unit * (of B, KB, MB, GB, TB) for which the amount will be > 1. * <p> * Additionally, at least 2 significant digits are always displayed. * <p> * Displays as bytes (B): 0-1023 * Displays as kilobytes (KB): 1024 - 2097151 (~2Mb) * Displays as megabytes (MB): 2097152 - 4294967295 (~4Gb) * Displays as gigabytes (GB): 4294967296 - infinity * <p> * Negative numbers will be returned as '0 B'. * * @param amount the amount of bytes * @return A string containing the amount, properly formated. */ public static String formatBytesForDisplay(long amount) { double displayAmount = (double) amount; int unitPowerOf1024 = 0; if(amount <= 0){ return "0 B"; } while(displayAmount>=1024 && unitPowerOf1024 < 4) { displayAmount = displayAmount / 1024; unitPowerOf1024++; } // TODO: get didactic, make these KiB, MiB, GiB, TiB final String[] units = { " B", " KB", " MB", " GB", " TB" }; // ensure at least 2 significant digits (#.#) for small displayValues int fractionDigits = (displayAmount < 10) ? 1 : 0; return doubleToString(displayAmount, fractionDigits, fractionDigits) + units[unitPowerOf1024]; } /** * Convert milliseconds value to a human-readable duration * @param time * @return Human readable string version of passed <code>time</code> */ public static String formatMillisecondsToConventional(long time) { return formatMillisecondsToConventional(time,true); } /** * Convert milliseconds value to a human-readable duration * @param time * @param toMs whether to print to the ms * @return Human readable string version of passed <code>time</code> */ public static String formatMillisecondsToConventional(long time, boolean toMs) { StringBuffer sb = new StringBuffer(); if(time<0) { sb.append("-"); } long absTime = Math.abs(time); if(!toMs && absTime < 1000) { return "0s"; } if(absTime > DAY_IN_MS) { // days sb.append(absTime / DAY_IN_MS + "d"); absTime = absTime % DAY_IN_MS; } if (absTime > HOUR_IN_MS) { //got hours. sb.append(absTime / HOUR_IN_MS + "h"); absTime = absTime % HOUR_IN_MS; } if (absTime > 60000) { sb.append(absTime / 60000 + "m"); absTime = absTime % 60000; } if (absTime > 1000) { sb.append(absTime / 1000 + "s"); absTime = absTime % 1000; } if(toMs) { sb.append(absTime + "ms"); } return sb.toString(); } /** * Generate a long UID based on the given class and version number. * Using this instead of the default will assume serialization * compatibility across class changes unless version number is * intentionally bumped. * * @param class1 * @param version * @return UID based off class and version number. */ public static long classnameBasedUID(Class class1, int version) { String callingClassname = class1.getName(); return (long)callingClassname.hashCode() << 32 + version; } /** * Copy the raw bytes of a long into a byte array, starting at * the specified offset. * * @param l * @param array * @param offset */ public static void longIntoByteArray(long l, byte[] array, int offset) { int i, shift; for(i = 0, shift = 56; i < 8; i++, shift -= 8) array[offset+i] = (byte)(0xFF & (l >> shift)); } public static long byteArrayIntoLong(byte [] bytearray) { return byteArrayIntoLong(bytearray, 0); } /** * Byte array into long. * @param bytearray Array to convert to a long. * @param offset Offset into array at which we start decoding the long. * @return Long made of the bytes of <code>array</code> beginning at * offset <code>offset</code>. * @see #longIntoByteArray(long, byte[], int) */ public static long byteArrayIntoLong(byte [] bytearray, int offset) { long result = 0; for (int i = offset; i < 8 /*Bytes in long*/; i++) { result = (result << 8 /*Bits in byte*/) | (0xff & (byte)(bytearray[i] & 0xff)); } return result; } /** * Given a string that may be a plain host or host/path (without * URI scheme), add an implied http:// if necessary. * * @param u string to evaluate * @return string with http:// added if no scheme already present */ public static String addImpliedHttpIfNecessary(String u) { if(u.indexOf(':') == -1 || u.indexOf('.') < u.indexOf(':')) { // No scheme present; prepend "http://" u = "http://" + u; } return u; } /** * Verify that the array begins with the prefix. * * @param array * @param prefix * @return true if array is identical to prefix for the first prefix.length * positions */ public static boolean startsWith(byte[] array, byte[] prefix) { if(prefix.length>array.length) { return false; } for(int i = 0; i < prefix.length; i++) { if(array[i]!=prefix[i]) { return false; } } return true; } /** * Utility method to get a String singleLineReport from Reporter * @param rep Reporter to get singleLineReport from * @return String of report */ public static String singleLineReport(Reporter rep) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); try { rep.singleLineReportTo(pw); } catch (IOException e) { // not really possible e.printStackTrace(); } pw.flush(); return sw.toString(); } /** * Compose the requested report into a String. DANGEROUS IF REPORT * CAN BE LARGE. * * @param rep Reported * @param name String name of report to compose * @return String of report */ public static String writeReportToString(Reporter rep, String name) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); rep.reportTo(name,pw); pw.flush(); return sw.toString(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -