A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 左拉 中级黑马   /  2014-4-18 16:09  /  599 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 左拉 于 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

         现在的程序中可以发现,都是通过配置文件控制的,而且只要配置文件改变了,程序可以立刻发生改变。达到了配置文件与程序相分离的目的。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马