⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stringutils.java

📁 Jive是基于JSP/JAVA技术构架的一个大型BBS论坛系统,这是Jive论坛2.6版本的源程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
     *     * @param data a base64 encode byte array to decode.     * @return the decoded String.     */    public static String decodeBase64(byte[] data) {        int c, c1;        int len = data.length;        StringBuffer ret = new StringBuffer((len * 3) / 4);        for (int i = 0; i < len; ++i) {            c = cvt.indexOf(data[i]);            ++i;            c1 = cvt.indexOf(data[i]);            c = ((c << 2) | ((c1 >> 4) & 0x3));            ret.append((char) c);            if (++i < len) {                c = data[i];                if (fillchar == c)                    break;                c = cvt.indexOf((char) c);                c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf);                ret.append((char) c1);            }            if (++i < len) {                c1 = data[i];                if (fillchar == c1)                    break;                c1 = cvt.indexOf((char) c1);                c = ((c << 6) & 0xc0) | c1;                ret.append((char) c);            }        }        return ret.toString();    }    private static final int fillchar = '=';    private static final String cvt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"                                    + "abcdefghijklmnopqrstuvwxyz"                                    + "0123456789+/";    /**     * Converts a line of text into an array of lower case words using a     * BreakIterator.wordInstance(). <p>     *     * This method is under the Jive Open Source Software License and was     * written by Mark Imbriaco.     *     * @param text a String of text to convert into an array of words     * @return text broken up into an array of words.     */    public static final String [] toLowerCaseWordArray(String text) {        if (text == null || text.length() == 0) {                return new String[0];        }        ArrayList wordList = new ArrayList();        BreakIterator boundary = BreakIterator.getWordInstance();        boundary.setText(text);        int start = 0;        for (int end = boundary.next(); end != BreakIterator.DONE;                start = end, end = boundary.next())        {            String tmp = text.substring(start,end).trim();            // Remove characters that are not needed.            tmp = replace(tmp, "+", "");            tmp = replace(tmp, "/", "");            tmp = replace(tmp, "\\", "");            tmp = replace(tmp, "#", "");            tmp = replace(tmp, "*", "");            tmp = replace(tmp, ")", "");            tmp = replace(tmp, "(", "");            tmp = replace(tmp, "&", "");            if (tmp.length() > 0) {                wordList.add(tmp);            }        }        return (String[]) wordList.toArray(new String[wordList.size()]);    }    /**     * Pseudo-random number generator object for use with randomString().     * The Random class is not considered to be cryptographically secure, so     * only use these random Strings for low to medium security applications.     */    private static Random randGen = new Random();    /**     * Array of numbers and letters of mixed case. Numbers appear in the list     * twice so that there is a more equal chance that a number will be picked.     * We can use the array to get a random number or letter by picking a random     * array index.     */    private static char[] numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyz" +                    "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();    /**     * Returns a random String of numbers and letters (lower and upper case)     * of the specified length. The method uses the Random class that is     * built-in to Java which is suitable for low to medium grade security uses.     * This means that the output is only pseudo random, i.e., each number is     * mathematically generated so is not truly random.<p>     *     * The specified length must be at least one. If not, the method will return     * null.     *     * @param length the desired length of the random String to return.     * @return a random String of numbers and letters of the specified length.     */    public static final String randomString(int length) {        if (length < 1) {            return null;        }        // Create a char buffer to put random letters and numbers in.        char [] randBuffer = new char[length];        for (int i=0; i<randBuffer.length; i++) {            randBuffer[i] = numbersAndLetters[randGen.nextInt(71)];        }        return new String(randBuffer);    }   /**    * Intelligently chops a String at a word boundary (whitespace) that occurs    * at the specified index in the argument or before. However, if there is a    * newline character before <code>length</code>, the String will be chopped    * there. If no newline or whitespace is found in <code>string</code> up to    * the index <code>length</code>, the String will chopped at <code>length</code>.    * <p>    * For example, chopAtWord("This is a nice String", 10) will return    * "This is a" which is the first word boundary less than or equal to 10    * characters into the original String.    *    * @param string the String to chop.    * @param length the index in <code>string</code> to start looking for a    *       whitespace boundary at.    * @return a substring of <code>string</code> whose length is less than or    *       equal to <code>length</code>, and that is chopped at whitespace.    */    public static final String chopAtWord(String string, int length) {        if (string == null || string.length() == 0) {            return string;        }        char [] charArray = string.toCharArray();        int sLength = string.length();        if (length < sLength) {            sLength = length;        }        // First check if there is a newline character before length; if so,        // chop word there.        for (int i=0; i<sLength-1; i++) {            // Windows            if (charArray[i] == '\r' && charArray[i+1] == '\n') {                return string.substring(0, i+1);            }            // Unix            else if (charArray[i] == '\n') {                return string.substring(0, i);            }        }        // Also check boundary case of Unix newline        if (charArray[sLength-1] == '\n') {            return string.substring(0, sLength-1);        }        // Done checking for newline, now see if the total string is less than        // the specified chop point.        if (string.length() < length) {            return string;        }        // No newline, so chop at the first whitespace.        for (int i = length-1; i > 0; i--) {            if (charArray[i] == ' ') {                return string.substring(0, i).trim();            }        }        // Did not find word boundary so return original String chopped at        // specified length.        return string.substring(0, length);    }    /**     * Reformats a string where lines that are longer than <tt>width</tt>     * are split apart at the earliest wordbreak or at maxLength, whichever is     * sooner. If the width specified is less than 5 or greater than the input     * Strings length the string will be returned as is.     * <p>     * Please note that this method can be lossy - trailing spaces on wrapped     * lines may be trimmed.     *     * @param input the String to reformat.     * @param width the maximum length of any one line.     * @return a new String with reformatted as needed.     */    public static String wordWrap(String input, int width, Locale locale) {        // protect ourselves        if (input == null) {            return "";        }        else if (width < 5) {            return input;        }        else if (width >= input.length()) {            return input;        }        // default locale        if (locale == null) {            locale = JiveGlobals.getLocale();        }        StringBuffer buf  = new StringBuffer(input);        boolean endOfLine = false;        int lineStart     = 0;        for (int i = 0; i < buf.length(); i++) {            if (buf.charAt(i) == '\n') {                lineStart = i + 1;                endOfLine = true;            }            // handle splitting at width character            if (i > lineStart + width - 1) {                if (!endOfLine) {                    int limit = i - lineStart - 1;                    BreakIterator breaks = BreakIterator.getLineInstance(locale);                    breaks.setText(buf.substring(lineStart, i));                    int end = breaks.last();                    // if the last character in the search string isn't a space,                    // we can't split on it (looks bad). Search for a previous                    // break character                   if (end == limit + 1) {                        if (!Character.isWhitespace(buf.charAt(lineStart + end))) {                            end = breaks.preceding(end - 1);                        }                    }                    // if the last character is a space, replace it with a \n                    if (end != BreakIterator.DONE && end == limit + 1) {                        buf.replace(lineStart + end, lineStart + end + 1, "\n");                        lineStart = lineStart + end;                    }                    // otherwise, just insert a \n                    else if (end != BreakIterator.DONE && end != 0) {                        buf.insert(lineStart + end, '\n');                        lineStart = lineStart + end + 1;                    }                    else {                        buf.insert(i, '\n');                        lineStart = i + 1;                    }                }                else {                    buf.insert(i, '\n');                    lineStart = i + 1;                    endOfLine = false;                }            }        }        return buf.toString();    }    // Create a regular expression engine that is used by the highlightWords    // method below.    private static Perl5Util perl5Util = new Perl5Util();    /**     * Highlights words in a string. Words matching ignores case. The actual     * higlighting method is specified with the start and end higlight tags.     * Those might be beginning and ending HTML bold tags, or anything else.<p>     *     * This method is under the Jive Open Source Software License and was     * written by Mark Imbriaco.     *     * @param string the String to highlight words in.     * @param words an array of words that should be highlighted in the string.     * @param startHighlight the tag that should be inserted to start highlighting.     * @param endHighlight the tag that should be inserted to end highlighting.     * @return a new String with the specified words highlighted.     */    public static final String highlightWords(String string, String[] words,        String startHighlight, String endHighlight)    {        if (string == null || words == null ||                startHighlight == null || endHighlight == null)        {            return null;        }        StringBuffer regexp = new StringBuffer();        // Iterate through each word and generate a word list for the regexp.        for (int x=0; x<words.length; x++)        {            // Excape "|" and "/"  to keep us out of trouble in our regexp.            words[x] = perl5Util.substitute("s#([\\|\\/\\.])#\\\\$1#g", words[x]);            if (regexp.length() > 0)            {                regexp.append("|");            }            regexp.append(words[x]);        }        // Escape the regular expression delimiter ("/").        startHighlight = perl5Util.substitute("s#\\/#\\\\/#g", startHighlight);        endHighlight = perl5Util.substitute("s#\\/#\\\\/#g", endHighlight);        // Build the regular expression. insert() the first part.        regexp.insert(0, "s/\\b(");        // The word list is here already, so just append the rest.        regexp.append(")\\b/");        regexp.append(startHighlight);        regexp.append("$1");        regexp.append(endHighlight);        regexp.append("/igm");        // Do the actual substitution via a simple regular expression.        return perl5Util.substitute(regexp.toString(), string);    }    /**     * Escapes all necessary characters in the String so that it can be used     * in an XML doc.     *     * @param string the string to escape.     * @return the string with appropriate characters escaped.     */    public static final String escapeForXML(String string) {        if (string == null) {            return null;        }        char ch;        int i=0;        int last=0;        char[] input = string.toCharArray();        int len = input.length;        StringBuffer out = new StringBuffer((int)(len*1.3));        for (; i < len; i++) {            ch = input[i];            if (ch > '>') {                continue;            } else if (ch == '<') {                if (i > last) {                    out.append(input, last, i - last);                }                last = i + 1;                out.append(LT_ENCODE);            } else if (ch == '&') {                if (i > last) {                    out.append(input, last, i - last);                }                last = i + 1;                out.append(AMP_ENCODE);            } else if (ch == '"') {                if (i > last) {                    out.append(input, last, i - last);                }                last = i + 1;                out.append(QUOTE_ENCODE);            }        }        if (last == 0) {            return string;        }        if (i > last) {            out.append(input, last, i - last);        }        return out.toString();    }    /**     * Unescapes the String by converting XML escape sequences back into normal     * characters.     *     * @param string the string to unescape.     * @return the string with appropriate characters unescaped.     */    public static final String unescapeFromXML(String string) {        string = replace(string, "&lt;", "<");        string = replace(string, "&gt;", ">");        string = replace(string, "&quot;", "\"");        return replace(string, "&amp;", "&");    }    private static final char[] zeroArray = "0000000000000000".toCharArray();    /**     * Pads the supplied String with 0's to the specified length and returns     * the result as a new String. For example, if the initial String is     * "9999" and the desired length is 8, the result would be "00009999".     * This type of padding is useful for creating numerical values that need     * to be stored and sorted as character data. Note: the current     * implementation of this method allows for a maximum <tt>length</tt> of     * 16.     *     * @param string the original String to pad.     * @param length the desired length of the new padded String.     * @return a new String padded with the required number of 0's.     */     public static final String zeroPadString(String string, int length) {        if (string == null || string.length() > length) {            return string;        }        StringBuffer buf = new StringBuffer(length);        buf.append(zeroArray, 0, length-string.length()).append(string);        return buf.toString();     }     /**      * Formats a Date as a fifteen character long String made up of the Date's      * padded millisecond value.      *      * @return a Date encoded as a String.      */     public static final String dateToMillis(Date date) {        return zeroPadString(Long.toString(date.getTime()), 15);     }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -