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