• 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");
        }}
  • 相关阅读:
    anaconda环境---ubuntu下重装
    算法---Face_Recognition配置实战篇
    算法---FaceNet+mtcnn的使用记录
    算法---FaceNet理论学习篇
    算法---FaceNet在Tf下的实战篇
    ubuntu系统---切换Py2.X与Py3.X版本
    anaconda环境中---py2.7下安装tf1.0 + py3.5下安装tf1.5
    Git---初入开源代码管理库的学习过程003
    day 87 Vue学习六之axios、vuex、脚手架中组件传值
    day 86 Vue学习之五DIY脚手架、webpack使用、vue-cli的使用、element-ui
  • 原文地址:https://www.cnblogs.com/wewill/p/5588760.html
Copyright © 2020-2023  润新知