本帖最后由 左拉 于 2014-4-18 16:09 编辑
1. Properties类
Properties类的主要功能是用于操作属性,在各个语言(包括操作系统)都会存在着许多的配置文件。所有的属性文件中的属性都是按照“key=value”的形式保存的,而且保存的内容都是String(字符串),此类定义如下:
public class Properties extends Hashtable<Object,Object>
此类是Hashtable的子类,而且已经默认指定好了泛型是Object,但是所有的属性操作中的类型肯定都是字符串,那么操作的时候主要使用的是Properties类完成。
Properties类中定义的主要操作方法:
1 public Object setProperty(String key,String value) 设置属性
2 public String getProperty(String key) 根据属性的名字取得属性的内容,如果没有返回null结果
3 public String getProperty(String key,String defaultValue) 根据属性的名字取得属性内容,如果没有则返回默认值(defaultValue)
4 public void list(PrintStream out) 从一个输出流中显示所有的属性内容
5 public void store(OutputStream out,String comments) throws IOException 向输出流中输出属性
6 public void load(InputStream inStream) throws IOException 从输入流中读取属性内容
7 public void storeToXML(OutputStream os,String comment) throws IOException 以XML文件格式输出属性内容
8 public void loadFromXML(InputStream in) throws IOException,InvalidPropertiesFormatException 以XML文件格式输入属性内容
1.1 设置和取得属性
import java.util.Properties;
public class PropertiesDemo01 {
public static void main(String[] args) {
Properties pro = new Properties();
pro.setProperty("BJ", "BeiJing");
pro.setProperty("NJ", "NanJing");
System.out.println(pro.getProperty("BJ"));
System.out.println(pro.getProperty("TJ"));
System.out.println(pro.getProperty("TJ", "没有此地区"));
}
}
1.2、保存和读取属性
所有的属性的内容都是可以通过输出和输入流进行保存和读取的,下面先通过代码观察如何保存在普通的文件之中。
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
public class PropertiesDemo02 {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.setProperty("BJ", "BeiJing");
pro.setProperty("NJ", "NanJing");
pro.store(new FileOutputStream(new File("D:" + File.separator + "area.properties")), "AREA INFO");
}
此时通过一个普通的文件流将所有的属性保存在了文件之中,而且一定要记住,所有的属性文件一定要使用“*.properties”作为后缀。
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
public class PropertiesDemo03 {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.load(new FileInputStream(new File("D:" + File.separator+ "area.properties")));
System.out.println(pro.getProperty("BJ"));
System.out.println(pro.getProperty("TJ"));
System.out.println(pro.getProperty("TJ", "没有此地区"));
}
}
以上是将属性保存在了普通文件之中,也可以将其保存在XML文件之中,代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.util.Properties;
public class PropertiesDemo04 {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.setProperty("BJ", "BeiJing");
pro.setProperty("NJ", "NanJing");
pro.storeToXML(new FileOutputStream(new File("D:" + File.separator + "area.xml")), "AREA INFO");
}
}
以后肯定也只能从XML文件格式中读取属性了。
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
public class PropertiesDemo05 {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.loadFromXML(new FileInputStream(new File("D:" + File.separator+ "area.xml")));
System.out.println(pro.getProperty("BJ"));
System.out.println(pro.getProperty("TJ"));
System.out.println(pro.getProperty("TJ", "没有此地区"));
}
}
1.3、列出属性
在实际的开发中,如果使用了IO流进行操作的话,有可能由于编码的不同而造成乱码的问题,因为程序的编码和本地环境的编码不统一,所以会造成乱码的显示,那么该如何查询本地编码呢,就需要通过Properties类的list()方法完成。
public class PropertiesDemo06 {
public static void main(String[] args) throws Exception {
System.getProperties().list(System.out) ;
}
}
关于文件的编码,在程序中主要有以下几种:
· GB2312、GBK:表示的是国标编码,2312表示的是简体中文,而GBK包含了简体和繁体中文
· ISO 8859-1:主要用于英文字母的编码方式
· UNICODE:Java中使用十六进制进行编码,能够表示出世界上所有的编码
· UTF编码:中文采用十六进制,而普通的字母依然采用和ISO 8859-1一样的编码
在以后的程序中经常会出现乱码的问题,这种问题造成的根本原因就是在于编码不统一。
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class EncodingDemo {
public static void main(String[] args) throws Exception {
OutputStream output = new FileOutputStream(new File("D:" + File.separator + "hello.txt"));
String info = "你好啊,中国!" ;
output.write(info.getBytes("ISO8859-1")) ;
output.close() ;
}
}
工厂设计终极版
工厂设计经过发展已经有两种模型:
1、 简单工厂,所有的工厂类随着子类的增加而要修改
2、 反射工厂,只要传递进去完整的包.类,就可以完成实例化操作
但是,第2种实现本身也有问题,因为每次都要传递一个完整的“包.类”实在是太麻烦了。
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
interface Area {
public void getInfo();
}
class BeiJing implements Area {
public void getInfo() {
System.out.println("你在北京,欢迎您!");
}
}
class NanJing implements Area {
public void getInfo() {
System.out.println("你在南京,欢迎您!");
}
}
class Factory {
public static Area getInstance(String className) {
Area a = null;
try {
a = (Area) Class.forName(className).newInstance();
} catch (Exception e) {
}
return a;
}
}
public class FactoryDemo {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.load(new FileInputStream(new File("D:" + File.separator
+ "area.properties")));
Area a = Factory.getInstance(pro.getProperty("area"));
a.getInfo();
}
}
配置文件:area.properties
area=org.lxh.factorydemo.NanJing
现在的程序中可以发现,都是通过配置文件控制的,而且只要配置文件改变了,程序可以立刻发生改变。达到了配置文件与程序相分离的目的。
|
|