一、java.util.Properties API & 案例

java.util.Properties 是一個屬性集合。常見的api有如下:

  • load(InputStream inStream)  從輸入流中讀取屬性
  • getProperty(String key)  根據key,獲取屬性值
  • getOrDefault(Object key, V defaultValue) 根據key對象,獲取屬性值需要強轉

首先在resources目錄下增加/main/resources/fast.properties:

fast.framework.name=fast
fast.framework.author=bysocket
fast.framework.age=1

然後直接上代碼PropertyUtil.java:

/**
  * .properties屬性文件操作工具類
  *
  * Created by bysocket on 16/7/19.
  */
 public class PropertyUtil {
  
     private static final Logger LOGGER = LoggerFactory.getLogger(PropertyUtil.class);
  
     /** .properties屬性文件名後綴 */
     public static final String PROPERTY_FILE_SUFFIX	= ".properties";
  
     /**
      * 根據屬性文件名,獲取屬性
      *
      * @param propsFileName
      * @return
      */
     public static Properties getProperties(String propsFileName) {
         if (StringUtils.isEmpty(propsFileName))
             throw new IllegalArgumentException();
  
         Properties  properties  = new Properties();
         InputStream inputStream = null;
  
         try {
  
             try {
                 /** 加入文件名後綴 */
                 if (propsFileName.lastIndexOf(PROPERTY_FILE_SUFFIX) == -1) {
                     propsFileName += PROPERTY_FILE_SUFFIX;
                 }
  
                 inputStream = Thread.currentThread().getContextClassLoader()
                         .getResourceAsStream(propsFileName);
                 if (null != inputStream)
                     properties.load(inputStream);
             } finally {
                 if ( null != inputStream) {
                     inputStream.close();
                 }
             }
  
         } catch (IOException e) {
             LOGGER.error("加載屬性文件出錯!",e);
             throw new RuntimeException(e);
         }
  
         return properties;
     }
  
     /**
      * 根據key,獲取屬性值
      *
      * @param properties
      * @param key
      * @return
      */
     public static String getString(Properties properties, String key){
         return properties.getProperty(key);
     }
  
     /**
      * 根據key,獲取屬性值
      *
      * @param properties
      * @param key
      * @param defaultValue
      * @return
      */
     public static String getStringOrDefault(Properties properties, String key, String defaultValue){
         return properties.getProperty(key,defaultValue);
     }
  
     /**
      * 根據key,獲取屬性值
      *
      * @param properties
      * @param key
      * @param defaultValue
      * @param <V>
      * @return
      */
     public static <V> V getOrDefault(Properties properties, String key, V defaultValue){
         return (V) properties.getOrDefault(key,defaultValue);
     }
 }

UT如下:

/**
  * {@link PropertyUtil} 測試用例
  * <p/>
  * Created by bysocket on 16/7/19.
  */
 public class PropertyUtilTest {
  
     @Test
     public void testGetProperties() {
         Properties properties = PropertyUtil.getProperties("fast");
         String fastFrameworkName = properties.getProperty("fast.framework.name");
         String authorName        = properties.getProperty("fast.framework.author");
         Object age               = properties.getOrDefault("fast.framework.age",10);
         Object defaultVal        = properties.getOrDefault("fast.framework.null",10);
         System.out.println(fastFrameworkName);
         System.out.println(authorName);
         System.out.println(age.toString());
         System.out.println(defaultVal.toString());
     }
  
     @Test
     public void testGetString() {
         Properties properties = PropertyUtil.getProperties("fast");
         String fastFrameworkName = PropertyUtil.getString(properties,"fast.framework.name");
         String authorName        = PropertyUtil.getString(properties,"fast.framework.author");
         System.out.println(fastFrameworkName);
         System.out.println(authorName);
     }
  
     @Test
     public void testGetOrDefault() {
         Properties properties = PropertyUtil.getProperties("fast");
         Object age               = PropertyUtil.getOrDefault(properties,"fast.framework.age",10);
         Object defaultVal        = PropertyUtil.getOrDefault(properties,"fast.framework.null",10);
         System.out.println(age.toString());
         System.out.println(defaultVal.toString());
     }
 }

Run Console:

1
10
fast
bysocket
1
10
fast
bysocket

相關對應代碼分享在 Github 主頁

二、JACKSON 案例

首先,加個Maven 依賴:

<!-- Jackson -->
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-jaxrs</artifactId>
			<version>1.9.13</version>
		</dependency>

  然後直接上代碼JSONUtil:

/**
  * JSON 工具類
  * <p/>
  * Created by bysocket on 16/7/19.
  */
 public class JSONUtil {
  
     private static final Logger LOGGER = LoggerFactory.getLogger(JSONUtil.class);
  
     /**
      * 默認JSON類
      **/
     private static final ObjectMapper mapper = new ObjectMapper();
  
     /**
      * 將 Java 對象轉換為 JSON 字符串
      *
      * @param object
      * @param <T>
      * @return
      */
     public static <T> String toJSONString(T object) {
         String jsonStr;
         try {
             jsonStr = mapper.writeValueAsString(object);
         } catch (Exception e) {
             LOGGER.error("Java Object Can't covert to JSON String!");
             throw new RuntimeException(e);
         }
         return jsonStr;
     }
  
  
     /**
      * 將 JSON 字符串轉化為 Java 對象
      *
      * @param json
      * @param clazz
      * @param <T>
      * @return
      */
     public static <T> T toObject(String json, Class<T> clazz) {
         T object;
         try {
             object = mapper.readValue(json, clazz);
         } catch (Exception e) {
             LOGGER.error("JSON String Can't covert to Java Object!");
             throw new RuntimeException(e);
         }
         return object;
     }
  
 }

UT如下:

/**
  * {@link JSONUtil} 測試用例
  * <p/>
  * Created by bysocket on 16/7/19.
  */
 public class JSONUtilTest {
  
     @Test
     public void testToJSONString() {
         JSONObject jsonObject = new JSONObject(1, "bysocket", 33);
         String jsonStr = JSONUtil.toJSONString(jsonObject);
         Assert.assertEquals("{\"age\":1,\"name\":\"bysocket\",\"id\":33}", jsonStr);
     }
  
     @Test(expected = RuntimeException.class)
     public void testToJSONStringError() {
         JSONUtil.toJSONString(System.out);
     }
  
     @Test
     public void testToObject() {
         JSONObject jsonObject = new JSONObject(1, "bysocket", 33);
         String jsonStr = JSONUtil.toJSONString(jsonObject);
         JSONObject resultObject = JSONUtil.toObject(jsonStr, JSONObject.class);
         Assert.assertEquals(jsonObject.toString(), resultObject.toString());
     }
  
     @Test(expected = RuntimeException.class)
     public void testToObjectError() {
         JSONUtil.toObject("{int:1}", JSONObject.class);
     }
 }
  
 class JSONObject {
     int age;
     String name;
     Integer id;
  
     public JSONObject() {
     }
  
     public JSONObject(int age, String name, Integer id) {
         this.age = age;
         this.name = name;
         this.id = id;
     }
  
     public int getAge() {
         return age;
     }
  
     public void setAge(int age) {
         this.age = age;
     }
  
     public String getName() {
         return name;
     }
  
     public void setName(String name) {
         this.name = name;
     }
  
     public Integer getId() {
         return id;
     }
  
     public void setId(Integer id) {
         this.id = id;
     }
  
     @Override
     public String toString() {
         return "JSONObject{" +
                 "age=" + age +
                 ", name='" + name + '\'' +
                 ", id=" + id +
                 '}';
     }
 }

Run Console(拋出了異常信息):

16/07/19 23:09:13 ERROR util.JSONUtil: JSON String Can't covert to Java Object!
16/07/19 23:09:13 ERROR util.JSONUtil: Java Object Can't covert to JSON String!

三、小結

相關對應代碼分