zoukankan      html  css  js  c++  java
  • Day 19:Properties配置文件类、打印流(printStream) 、 编码与解码


    Properties(配置文件类): 主要用于生产配置文件与读取配置文件的信息。

      Properties要注意的细节:
         1. 如果配置文件的信息一旦使用了中文,那么在使用store方法生成配置文件的时候只能使用字符流解决,如果使用字节流生成配置文件的话,
          默认使用的是iso8859-1码表进行编码存储,这时候会出现乱码。
         2. 如果Properties中的内容发生了变化,一定要重新使用Properties生成配置文件,否则配置文件信息不会发生变化。
     

    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Properties;
    
    //存配置文件
    public class Demo1 {
        public static void main(String[] args) throws IOException {
            Properties p = new Properties();
            p.setProperty("李杰", "999");
            p.setProperty("李英", "666");
            p.setProperty("李汉三", "888");
            
            /*复习遍历(properties基于hashtable基于Map,所以用entrySet遍历)
            Set<Entry<Object, Object>> a = p.entrySet();
            for(Entry<Object, Object> b:a) {
                System.out.println(b);
            }*/
            
            //使用Properties产生配置文件
            //方法一:使用字节输出流无法输出汉字,只会出现乱码,因为底层用的是拉丁字符表
            p.store(new FileOutputStream("F:\a.properties"), "way:1");
            //方法二:使用字符输出流输出汉字,底层用的是GBK表
            p.store(new FileWriter("F:\b.properties"), "way:2");//way:2处还是无法正常解码中文,需要注意
        }
    }
    //加载、修改配置文件
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Map.Entry;
    import java.util.Properties;
    import java.util.Set;
    
    public class Demo2 {
        public static void main(String[] args) throws IOException {
            readProperties();
        }
        public static void readProperties() throws IOException{
            Properties properties = new Properties();
            properties.load(new FileReader("F:\b.properties"));
            //遍历properties判断是否加载成功
            Set<Entry<Object, Object>> entrys = properties.entrySet();
            for(Entry<Object, Object> entry  :entrys){
                System.out.println("键:"+ entry.getKey() +" 值:"+ entry.getValue());
            }
            
            //修改李杰的密码,把修改后的Properties再生成一个配置文件
            properties.setProperty("李杰", "007");
            properties.store(new FileWriter("F:\b.properties"), "ways:2");
            
            
        }
        
    }

     方法一效果

    #way:1
    #Sat Aug 04 11:08:30 CST 2018
    u674Eu6770=999
    u674Eu6C49u4E09=888
    u674Eu82F1=666

    方法二效果

    #ways:2
    #Sat Aug 04 11:08:37 CST 2018
    李杰=007
    李汉三=888
    李英=666

    练习: 使用properties实现本软件只能 运行三次,超过了三次之后就提示购买正版,退jvm.

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Properties;
    
    public class Demo3 {
        
        public static void main(String[] args) throws IOException {
            File file = new File("F:\count.properties");
            if(!file.exists()){
                file.createNewFile();//如果配置文件不存在,则创建该配置文件
            }
            
            Properties properties = new Properties();
            properties.load(new FileInputStream(file));//把配置文件的信息加载到properties中
            FileOutputStream fileOutputStream = new FileOutputStream(file);//必须放在加载之后,不然他会清空文件内容
    
            int count = 0; //定义该变量是用于保存软件的运行次数的。
            String value = properties.getProperty("count");//读取配置文件的运行次数
            if(value!=null){
                count = Integer.parseInt(value);
            }
            //判断使用的次数是否已经达到了三次,
            if(count==3){
                System.out.println("你已经超出了试用次数,请购买正版软件!!");
                System.exit(0);
            }
            count++;
            System.out.println("你已经使用了本软件第"+count+"次");
            properties.setProperty("count",count+"");
            //使用Properties生成一个配置文件
            properties.store(fileOutputStream,"runtime");
        }
    }


    打印流(printStream)  打印流可以打印任意类型的数据,而且打印数据之前都会先把数据转换成字符串再进行打印。
     

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintStream;
    
    class Animal{
        
        String name;
        String color;
        
        public Animal(String name,String color){
            this.name = name;
            this.color = color;
        }
        
        @Override
        public String toString() {
            return "名字:"+this.name+ " 颜色:"+ this.color;
        }
    }
    
    public class Demo4 {
        
        public static void main(String[] args) throws IOException {
            /*FileOutputStream fileOutputStream = new FileOutputStream("F:\a.txt");
            fileOutputStream.write("97".getBytes());
            fileOutputStream.close();*/
    
            File file = new  File("F:\a.txt");
            //创建一个打印流
            PrintStream printStream = new PrintStream(file);
            /*
            printStream.println(97);
            printStream.println(3.14);
            printStream.println('a');
            printStream.println(true);
            Animal a = new Animal("天空", "蓝色");
            printStream.println(a);
            
            
            //默认标准的输出流就是向控制台输出的,
            System.setOut(printStream); //重新设置了标准的输出流对象
            System.out.println("的健身卡好的艰苦");
            */
            
            File logFile = new File("F:\2015年1月8日.log");
            PrintStream logPrintStream = new PrintStream( new FileOutputStream(logFile,true) );
            try{
                int c = 4/0;
                System.out.println("c="+c);
                int[] arr = null;
                System.out.println(arr.length);
                
            }catch(Exception e){
                e.printStackTrace(logPrintStream);    
            }    
        }
    }

    编码与解码 
      编码: 把看得懂的字符变成看不懂码值这个过程我们称作为编码。
      解码: 把码值查找对应的字符,我们把这个过程称作为解码。

    注意: 以后编码与解码一般我们都使用统一的码表。否则非常容易出乱码。

    import java.io.UnsupportedEncodingException;
    import java.util.Arrays;
    
    public class Demo7 {
        
        public static void main(String[] args) throws Exception {
            /*
            String str = "中国";
            byte[] buf = str.getBytes("utf-8");// 平台默认的编码表是gbk编码表。  编码
            System.out.println("数组的元素:"+Arrays.toString(buf)); //
            str = new String(buf,"utf-8");  //默认使用了gbk码表去解码。 
            System.out.println("解码后的字符串:"+ str);        
            */
            
            /*String str = "a中国"; // ,0, 97, 78, 45, 86, -3
            byte[] buf = str.getBytes("unicode");  //编码与解码的时候指定 的码表是unicode实际上就是用了utf-16.
            System.out.println("数组的内容:"+ Arrays.toString(buf));
            */
            
            String str = "大家好";
            byte[] buf = str.getBytes(); //使用gbk进行编码
            System.out.println("字节数组:"+ Arrays.toString(buf));  // -76, -13, -68, -46, -70, -61
            
            str = new String(buf,"iso8859-1");
            // 出现乱码之后都可以被还原吗? 
            
            byte[] buf2 = str.getBytes("iso8859-1");
            str = new String(buf2,"gbk");
            System.out.println(str);        
        }    
    }
  • 相关阅读:
    centos磁盘满了,查找大文件并清理
    centos如何查看磁盘剩余空间
    无法连接mysql,请检查mysql是否已启动及用户密码是否设置正确
    HTTP/1.1新建会话失败 解决方法及分析
    PHP 获取 IE浏览器版本号
    基于Android Studio搭建Android应用开发环境
    打印机重启后才能打印
    洛谷P1141 01迷宫【DFS】
    洛谷P1219 八皇后【DFS】
    UVA133
  • 原文地址:https://www.cnblogs.com/JYDesigner/p/9417968.html
Copyright © 2011-2022 走看看