Day 19:Properties配置文件类、打印流(printStream) 、 编码与解码


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

  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");
        
        
    }
    
}

 方法一效果jvm

#way:1
#Sat Aug 04 11:08:30 CST 2018
\u674E\u6770=999
\u674E\u6C49\u4E09=888
\u674E\u82F1=666ide

方法二效果this

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

 

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

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)  打印流能够打印任意类型的数据,并且打印数据以前都会先把数据转换成字符串再进行打印。
 code

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);    
        }    
    }
}

 

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

注意: 之后编码与解码通常咱们都使用统一的码表。不然很是容易出乱码。blog

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);        
    }    
}
相关文章
相关标签/搜索