信息发布软件,b2b软件,广告发布软件
标题: JAVA技术:XML配置文件的读取处理多方法实例教程 [打印本页]
作者: 宣传软件 时间: 2016-9-24 08:31
标题: JAVA技术:XML配置文件的读取处理多方法实例教程
Java和XML是黄金组合,网上已经有很多文章介绍,XML作为电子商务中数据交换,已经有其不可替代的作用,但是在平时系统开发中,我们不一定都用到数据交换,是不是无法使用XML了?
当然不是,现在已经有一个新趋势,java程序的配置文件都开始使用XML格式,以前是使用类似windows的INI格式。(Java中也有Propertiesy这样的类专门处理这样的属性配置文件)。使用XML作为Java的配置文件有很多好处,从Tomcat的安装配置文件和J2ee的配置文件中,我们已经看到XML的普遍应用,让我们也跟随流行趋势用XML武装起来。
现在关键是如何读取XML配置文件?有好几种XML解析器:主要有DOM和SAX ,这些区别网上文章介绍很多。
在apache的XML项目组中,目前有Xerces Xalan Cocoon几个开发XML相关技术的project.Tomcat本身使用的是 Sun 的 JAXP,而其XSL Taglib project中使用Xerces解析器。
好了,上面都是比较烦人的理论问题,还是赶快切入XML的配置文件的读取吧。
在我们的程序中,通常要有一些根据主机环境确定的变量。比如数据库访问用户名和密码,不同的主机可能设置不一样。只要更改XML配置文件,就可以正常运行。
localhost
sqlname
username
password
上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下。
我们编制一个Java程序直接读取,将dbhost dbuser dbpassword提取出来供其他程序访问数据库用。
目前使用SAX比较的多,与DOM主要区别是 SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件。这里我们使用SAX解析,由于SAX解析器不断在发展,网上有不少文章是针对老版本的。如果你使用JDK1.4 ,可以参考 使用SAX处理XML文档 一文。这里的程序是根据其改进并且经过实践调试得来的。
对上面myenv.xml读取的Java程序:
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import java.util.Properties;
//使用DefaultHandler的好处 是 不必陈列出所有方法,
public class ConfigParser extends DefaultHandler {
////定义一个Properties 用来存放 dbhost dbuser dbpassword的值
private Properties props;
private String currentSet;
private String currentName;
private StringBuffer currentValue = new StringBuffer();
//构建器初始化props
public ConfigParser() {
this.props = new Properties();
}
public Properties getProps() {
return this.props;
}
//定义开始解析元素的方法. 这里是将中的名称xxx提取出来.
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
currentValue.delete(0, currentValue.length());
this.currentName =qName;
}
//这里是将之间的值加入到currentValue
public void characters(char[] ch, int start, int length) throws SAXException {
currentValue.append(ch, start, length);
}
//在遇到结束后,将之前的名称和值一一对应保存在props中
public void endElement(String uri, String localName, String qName) throws SAXException {
props.put(qName.toLowerCase(), currentValue.toString().trim());
}
}
上面的这个解析程序比较简单吧? 其实解析XML就是这么简单。
现在我们已经将dbhost dbuser dbpassword的值localhost sqlname username password提取了出来。但是这只是在在解析器内部,我们的程序还不能访问。需要再编制一个程序。
import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.net.URL;
public class ParseXML{
//定义一个Properties 用来存放 dbhost dbuser dbpassword的值
private Properties props;
//这里的props
public Properties getProps() {
return this.props;
}
public void parse(String filename) throws Exception {
//将我们的解析器对象化
ConfigParser handler = new ConfigParser();
//获取SAX工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
//获取SAX解析
SAXParser parser = factory.newSAXParser();
//得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes
//下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义
URL confURL = BeansConstants.class.getClassLoader().getResource(filename);
try
{
//将解析器和解析对象myenv.xml联系起来,开始解析
parser.parse(confURL.toString(), handler);
//获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了
props = handler.getProps();
}finally{
factory=null;
parser=null;
handler=null;
}
}
}
由于我们的XML文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了。
作者: 宣传软件 时间: 2016-9-24 08:33
多方法实例1
一、使用org.apache.commons.configuration
需要使用的是jar包:commons-collections-3.2.1.jar、commons-configuration-1.10.jar、commons-lang-2.6.jar和commons-logging-1.2.jar。
可以读取的配置文件:xml和properties
1、读取xml文件
[java] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:12px;">package com.styspace;
-
- import org.apache.commons.configuration.Configuration;
- import org.apache.commons.configuration.ConfigurationException;
- import org.apache.commons.configuration.XMLConfiguration;
- public class xmlLoaderTest {
-
- public static void main(String[] args) throws ConfigurationException{
- Configuration config = new XMLConfiguration("com/styspace/config.xml");
- String name = config.getString("Account.name");
- System.out.println("name:" + name);
- }
- }
- </span>
需要注意的是config.getString(“Account.name”)中的参数是Account.name,这个参数是XPath格式的,而且不能包含xml中的根元素。
使用到的config.xml内容如下:
[html] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:12px;"><?xml version="1.0" encoding="gbk"?>
- <Accounts>
- <Account type="by0003">
- <code>100001</code>
- <pass>123</pass>
- <name>李四</name>
- <money>1000000.00</money>
- </Account>
- </Accounts></span>
2、读取properties文件
[java] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:12px;">package com.styspace;
-
- import org.apache.commons.configuration.Configuration;
- import org.apache.commons.configuration.ConfigurationException;
- import org.apache.commons.configuration.PropertiesConfiguration;
-
- public class peropertiesLoaderTest {
-
- public static void main(String[] args) throws ConfigurationException{
- Configuration config = new PropertiesConfiguration("com/styspace/config.properties");
- String name = config.getString("name");
- System.out.println("name:" + name);
- }
- }
- </span>
使用到的config.properties文件内容如下:
[plain] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:12px;">threads.max=50threas.min=2
- timout=15.52
- interactive=true
- color=red
- speed=50
- name=Default User</span>
二、使用java.util.Properties读取
[java] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:12px;">package com.styspace;
-
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Properties;
-
- public class PropertiesTest {
- public static void main(String[] args){
- PropertiesTest pt = new PropertiesTest();
- try {
- pt.getProperties();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
-
- private void getProperties() throws IOException {
- InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("com/styspace/config.properties");
- System.out.println("begin!!!");
- Properties properties = new Properties();
- try{
- properties.load(inputStream);
- }catch (IOException ioE){
- ioE.printStackTrace();
- }finally{
- inputStream.close();
- }
- System.out.println("name:"+properties.getProperty("name"));
- }
- }
- </span>
需要注意的是hetClassLoader().getResourceAsStream()的参数是项目根目录下的路径,尽管config.properties是该该类文件在相同的目录下,但是不能写成getClassLoader().getResourceAsStream("config.properties"),这样程序会报错,得到的InputStream是null值。
ClassLoader()和URLClassLoader()区别:ClassLoader()只能查找src目录下的文件,而URLClassLoader()则能查找任意目录下的文件。
三、spring中配置文件的读取
1、ClassPathXmlApplicationContext:从类路径中加载。
2、FileSystemXmlApplicationContext:从文件系统加载。
3、XmlWebApplicationContext:从web系统中加载。
1、使用bean工厂获取bean
[java] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:12px;"> BeanFactory factory = null; //声明
-
- ClassPathResource resource = new ClassPathResource("spring.xml");//类路径
- factory= new XmlBeanFactory(resource);
-
- FileSystemResource fileSystemResource = new FileSystemResource("D:\\Ncode\\mcode\\sday02\\src\\spring.xml");//文件路径
- factory= new XmlBeanFactory(fileSystemResource);
-
- //XmlBeanFactory(参数可以是resource或者fileSystemResource等
- //但是不能是 res 原因可以查看:文档Part III. Core Technologies 6. Resources
- //中6.2 The Resource interface 有关isOpen方法的说明);
- //InputStreamResource res = new InputStreamResource(new FileInputStream("D:\\Ncode\\mcode\\sday02\\src\\spring.xml"));//系统路径
-
- HelloService helloService = factory.getBean("helloServiceImpl", HelloServiceImpl.class);
- helloService.sayHello();</span>
2、使用上下文(Context)
上下文更加高级:提供文本信息解析工具,包括对国际化支持;提供载入文件资源的通用方法,如图片;可以向注册为监听器的bean发送事件。
在很少的情况下,使用BeanFactory。
[java] view plain copy
- <span style="font-family:Microsoft YaHei;font-size:12px;"> //从文件系统
- ApplicationContext context = new FileSystemXmlApplicationContext("file:\\Ncode\\mcode\\sday02\\src\\spring.xml");
- //从类路径
- ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
-
- HelloService helloService = context.getBean("helloServiceImpl", HelloServiceImpl.class);
- helloService.sayHello();</span>
3、在web应用中使用
3.1、使用XmlWebApplicationContext
[java] view plain copy
- XmlWebApplicationContext context = new XmlWebApplicationContext();
- //默认的路径/WEB-INF/applicationContext.xml
- //applicationContext.xml文件名称 可以任意起
- //重新设置路径
- //context.setConfigLocations(new String[] {"/WEB-INF/classes/applicationContext.xml"});
- //设置ServletContext上下下文为web应用程序的上下文
- context.setServletContext(getServletContext());
- //刷新
- context.refresh();
- //根据id名称获取
- HelloDao helloDao = context.getBean("helloDaoImpl", HelloDaoImpl.class);
- //执行helloDao对象的方法
- helloDao.sayHello();
3.2、使用WebApplicationContextUtils工具类
[java] view plain copy
- //直接采用getWebApplicationContext(getServletContext()) 获取context对象
- WebApplicationContext context=
- WebApplicationContextUtils.getWebApplicationContext(getServletContext());
- //context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
- System.out.println(context);
- HelloDao helloDao = context.getBean("helloDaoImpl", HelloDaoImpl.class);
- helloDao.sayHello()
两者的区别是:
1、当采用getWebApplicationContext(getServletContext())获取context对象的时候,输出的context对象为null 所以在使用
context.getBean("helloDaoImpl", HelloDaoImpl.class);会出现空指针的异常
2、当采用getRequiredWebApplicationContext(getServletContext());获取context对象的时候 会出现如下bug
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered
作者: 宣传软件 时间: 2016-9-24 08:35
多方法实例教程3
一 使用原生方式读取配置文件
1 文件系统加载
Java代码
- InputStream in = new FileInputStream("config.properties");
- Properties p = new Properties();
- p.load(in);
2 类加载方式
A 与类同级目录
Java代码
- InputStream in = Main.class.getResourceAsStream("config.properties");
B 在类的下一级目录
Java代码
- InputStream in =
- Main.class.getResourceAsStream("resource/config.properties");
C 指定加载资源配置文件的classes相对路径
Java代码
- InputStream in =
- Main.class.getResourceAsStream("/test/resource/config.properties");
注意事项:如上以/开头的是指从根目录开始加载。
D 使用类加载器的方式
Java代码
- InputStream in = Main.class.getClassLoader().
- getResourceAsStream("test/resource/config.properties");
E 资源配置文件在classes下
Java代码
- InputStream in =
- Main.class.getClassLoader().getResourceAsStream("config.properties");
二 使用apache提供的功能组件
参照网上相关资料
1 读取properties文件的方式
示例代码
Java代码
- import java.util.List;
- import org.apache.commons.configuration.Configuration;
- import org.apache.commons.configuration.ConfigurationException;
- import org.apache.commons.configuration.PropertiesConfiguration;
-
- public class PropertiesConfigurationDemo {
-
- public static void main(String[] args) throws ConfigurationException {
-
- Configuration config = new PropertiesConfiguration(PropertiesConfigurationDemo.class.getResource("system-config.properties"));
- String ip = config.getString("ip");
- String[] colors = config.getStringArray("colors.pie");
- for (int i = 0; i < colors.length; i++) {
- System.out.println(colors);
- }
-
- List<?> colorList = config.getList("colors.pie");
- for (int i = 0; i < colorList.size(); i++) {
- System.out.println(colorList.get(i));
- }
- }
- }
配置文件代码:
ip=10.10.1.1
colors.pie = #FF0000, #00FF00, #0000FF
2 读取XML文件的方式
Java代码
- import java.util.List;
- import org.apache.commons.configuration.Configuration;
- import org.apache.commons.configuration.ConfigurationException;
- import org.apache.commons.configuration.XMLConfiguration;
-
- public class XMLConfigurationDemo {
-
- public static void main(String[] args) throws ConfigurationException {
-
- Configuration config = new XMLConfiguration(XMLConfigurationDemo.class
- .getResource("system-config.xml"));
- String ip = config.getString("ip");
- String account = config.getString("account");
- String password = config.getString("password");
- List<?> roles = config.getList("roles.role");
- System.out.println("IP: " + ip);
- System.out.println("Account: " + account);
- System.out.println("Password: " + password);
- for (int i = 0; i < roles.size(); i++) {
- System.out.println("Role: " + roles.get(i));
- }
- }
- }
Xml文件代码:
Xml代码
- <config>
- <ip>10.10.1.1</ip>
- <account>jini</account>
- <password>jakarta99</password>
- <roles>
- <role>admin</role>
- <role>manager</role>
- <role>user</role>
- </roles>
- </config>
示例2
Java代码
- import org.apache.commons.configuration.Configuration;
- import org.apache.commons.configuration.ConfigurationException;
- import org.apache.commons.configuration.XMLConfiguration;
- public class XmlConfigurationExample {
- public static void main(String[] args) throws Exception,
- ConfigurationException {
- String resource = "main/global.xml";
- Configuration config = new XMLConfiguration(resource);
- // 只有new一个XMLConfiguration的实例就可以了.
- List<?> startCriteria = config.getList("start-criteria.criteria");
- for (int i = 0; i < startCriteria.size(); i++) {
- System.out.println("Role: " + startCriteria.get(i));
- }
- int horsepower = config.getInt("horsepower");
- System.out.println(horsepower);
- }
- }
global.xml文件代码
Xml代码
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <engine-config>
- <start-criteria>
- <criteria>
- Temperature Above -10 Celsius
- </criteria>
- <criteria>
- Fuel tank is not empty
- </criteria>
- </start-criteria>
- <volume>4 Liters</volume>
- <horsepower>42</horsepower>
- </engine-config>
示例3:混合读取二种文件
Java代码
- import java.util.List;
- import org.apache.commons.configuration.CompositeConfiguration;
- import org.apache.commons.configuration.ConfigurationException;
- import org.apache.commons.configuration.PropertiesConfiguration;
- import org.apache.commons.configuration.XMLConfiguration;
-
- public class Test {
-
- public static void main(String[] args) throws ConfigurationException {
- CompositeConfiguration config = new CompositeConfiguration();
- config.addConfiguration(new PropertiesConfiguration(
- "main/global.properties"));
- config.addConfiguration(new XMLConfiguration("main/global.xml"));
-
- List<?> startCriteria = config.getList("start-criteria.criteria");
- int horsepower = config.getInt("horsepower");
- for (int i = 0; i < startCriteria.size(); i++) {
- System.out.println("Role: " + startCriteria.get(i));
- }
- System.out.println(horsepower);
- System.out.println("Speed: " + config.getFloat("speed"));
- System.out.println("Names: " + config.getString("name"));
- }
- }
Xml如上所示,global.properties文件如下:
speed=50
name=Default User
示例4
Java代码
- import java.net.URL;
- import java.util.List;
- import org.apache.commons.configuration.Configuration;
- import org.apache.commons.configuration.ConfigurationFactory;
- public class PropertiesXmlConfigurationExample {
-
- public static void main(String[] args) throws Exception {
- ConfigurationFactory factory = new ConfigurationFactory();
- URL configURL = PropertiesXmlConfigurationExample.class.getResource("additional-xml-configuration.xml");
- factory.setConfigurationURL(configURL);
- Configuration config = factory.getConfiguration();
- List<?> startCriteria = config.getList("start-criteria.criteria");
- for (int i = 0; i < startCriteria.size(); i++) {
- System.out.println("Role: " + startCriteria.get(i));
- }
- int horsepower = config.getInt("horsepower");
- System.out.println("Horsepower: " + horsepower);
-
- System.out.println("Speed: " + config.getFloat("speed"));
- System.out.println("Names: " + config.getString("name"));
-
- }
- }
additional-xml-configuration.xml文件内容:
Xml代码
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <configuration>
- <properties fileName="global.properties"/>
- <xml fileName="global.xml"/>
- </configuration>
相关API说明:
# PropertiesConfiguration 从一个 property 文件中加载配置 .
# XMLConfiguration 从 XML 文件中加载配置信息 .
# XMLPropertyListConfiguration 也可以读取 XML 被 Mac OSX 使用变量 .
# JNDIConfiguration 利用 jndi 树的一个键值,可以返回一个值,这个值来作为配置信息
# BaseConfiguration 访问内存中的一个配置对象 .
# HierarchicalConfiguration 一个在内存中的配置对象,这个对象可以处理复杂的数据结构 .
# SystemConfiguration 一个利用系统属性的配置信息
# ConfigurationConverter 把 java.util.Properties 或者 org.apache.collections.commons.ExtendedProperties 转化为一个 Configuration 对象
欢迎光临 信息发布软件,b2b软件,广告发布软件 (http://postbbs.com/) |
Powered by Discuz! X3.2 |