最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java代碼實(shí)現(xiàn)對properties文件有序的讀寫的示例

 更新時(shí)間:2017年11月21日 10:29:01   作者:李學(xué)凱  
本篇文章主要介紹了Java代碼實(shí)現(xiàn)對properties文件有序的讀寫的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

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

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

下面就示范怎么按順序讀properties文件,以及還得按原來的順序?qū)憄roperties文件。

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; 
 
  /** 
   * 因?yàn)長inkedHashSet有序,所以,key在調(diào)用put()的時(shí)候,存放到這里也就有序。 
   */ 
  private final LinkedHashSet<Object> keys = new LinkedHashSet<>(); 
 
  @Override 
  public Enumeration<Object> keys() { 
    return Collections.enumeration(keys); 
  } 
 
  /** 
   * 在put的時(shí)候,只是把key有序的存到{@link OrderedProperties#keys} 
   * 取值的時(shí)候,根據(jù)有序的keys,可以有序的取出所有value 
   * 依然調(diào)用父類的put方法,也就是key value 鍵值對還是存在hashTable里. 
   * 只是現(xiàn)在多了個(gè)存key的屬性{@link OrderedProperties#keys} 
   */ 
  @Override 
  public Object put(Object key, Object value) { 
    keys.add(key); 
    return super.put(key, value); 
  } 
 
  /** 
   * 因?yàn)閺?fù)寫了這個(gè)方法,在(方式一)的時(shí)候,才輸出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Set<String> stringPropertyNames() { 
    Set<String> set = new LinkedHashSet<>(); 
    for (Object key : this.keys) { 
      set.add((String) key); 
    } 
    return set; 
  } 
 
  /** 
   * 因?yàn)閺?fù)寫了這個(gè)方法,在(方式二)的時(shí)候,才輸出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Set<Object> keySet() { 
    return keys; 
  } 
 
  //這個(gè)就不設(shè)置有序了,因?yàn)樯婕暗紿ashTable內(nèi)部類:EntrySet,不好復(fù)寫。 
  //public LinkedHashSet<Map.Entry<Object, Object>> entrySet() { 
  //  LinkedHashSet<Map.Entry<Object, Object>> entrySet = new LinkedHashSet<>(); 
  //  for (Object key : keys) { 
  // 
  //  } 
  //  return entrySet; 
  //} 
 
  /** 
   * 因?yàn)閺?fù)寫了這個(gè)方法,在(方式四)的時(shí)候,才輸出有序。 
   * {@link MainOrder#printProp} 
   */ 
  @Override 
  public Enumeration<?> propertyNames() { 
    return Collections.enumeration(keys); 
  } 
} 

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

看下整個(gè)的類繼承關(guān)系:如下圖:

下面是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();//返回的屬性鍵值對實(shí)體 
    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文件中有漢子,則漢字會亂碼。因?yàn)槲丛O(shè)置編碼格式。 
      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, "此參數(shù)是保存生成properties文件中第一行的注釋說明文字");//這個(gè)會兩個(gè)地方亂碼 
      //prop.store(new OutputStreamWriter(oFile, "utf-8"), "漢字亂碼");//這個(gè)就是生成的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()); 
        } 
      } 
    } 
 
  } 
} 

其實(shí)讀和寫,都和使用系統(tǒng)提供的類的差別不大,只是現(xiàn)在讀到了我們自己寫的子類里面去了。

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

下面是讀的文件的內(nèi)容截圖:

再然后是,實(shí)際代碼運(yùn)行的結(jié)果截圖:

---------(方式一)------------ 
1=11 
2=22 
3=33 
4=44 
5=55 
6=66 
7=77 
8=88 
9=99 
10=18 
11漢字=測試漢字以防亂碼產(chǎn)生 
---------(方式二)------------ 
1=11 
2=22 
3=33 
4=44 
5=55 
6=66 
7=77 
8=88 
9=99 
10=18 
11漢字=測試漢字以防亂碼產(chǎn)生 
---------(方式三)------------ 
11漢字=測試漢字以防亂碼產(chǎn)生 
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漢字=測試漢字以防亂碼產(chǎn)生 

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java?如何用二維數(shù)組創(chuàng)建空心菱形

    Java?如何用二維數(shù)組創(chuàng)建空心菱形

    這篇文章主要介紹了Java?如何用二維數(shù)組創(chuàng)建空心菱形,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    SpringBoot整合Quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解

    這篇文章主要介紹了Java?任務(wù)調(diào)度框架?Quartz,Quartz是OpenSymphony開源組織在Job?scheduling領(lǐng)域又一個(gè)開源項(xiàng)目,完全由Java開發(fā),可以用來執(zhí)行定時(shí)任務(wù),類似于java.util.Timer。,下面我們來學(xué)習(xí)一下關(guān)于?Quartz更多的詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2022-08-08
  • Java實(shí)現(xiàn)數(shù)組反轉(zhuǎn)翻轉(zhuǎn)的方法實(shí)例

    Java實(shí)現(xiàn)數(shù)組反轉(zhuǎn)翻轉(zhuǎn)的方法實(shí)例

    本篇文章主要介紹了Java實(shí)現(xiàn)數(shù)組反轉(zhuǎn)翻轉(zhuǎn)的方法實(shí)例,詳細(xì)的介紹了3種實(shí)現(xiàn)方法,有興趣的可以了解一下。
    2017-04-04
  • 如何使用新方式編寫Spring MVC接口

    如何使用新方式編寫Spring MVC接口

    這篇文章主要介紹了如何使用新方式編寫Spring MVC接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java AtomicInteger類的使用方法詳解

    Java AtomicInteger類的使用方法詳解

    這篇文章主要介紹了Java AtomicInteger類的使用方法詳解,文中有具體實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • 詳解如何使用SpringBoot封裝Excel生成器

    詳解如何使用SpringBoot封裝Excel生成器

    在軟件開發(fā)過程中,經(jīng)常需要生成Excel文件來導(dǎo)出數(shù)據(jù)或者生成報(bào)表,為了簡化開發(fā)流程和提高代碼的可維護(hù)性,我們可以使用Spring Boot封裝Excel生成器,本文將介紹如何使用Spring Boot封裝Excel生成器,并提供一些示例代碼來說明其用法和功能
    2023-06-06
  • SpringKafka消息發(fā)布之KafkaTemplate與事務(wù)支持功能

    SpringKafka消息發(fā)布之KafkaTemplate與事務(wù)支持功能

    通過本文介紹的基本用法、序列化選項(xiàng)、事務(wù)支持、錯(cuò)誤處理和性能優(yōu)化技術(shù),開發(fā)者可以構(gòu)建高效可靠的Kafka消息發(fā)布系統(tǒng),事務(wù)支持特性尤為重要,它確保了在分布式環(huán)境中的數(shù)據(jù)一致性,感興趣的朋友一起看看吧
    2025-04-04
  • spring-AOP 及 AOP獲取request各項(xiàng)參數(shù)操作

    spring-AOP 及 AOP獲取request各項(xiàng)參數(shù)操作

    這篇文章主要介紹了spring-AOP 及 AOP獲取request各項(xiàng)參數(shù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 在SpringBoot框架中實(shí)現(xiàn)打印響應(yīng)的日志

    在SpringBoot框架中實(shí)現(xiàn)打印響應(yīng)的日志

    這篇文章主要介紹了在SpringBoot框架中實(shí)現(xiàn)打印響應(yīng)的日志,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java super關(guān)鍵字用法實(shí)戰(zhàn)案例分析

    Java super關(guān)鍵字用法實(shí)戰(zhàn)案例分析

    這篇文章主要介紹了Java super關(guān)鍵字用法,結(jié)合具體案例形式分析了java super關(guān)鍵字調(diào)用父類構(gòu)造方法、屬性及方法等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-09-09

最新評論

苍山县| 卢龙县| 清水县| 景德镇市| 绥滨县| 油尖旺区| 临泉县| 壤塘县| 阿瓦提县| 古蔺县| 方城县| 龙山县| 金沙县| 宜昌市| 南江县| 七台河市| 梁平县| 成都市| 洪泽县| 呼和浩特市| 奉化市| 孝感市| 永顺县| 东丽区| 永寿县| 南漳县| 景谷| 扎赉特旗| 哈密市| 济源市| 辽宁省| 蓝田县| 张家港市| 苍南县| 黄龙县| 长岭县| 晋中市| 平舆县| 子长县| 博客| 岱山县|