首页 > 编程语言 >Java-Day-27( Properties 类 + 章节练习 )

Java-Day-27( Properties 类 + 章节练习 )

时间:2023-06-05 23:47:07浏览次数:55  
标签:27 Java String System properties new Properties out

Java-Day-27

Properties 类

  • 程序读取 xx.properties 配置文件,修改的话就通过配置文件将信息写入到程序 ( 非写死在程序中,灵活性差,编译代价大 )

  • 传统方法:

    public class Test {
        public static void main(String[] args) throws IOException { // 传统方法
    //        读取db.properties文件,并得到信息
            BufferedReader bufferedReader = new BufferedReader(new FileReader("src\\main\\resources\\db.properties"));
            String line = "";
            while ((line = bufferedReader.readLine()) != null) { // 循环读取
    //            直接输出文件内容
    //            System.out.println(line);
    
                String[] split = line.split("="); // 一次循环,分割一行,每行都"="分割
    //            键值对形式取出
    //            System.out.println(split[0] + "值为:" + split[1]);
    
    //            若是想专门取出某值
                if ("user".equals(split[0])) {
                    System.out.println(split[0] + "值是:" + split[1]);
                }
            }
            bufferedReader.close();
        }
    }
    

基本介绍

  • 专门用于读写配置文件的集合类

    • 配置文件格式:

      键=值

      键=值

  • 注意:键值对不需要有空格,值不需要用引号引起来。默认类型是 String

常用方法

  • load:加载配置文件的键值对到 Properties 对象
  • list:将数据显示到指定设备
  • getProperty(key):根据键获取值
  • setProperty(key, value):设置键值对到 Properties 对象
  • store:将 Properties 中的键值对存储到配置文件 ( 如果文件已存在,则覆盖 ),在 idea 中,保存信息到配置文件,如果含有中文,会存储为其 unicode 码

unicode 查询

public class Test {
    public static void main(String[] args) throws IOException {
//        使用 Properties 类来读取 mysql.properties 文件

//        1. 创建 Properties 对象
        Properties properties = new Properties();
//        2. 加载指定配置文件
        properties.load(new FileReader("src\\main\\resources\\db.properties"));
//        3. 把 k-v 显示到控制台(标准输出)
        properties.list(System.out);
//        4. 根据 key 获取对应的值
        String user = properties.getProperty("user");
        String pwd = properties.getProperty("pwd");
        System.out.println("用户名是:" + user + ", 密码是:" + pwd);
    }
}

练习

  • 使用 Properties 类完成对 mysql.properties 的读取

    • 如上述常用方法里的代码
  • 使用 Properties 类添加 key-val 到新文件 mysql1.properties 中

    public class Test {
        public static void main(String[] args) throws IOException {
    //        使用Properties 类创建配置文件.修改配置文件内容
    
            Properties properties = new Properties();
    //        之前没有此k-v,那就是创建
           properties.setProperty("charset", "utf8");
            properties.setProperty("user", "猪呀"); // 保存"猪呀"的unicode码值
            properties.setProperty("pwd", "abc111");
    
    //        将 k-v 存储文件中即可(流或者字节流的方式)
    //        comments:注释, null就算没有注释,否则会在生成文件时,在第一行多一条:"#注释"
            properties.store(new FileOutputStream("src\\main\\resources\\mysql1.properties"), null);
            System.out.println("保存配置文件成功~");
        }
    }
    
    • mysql1.properties 中

      #Sat Jun 03 22:21:58 CST 2023
      user=\u732A\u5440
      pwd=abc111
      charset=utf8
      
  • 使用 Properties 类完成对 mysql1.properties 的读取,并修改某个 key-val

    • 其他代码都同上述创建时候的代码操作

      //        如果该文件有key,就是修改(没有就是创建)
              properties.setProperty("charset", "utf8");
              properties.setProperty("user", "哇哈哈哈"); // 保存"猪呀"的unicode码值
              properties.setProperty("pwd", "123456");
      
    • 源码

      /*
          Properties 父类是 Hashtable, 底层就是Hashtable核心方法
          public synchronized V put(K key, V value) {
              if (value == null) {    // null的话就是空指针错误
                  throw new NullPointerException();
              }
      
              // Makes sure the key is not already in the hashtable.
              Entry<?,?> tab[] = table;
              int hash = key.hashCode();  // 已存在就是替换
              int index = (hash & 0x7FFFFFFF) % tab.length;
              @SuppressWarnings("unchecked")
              Entry<K,V> entry = (Entry<K,V>)tab[index];
              for(; entry != null ; entry = entry.next) {
                  if ((entry.hash == hash) && entry.key.equals(key)) {
                      V old = entry.value;
                      entry.value = value;  // 替换
                      return old;
                  }
              }
      
              addEntry(hash, key, value, index);  // 不存在,新的key,就是添加新的
              return null;
          }
      */
      

本章作业

  • 作业一要求:

    • 判断 e 盘下是否有文件夹 mytemp,如果没有就创建 mytemp

    • 在 e:\\mytemp 目录下,创建文件 hello.txt

    • 如果 hello.txt 已经存在,提示该文件已经存在,就不要再重复创建了

    • 若是新创建的 hello.txt 文件中,就直接写入 hello, world~

      public class Test {
          public static void main(String[] args) throws IOException {
              String directoryPath = "e:\\mytemp";
              File file = new File(directoryPath);
              if (! file.exists()) {
                  if (file.mkdirs()) {
                      System.out.println(directoryPath + " 下创建成功");
                  } else {
                      System.out.println(directoryPath + " 下创建失败了");
                  }
              }
              String filePath = directoryPath + "\\hello.txt"; // 目录 + 文件:完整路径
              file = new File(filePath);
              if (! file.exists()) {
      //            创建文件
                  if (file.createNewFile()) {
                      System.out.println(filePath + " 文件创建成功");
      //                如果文件存在,就要用BufferedWriter字符输入流写入内容
      //                处理流(节点流)
                      BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
                      bufferedWriter.write("hello, world~");
                      bufferedWriter.close();
                  } else {
                      System.out.println(filePath + " 创建失败了");
                  }
              } else {
                  System.out.println(filePath + " 已经存在,无需再建");
              }
          }
      }
      
  • 作业二要求:

    • 使用 BufferedReader 读取一个文本文件,为每行加上行号,再连同内容一并输出到屏幕上
    public class Test {
        public static void main(String[] args) throws IOException {
            String filePath = "e:\\mytemp\\hello.txt";
    //        String reFilePath = "e:\\mytemp\\re_hello.txt";
    //        String charset = "gbk";
            BufferedReader br = null;
            String line = "";
            int lineNum = 0;
            try {
                br = new BufferedReader(new FileReader(filePath));
    //            为防止出现编码规则不同导致汉字识别不符,就将FileInputStream转成InputStreamReader再转成BufferedReader
    //            br = new BufferedReader(new InputStreamReader(new FileInputStream(reFilePath), charset));
                while ((line = br.readLine()) != null) {
                    System.out.println("第" + ++lineNum + "行:" + line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (br != null) {
                        br.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
  • 作业三要求:

    • 要编写一个 dog.properties

      dogName=zyz

      age=5

      color=red

    • 编写 Dog 类 ( name, age, color ) 创建一个 dog 对象,读取 dog.properties 用相应的内容完成属性初始化,并输出

    • 将创建的 Dog 对象,序列化到文件 dog.dat 文件

    • 再反序列化在控制台显示

      public class Test_java {
          public static void main(String[] args) throws IOException {
      //        编写
              String fileName = "src\\main\\resources\\dog.properties";
              Properties properties = new Properties();
              properties.load(new FileReader(fileName));
              properties.list(System.out);
      
      //        用一个对象读取配置信息并存储
      //        Object dogName = properties.get("dogName");
      //        返回值是Object类型,但要求取到字符串信息
              String dogName = properties.get("dogName") + ""; // Object—>String:后面加一个空的""即可 (或重新再new)
              int age = Integer.parseInt(properties.get("age") + ""); // Object—>int(通过String)
              String color = properties.get("color") + ""; // 同样加一个空串
              Dog dog = new Dog(dogName, age, color);
              System.out.println("===dog对象信息===");
              System.out.println(dog);
      
      //        序列化到文件dog.dat(注意,一个对象想被序列化,就得实现Serializable接口)
              String serFilePath = "e:\\dog.dat";
              ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(serFilePath));
              oos.writeObject(dog);
              oos.close();
              System.out.println("dog对象序列化完成");
          }
          
      //        再编写一个方法,反序列化dog
          @Test
          public void m1() throws Exception {
              String serFilePath = "e:\\dog.dat";
              ObjectInputStream ois = new ObjectInputStream(new FileInputStream(serFilePath));
              Dog dog = (Dog) ois.readObject();
              System.out.println("===反序列化后dog对象信息===");
              System.out.println(dog);
              ois.close();
          }
      
      }
      
      class Dog implements Serializable{
          private String dogName;
          private int age;
          private String color;
      
          public Dog(String dogName, int age, String color) {
              this.dogName = dogName;
              this.age = age;
              this.color = color;
          }
          
      //    getter and setter 
      //    ......
      
          @Override
          public String toString() {
              return "Dog{" +
                      "dogName='" + dogName + '\'' +
                      ", age=" + age +
                      ", color='" + color + '\'' +
                      '}';
          }
      }
      
    • 使用@Test注解时报错

      • 报错修改后显示@org.junit.jupiter.api.Test:所在类名也叫Test,
      • 没导jar包 ( 依赖 ):junit
      • 依赖版本低

标签:27,Java,String,System,properties,new,Properties,out
From: https://www.cnblogs.com/zhu-ya-zhu/p/17459301.html

相关文章

  • Java官方笔记7接口
    接口接口只能包含:constants,methodsignatures(abstract),defaultmethods,staticmethods,andnestedtypes方法体只存在于:defaultmethodsandstaticmethods接口不能实例化,只能被类实现,或者被其他接口继承(接口可以多继承)。定义接口:publicinterfaceOperateCar{/......
  • 【Java】再谈Springboot 策略模式
     第一次使用策略模式是一年前的一个项目:https://www.cnblogs.com/mindzone/p/16046538.html当时还不知道Spring支持集合类型的自动装配在最近一个项目,我发现很多业务需要频繁的使用这种模式去聚合代码 一、牛刀小试这是最开始的定义策略的业务接口/***业务推送管......
  • TypeScript Vs JavaScript 区别
    一、观察1.JS平常的复制类型letval;val=123;val="123";val=true;val=[1,3,5];注意点:由于JS是弱类型的,所以只要定义了一个变量,就可以往这个变量中存储任意类型的数据也正是因为如此,所以会给我们带来一个问题2.假设a是一个数组,b是一个数值func......
  • Elastic_Search 和java的入门结合
    1,pom文件添加依赖... 2,config配置文件  3,写接口文件 ......
  • Java如何实现去重?这是在炫技吗?
    大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。austin支持两种去重的类型:N分钟相同内容达到N次去重和一天内N次相同渠道频次去重。Java开源项目消息推送平台......
  • Java学习笔记(十五)
    1.请描述你理解的转换流 转换流(InputStreamReader和OutputStreamWriter)是字节流和字符流之间的一种桥梁,用于将字节流转换为字符流或将字符流转换为字节流。转换流可以解决字节流和字符流之间的编码转换问题,从而使得我们可以方便地在不同的字符集之间进行转换。2.请描述你理解......
  • java程序设计对文件的操作
    1文件的读入与写进importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){try{FileinFile=newFile("D://example.txt");BufferedReaderbf=newBufferedReader(newFileReader(inFile));......
  • Java中为什么禁止把SimpleDateFormat定位为static变量以及如果非要使用static定位Simp
    场景Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/art......
  • Java开发手册中为什么不建议在for循环中使用"+"进行字符串操作
    场景java开发手册中对于循环体中进行字符串的拼接要求如下:【推荐】循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展。说明:下例中,反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回Stri......
  • 记录--JavaScript 中有趣的 9 个常用编码套路
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助1️⃣set对象:数组快速去重常规情况下,我们想要筛选唯一值,一般会想到遍历数组然后逐个对比,或者使用成熟的库比如lodash之类的。不过,ES6带来了一个新玩意儿!它引入了一个全新的对象类型:Set!而且,如果结合上...展开运算符......