• Properties+重温Map+本地计数器


    昨天想写一个记账本,发现并不能把项目名称与内容关联起来,于是乎我想到了map,可是又不知道map储存到文件中又怎么读出来,幸好今天遇到了properties
    Properties是Hashtable的子类,Hashtable实现Map接口
    所以Properties其实是一个Map

    Map(映射)

    首先Map是一个接口,所以实例化找他的子类HashMap、LinkedHashMap和TreeMap
    不同于List和Set的是,Map并不实现Collection,所以不能用Collections的方法

    Map方法

    构造函数

    和以前一样
    Map

    添加

    put(Key key,Value value):void
    putAll(Map xxxx):void复制映射
    相当与容器中的add()和addAll()
    此时如果存在旧的键值对,并不是添加,而是覆盖

    得到

    get(Key key):Value 若该键不存在,则返回null,相当于Collection中的get(索引)
    keySet():Set 返回Key的Set视图,因为key不可重复,所以返回不可重复的Set视图,而不是List
    values():Collection 返回Value的Collection(实际是List)视图,因为Value可以重复,所以返回可以重复的List视图
    entrySet():Set

    判断

    isEmpty():boolean
    containsKey(Key key):boolean
    containsValue(Value value):boolean

    操作

    clear():void 清空
    remove(Key key):Value 返回被删除的值
    size():int 返回键值的数量

    hashCode():int 返回映射中各项哈希值之和
    equals(Map another):boolean 比较两个引用是否相等
    看到这里,我们发现在Map接口中重写了java.lang.Object中的equals(重写成各项哈希值之和)和hashCode()方法
    使得equals是比较内容,而不是比较引用
    又!是在Map中重写的,所以对Map下的所有子类之间都可以用equals去比较!


    Properties(属性列表)

    Properties的方法

    构造方法

    Properties():
    Properties(Properties default):
    因为Properties中有一个字段Properties defaults,这是一个默认的属性列表,包含未找到的默认值,所以第二的构造方法,就把default作为默认属性列表

    添加

    因为Properties必须添加

    得到

    getProperty(String key):String 得到值
    stringPropertySet():Set与Set转换

    写出去

    store(OutputStream out,String comments):void 用字节流输出
    store(Writer out,String comments):void 用字符流输出
    参数comments是注释,会出现的文件的首行,格式#comments
    不过注释千万不要写中文,因为好像是编码的原因,中文会出现乱码
    list(PrintStream out):void
    list(PrintWriter out):void
    将列表属性输出到指定的输出流可以用来打印
    目前我还没知道有什么作用
    注意:上面两个方法都不输出其默认属性列表
    写入各个项后,自动刷新输出流。此方法返回后,输出流仍保持打开状态。

    读进来

    load(InputStream in):void
    load(Reader):void
    和写进来的方法一样,此方法返回后,指定的流仍保持打开状态。
    对应相应输出时候的格式(字节or字符)

    用Properties的好处

    输出到文本的时候带有时间(相当于打印date对象),且自动换行
    输入的时候自动识别键和值
    因为值的数据类型是String,所以如果想对int进行操作就有点麻烦,这里有一个方法:
    java.lang.Integer.parseInt(String) 这是一个静态的方法,将十进制的字符串转换为数字

    用Properties做一个登录计数器

    import java.util.*;
    import java.io.*;
    public class LoginAccounter{
        public static void main(String[] args)throws IOException{
            File accounter=new File("accounter.properties");
            FileOutputStream out=new FileOutputStream(accounter,accounter.isFile());
            FileInputStream in=new FileInputStream(accounter);
            Properties account=new Properties();
            account.load(in);
            int time=Integer.parseInt(account.getProperty("Time","0"));
            if((++time)<3){
            System.out.println("少侠,风尘仆仆,梦幻西游一直在您左右,我们为您准备了在线大礼包,请听我道来
    您已经来到梦幻西游"+time+"次了,再登录"+(3-time)+"次,您就可以获得**在线大礼包**!!!");}
            else{System.out.println("少侠,您已经满足领取在线大礼包(登录10次)的条件了,请少侠移步至梦幻精灵处领取!!感谢您支持梦幻西游!");}
            account.setProperty("Time",(time)+"");
            account.store(out,"LoginAccounter");
        }}
  • 相关阅读:
    poj 1789 每个字符串不同的字母数代表两个结点间的权值 (MST)
    poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题
    poj 1631 最多能有多少条不交叉的线 最大非降子序列 (LIS)
    hdu 5256 最少修改多少个数 能使原数列严格递增 (LIS)
    hdu 1025 上面n个点与下面n个点对应连线 求最多能连有多少条不相交的线 (LIS)
    Gym 100512F Funny Game (博弈+数论)
    UVa 12714 Two Points Revisited (水题,计算几何)
    UVa 12717 Fiasco (BFS模拟)
    UVa 12718 Dromicpalin Substrings (暴力)
    UVa 12716 && UVaLive 6657 GCD XOR (数论)
  • 原文地址:https://www.cnblogs.com/wewill/p/5588760.html
Copyright © 2020-2023  润新知