| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
jopen
9年前发布

Android获取手机中外置内存卡、内置内存卡、手机内存路径

获取手机中外置内存卡、内置内存卡、手机内存路径。思路是:先用 Environment.getExternalStorageDirectory()获得外部存储卡路径(某些机型也表现为内部存储卡路径),如没有获 取到有效sd卡插入,则使用安卓的配置文件system/etc/vold.fstab读取全部挂载信息,假如也没有可写入的sd卡,则使用 getFilesDir()方式获得当前应用所在存储路径。为适应不同手机的内存情况,先分三种情况获得可存储路径phonePicsPath,后面代码较长是因为有两个工具类,复制即可,代码如下:


//首先判断是否有外部存储卡,如没有判断是否有内部存储卡,如没有,继续读取应用程序所在存储    if(getExternalSdCardPath() != null){     phonePicsPath = getExternalSdCardPath();    }else{     phonePicsPath = getFilesDir().getAbsolutePath();    }


/**       * 遍历 "system/etc/vold.fstab” 文件,获取全部的Android的挂载点信息       *        * @return       */      private static ArrayList<String> getDevMountList() {          String[] toSearch = FileUtils.readFile("/system/etc/vold.fstab").split(" ");          ArrayList<String> out = new ArrayList<String>();          for (int i = 0; i < toSearch.length; i++) {              if (toSearch[i].contains("dev_mount")) {                  if (new File(toSearch[i + 2]).exists()) {                      out.add(toSearch[i + 2]);                  }              }          }          return out;      }  /**       * 获取扩展SD卡存储目录       *        * 如果有外接的SD卡,并且已挂载,则返回这个外置SD卡目录       * 否则:返回内置SD卡目录       *        * @return       */      public static String getExternalSdCardPath() {             if (SDCardUtils.isMounted()) {              File sdCardFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath());              return sdCardFile.getAbsolutePath();          }             String path = null;             File sdCardFile = null;             ArrayList<String> devMountList = getDevMountList();             for (String devMount : devMountList) {              File file = new File(devMount);                 if (file.isDirectory() && file.canWrite()) {                  path = file.getAbsolutePath();                     String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date());                  File testWritable = new File(path, "test_" + timeStamp);                     if (testWritable.mkdirs()) {                      testWritable.delete();                  } else {                      path = null;                  }              }          }             if (path != null) {              sdCardFile = new File(path);              return sdCardFile.getAbsolutePath();          }             return null;      }



FileUtils文件:



package com.zqsy.order.tools;    /***   * 文件工具类   * @author zhangda   *   */  import java.io.BufferedReader;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java.io.FileOutputStream;  import java.io.FileWriter;  import java.io.IOException;  import java.io.InputStream;  import java.io.InputStreamReader;  import java.io.OutputStream;  import java.util.ArrayList;  import java.util.List;    import android.text.TextUtils;    /**   * File Utils   * <ul>   * Read or write file   * <li>{@link #readFile(String)} read file</li>   * <li>{@link #readFileToList(String)} read file to string list</li>   * <li>{@link #writeFile(String, String, boolean)} write file from String</li>   * <li>{@link #writeFile(String, String)} write file from String</li>   * <li>{@link #writeFile(String, List, boolean)} write file from String List</li>   * <li>{@link #writeFile(String, List)} write file from String List</li>   * <li>{@link #writeFile(String, InputStream)} write file</li>   * <li>{@link #writeFile(String, InputStream, boolean)} write file</li>   * <li>{@link #writeFile(File, InputStream)} write file</li>   * <li>{@link #writeFile(File, InputStream, boolean)} write file</li>   * </ul>   * <ul>   * Operate file   * <li>{@link #moveFile(File, File)} or {@link #moveFile(String, String)}</li>   * <li>{@link #copyFile(String, String)}</li>   * <li>{@link #getFileExtension(String)}</li>   * <li>{@link #getFileName(String)}</li>   * <li>{@link #getFileNameWithoutExtension(String)}</li>   * <li>{@link #getFileSize(String)}</li>   * <li>{@link #deleteFile(String)}</li>   * <li>{@link #isFileExist(String)}</li>   * <li>{@link #isFolderExist(String)}</li>   * <li>{@link #makeFolders(String)}</li>   * <li>{@link #makeDirs(String)}</li>   * </ul>   *    * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2012-5-12   */  public class FileUtils {        public final static String FILE_EXTENSION_SEPARATOR = ".";        private FileUtils() {          throw new AssertionError();      }        /**       * read file       *        * @param filePath       * @param charsetName The name of a supported {@link java.nio.charset.Charset </code>charset<code>}       * @return if file not exist, return null, else return content of file       * @throws RuntimeException if an error occurs while operator BufferedReader       */      public static String readFile(String filePath) {       String fileContent = "";          File file = new File(filePath);          if (file == null || !file.isFile()) {              return null;          }            BufferedReader reader = null;          try {              InputStreamReader is = new InputStreamReader(new FileInputStream(file));              reader = new BufferedReader(is);              String line = null;              int i = 0;              while ((line = reader.readLine()) != null) {                  fileContent += line + " ";              }              reader.close();              return fileContent;          } catch (IOException e) {           e.printStackTrace();          } finally {              if (reader != null) {                  try {                      reader.close();                  } catch (IOException e) {                   e.printStackTrace();                  }              }          }          return fileContent;      }        /**       * write file       *        * @param filePath       * @param content       * @param append is append, if true, write to the end of file, else clear content of file and write into it       * @return return false if content is empty, true otherwise       * @throws RuntimeException if an error occurs while operator FileWriter       */      public static boolean writeFile(String filePath, String content, boolean append) {          if (StringUtils.isEmpty(content)) {              return false;          }            FileWriter fileWriter = null;          try {              makeDirs(filePath);              fileWriter = new FileWriter(filePath, append);              fileWriter.write(content);              fileWriter.close();              return true;          } catch (IOException e) {              throw new RuntimeException("IOException occurred. ", e);          } finally {              if (fileWriter != null) {                  try {                      fileWriter.close();                  } catch (IOException e) {                      throw new RuntimeException("IOException occurred. ", e);                  }              }          }      }        /**       * write file       *        * @param filePath       * @param contentList       * @param append is append, if true, write to the end of file, else clear content of file and write into it       * @return return false if contentList is empty, true otherwise       * @throws RuntimeException if an error occurs while operator FileWriter       */      public static boolean writeFile(String filePath, List<String> contentList, boolean append) {          if (contentList == null || contentList.size() == 0) {              return false;          }            FileWriter fileWriter = null;          try {              makeDirs(filePath);              fileWriter = new FileWriter(filePath, append);              int i = 0;              for (String line : contentList) {                  if (i++ > 0) {                      fileWriter.write("\r\n");                  }                  fileWriter.write(line);              }              fileWriter.close();              return true;          } catch (IOException e) {              throw new RuntimeException("IOException occurred. ", e);          } finally {              if (fileWriter != null) {                  try {                      fileWriter.close();                  } catch (IOException e) {                      throw new RuntimeException("IOException occurred. ", e);                  }              }          }      }        /**       * write file, the string will be written to the begin of the file       *        * @param filePath       * @param content       * @return       */      public static boolean writeFile(String filePath, String content) {          return writeFile(filePath, content, false);      }        /**       * write file, the string list will be written to the begin of the file       *        * @param filePath       * @param contentList       * @return       */      public static boolean writeFile(String filePath, List<String> contentList) {          return writeFile(filePath, contentList, false);      }        /**       * write file, the bytes will be written to the begin of the file       *        * @param filePath       * @param stream       * @return       * @see {@link #writeFile(String, InputStream, boolean)}       */      public static boolean writeFile(String filePath, InputStream stream) {          return writeFile(filePath, stream, false);      }        /**       * write file       *        * @param file the file to be opened for writing.       * @param stream the input stream       * @param append if <code>true</code>, then bytes will be written to the end of the file rather than the beginning       * @return return true       * @throws RuntimeException if an error occurs while operator FileOutputStream       */      public static boolean writeFile(String filePath, InputStream stream, boolean append) {          return writeFile(filePath != null ? new File(filePath) : null, stream, append);      }        /**       * write file, the bytes will be written to the begin of the file       *        * @param file       * @param stream       * @return       * @see {@link #writeFile(File, InputStream, boolean)}       */      public static boolean writeFile(File file, InputStream stream) {          return writeFile(file, stream, false);      }        /**       * write file       *        * @param file the file to be opened for writing.       * @param stream the input stream       * @param append if <code>true</code>, then bytes will be written to the end of the file rather than the beginning       * @return return true       * @throws RuntimeException if an error occurs while operator FileOutputStream       */      public static boolean writeFile(File file, InputStream stream, boolean append) {          OutputStream o = null;          try {              makeDirs(file.getAbsolutePath());              o = new FileOutputStream(file, append);              byte data[] = new byte[1024];              int length = -1;              while ((length = stream.read(data)) != -1) {                  o.write(data, 0, length);              }              o.flush();              return true;          } catch (FileNotFoundException e) {              throw new RuntimeException("FileNotFoundException occurred. ", e);          } catch (IOException e) {              throw new RuntimeException("IOException occurred. ", e);          } finally {              if (o != null) {                  try {                      o.close();                      stream.close();                  } catch (IOException e) {                      throw new RuntimeException("IOException occurred. ", e);                  }              }          }      }        /**       * move file       *        * @param sourceFilePath       * @param destFilePath       */      public static void moveFile(String sourceFilePath, String destFilePath) {          if (TextUtils.isEmpty(sourceFilePath) || TextUtils.isEmpty(destFilePath)) {              throw new RuntimeException("Both sourceFilePath and destFilePath cannot be null.");          }          moveFile(new File(sourceFilePath), new File(destFilePath));      }        /**       * move file       *        * @param srcFile       * @param destFile       */      public static void moveFile(File srcFile, File destFile) {          boolean rename = srcFile.renameTo(destFile);          if (!rename) {              copyFile(srcFile.getAbsolutePath(), destFile.getAbsolutePath());              deleteFile(srcFile.getAbsolutePath());          }      }        /**       * copy file       *        * @param sourceFilePath       * @param destFilePath       * @return       * @throws RuntimeException if an error occurs while operator FileOutputStream       */      public static boolean copyFile(String sourceFilePath, String destFilePath) {          InputStream inputStream = null;          try {              inputStream = new FileInputStream(sourceFilePath);          } catch (FileNotFoundException e) {              throw new RuntimeException("FileNotFoundException occurred. ", e);          }          return writeFile(destFilePath, inputStream);      }        /**       * read file to string list, a element of list is a line       *        * @param filePath       * @param charsetName The name of a supported {@link java.nio.charset.Charset </code>charset<code>}       * @return if file not exist, return null, else return content of file       * @throws RuntimeException if an error occurs while operator BufferedReader       */      public static List<String> readFileToList(String filePath, String charsetName) {          File file = new File(filePath);          List<String> fileContent = new ArrayList<String>();          if (file == null || !file.isFile()) {              return null;          }            BufferedReader reader = null;          try {              InputStreamReader is = new InputStreamReader(new FileInputStream(file), charsetName);              reader = new BufferedReader(is);              String line = null;              while ((line = reader.readLine()) != null) {                  fileContent.add(line);              }              reader.close();              return fileContent;          } catch (IOException e) {              throw new RuntimeException("IOException occurred. ", e);          } finally {              if (reader != null) {                  try {                      reader.close();                  } catch (IOException e) {                      throw new RuntimeException("IOException occurred. ", e);                  }              }          }      }        /**       * get file name from path, not include suffix       *        * <pre>       *      getFileNameWithoutExtension(null)               =   null       *      getFileNameWithoutExtension("")                 =   ""       *      getFileNameWithoutExtension("   ")              =   "   "       *      getFileNameWithoutExtension("abc")              =   "abc"       *      getFileNameWithoutExtension("a.mp3")            =   "a"       *      getFileNameWithoutExtension("a.b.rmvb")         =   "a.b"       *      getFileNameWithoutExtension("c:\\")              =   ""       *      getFileNameWithoutExtension("c:\\a")             =   "a"       *      getFileNameWithoutExtension("c:\\a.b")           =   "a"       *      getFileNameWithoutExtension("c:a.txt\\a")        =   "a"       *      getFileNameWithoutExtension("/home/admin")      =   "admin"       *      getFileNameWithoutExtension("/home/admin/a.txt/b.mp3")  =   "b"       * </pre>       *        * @param filePath       * @return file name from path, not include suffix       * @see       */      public static String getFileNameWithoutExtension(String filePath) {          if (StringUtils.isEmpty(filePath)) {              return filePath;          }            int extenPosi = filePath.lastIndexOf(FILE_EXTENSION_SEPARATOR);          int filePosi = filePath.lastIndexOf(File.separator);          if (filePosi == -1) {              return (extenPosi == -1 ? filePath : filePath.substring(0, extenPosi));          }          if (extenPosi == -1) {              return filePath.substring(filePosi + 1);          }          return (filePosi < extenPosi ? filePath.substring(filePosi + 1, extenPosi) : filePath.substring(filePosi + 1));      }        /**       * get file name from path, include suffix       *        * <pre>       *      getFileName(null)               =   null       *      getFileName("")                 =   ""       *      getFileName("   ")              =   "   "       *      getFileName("a.mp3")            =   "a.mp3"       *      getFileName("a.b.rmvb")         =   "a.b.rmvb"       *      getFileName("abc")              =   "abc"       *      getFileName("c:\\")              =   ""       *      getFileName("c:\\a")             =   "a"       *      getFileName("c:\\a.b")           =   "a.b"       *      getFileName("c:a.txt\\a")        =   "a"       *      getFileName("/home/admin")      =   "admin"       *      getFileName("/home/admin/a.txt/b.mp3")  =   "b.mp3"       * </pre>       *        * @param filePath       * @return file name from path, include suffix       */      public static String getFileName(String filePath) {          if (StringUtils.isEmpty(filePath)) {              return filePath;          }            int filePosi = filePath.lastIndexOf(File.separator);          return (filePosi == -1) ? filePath : filePath.substring(filePosi + 1);      }        /**       * get folder name from path       *        * <pre>       *      getFolderName(null)               =   null       *      getFolderName("")                 =   ""       *      getFolderName("   ")              =   ""       *      getFolderName("a.mp3")            =   ""       *      getFolderName("a.b.rmvb")         =   ""       *      getFolderName("abc")              =   ""       *      getFolderName("c:\\")              =   "c:"       *      getFolderName("c:\\a")             =   "c:"       *      getFolderName("c:\\a.b")           =   "c:"       *      getFolderName("c:a.txt\\a")        =   "c:a.txt"       *      getFolderName("c:a\\b\\c\\d.txt")    =   "c:a\\b\\c"       *      getFolderName("/home/admin")      =   "/home"       *      getFolderName("/home/admin/a.txt/b.mp3")  =   "/home/admin/a.txt"       * </pre>       *        * @param filePath       * @return       */      public static String getFolderName(String filePath) {            if (StringUtils.isEmpty(filePath)) {              return filePath;          }            int filePosi = filePath.lastIndexOf(File.separator);          return (filePosi == -1) ? "" : filePath.substring(0, filePosi);      }        /**       * get suffix of file from path       *        * <pre>       *      getFileExtension(null)               =   ""       *      getFileExtension("")                 =   ""       *      getFileExtension("   ")              =   "   "       *      getFileExtension("a.mp3")            =   "mp3"       *      getFileExtension("a.b.rmvb")         =   "rmvb"       *      getFileExtension("abc")              =   ""       *      getFileExtension("c:\\")              =   ""       *      getFileExtension("c:\\a")             =   ""       *      getFileExtension("c:\\a.b")           =   "b"       *      getFileExtension("c:a.txt\\a")        =   ""       *      getFileExtension("/home/admin")      =   ""       *      getFileExtension("/home/admin/a.txt/b")  =   ""       *      getFileExtension("/home/admin/a.txt/b.mp3")  =   "mp3"       * </pre>       *        * @param filePath       * @return       */      public static String getFileExtension(String filePath) {          if (StringUtils.isBlank(filePath)) {              return filePath;          }            int extenPosi = filePath.lastIndexOf(FILE_EXTENSION_SEPARATOR);          int filePosi = filePath.lastIndexOf(File.separator);          if (extenPosi == -1) {              return "";          }          return (filePosi >= extenPosi) ? "" : filePath.substring(extenPosi + 1);      }        /**       * Creates the directory named by the trailing filename of this file, including the complete directory path required       * to create this directory. <br/>       * <br/>       * <ul>       * <strong>Attentions:</strong>       * <li>makeDirs("C:\\Users\\Trinea") can only create users folder</li>       * <li>makeFolder("C:\\Users\\Trinea\\") can create Trinea folder</li>       * </ul>       *        * @param filePath       * @return true if the necessary directories have been created or the target directory already exists, false one of       *         the directories can not be created.       *         <ul>       *         <li>if {@link FileUtils#getFolderName(String)} return null, return false</li>       *         <li>if target directory already exists, return true</li>       *         <li>return {@link java.io.File#makeFolder}</li>       *         </ul>       */      public static boolean makeDirs(String filePath) {          String folderName = getFolderName(filePath);          if (StringUtils.isEmpty(folderName)) {              return false;          }            File folder = new File(folderName);          return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();      }        /**       * @param filePath       * @return       * @see #makeDirs(String)       */      public static boolean makeFolders(String filePath) {          return makeDirs(filePath);      }        /**       * Indicates if this file represents a file on the underlying file system.       *        * @param filePath       * @return       */      public static boolean isFileExist(String filePath) {          if (StringUtils.isBlank(filePath)) {              return false;          }            File file = new File(filePath);          return (file.exists() && file.isFile());      }        /**       * Indicates if this file represents a directory on the underlying file system.       *        * @param directoryPath       * @return       */      public static boolean isFolderExist(String directoryPath) {          if (StringUtils.isBlank(directoryPath)) {              return false;          }            File dire = new File(directoryPath);          return (dire.exists() && dire.isDirectory());      }        /**       * delete file or directory       * <ul>       * <li>if path is null or empty, return true</li>       * <li>if path not exist, return true</li>       * <li>if path exist, delete recursion. return true</li>       * <ul>       *        * @param path       * @return       */      public static boolean deleteFile(String path) {          if (StringUtils.isBlank(path)) {              return true;          }            File file = new File(path);          if (!file.exists()) {              return true;          }          if (file.isFile()) {              return file.delete();          }          if (!file.isDirectory()) {              return false;          }          for (File f : file.listFiles()) {              if (f.isFile()) {                  f.delete();              } else if (f.isDirectory()) {                  deleteFile(f.getAbsolutePath());              }          }          return file.delete();      }        /**       * get file size       * <ul>       * <li>if path is null or empty, return -1</li>       * <li>if path exist and it is a file, return file size, else return -1</li>       * <ul>       *        * @param path       * @return returns the length of this file in bytes. returns -1 if the file does not exist.       */      public static long getFileSize(String path) {          if (StringUtils.isBlank(path)) {              return -1;          }            File file = new File(path);          return (file.exists() && file.isFile() ? file.length() : -1);      }  }



StringUtils文件



package com.zqsy.order.tools;    import java.io.UnsupportedEncodingException;  import java.net.URLEncoder;  import java.util.regex.Matcher;  import java.util.regex.Pattern;    /**   * String Utils   *    * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2011-7-22   */  public class StringUtils {        private StringUtils() {          throw new AssertionError();      }        /**       * is null or its length is 0 or it is made by space       *        * <pre>       * isBlank(null) = true;       * isBlank(&quot;&quot;) = true;       * isBlank(&quot;  &quot;) = true;       * isBlank(&quot;a&quot;) = false;       * isBlank(&quot;a &quot;) = false;       * isBlank(&quot; a&quot;) = false;       * isBlank(&quot;a b&quot;) = false;       * </pre>       *        * @param str       * @return if string is null or its size is 0 or it is made by space, return true, else return false.       */      public static boolean isBlank(String str) {          return (str == null || str.trim().length() == 0);      }        /**       * is null or its length is 0       *        * <pre>       * isEmpty(null) = true;       * isEmpty(&quot;&quot;) = true;       * isEmpty(&quot;  &quot;) = false;       * </pre>       *        * @param str       * @return if string is null or its size is 0, return true, else return false.       */      public static boolean isEmpty(CharSequence str) {          return (str == null || str.length() == 0);      }        /**       * compare two string       *        * @param actual       * @param expected       * @return       * @see ObjectUtils#isEquals(Object, Object)       */      public static boolean isEquals(String actual, String expected) {       return actual == expected || (actual == null ? expected == null : actual.equals(expected));      }        /**       * get length of CharSequence       *        * <pre>       * length(null) = 0;       * length(\"\") = 0;       * length(\"abc\") = 3;       * </pre>       *        * @param str       * @return if str is null or empty, return 0, else return {@link CharSequence#length()}.       */      public static int length(CharSequence str) {          return str == null ? 0 : str.length();      }        /**       * null Object to empty string       *        * <pre>       * nullStrToEmpty(null) = &quot;&quot;;       * nullStrToEmpty(&quot;&quot;) = &quot;&quot;;       * nullStrToEmpty(&quot;aa&quot;) = &quot;aa&quot;;       * </pre>       *        * @param str       * @return       */      public static String nullStrToEmpty(Object str) {          return (str == null ? "" : (str instanceof String ? (String)str : str.toString()));      }        /**       * capitalize first letter       *        * <pre>       * capitalizeFirstLetter(null)     =   null;       * capitalizeFirstLetter("")       =   "";       * capitalizeFirstLetter("2ab")    =   "2ab"       * capitalizeFirstLetter("a")      =   "A"       * capitalizeFirstLetter("ab")     =   "Ab"       * capitalizeFirstLetter("Abc")    =   "Abc"       * </pre>       *        * @param str       * @return       */      public static String capitalizeFirstLetter(String str) {          if (isEmpty(str)) {              return str;          }            char c = str.charAt(0);          return (!Character.isLetter(c) || Character.isUpperCase(c)) ? str : new StringBuilder(str.length())                  .append(Character.toUpperCase(c)).append(str.substring(1)).toString();      }        /**       * encoded in utf-8       *        * <pre>       * utf8Encode(null)        =   null       * utf8Encode("")          =   "";       * utf8Encode("aa")        =   "aa";       * utf8Encode("啊啊啊啊")   = "%E5%95%8A%E5%95%8A%E5%95%8A%E5%95%8A";       * </pre>       *        * @param str       * @return       * @throws UnsupportedEncodingException if an error occurs       */      public static String utf8Encode(String str) {          if (!isEmpty(str) && str.getBytes().length != str.length()) {              try {                  return URLEncoder.encode(str, "UTF-8");              } catch (UnsupportedEncodingException e) {                  throw new RuntimeException("UnsupportedEncodingException occurred. ", e);              }          }          return str;      }        /**       * encoded in utf-8, if exception, return defultReturn       *        * @param str       * @param defultReturn       * @return       */      public static String utf8Encode(String str, String defultReturn) {          if (!isEmpty(str) && str.getBytes().length != str.length()) {              try {                  return URLEncoder.encode(str, "UTF-8");              } catch (UnsupportedEncodingException e) {                  return defultReturn;              }          }          return str;      }        /**       * get innerHtml from href       *        * <pre>       * getHrefInnerHtml(null)                                  = ""       * getHrefInnerHtml("")                                    = ""       * getHrefInnerHtml("mp3")                                 = "mp3";       * getHrefInnerHtml("&lt;a innerHtml&lt;/a&gt;")                    = "&lt;a innerHtml&lt;/a&gt;";       * getHrefInnerHtml("&lt;a&gt;innerHtml&lt;/a&gt;")                    = "innerHtml";       * getHrefInnerHtml("&lt;a&lt;a&gt;innerHtml&lt;/a&gt;")                    = "innerHtml";       * getHrefInnerHtml("&lt;a href="baidu.com"&gt;innerHtml&lt;/a&gt;")               = "innerHtml";       * getHrefInnerHtml("&lt;a href="baidu.com" title="baidu"&gt;innerHtml&lt;/a&gt;") = "innerHtml";       * getHrefInnerHtml("   &lt;a&gt;innerHtml&lt;/a&gt;  ")                           = "innerHtml";       * getHrefInnerHtml("&lt;a&gt;innerHtml&lt;/a&gt;&lt;/a&gt;")                      = "innerHtml";       * getHrefInnerHtml("jack&lt;a&gt;innerHtml&lt;/a&gt;&lt;/a&gt;")                  = "innerHtml";       * getHrefInnerHtml("&lt;a&gt;innerHtml1&lt;/a&gt;&lt;a&gt;innerHtml2&lt;/a&gt;")        = "innerHtml2";       * </pre>       *        * @param href       * @return <ul>       *         <li>if href is null, return ""</li>       *         <li>if not match regx, return source</li>       *         <li>return the last string that match regx</li>       *         </ul>       */      public static String getHrefInnerHtml(String href) {          if (isEmpty(href)) {              return "";          }            String hrefReg = ".*<[\\s]*a[\\s]*.*>(.+?)<[\\s]*/a[\\s]*>.*";          Pattern hrefPattern = Pattern.compile(hrefReg, Pattern.CASE_INSENSITIVE);          Matcher hrefMatcher = hrefPattern.matcher(href);          if (hrefMatcher.matches()) {              return hrefMatcher.group(1);          }          return href;      }    /**       * process special char in html       *        * <pre>       * htmlEscapeCharsToString(null) = null;       * htmlEscapeCharsToString("") = "";       * htmlEscapeCharsToString("mp3") = "mp3";       * htmlEscapeCharsToString("mp3&lt;") = "mp3<";       * htmlEscapeCharsToString("mp3&gt;") = "mp3\>";       * htmlEscapeCharsToString("mp3&amp;mp4") = "mp3&mp4";       * htmlEscapeCharsToString("mp3&quot;mp4") = "mp3\"mp4";       * htmlEscapeCharsToString("mp3&lt;&gt;&amp;&quot;mp4") = "mp3\<\>&\"mp4";       * </pre>       *        * @param source       * @return       */      public static String htmlEscapeCharsToString(String source) {          return StringUtils.isEmpty(source) ? source : source.replaceAll("&lt;", "<").replaceAll("&gt;", ">")                  .replaceAll("&amp;", "&").replaceAll("&quot;", "\"");      }        /**       * transform half width char to full width char       *        * <pre>       * fullWidthToHalfWidth(null) = null;       * fullWidthToHalfWidth("") = "";       * fullWidthToHalfWidth(new String(new char[] {12288})) = " ";       * fullWidthToHalfWidth("!"#$%&) = "!\"#$%&";       * </pre>       *        * @param s       * @return       */      public static String fullWidthToHalfWidth(String s) {          if (isEmpty(s)) {              return s;          }            char[] source = s.toCharArray();          for (int i = 0; i < source.length; i++) {              if (source[i] == 12288) {                  source[i] = ' ';                  // } else if (source[i] == 12290) {                  // source[i] = '.';              } else if (source[i] >= 65281 && source[i] <= 65374) {                  source[i] = (char)(source[i] - 65248);              } else {                  source[i] = source[i];              }          }          return new String(source);      }        /**       * transform full width char to half width char       *        * <pre>       * halfWidthToFullWidth(null) = null;       * halfWidthToFullWidth("") = "";       * halfWidthToFullWidth(" ") = new String(new char[] {12288});       * halfWidthToFullWidth("!\"#$%&) = "!"#$%&";       * </pre>       *        * @param s       * @return       */      public static String halfWidthToFullWidth(String s) {          if (isEmpty(s)) {              return s;          }            char[] source = s.toCharArray();          for (int i = 0; i < source.length; i++) {              if (source[i] == ' ') {                  source[i] = (char)12288;                  // } else if (source[i] == '.') {                  // source[i] = (char)12290;              } else if (source[i] >= 33 && source[i] <= 126) {                  source[i] = (char)(source[i] + 65248);              } else {                  source[i] = source[i];              }          }          return new String(source);      }  }