Java中Properties类的简介

阅读更多
之前针对项目的配置文件,遇到xml我们直接就用现在的开源框架dom4j或者jdom去解析,但是现在遇到一个后缀为properties的文件,里面保存的都是一些键值对,想想,我们还能去用那两种方式去解析吗?如果可以,那表示小弟还没有接触到哪个层面,目前只会用其最常用的,针对xml文件的解析,但是碰见类似于下面的键值对,我们该如何去做?难道要一行行的读出来,然后去判断等号的位置,然后进行截取?我不能说你这种方法不好,但是如果有简单的办法,为什么不用呢?还要自己去写读取的逻辑呢?而且如果考虑到代码的复用性,你还不得不考虑性能问题,一般来说,Java提供的api也是经过千锤百炼的,除非你是是牛逼的开发人员,不然还是建议老老实实用java提供的api吧。

下面我们就看一种最简单的文件读取吧。

下面的文件内容保存在我本地的F:\Work\properties中。
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:oracle
jdbc.username=test
jdbc.password=test

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class UtilProperties 
{

	public static void main(String[] args) 
	{
		
		File file = new File("F:\\Work\\properties\\db.properties");
		
		FileInputStream fi = null;
		
		try 
		{
			fi = new FileInputStream(file);
		} catch (FileNotFoundException e) 
		{
			e.printStackTrace();
		}
		
		Properties p = new Properties();
		
		try 
		{
			p.load(fi);
		} catch (IOException e) 
		{
			e.printStackTrace();
		}
		
		p.list(System.out);
		
	}
}

运行结果输出如下。(此方法一般用于调试)
-- listing properties --
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:oracle
jdbc.username=test
jdbc.password=test
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver

下面这种方式的输出才是我们需要用到的,
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

public class UtilProperties 
{

	public static void main(String[] args) 
	{
		
		File file = new File("F:\\Work\\properties\\db.properties");
		
		FileInputStream fi = null;
		
		try 
		{
			fi = new FileInputStream(file);
		} catch (FileNotFoundException e) 
		{
			e.printStackTrace();
		}
		
		Properties p = new Properties();
		
		try 
		{
			p.load(fi);
		} catch (IOException e) 
		{
			e.printStackTrace();
		}
		
		Enumeration e = p.propertyNames();
		
		while(e.hasMoreElements())
		{
			Object obj = e.nextElement();
			System.out.println(obj+"="+p.getProperty((String) obj));
		}
		
	}
}

结果如下:
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:oracle
jdbc.username=test
jdbc.password=test
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver

虽然你发现输出反而少了一行,但是你可以看下我们的输出代码的写法,如果我们不用去输出,而是把他set进入一个对象的属性中去,那我们岂不是能够通过此方法,获得文件的记录,然后入库或者都可以了,是不是很简单,但是你会发现,我们这样做仅仅不够,很多人就会问了,这个类就只有这一个作用吗?别着急,下面我们就开始进入另一个相对比较常见的方式, xml文件解析

xml文件这次我们保存在我们的项目路径下D:\Workspace\TESTFOROJ

文件的内容如下:



jdbc:oracle:thin:@127.0.0.1:1521:oracle
test
test
oracle.jdbc.driver.OracleDriver



我们需要解析的代码就变成如下代码了:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;

public class UtilProperties 
{

	public static void main(String[] args) 
	{

		File file = new File("D:\\Workspace\\TESTFOROJ\\db.xml");

		FileInputStream fi = null;

		try 
		{
			fi = new FileInputStream(file);
		} catch (FileNotFoundException e) 
		{
			e.printStackTrace();
		}

		Properties p = new Properties();

		try 
		{
			p.loadFromXML(fi);
		} catch (InvalidPropertiesFormatException e1) 
		{
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		@SuppressWarnings("unchecked")
		Enumeration e = (Enumeration) p.propertyNames();

		while (e.hasMoreElements()) 
		{
			Object obj = e.nextElement();
			System.out.println(obj + "=" + p.getProperty((String) obj));
		}

	}
}输出结果如下: 
 
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:oracle
jdbc.username=test
jdbc.password=test
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver

以上是举例我们如何进行xml文件的读取, 其实我们还可以做到 xml文件的保存
我们还是以上个文件为例,代码如下
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Enumeration;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;

public class UtilProperties 
{
	
	private static void getXML(Properties p,String fileName)
	{
		File file = new File(fileName);

		FileInputStream fi = null;

		try 
		{
			fi = new FileInputStream(file);
		} catch (FileNotFoundException e) 
		{
			e.printStackTrace();
		}

		try 
		{
			p.loadFromXML(fi);
		} catch (InvalidPropertiesFormatException e1) 
		{
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}

		@SuppressWarnings("unchecked")
		Enumeration e = (Enumeration) p.propertyNames();

		while (e.hasMoreElements()) 
		{
			Object obj = e.nextElement();
			System.out.println(obj + "=" + p.getProperty((String) obj));
		}
	}

	public static void main(String[] args) 
	{

		Properties p = new Properties();
		
		//读取文件
		getXML(p,"D:\\Workspace\\TESTFOROJ\\db.xml");
		//改变我们读进来的属性,然后输出到另一个xml文件中去
		
		p.setProperty("jdbc.username", "OOOOOOXXXXXXXX");
		
		PrintStream ps = null;
		String fileName = "D:\\Workspace\\TESTFOROJ\\db_bak.xml";
		
		try {
			ps = new PrintStream(new File(fileName));
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		try {
			p.storeToXML(ps, "this is print xml,just for test");
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		//看下改变之后的文件内容
		getXML(p,fileName);

	}
} 
 
下面是我们的输出结果:
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:oracle
jdbc.username=test
jdbc.password=test
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:oracle
jdbc.username=OOOOOOXXXXXXXX
jdbc.password=test
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver


注意,此类还有很多我没有涉及到的,一些高级的属性,后续会慢慢研究,此文章只为备忘,如果有朋友看到了,有觉得不对的地方,请尽管提出来。注意,代码中有一些后续工作没有处理,比如流的关闭,我是没有做的,希望大家要注意哦。

以下是load方法的解释。
Open Declaration void java.util.Properties.load(InputStream inStream) throws IOException


Reads a property list (key and element pairs) from the input byte stream. The input stream is in a simple line-oriented format as specified in load(Reader) and is assumed to use the ISO 8859-1 character encoding; that is each byte is one Latin1 character. Characters not in Latin1, and certain special characters, are represented in keys and elements using Unicode escapes. 

The specified stream remains open after this method returns



你可能感兴趣的:(java,xml,properties,用法)