中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java代碼實現對properties文件有序的讀寫的示例

發布時間:2020-09-04 23:03:20 來源:腳本之家 閱讀:286 作者:李學凱 欄目:編程語言

最近遇到一項需求,要求把properties文件中的內容讀取出來供用戶修改,修改完后需要再重新保存到properties文件中。很簡單的需求吧,可問題是Properties是繼承自HashTable的,直接通過keySet()、keys()或entrySet()方法對Properties中的元素進行遍歷時取出來的內容順序與properties文件中的順序不一致,這是問題一;問題二是就算取出來的時候是有序的,保存到文件中時又是無序的了。

當然,解決這兩個問題的方法有很多。我最終采用的方法是自定義一個PropertiesUtil類,該類繼承自Properties。PropertiesUtil提供一個返回由key按照存入順序組成的List的方法,getKeyList(),這樣問題一就解決了。那如何保證getKeyList()方法返回的就是有序的key組成的集合呢?我查看了一下Properties方法的源碼,發現其setProperty()方法實際上就是調用了父類HashTable的put()方法,其次Properties在從文件中加載內容時是按照文件順序進行讀取,然后調用父類HashTable的put()方法進行儲存。所以問題的解決辦法就是PropertiesUtil持有一個私有的可以有序存儲key的集合,然后重寫父類的put()方法,在方法體中照常通過super.put()進行屬性的存儲,同時將key添加到存儲key的集合中。

Properties提供有save()方法和store()方法可以將當前對象的內容存放到指定的輸出流中,但它們的底層邏輯都是一樣的。通過調用keys()方法獲取一個Enumeration,然后對該Enumeration進行遍歷,依次將對應的key和value寫入到輸出流中,所以要保證寫入是有序的,就要保證遍歷keys()返回的Enumeration時取出的元素key是有序的。所以解決方法是重寫keys()方法,保證遍歷返回的Enumeration時得到的key是有序的。

下面就示范怎么按順序讀properties文件,以及還得按原來的順序寫properties文件。

package com.lxk.propertyFileTest; 
 
import java.util.*; 
 
/** 
 * Created by lxk on 2017/5/2 
 */ 
public class OrderedProperties extends Properties { 
  private static final long serialVersionUID = -4627607243846121965L; 
 
  /** 
   * 因為LinkedHashSet有序,所以,key在調用put()的時候,存放到這里也就有序。 
   */ 
  private final LinkedHashSet<Object> keys = new LinkedHashSet<>(); 
 
  @Override 
  public Enumeration<Object> keys() { 
    return Collections.enumeration(keys); 
  } 
 
  /** 
   * 在put的時候,只是把key有序的存到{@link OrderedProperties#keys} 
   * 取值的時候,根據有序的keys,可以有序的取出所有value 
   * 依然調用父類的put方法,也就是key value 鍵值對還是存在hashTable里. 
   * 只是現在多了個存key的屬性{@link OrderedProperties#keys} 
   */ 
  @Override 
  public Object put(Object key, Object value) { 
    keys.add(key); 
    return super.put(key, value); 
  } 
 
  /** 
   * 因為復寫了這個方法,在(方式一)的時候,才輸出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Set<String> stringPropertyNames() { 
    Set<String> set = new LinkedHashSet<>(); 
    for (Object key : this.keys) { 
      set.add((String) key); 
    } 
    return set; 
  } 
 
  /** 
   * 因為復寫了這個方法,在(方式二)的時候,才輸出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Set<Object> keySet() { 
    return keys; 
  } 
 
  //這個就不設置有序了,因為涉及到HashTable內部類:EntrySet,不好復寫。 
  //public LinkedHashSet<Map.Entry<Object, Object>> entrySet() { 
  //  LinkedHashSet<Map.Entry<Object, Object>> entrySet = new LinkedHashSet<>(); 
  //  for (Object key : keys) { 
  // 
  //  } 
  //  return entrySet; 
  //} 
 
  /** 
   * 因為復寫了這個方法,在(方式四)的時候,才輸出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Enumeration<?> propertyNames() { 
    return Collections.enumeration(keys); 
  } 
} 

上面是繼承Java自帶的類,我們做的主要是實現有序,其他的還是原來的樣子就行。

看下整個的類繼承關系:如下圖:

Java代碼實現對properties文件有序的讀寫的示例

下面是main方法的類。

package com.lxk.propertyFileTest; 
 
import java.io.*; 
import java.util.Enumeration; 
import java.util.Map; 
import java.util.Properties; 
import java.util.Set; 
 
/** 
 * 讀寫properties文件測試(帶順序的讀和寫) 
 * <p> 
 * Created by lxk on 2017/5/2 
 */ 
public class MainOrder { 
  public static void main(String[] args) { 
    Properties prop = readOrderedPropertiesFile(); 
    printProp(prop); 
    writeOrderedPropertiesFile(prop); 
  } 
 
  /** 
   * 輸出properties的key和value 
   */ 
  public static void printProp(Properties properties) { 
    System.out.println("---------(方式一)------------"); 
    for (String key : properties.stringPropertyNames()) { 
      System.out.println(key + "=" + properties.getProperty(key)); 
    } 
 
    System.out.println("---------(方式二)------------"); 
    Set<Object> keys = properties.keySet();//返回屬性key的集合 
    for (Object key : keys) { 
      System.out.println(key.toString() + "=" + properties.get(key)); 
    } 
 
    System.out.println("---------(方式三)------------"); 
    Set<Map.Entry<Object, Object>> entrySet = properties.entrySet();//返回的屬性鍵值對實體 
    for (Map.Entry<Object, Object> entry : entrySet) { 
      System.out.println(entry.getKey() + "=" + entry.getValue()); 
    } 
 
    System.out.println("---------(方式四)------------"); 
    Enumeration<?> e = properties.propertyNames(); 
    while (e.hasMoreElements()) { 
      String key = (String) e.nextElement(); 
      String value = properties.getProperty(key); 
      System.out.println(key + "=" + value); 
    } 
  } 
 
  /** 
   * 讀Properties文件(有序) 
   */ 
  private static Properties readOrderedPropertiesFile() { 
    Properties properties = new OrderedProperties(); 
    InputStreamReader inputStreamReader = null; 
    try { 
      InputStream inputStream = new BufferedInputStream(new FileInputStream("D:testOrder.properties")); 
      //prop.load(in);//直接這么寫,如果properties文件中有漢子,則漢字會亂碼。因為未設置編碼格式。 
      inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 
      properties.load(inputStreamReader); 
    } catch (Exception e) { 
      System.out.println(e.getMessage()); 
    } finally { 
      if (inputStreamReader != null) { 
        try { 
          inputStreamReader.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
    } 
    return properties; 
  } 
 
  /** 
   * 寫Properties文件(有序) 
   */ 
  private static void writeOrderedPropertiesFile(Properties properties) { 
    properties.setProperty("phone", "10086"); 
    OutputStreamWriter outputStreamWriter = null; 
    try { 
      //保存屬性到b.properties文件 
      FileOutputStream fileOutputStream = new FileOutputStream("order.properties", false);//true表示追加打開,false每次都是清空再重寫 
      //prop.store(oFile, "此參數是保存生成properties文件中第一行的注釋說明文字");//這個會兩個地方亂碼 
      //prop.store(new OutputStreamWriter(oFile, "utf-8"), "漢字亂碼");//這個就是生成的properties文件中第一行的注釋文字亂碼 
      outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8"); 
      properties.store(outputStreamWriter, "lll"); 
    } catch (Exception e) { 
      System.out.println(e.getMessage()); 
    } finally { 
      if (outputStreamWriter != null) { 
        try { 
          outputStreamWriter.close(); 
        } catch (IOException e) { 
          System.out.println(e.getMessage()); 
        } 
      } 
    } 
 
  } 
} 

其實讀和寫,都和使用系統提供的類的差別不大,只是現在讀到了我們自己寫的子類里面去了。

其他的代碼都是一樣樣的。

下面是讀的文件的內容截圖:

Java代碼實現對properties文件有序的讀寫的示例

再然后是,實際代碼運行的結果截圖:

---------(方式一)------------ 
1=11 
2=22 
3=33 
4=44 
5=55 
6=66 
7=77 
8=88 
9=99 
10=18 
11漢字=測試漢字以防亂碼產生 
---------(方式二)------------ 
1=11 
2=22 
3=33 
4=44 
5=55 
6=66 
7=77 
8=88 
9=99 
10=18 
11漢字=測試漢字以防亂碼產生 
---------(方式三)------------ 
11漢字=測試漢字以防亂碼產生 
9=99 
8=88 
7=77 
6=66 
5=55 
4=44 
3=33 
2=22 
10=18 
1=11 
---------(方式四)------------ 
1=11 
2=22 
3=33 
4=44 
5=55 
6=66 
7=77 
8=88 
9=99 
10=18 
11漢字=測試漢字以防亂碼產生 

額,太長了,就不截圖了吧,就給把打印結果給展示一下得了。

可以看到,只有第三次是無序的,具體原因,我也在代碼里面解釋過了。

還有,就是生成的文件的截圖:

Java代碼實現對properties文件有序的讀寫的示例

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石阡县| 任丘市| 上饶县| 塔城市| 瑞金市| 昭觉县| 合作市| 宁陕县| 望谟县| 安吉县| 石景山区| 秀山| 通城县| 普兰店市| 信宜市| 于田县| 岱山县| 平顶山市| 咸阳市| 沽源县| 永嘉县| 天等县| 韩城市| 晋州市| 新巴尔虎右旗| 佛学| 昌江| 汶川县| 陇川县| 龙州县| 宁德市| 桐城市| 苗栗市| 陆良县| 确山县| 广宗县| 佛冈县| 滨州市| 张掖市| 鹰潭市| 垫江县|