zoukankan      html  css  js  c++  java
  • java 常用工具类的使用<二>

    一、String工具类

       1 package com.mkyong.common;  
       2    
       3 import java.util.ArrayList;  
       4 import java.util.List;  
       5    
       6 /** 
       7  *  
       8  * String工具类. <br> 
       9  *  
      10  * @author 宋立君 
      11  * @date 2014年06月24日 
      12  */  
      13 public class StringUtil {  
      14    
      15     private static final int INDEX_NOT_FOUND = -1;  
      16     private static final String EMPTY = "";  
      17     /** 
      18      * <p> 
      19      * The maximum size to which the padding constant(s) can expand. 
      20      * </p> 
      21      */  
      22     private static final int PAD_LIMIT = 8192;  
      23    
      24     /** 
      25      * 功能:将半角的符号转换成全角符号.(即英文字符转中文字符) 
      26      *  
      27      * @author 宋立君 
      28      * @param str 
      29      *            源字符串 
      30      * @return String 
      31      * @date 2014年06月24日 
      32      */  
      33     public static String changeToFull(String str) {  
      34         String source = "1234567890!@#$%^&*()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_=+\|[];:'",<.>/?";  
      35         String[] decode = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0",  
      36                 "!", "@", "#", "$", "%", "︿", "&", "*", "(", ")", "a", "b",  
      37                 "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",  
      38                 "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",  
      39                 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",  
      40                 "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X",  
      41                 "Y", "Z", "-", "_", "=", "+", "\", "|", "【", "】", ";", ":",  
      42                 "'", """, ",", "〈", "。", "〉", "/", "?" };  
      43         String result = "";  
      44         for (int i = 0; i < str.length(); i++) {  
      45             int pos = source.indexOf(str.charAt(i));  
      46             if (pos != -1) {  
      47                 result += decode[pos];  
      48             } else {  
      49                 result += str.charAt(i);  
      50             }  
      51         }  
      52         return result;  
      53     }  
      54    
      55     /** 
      56      * 功能:cs串中是否一个都不包含字符数组searchChars中的字符。 
      57      *  
      58      * @author 宋立君 
      59      * @param cs 
      60      *            字符串 
      61      * @param searchChars 
      62      *            字符数组 
      63      * @return boolean 都不包含返回true,否则返回false。 
      64      * @date 2014年06月24日 
      65      */  
      66     public static boolean containsNone(CharSequence cs, char... searchChars) {  
      67         if (cs == null || searchChars == null) {  
      68             return true;  
      69         }  
      70         int csLen = cs.length();  
      71         int csLast = csLen - 1;  
      72         int searchLen = searchChars.length;  
      73         int searchLast = searchLen - 1;  
      74         for (int i = 0; i < csLen; i++) {  
      75             char ch = cs.charAt(i);  
      76             for (int j = 0; j < searchLen; j++) {  
      77                 if (searchChars[j] == ch) {  
      78                     if (Character.isHighSurrogate(ch)) {  
      79                         if (j == searchLast) {  
      80                             // missing low surrogate, fine, like  
      81                             // String.indexOf(String)  
      82                             return false;  
      83                         }  
      84                         if (i < csLast  
      85                                 && searchChars[j + 1] == cs.charAt(i + 1)) {  
      86                             return false;  
      87                         }  
      88                     } else {  
      89                         // ch is in the Basic Multilingual Plane  
      90                         return false;  
      91                     }  
      92                 }  
      93             }  
      94         }  
      95         return true;  
      96     }  
      97    
      98     /** 
      99      * <p> 
     100      * 编码为Unicode,格式 'u0020'. 
     101      * </p> 
     102      *  
     103      * @author 宋立君 
     104      *  
     105      *         <pre> 
     106      *   CharUtils.unicodeEscaped(' ') = "u0020" 
     107      *   CharUtils.unicodeEscaped('A') = "u0041" 
     108      * </pre> 
     109      *  
     110      * @param ch 
     111      *            源字符串 
     112      * @return 转码后的字符串 
     113      * @date 2014年06月24日 
     114      */  
     115     public static String unicodeEscaped(char ch) {  
     116         if (ch < 0x10) {  
     117             return "\u000" + Integer.toHexString(ch);  
     118         } else if (ch < 0x100) {  
     119             return "\u00" + Integer.toHexString(ch);  
     120         } else if (ch < 0x1000) {  
     121             return "\u0" + Integer.toHexString(ch);  
     122         }  
     123         return "\u" + Integer.toHexString(ch);  
     124     }  
     125    
     126     /** 
     127      * <p> 
     128      * 进行tostring操作,如果传入的是null,返回空字符串。 
     129      * </p> 
     130      * 
     131      * <pre> 
     132      * ObjectUtils.toString(null)         = "" 
     133      * ObjectUtils.toString("")           = "" 
     134      * ObjectUtils.toString("bat")        = "bat" 
     135      * ObjectUtils.toString(Boolean.TRUE) = "true" 
     136      * </pre> 
     137      * 
     138      * @param obj 
     139      *            源 
     140      * @return String 
     141      */  
     142     public static String toString(Object obj) {  
     143         return obj == null ? "" : obj.toString();  
     144     }  
     145    
     146     /** 
     147      * <p> 
     148      * 进行tostring操作,如果传入的是null,返回指定的默认值。 
     149      * </p> 
     150      * 
     151      * <pre> 
     152      * ObjectUtils.toString(null, null)           = null 
     153      * ObjectUtils.toString(null, "null")         = "null" 
     154      * ObjectUtils.toString("", "null")           = "" 
     155      * ObjectUtils.toString("bat", "null")        = "bat" 
     156      * ObjectUtils.toString(Boolean.TRUE, "null") = "true" 
     157      * </pre> 
     158      * 
     159      * @param obj 
     160      *            源 
     161      * @param nullStr 
     162      *            如果obj为null时返回这个指定值 
     163      * @return String 
     164      */  
     165     public static String toString(Object obj, String nullStr) {  
     166         return obj == null ? nullStr : obj.toString();  
     167     }  
     168    
     169     /** 
     170      * <p> 
     171      * 只从源字符串中移除指定开头子字符串. 
     172      * </p> 
     173      *  
     174      * <pre> 
     175      * StringUtil.removeStart(null, *)      = null 
     176      * StringUtil.removeStart("", *)        = "" 
     177      * StringUtil.removeStart(*, null)      = * 
     178      * StringUtil.removeStart("www.domain.com", "www.")   = "domain.com" 
     179      * StringUtil.removeStart("domain.com", "www.")       = "domain.com" 
     180      * StringUtil.removeStart("www.domain.com", "domain") = "www.domain.com" 
     181      * StringUtil.removeStart("abc", "")    = "abc" 
     182      * </pre> 
     183      * 
     184      * @param str 
     185      *            源字符串 
     186      * @param remove 
     187      *            将要被移除的子字符串 
     188      * @return String 
     189      */  
     190     public static String removeStart(String str, String remove) {  
     191         if (isEmpty(str) || isEmpty(remove)) {  
     192             return str;  
     193         }  
     194         if (str.startsWith(remove)) {  
     195             return str.substring(remove.length());  
     196         }  
     197         return str;  
     198     }  
     199    
     200     /** 
     201      * <p> 
     202      * 只从源字符串中移除指定结尾的子字符串. 
     203      * </p> 
     204      *  
     205      * <pre> 
     206      * StringUtil.removeEnd(null, *)      = null 
     207      * StringUtil.removeEnd("", *)        = "" 
     208      * StringUtil.removeEnd(*, null)      = * 
     209      * StringUtil.removeEnd("www.domain.com", ".com.")  = "www.domain.com" 
     210      * StringUtil.removeEnd("www.domain.com", ".com")   = "www.domain" 
     211      * StringUtil.removeEnd("www.domain.com", "domain") = "www.domain.com" 
     212      * StringUtil.removeEnd("abc", "")    = "abc" 
     213      * </pre> 
     214      * 
     215      * @param str 
     216      *            源字符串 
     217      * @param remove 
     218      *            将要被移除的子字符串 
     219      * @return String 
     220      */  
     221     public static String removeEnd(String str, String remove) {  
     222         if (isEmpty(str) || isEmpty(remove)) {  
     223             return str;  
     224         }  
     225         if (str.endsWith(remove)) {  
     226             return str.substring(0, str.length() - remove.length());  
     227         }  
     228         return str;  
     229     }  
     230    
     231     /** 
     232      * <p> 
     233      * 将一个字符串重复N次 
     234      * </p> 
     235      * 
     236      * <pre> 
     237      * StringUtil.repeat(null, 2) = null 
     238      * StringUtil.repeat("", 0)   = "" 
     239      * StringUtil.repeat("", 2)   = "" 
     240      * StringUtil.repeat("a", 3)  = "aaa" 
     241      * StringUtil.repeat("ab", 2) = "abab" 
     242      * StringUtil.repeat("a", -2) = "" 
     243      * </pre> 
     244      * 
     245      * @param str 
     246      *            源字符串 
     247      * @param repeat 
     248      *            重复的次数 
     249      * @return String 
     250      */  
     251     public static String repeat(String str, int repeat) {  
     252         // Performance tuned for 2.0 (JDK1.4)  
     253    
     254         if (str == null) {  
     255             return null;  
     256         }  
     257         if (repeat <= 0) {  
     258             return EMPTY;  
     259         }  
     260         int inputLength = str.length();  
     261         if (repeat == 1 || inputLength == 0) {  
     262             return str;  
     263         }  
     264         if (inputLength == 1 && repeat <= PAD_LIMIT) {  
     265             return repeat(str.charAt(0), repeat);  
     266         }  
     267    
     268         int outputLength = inputLength * repeat;  
     269         switch (inputLength) {  
     270         case 1:  
     271             return repeat(str.charAt(0), repeat);  
     272         case 2:  
     273             char ch0 = str.charAt(0);  
     274             char ch1 = str.charAt(1);  
     275             char[] output2 = new char[outputLength];  
     276             for (int i = repeat * 2 - 2; i >= 0; i--, i--) {  
     277                 output2[i] = ch0;  
     278                 output2[i + 1] = ch1;  
     279             }  
     280             return new String(output2);  
     281         default:  
     282             StringBuilder buf = new StringBuilder(outputLength);  
     283             for (int i = 0; i < repeat; i++) {  
     284                 buf.append(str);  
     285             }  
     286             return buf.toString();  
     287         }  
     288     }  
     289    
     290     /** 
     291      * <p> 
     292      * 将一个字符串重复N次,并且中间加上指定的分隔符 
     293      * </p> 
     294      * 
     295      * <pre> 
     296      * StringUtil.repeat(null, null, 2) = null 
     297      * StringUtil.repeat(null, "x", 2)  = null 
     298      * StringUtil.repeat("", null, 0)   = "" 
     299      * StringUtil.repeat("", "", 2)     = "" 
     300      * StringUtil.repeat("", "x", 3)    = "xxx" 
     301      * StringUtil.repeat("?", ", ", 3)  = "?, ?, ?" 
     302      * </pre> 
     303      * 
     304      * @param str 
     305      *            源字符串 
     306      * @param separator 
     307      *            分隔符 
     308      * @param repeat 
     309      *            重复次数 
     310      * @return String 
     311      */  
     312     public static String repeat(String str, String separator, int repeat) {  
     313         if (str == null || separator == null) {  
     314             return repeat(str, repeat);  
     315         } else {  
     316             // given that repeat(String, int) is quite optimized, better to rely  
     317             // on it than try and splice this into it  
     318             String result = repeat(str + separator, repeat);  
     319             return removeEnd(result, separator);  
     320         }  
     321     }  
     322    
     323     /** 
     324      * <p> 
     325      * 将某个字符重复N次. 
     326      * </p> 
     327      * 
     328      * @param ch 
     329      *            某个字符 
     330      * @param repeat 
     331      *            重复次数 
     332      * @return String 
     333      */  
     334     public static String repeat(char ch, int repeat) {  
     335         char[] buf = new char[repeat];  
     336         for (int i = repeat - 1; i >= 0; i--) {  
     337             buf[i] = ch;  
     338         }  
     339         return new String(buf);  
     340     }  
     341    
     342     /** 
     343      * <p> 
     344      * 字符串长度达不到指定长度时,在字符串右边补指定的字符. 
     345      * </p> 
     346      *  
     347      * <pre> 
     348      * StringUtil.rightPad(null, *, *)     = null 
     349      * StringUtil.rightPad("", 3, 'z')     = "zzz" 
     350      * StringUtil.rightPad("bat", 3, 'z')  = "bat" 
     351      * StringUtil.rightPad("bat", 5, 'z')  = "batzz" 
     352      * StringUtil.rightPad("bat", 1, 'z')  = "bat" 
     353      * StringUtil.rightPad("bat", -1, 'z') = "bat" 
     354      * </pre> 
     355      * 
     356      * @param str 
     357      *            源字符串 
     358      * @param size 
     359      *            指定的长度 
     360      * @param padChar 
     361      *            进行补充的字符 
     362      * @return String 
     363      */  
     364     public static String rightPad(String str, int size, char padChar) {  
     365         if (str == null) {  
     366             return null;  
     367         }  
     368         int pads = size - str.length();  
     369         if (pads <= 0) {  
     370             return str; // returns original String when possible  
     371         }  
     372         if (pads > PAD_LIMIT) {  
     373             return rightPad(str, size, String.valueOf(padChar));  
     374         }  
     375         return str.concat(repeat(padChar, pads));  
     376     }  
     377    
     378     /** 
     379      * <p> 
     380      * 扩大字符串长度,从左边补充指定字符 
     381      * </p> 
     382      *  
     383      * <pre> 
     384      * StringUtil.rightPad(null, *, *)      = null 
     385      * StringUtil.rightPad("", 3, "z")      = "zzz" 
     386      * StringUtil.rightPad("bat", 3, "yz")  = "bat" 
     387      * StringUtil.rightPad("bat", 5, "yz")  = "batyz" 
     388      * StringUtil.rightPad("bat", 8, "yz")  = "batyzyzy" 
     389      * StringUtil.rightPad("bat", 1, "yz")  = "bat" 
     390      * StringUtil.rightPad("bat", -1, "yz") = "bat" 
     391      * StringUtil.rightPad("bat", 5, null)  = "bat  " 
     392      * StringUtil.rightPad("bat", 5, "")    = "bat  " 
     393      * </pre> 
     394      * 
     395      * @param str 
     396      *            源字符串 
     397      * @param size 
     398      *            扩大后的长度 
     399      * @param padStr 
     400      *            在右边补充的字符串 
     401      * @return String 
     402      */  
     403     public static String rightPad(String str, int size, String padStr) {  
     404         if (str == null) {  
     405             return null;  
     406         }  
     407         if (isEmpty(padStr)) {  
     408             padStr = " ";  
     409         }  
     410         int padLen = padStr.length();  
     411         int strLen = str.length();  
     412         int pads = size - strLen;  
     413         if (pads <= 0) {  
     414             return str; // returns original String when possible  
     415         }  
     416         if (padLen == 1 && pads <= PAD_LIMIT) {  
     417             return rightPad(str, size, padStr.charAt(0));  
     418         }  
     419    
     420         if (pads == padLen) {  
     421             return str.concat(padStr);  
     422         } else if (pads < padLen) {  
     423             return str.concat(padStr.substring(0, pads));  
     424         } else {  
     425             char[] padding = new char[pads];  
     426             char[] padChars = padStr.toCharArray();  
     427             for (int i = 0; i < pads; i++) {  
     428                 padding[i] = padChars[i % padLen];  
     429             }  
     430             return str.concat(new String(padding));  
     431         }  
     432     }  
     433    
     434     /** 
     435      * <p> 
     436      * 扩大字符串长度,从左边补充空格 
     437      * </p> 
     438      * 
     439      * <pre> 
     440      * StringUtil.leftPad(null, *)   = null 
     441      * StringUtil.leftPad("", 3)     = "   " 
     442      * StringUtil.leftPad("bat", 3)  = "bat" 
     443      * StringUtil.leftPad("bat", 5)  = "  bat" 
     444      * StringUtil.leftPad("bat", 1)  = "bat" 
     445      * StringUtil.leftPad("bat", -1) = "bat" 
     446      * </pre> 
     447      * 
     448      * @param str 
     449      *            源字符串 
     450      * @param size 
     451      *            扩大后的长度 
     452      * @return String 
     453      */  
     454     public static String leftPad(String str, int size) {  
     455         return leftPad(str, size, ' ');  
     456     }  
     457    
     458     /** 
     459      * <p> 
     460      * 扩大字符串长度,从左边补充指定的字符 
     461      * </p> 
     462      * 
     463      * <pre> 
     464      * StringUtil.leftPad(null, *, *)     = null 
     465      * StringUtil.leftPad("", 3, 'z')     = "zzz" 
     466      * StringUtil.leftPad("bat", 3, 'z')  = "bat" 
     467      * StringUtil.leftPad("bat", 5, 'z')  = "zzbat" 
     468      * StringUtil.leftPad("bat", 1, 'z')  = "bat" 
     469      * StringUtil.leftPad("bat", -1, 'z') = "bat" 
     470      * </pre> 
     471      * 
     472      * @param str 
     473      *            源字符串 
     474      * @param size 
     475      *            扩大后的长度 
     476      * @param padStr 
     477      *            补充的字符 
     478      * @return String 
     479      */  
     480     public static String leftPad(String str, int size, char padChar) {  
     481         if (str == null) {  
     482             return null;  
     483         }  
     484         int pads = size - str.length();  
     485         if (pads <= 0) {  
     486             return str; // returns original String when possible  
     487         }  
     488         if (pads > PAD_LIMIT) {  
     489             return leftPad(str, size, String.valueOf(padChar));  
     490         }  
     491         return repeat(padChar, pads).concat(str);  
     492     }  
     493    
     494     /** 
     495      * <p> 
     496      * 扩大字符串长度,从左边补充指定的字符 
     497      * </p> 
     498      *  
     499      * <pre> 
     500      * StringUtil.leftPad(null, *, *)      = null 
     501      * StringUtil.leftPad("", 3, "z")      = "zzz" 
     502      * StringUtil.leftPad("bat", 3, "yz")  = "bat" 
     503      * StringUtil.leftPad("bat", 5, "yz")  = "yzbat" 
     504      * StringUtil.leftPad("bat", 8, "yz")  = "yzyzybat" 
     505      * StringUtil.leftPad("bat", 1, "yz")  = "bat" 
     506      * StringUtil.leftPad("bat", -1, "yz") = "bat" 
     507      * StringUtil.leftPad("bat", 5, null)  = "  bat" 
     508      * StringUtil.leftPad("bat", 5, "")    = "  bat" 
     509      * </pre> 
     510      * 
     511      * @param str 
     512      *            源字符串 
     513      * @param size 
     514      *            扩大后的长度 
     515      * @param padStr 
     516      *            补充的字符串 
     517      * @return String 
     518      */  
     519     public static String leftPad(String str, int size, String padStr) {  
     520         if (str == null) {  
     521             return null;  
     522         }  
     523         if (isEmpty(padStr)) {  
     524             padStr = " ";  
     525         }  
     526         int padLen = padStr.length();  
     527         int strLen = str.length();  
     528         int pads = size - strLen;  
     529         if (pads <= 0) {  
     530             return str; // returns original String when possible  
     531         }  
     532         if (padLen == 1 && pads <= PAD_LIMIT) {  
     533             return leftPad(str, size, padStr.charAt(0));  
     534         }  
     535    
     536         if (pads == padLen) {  
     537             return padStr.concat(str);  
     538         } else if (pads < padLen) {  
     539             return padStr.substring(0, pads).concat(str);  
     540         } else {  
     541             char[] padding = new char[pads];  
     542             char[] padChars = padStr.toCharArray();  
     543             for (int i = 0; i < pads; i++) {  
     544                 padding[i] = padChars[i % padLen];  
     545             }  
     546             return new String(padding).concat(str);  
     547         }  
     548     }  
     549    
     550     /** 
     551      * <p> 
     552      * 扩大字符串长度并将现在的字符串居中,被扩大部分用空格填充。 
     553      * <p> 
     554      *  
     555      * <pre> 
     556      * StringUtil.center(null, *)   = null 
     557      * StringUtil.center("", 4)     = "    " 
     558      * StringUtil.center("ab", -1)  = "ab" 
     559      * StringUtil.center("ab", 4)   = " ab " 
     560      * StringUtil.center("abcd", 2) = "abcd" 
     561      * StringUtil.center("a", 4)    = " a  " 
     562      * </pre> 
     563      * 
     564      * @param str 
     565      *            源字符串 
     566      * @param size 
     567      *            扩大后的长度 
     568      * @return String 
     569      */  
     570     public static String center(String str, int size) {  
     571         return center(str, size, ' ');  
     572     }  
     573    
     574     /** 
     575      * <p> 
     576      * 将字符串长度修改为指定长度,并进行居中显示。 
     577      * </p> 
     578      * 
     579      * <pre> 
     580      * StringUtil.center(null, *, *)     = null 
     581      * StringUtil.center("", 4, ' ')     = "    " 
     582      * StringUtil.center("ab", -1, ' ')  = "ab" 
     583      * StringUtil.center("ab", 4, ' ')   = " ab" 
     584      * StringUtil.center("abcd", 2, ' ') = "abcd" 
     585      * StringUtil.center("a", 4, ' ')    = " a  " 
     586      * StringUtil.center("a", 4, 'y')    = "yayy" 
     587      * </pre> 
     588      * 
     589      * @param str 
     590      *            源字符串 
     591      * @param size 
     592      *            指定的长度 
     593      * @param padStr 
     594      *            长度不够时补充的字符串 
     595      * @return String 
     596      * @throws IllegalArgumentException 
     597      *             如果被补充字符串为 null或者 empty 
     598      */  
     599     public static String center(String str, int size, char padChar) {  
     600         if (str == null || size <= 0) {  
     601             return str;  
     602         }  
     603         int strLen = str.length();  
     604         int pads = size - strLen;  
     605         if (pads <= 0) {  
     606             return str;  
     607         }  
     608         str = leftPad(str, strLen + pads / 2, padChar);  
     609         str = rightPad(str, size, padChar);  
     610         return str;  
     611     }  
     612    
     613     /** 
     614      * <p> 
     615      * 将字符串长度修改为指定长度,并进行居中显示。 
     616      * </p> 
     617      * 
     618      * <pre> 
     619      * StringUtil.center(null, *, *)     = null 
     620      * StringUtil.center("", 4, " ")     = "    " 
     621      * StringUtil.center("ab", -1, " ")  = "ab" 
     622      * StringUtil.center("ab", 4, " ")   = " ab" 
     623      * StringUtil.center("abcd", 2, " ") = "abcd" 
     624      * StringUtil.center("a", 4, " ")    = " a  " 
     625      * StringUtil.center("a", 4, "yz")   = "yayz" 
     626      * StringUtil.center("abc", 7, null) = "  abc  " 
     627      * StringUtil.center("abc", 7, "")   = "  abc  " 
     628      * </pre> 
     629      * 
     630      * @param str 
     631      *            源字符串 
     632      * @param size 
     633      *            指定的长度 
     634      * @param padStr 
     635      *            长度不够时补充的字符串 
     636      * @return String 
     637      * @throws IllegalArgumentException 
     638      *             如果被补充字符串为 null或者 empty 
     639      */  
     640     public static String center(String str, int size, String padStr) {  
     641         if (str == null || size <= 0) {  
     642             return str;  
     643         }  
     644         if (isEmpty(padStr)) {  
     645             padStr = " ";  
     646         }  
     647         int strLen = str.length();  
     648         int pads = size - strLen;  
     649         if (pads <= 0) {  
     650             return str;  
     651         }  
     652         str = leftPad(str, strLen + pads / 2, padStr);  
     653         str = rightPad(str, size, padStr);  
     654         return str;  
     655     }  
     656    
     657     /** 
     658      * <p> 
     659      * 检查字符串是否全部为小写. 
     660      * </p> 
     661      *  
     662      * <pre> 
     663      * StringUtil.isAllLowerCase(null)   = false 
     664      * StringUtil.isAllLowerCase("")     = false 
     665      * StringUtil.isAllLowerCase("  ")   = false 
     666      * StringUtil.isAllLowerCase("abc")  = true 
     667      * StringUtil.isAllLowerCase("abC") = false 
     668      * </pre> 
     669      * 
     670      * @param cs 
     671      *            源字符串 
     672      * @return String 
     673      */  
     674     public static boolean isAllLowerCase(String cs) {  
     675         if (cs == null || isEmpty(cs)) {  
     676             return false;  
     677         }  
     678         int sz = cs.length();  
     679         for (int i = 0; i < sz; i++) {  
     680             if (Character.isLowerCase(cs.charAt(i)) == false) {  
     681                 return false;  
     682             }  
     683         }  
     684         return true;  
     685     }  
     686    
     687     /** 
     688      * <p> 
     689      * 检查是否都是大写. 
     690      * </p> 
     691      *  
     692      * <pre> 
     693      * StringUtil.isAllUpperCase(null)   = false 
     694      * StringUtil.isAllUpperCase("")     = false 
     695      * StringUtil.isAllUpperCase("  ")   = false 
     696      * StringUtil.isAllUpperCase("ABC")  = true 
     697      * StringUtil.isAllUpperCase("aBC") = false 
     698      * </pre> 
     699      * 
     700      * @param cs 
     701      *            源字符串 
     702      * @return String 
     703      */  
     704     public static boolean isAllUpperCase(String cs) {  
     705         if (cs == null || StringUtil.isEmpty(cs)) {  
     706             return false;  
     707         }  
     708         int sz = cs.length();  
     709         for (int i = 0; i < sz; i++) {  
     710             if (Character.isUpperCase(cs.charAt(i)) == false) {  
     711                 return false;  
     712             }  
     713         }  
     714         return true;  
     715     }  
     716    
     717     /** 
     718      * <p> 
     719      * 反转字符串. 
     720      * </p> 
     721      *  
     722      * <pre> 
     723      * StringUtil.reverse(null)  = null 
     724      * StringUtil.reverse("")    = "" 
     725      * StringUtil.reverse("bat") = "tab" 
     726      * </pre> 
     727      * 
     728      * @param str 
     729      *            源字符串 
     730      * @return String 
     731      */  
     732     public static String reverse(String str) {  
     733         if (str == null) {  
     734             return null;  
     735         }  
     736         return new StringBuilder(str).reverse().toString();  
     737     }  
     738    
     739     /** 
     740      * <p> 
     741      * 字符串达不到一定长度时在右边补空白. 
     742      * </p> 
     743      *  
     744      * <pre> 
     745      * StringUtil.rightPad(null, *)   = null 
     746      * StringUtil.rightPad("", 3)     = "   " 
     747      * StringUtil.rightPad("bat", 3)  = "bat" 
     748      * StringUtil.rightPad("bat", 5)  = "bat  " 
     749      * StringUtil.rightPad("bat", 1)  = "bat" 
     750      * StringUtil.rightPad("bat", -1) = "bat" 
     751      * </pre> 
     752      * 
     753      * @param str 
     754      *            源字符串 
     755      * @param size 
     756      *            指定的长度 
     757      * @return String 
     758      */  
     759     public static String rightPad(String str, int size) {  
     760         return rightPad(str, size, ' ');  
     761     }  
     762    
     763     /** 
     764      * 从右边截取字符串.</p> 
     765      *  
     766      * <pre> 
     767      * StringUtil.right(null, *)    = null 
     768      * StringUtil.right(*, -ve)     = "" 
     769      * StringUtil.right("", *)      = "" 
     770      * StringUtil.right("abc", 0)   = "" 
     771      * StringUtil.right("abc", 2)   = "bc" 
     772      * StringUtil.right("abc", 4)   = "abc" 
     773      * </pre> 
     774      *  
     775      * @param str 
     776      *            源字符串 
     777      * @param len 
     778      *            长度 
     779      * @return String 
     780      */  
     781     public static String right(String str, int len) {  
     782         if (str == null) {  
     783             return null;  
     784         }  
     785         if (len < 0) {  
     786             return EMPTY;  
     787         }  
     788         if (str.length() <= len) {  
     789             return str;  
     790         }  
     791         return str.substring(str.length() - len);  
     792     }  
     793    
     794     /** 
     795      * <p> 
     796      * 截取一个字符串的前几个. 
     797      * </p> 
     798      *  
     799      * <pre> 
     800      * StringUtil.left(null, *)    = null 
     801      * StringUtil.left(*, -ve)     = "" 
     802      * StringUtil.left("", *)      = "" 
     803      * StringUtil.left("abc", 0)   = "" 
     804      * StringUtil.left("abc", 2)   = "ab" 
     805      * StringUtil.left("abc", 4)   = "abc" 
     806      * </pre> 
     807      *  
     808      * @param str 
     809      *            源字符串 
     810      * @param len 
     811      *            截取的长度 
     812      * @return the String 
     813      */  
     814     public static String left(String str, int len) {  
     815         if (str == null) {  
     816             return null;  
     817         }  
     818         if (len < 0) {  
     819             return EMPTY;  
     820         }  
     821         if (str.length() <= len) {  
     822             return str;  
     823         }  
     824         return str.substring(0, len);  
     825     }  
     826    
     827     /** 
     828      * <p> 
     829      * 得到tag字符串中间的子字符串,只返回第一个匹配项。 
     830      * </p> 
     831      *  
     832      * <pre> 
     833      * StringUtil.substringBetween(null, *)            = null 
     834      * StringUtil.substringBetween("", "")             = "" 
     835      * StringUtil.substringBetween("", "tag")          = null 
     836      * StringUtil.substringBetween("tagabctag", null)  = null 
     837      * StringUtil.substringBetween("tagabctag", "")    = "" 
     838      * StringUtil.substringBetween("tagabctag", "tag") = "abc" 
     839      * </pre> 
     840      *  
     841      * @param str 
     842      *            源字符串。 
     843      * @param tag 
     844      *            标识字符串。 
     845      * @return String 子字符串, 如果没有符合要求的,返回{@code null}。 
     846      */  
     847     public static String substringBetween(String str, String tag) {  
     848         return substringBetween(str, tag, tag);  
     849     }  
     850    
     851     /** 
     852      * <p> 
     853      * 得到两个字符串中间的子字符串,只返回第一个匹配项。 
     854      * </p> 
     855      *  
     856      * <pre> 
     857      * StringUtil.substringBetween("wx[b]yz", "[", "]") = "b" 
     858      * StringUtil.substringBetween(null, *, *)          = null 
     859      * StringUtil.substringBetween(*, null, *)          = null 
     860      * StringUtil.substringBetween(*, *, null)          = null 
     861      * StringUtil.substringBetween("", "", "")          = "" 
     862      * StringUtil.substringBetween("", "", "]")         = null 
     863      * StringUtil.substringBetween("", "[", "]")        = null 
     864      * StringUtil.substringBetween("yabcz", "", "")     = "" 
     865      * StringUtil.substringBetween("yabcz", "y", "z")   = "abc" 
     866      * StringUtil.substringBetween("yabczyabcz", "y", "z")   = "abc" 
     867      * </pre> 
     868      *  
     869      * @param str 
     870      *            源字符串 
     871      * @param open 
     872      *            起字符串。 
     873      * @param close 
     874      *            末字符串。 
     875      * @return String 子字符串, 如果没有符合要求的,返回{@code null}。 
     876      */  
     877     public static String substringBetween(String str, String open, String close) {  
     878         if (str == null || open == null || close == null) {  
     879             return null;  
     880         }  
     881         int start = str.indexOf(open);  
     882         if (start != INDEX_NOT_FOUND) {  
     883             int end = str.indexOf(close, start + open.length());  
     884             if (end != INDEX_NOT_FOUND) {  
     885                 return str.substring(start + open.length(), end);  
     886             }  
     887         }  
     888         return null;  
     889     }  
     890    
     891     /** 
     892      * <p> 
     893      * 得到两个字符串中间的子字符串,所有匹配项组合为数组并返回。 
     894      * </p> 
     895      *  
     896      * <pre> 
     897      * StringUtil.substringsBetween("[a][b][c]", "[", "]") = ["a","b","c"] 
     898      * StringUtil.substringsBetween(null, *, *)            = null 
     899      * StringUtil.substringsBetween(*, null, *)            = null 
     900      * StringUtil.substringsBetween(*, *, null)            = null 
     901      * StringUtil.substringsBetween("", "[", "]")          = [] 
     902      * </pre> 
     903      * 
     904      * @param str 
     905      *            源字符串 
     906      * @param open 
     907      *            起字符串。 
     908      * @param close 
     909      *            末字符串。 
     910      * @return String 子字符串数组, 如果没有符合要求的,返回{@code null}。 
     911      */  
     912     public static String[] substringsBetween(String str, String open,  
     913             String close) {  
     914         if (str == null || isEmpty(open) || isEmpty(close)) {  
     915             return null;  
     916         }  
     917         int strLen = str.length();  
     918         if (strLen == 0) {  
     919             return new String[0];  
     920         }  
     921         int closeLen = close.length();  
     922         int openLen = open.length();  
     923         List<String> list = new ArrayList<String>();  
     924         int pos = 0;  
     925         while (pos < strLen - closeLen) {  
     926             int start = str.indexOf(open, pos);  
     927             if (start < 0) {  
     928                 break;  
     929             }  
     930             start += openLen;  
     931             int end = str.indexOf(close, start);  
     932             if (end < 0) {  
     933                 break;  
     934             }  
     935             list.add(str.substring(start, end));  
     936             pos = end + closeLen;  
     937         }  
     938         if (list.isEmpty()) {  
     939             return null;  
     940         }  
     941         return list.toArray(new String[list.size()]);  
     942     }  
     943    
     944     /** 
     945      * 功能:切换字符串中的所有字母大小写。<br/> 
     946      *  
     947      * <pre> 
     948      * StringUtil.swapCase(null)                 = null 
     949      * StringUtil.swapCase("")                   = "" 
     950      * StringUtil.swapCase("The dog has a BONE") = "tHE DOG HAS A bone" 
     951      * </pre> 
     952      *  
     953      * 
     954      * @param str 
     955      *            源字符串 
     956      * @return String 
     957      */  
     958     public static String swapCase(String str) {  
     959         if (StringUtil.isEmpty(str)) {  
     960             return str;  
     961         }  
     962         char[] buffer = str.toCharArray();  
     963    
     964         boolean whitespace = true;  
     965    
     966         for (int i = 0; i < buffer.length; i++) {  
     967             char ch = buffer[i];  
     968             if (Character.isUpperCase(ch)) {  
     969                 buffer[i] = Character.toLowerCase(ch);  
     970                 whitespace = false;  
     971             } else if (Character.isTitleCase(ch)) {  
     972                 buffer[i] = Character.toLowerCase(ch);  
     973                 whitespace = false;  
     974             } else if (Character.isLowerCase(ch)) {  
     975                 if (whitespace) {  
     976                     buffer[i] = Character.toTitleCase(ch);  
     977                     whitespace = false;  
     978                 } else {  
     979                     buffer[i] = Character.toUpperCase(ch);  
     980                 }  
     981             } else {  
     982                 whitespace = Character.isWhitespace(ch);  
     983             }  
     984         }  
     985         return new String(buffer);  
     986     }  
     987    
     988     /** 
     989      * 功能:截取出最后一个标志位之后的字符串.<br/> 
     990      * 如果sourceStr为empty或者expr为null,直接返回源字符串。<br/> 
     991      * 如果expr长度为0,直接返回sourceStr。<br/> 
     992      * 如果expr在sourceStr中不存在,直接返回sourceStr。<br/> 
     993      *  
     994      * @author 宋立君 
     995      * @date 2014年06月24日 
     996      * @param sourceStr 
     997      *            被截取的字符串 
     998      * @param expr 
     999      *            分隔符 
    1000      * @return String 
    1001      */  
    1002     public static String substringAfterLast(String sourceStr, String expr) {  
    1003         if (isEmpty(sourceStr) || expr == null) {  
    1004             return sourceStr;  
    1005         }  
    1006         if (expr.length() == 0) {  
    1007             return sourceStr;  
    1008         }  
    1009    
    1010         int pos = sourceStr.lastIndexOf(expr);  
    1011         if (pos == -1) {  
    1012             return sourceStr;  
    1013         }  
    1014         return sourceStr.substring(pos + expr.length());  
    1015     }  
    1016    
    1017     /** 
    1018      * 功能:截取出最后一个标志位之前的字符串.<br/> 
    1019      * 如果sourceStr为empty或者expr为null,直接返回源字符串。<br/> 
    1020      * 如果expr长度为0,直接返回sourceStr。<br/> 
    1021      * 如果expr在sourceStr中不存在,直接返回sourceStr。<br/> 
    1022      *  
    1023      * @author 宋立君 
    1024      * @date 2014年06月24日 
    1025      * @param sourceStr 
    1026      *            被截取的字符串 
    1027      * @param expr 
    1028      *            分隔符 
    1029      * @return String 
    1030      */  
    1031     public static String substringBeforeLast(String sourceStr, String expr) {  
    1032         if (isEmpty(sourceStr) || expr == null) {  
    1033             return sourceStr;  
    1034         }  
    1035         if (expr.length() == 0) {  
    1036             return sourceStr;  
    1037         }  
    1038         int pos = sourceStr.lastIndexOf(expr);  
    1039         if (pos == -1) {  
    1040             return sourceStr;  
    1041         }  
    1042         return sourceStr.substring(0, pos);  
    1043     }  
    1044    
    1045     /** 
    1046      * 功能:截取出第一个标志位之后的字符串.<br/> 
    1047      * 如果sourceStr为empty或者expr为null,直接返回源字符串。<br/> 
    1048      * 如果expr长度为0,直接返回sourceStr。<br/> 
    1049      * 如果expr在sourceStr中不存在,直接返回sourceStr。<br/> 
    1050      *  
    1051      * @author 宋立君 
    1052      * @date 2014年06月24日 
    1053      * @param sourceStr 
    1054      *            被截取的字符串 
    1055      * @param expr 
    1056      *            分隔符 
    1057      * @return String 
    1058      */  
    1059     public static String substringAfter(String sourceStr, String expr) {  
    1060         if (isEmpty(sourceStr) || expr == null) {  
    1061             return sourceStr;  
    1062         }  
    1063         if (expr.length() == 0) {  
    1064             return sourceStr;  
    1065         }  
    1066    
    1067         int pos = sourceStr.indexOf(expr);  
    1068         if (pos == -1) {  
    1069             return sourceStr;  
    1070         }  
    1071         return sourceStr.substring(pos + expr.length());  
    1072     }  
    1073    
    1074     /** 
    1075      * 功能:截取出第一个标志位之前的字符串.<br/> 
    1076      * 如果sourceStr为empty或者expr为null,直接返回源字符串。<br/> 
    1077      * 如果expr长度为0,直接返回sourceStr。<br/> 
    1078      * 如果expr在sourceStr中不存在,直接返回sourceStr。<br/> 
    1079      * 如果expr在sourceStr中存在不止一个,以第一个位置为准。 
    1080      *  
    1081      * @author 宋立君 
    1082      * @date 2014年06月24日 
    1083      * @param sourceStr 
    1084      *            被截取的字符串 
    1085      * @param expr 
    1086      *            分隔符 
    1087      * @return String 
    1088      */  
    1089     public static String substringBefore(String sourceStr, String expr) {  
    1090         if (isEmpty(sourceStr) || expr == null) {  
    1091             return sourceStr;  
    1092         }  
    1093         if (expr.length() == 0) {  
    1094             return sourceStr;  
    1095         }  
    1096         int pos = sourceStr.indexOf(expr);  
    1097         if (pos == -1) {  
    1098             return sourceStr;  
    1099         }  
    1100         return sourceStr.substring(0, pos);  
    1101     }  
    1102    
    1103     /** 
    1104      * 功能:检查这个字符串是不是空字符串。<br/> 
    1105      * 如果这个字符串为null或者trim后为空字符串则返回true,否则返回false。 
    1106      *  
    1107      * @author 宋立君 
    1108      * @date 2014年06月24日 
    1109      * @param chkStr 
    1110      *            被检查的字符串 
    1111      * @return boolean 
    1112      */  
    1113     public static boolean isEmpty(String chkStr) {  
    1114         if (chkStr == null) {  
    1115             return true;  
    1116         } else {  
    1117             return "".equals(chkStr.trim()) ? true : false;  
    1118         }  
    1119     }  
    1120    
    1121     /** 
    1122      * 如果字符串没有超过最长显示长度返回原字符串,否则从开头截取指定长度并加...返回。 
    1123      *  
    1124      * @param str 
    1125      *            原字符串 
    1126      * @param length 
    1127      *            字符串最长显示的长度 
    1128      * @return 转换后的字符串 
    1129      */  
    1130     public static String trimString(String str, int length) {  
    1131         if (str == null) {  
    1132             return "";  
    1133         } else if (str.length() > length) {  
    1134             return str.substring(0, length - 3) + "...";  
    1135         } else {  
    1136             return str;  
    1137         }  
    1138     }  
    1139    
    1140 }  

    二、MD5

      1 package com.mkyong.common;  
      2   
      3 import java.io.File;  
      4 import java.io.FileInputStream;  
      5 import java.io.IOException;  
      6 import java.nio.MappedByteBuffer;  
      7 import java.nio.channels.FileChannel;  
      8 import java.security.MessageDigest;  
      9 import java.security.NoSuchAlgorithmException;  
     10   
     11 /** 
     12  *  
     13  * String工具类. <br> 
     14  *  
     15  * @author 宋立君 
     16  * @date 2014年06月24日 
     17  */  
     18 public class MD5Util {  
     19   
     20     protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6',  
     21             '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };  
     22   
     23     protected static MessageDigest messagedigest = null;  
     24   
     25     static {  
     26         try {  
     27             messagedigest = MessageDigest.getInstance("MD5");  
     28         } catch (NoSuchAlgorithmException nsaex) {  
     29             System.err.println(MD5Util.class.getName()  
     30                     + "初始化失败,MessageDigest不支持MD5Util。");  
     31             nsaex.printStackTrace();  
     32         }  
     33     }  
     34   
     35     /** 
     36      * 功能:加盐版的MD5.返回格式为MD5(密码+{盐值}) 
     37      *  
     38      * @author 宋立君 
     39      * @date 2014年06月24日 
     40      * @param password 
     41      *            密码 
     42      * @param salt 
     43      *            盐值 
     44      * @return String 
     45      */  
     46     public static String getMD5StringWithSalt(String password, String salt) {  
     47         if (password == null) {  
     48             throw new IllegalArgumentException("password不能为null");  
     49         }  
     50         if (StringUtil.isEmpty(salt)) {  
     51             throw new IllegalArgumentException("salt不能为空");  
     52         }  
     53         if ((salt.toString().lastIndexOf("{") != -1)  
     54                 || (salt.toString().lastIndexOf("}") != -1)) {  
     55             throw new IllegalArgumentException("salt中不能包含 { 或者 }");  
     56         }  
     57         return getMD5String(password + "{" + salt.toString() + "}");  
     58     }  
     59   
     60     /** 
     61      * 功能:得到文件的md5值。 
     62      *  
     63      * @author 宋立君 
     64      * @date 2014年06月24日 
     65      * @param file 
     66      *            文件。 
     67      * @return String 
     68      * @throws IOException 
     69      *             读取文件IO异常时。 
     70      */  
     71     public static String getFileMD5String(File file) throws IOException {  
     72         FileInputStream in = new FileInputStream(file);  
     73         FileChannel ch = in.getChannel();  
     74         MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0,  
     75                 file.length());  
     76         messagedigest.update(byteBuffer);  
     77         return bufferToHex(messagedigest.digest());  
     78     }  
     79   
     80     /** 
     81      * 功能:得到一个字符串的MD5值。 
     82      *  
     83      * @author 宋立君 
     84      * @date 2014年06月24日 
     85      * @param str 
     86      *            字符串 
     87      * @return String 
     88      */  
     89     public static String getMD5String(String str) {  
     90         return getMD5String(str.getBytes());  
     91     }  
     92   
     93     private static String getMD5String(byte[] bytes) {  
     94         messagedigest.update(bytes);  
     95         return bufferToHex(messagedigest.digest());  
     96     }  
     97   
     98     private static String bufferToHex(byte bytes[]) {  
     99         return bufferToHex(bytes, 0, bytes.length);  
    100     }  
    101   
    102     private static String bufferToHex(byte bytes[], int m, int n) {  
    103         StringBuffer stringbuffer = new StringBuffer(2 * n);  
    104         int k = m + n;  
    105         for (int l = m; l < k; l++) {  
    106             appendHexPair(bytes[l], stringbuffer);  
    107         }  
    108         return stringbuffer.toString();  
    109     }  
    110   
    111     private static void appendHexPair(byte bt, StringBuffer stringbuffer) {  
    112         char c0 = hexDigits[(bt & 0xf0) >> 4];  
    113         char c1 = hexDigits[bt & 0xf];  
    114         stringbuffer.append(c0);  
    115         stringbuffer.append(c1);  
    116     }  
    117 }  

    三、File工具类

      1 package com.mkyong.common;  
      2   
      3 import java.io.ByteArrayInputStream;  
      4 import java.io.File;  
      5 import java.io.FileInputStream;  
      6 import java.io.FileOutputStream;  
      7 import java.io.IOException;  
      8 import java.io.InputStream;  
      9 import java.io.OutputStream;  
     10   
     11 /** 
     12  * 文件相关操作辅助类。 
     13  *  
     14  * @author 宋立君 
     15  * @date 2014年06月24日 
     16  */  
     17 public class FileUtil {  
     18     private static final String FOLDER_SEPARATOR = "/";  
     19     private static final char EXTENSION_SEPARATOR = '.';  
     20   
     21     /** 
     22      * 功能:复制文件或者文件夹。 
     23      *  
     24      * @author 宋立君 
     25      * @date 2014年06月24日 
     26      * @param inputFile 
     27      *            源文件 
     28      * @param outputFile 
     29      *            目的文件 
     30      * @param isOverWrite 
     31      *            是否覆盖(只针对文件) 
     32      * @throws IOException 
     33      */  
     34     public static void copy(File inputFile, File outputFile, boolean isOverWrite)  
     35             throws IOException {  
     36         if (!inputFile.exists()) {  
     37             throw new RuntimeException(inputFile.getPath() + "源目录不存在!");  
     38         }  
     39         copyPri(inputFile, outputFile, isOverWrite);  
     40     }  
     41   
     42     /** 
     43      * 功能:为copy 做递归使用。 
     44      *  
     45      * @author 宋立君 
     46      * @date 2014年06月24日 
     47      * @param inputFile 
     48      * @param outputFile 
     49      * @param isOverWrite 
     50      * @throws IOException 
     51      */  
     52     private static void copyPri(File inputFile, File outputFile,  
     53             boolean isOverWrite) throws IOException {  
     54         // 是个文件。  
     55         if (inputFile.isFile()) {  
     56             copySimpleFile(inputFile, outputFile, isOverWrite);  
     57         } else {  
     58             // 文件夹  
     59             if (!outputFile.exists()) {  
     60                 outputFile.mkdir();  
     61             }  
     62             // 循环子文件夹  
     63             for (File child : inputFile.listFiles()) {  
     64                 copy(child,  
     65                         new File(outputFile.getPath() + "/" + child.getName()),  
     66                         isOverWrite);  
     67             }  
     68         }  
     69     }  
     70   
     71     /** 
     72      * 功能:copy单个文件 
     73      *  
     74      * @author 宋立君 
     75      * @date 2014年06月24日 
     76      * @param inputFile 
     77      *            源文件 
     78      * @param outputFile 
     79      *            目标文件 
     80      * @param isOverWrite 
     81      *            是否允许覆盖 
     82      * @throws IOException 
     83      */  
     84     private static void copySimpleFile(File inputFile, File outputFile,  
     85             boolean isOverWrite) throws IOException {  
     86         // 目标文件已经存在  
     87         if (outputFile.exists()) {  
     88             if (isOverWrite) {  
     89                 if (!outputFile.delete()) {  
     90                     throw new RuntimeException(outputFile.getPath() + "无法覆盖!");  
     91                 }  
     92             } else {  
     93                 // 不允许覆盖  
     94                 return;  
     95             }  
     96         }  
     97         InputStream in = new FileInputStream(inputFile);  
     98         OutputStream out = new FileOutputStream(outputFile);  
     99         byte[] buffer = new byte[1024];  
    100         int read = 0;  
    101         while ((read = in.read(buffer)) != -1) {  
    102             out.write(buffer, 0, read);  
    103         }  
    104         in.close();  
    105         out.close();  
    106     }  
    107   
    108     /** 
    109      * 功能:删除文件 
    110      *  
    111      * @author 宋立君 
    112      * @date 2014年06月24日 
    113      * @param file 
    114      *            文件 
    115      */  
    116     public static void delete(File file) {  
    117         deleteFile(file);  
    118     }  
    119   
    120     /** 
    121      * 功能:删除文件,内部递归使用 
    122      *  
    123      * @author 宋立君 
    124      * @date 2014年06月24日 
    125      * @param file 
    126      *            文件 
    127      * @return boolean true 删除成功,false 删除失败。 
    128      */  
    129     private static void deleteFile(File file) {  
    130         if (file == null || !file.exists()) {  
    131             return;  
    132         }  
    133         // 单文件  
    134         if (!file.isDirectory()) {  
    135             boolean delFlag = file.delete();  
    136             if (!delFlag) {  
    137                 throw new RuntimeException(file.getPath() + "删除失败!");  
    138             } else {  
    139                 return;  
    140             }  
    141         }  
    142         // 删除子目录  
    143         for (File child : file.listFiles()) {  
    144             deleteFile(child);  
    145         }  
    146         // 删除自己  
    147         file.delete();  
    148     }  
    149   
    150     /** 
    151      * 从文件路径中抽取文件的扩展名, 例如. "mypath/myfile.txt" -> "txt". * @author 宋立君 
    152      *  
    153      * @date 2014年06月24日 
    154      * @param 文件路径 
    155      * @return 如果path为null,直接返回null。 
    156      */  
    157     public static String getFilenameExtension(String path) {  
    158         if (path == null) {  
    159             return null;  
    160         }  
    161         int extIndex = path.lastIndexOf(EXTENSION_SEPARATOR);  
    162         if (extIndex == -1) {  
    163             return null;  
    164         }  
    165         int folderIndex = path.lastIndexOf(FOLDER_SEPARATOR);  
    166         if (folderIndex > extIndex) {  
    167             return null;  
    168         }  
    169         return path.substring(extIndex + 1);  
    170     }  
    171   
    172     /** 
    173      * 从文件路径中抽取文件名, 例如: "mypath/myfile.txt" -> "myfile.txt"。 * @author 宋立君 
    174      *  
    175      * @date 2014年06月24日 
    176      * @param path 
    177      *            文件路径。 
    178      * @return 抽取出来的文件名, 如果path为null,直接返回null。 
    179      */  
    180     public static String getFilename(String path) {  
    181         if (path == null) {  
    182             return null;  
    183         }  
    184         int separatorIndex = path.lastIndexOf(FOLDER_SEPARATOR);  
    185         return (separatorIndex != -1 ? path.substring(separatorIndex + 1)  
    186                 : path);  
    187     }  
    188   
    189     /** 
    190      * 功能:保存文件。 
    191      *  
    192      * @author 宋立君 
    193      * @date 2014年06月24日 
    194      * @param content 
    195      *            字节 
    196      * @param file 
    197      *            保存到的文件 
    198      * @throws IOException 
    199      */  
    200     public static void save(byte[] content, File file) throws IOException {  
    201         if (file == null) {  
    202             throw new RuntimeException("保存文件不能为空");  
    203         }  
    204         if (content == null) {  
    205             throw new RuntimeException("文件流不能为空");  
    206         }  
    207         InputStream is = new ByteArrayInputStream(content);  
    208         save(is, file);  
    209     }  
    210   
    211     /** 
    212      * 功能:保存文件 
    213      *  
    214      * @author 宋立君 
    215      * @date 2014年06月24日 
    216      * @param streamIn 
    217      *            文件流 
    218      * @param file 
    219      *            保存到的文件 
    220      * @throws IOException 
    221      */  
    222     public static void save(InputStream streamIn, File file) throws IOException {  
    223         if (file == null) {  
    224             throw new RuntimeException("保存文件不能为空");  
    225         }  
    226         if (streamIn == null) {  
    227             throw new RuntimeException("文件流不能为空");  
    228         }  
    229         // 输出流  
    230         OutputStream streamOut = null;  
    231         // 文件夹不存在就创建。  
    232         if (!file.getParentFile().exists()) {  
    233             file.getParentFile().mkdirs();  
    234         }  
    235         streamOut = new FileOutputStream(file);  
    236         int bytesRead = 0;  
    237         byte[] buffer = new byte[8192];  
    238         while ((bytesRead = streamIn.read(buffer, 0, 8192)) != -1) {  
    239             streamOut.write(buffer, 0, bytesRead);  
    240         }  
    241         streamOut.close();  
    242         streamIn.close();  
    243     }  
    244 }  
  • 相关阅读:
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    一手遮天 Android
    springcloud~feign POST form-url-encoded data
    java~和.net相通的DES-ECB加解密技术
    java的byte和C#的byte的不同之处
    spi~动态监控目录的jar实现热加载
    jboss( WildFly)上运行 springboot程序
    nc
  • 原文地址:https://www.cnblogs.com/jasonxcj/p/4925333.html
Copyright © 2011-2022 走看看