java.util.Properties和dom4j读写.properties和.xml

v2-a1033ed2107c2822dfbe943abd9d6386_1200x500.jpg

一、.properties文件的读写

什么是.properties文件?简单来说.properties文件就是java中用于存放一些配置的文件,这些配置以键值对(key=value)形式存放,文件名后缀以.properties结尾。

看一下项目中常见的jdbc.properties文件:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/helloJava
jdbc.usename=root
jdbc.password=root

Java中常用java.util.Properties类来处理.properties文件。下面,我们用Java代码来演示一下这个jdbc.properties的创建、读写。

代码中主要包括:createProp()、setProp()和readPorp()方法。

1.createProp()通过字符流一次性地输入并创建了jdbc.properties文件;

public class useProperties  {
    private static String userpath = System.getProperty("user.home");
    private static String configStr = "jdbc.driver=com.mysql.jdbc.Driver\n" +
            "jdbc.url=jdbc:mysql://localhost:3306/helloJava\n" +
            "jdbc.username=root\njdbc.password=root";

    public static void createProp (String data,String path){
        File f = new File(path);
        try(FileWriter fr = new FileWriter(f)){
            char[] cs = data.toCharArray();
            fr.write(cs);
            System.out.println("jdbc.properties文件已创建成功!路径是:" + path);
        } catch(IOException e){
            e.printStackTrace();
        }
    }

2.setProp()通过Properties p = new Properties();p.setProperty()和p.store()的方式,逐个输入key和value值的方式向jdbc.properties文件写入新的键值对(覆盖掉原文件)。

public static void setProp(String path){
        Properties p = new Properties();
        String url = "jdbc:mysql://localhost:3306/helloLyon";
        String driver = "org.gjt.mm.mysql.Driver";
        String username = "root";
        String password = "admin";
        try (InputStream fis =  new FileInputStream(path);
             OutputStream fos = new FileOutputStream(path)) {
            //准备文件输入流fis和文件输出流fos
            p.load(fis);
            //加载输入流到Properties对象p
            p.setProperty("jdbc.url",url);
            p.setProperty("jdbc.driver",driver);
            p.setProperty("jdbc.username",username);
            p.setProperty("jdbc.password",password);
            //输出流存至p
            p.store(fos,"更新键值对");
            System.out.println("新的键值对已成功写入文件:" + path);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.readProp()方法演示了用for循环遍历所有key-value。当然,除了遍历所有的key-value还可以用getProperty()方法来获取指定key的value值。

public static void readProp(String path){
        Properties p = new Properties();
        try (BufferedReader bf = new BufferedReader(new FileReader(path))){
            //读取方式有多种,此处也可以用:FileInputStream fs = new FileInputStream(path)...
            p.load(bf);
            System.out.println("\n用for循环查看所有的key——value信息:");
            for (Object key : p.keySet()) {
                System.out.println(key + "=" + p.get(key));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

完整代码及运行结果如下:

image

运行后生产的jdbc.properties文件如下:

image

二、.xml文件的读写

最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容存储和表现分离等等优势注定了该语言从诞生之日起就会走向辉煌。 XML 语言在成为 W3C 标准之后进入到了一个快速发展的时期,当然它本身所具有的一系列优点和优势也注定了各大技术厂商对它的偏爱,Java 作为软件行业的一种开发技术也迅速作出了反应,出现了多种对 XML 支持的工具.

XML 三种解析方式简介

大名鼎鼎的 DOM

说它大名鼎鼎可是一点不为过,DOM 是 W3C 处理 XML 的标准 API,它是许多其它与 XML 处理相关的标准的基础,不仅是 Java,其它诸如 Javascript,PHP,MS .NET 等等语言都实现了该标准, 成为了应用最为广泛的 XML 处理方式。当然,为了能提供更多更加强大的功能,Java 对于 DOM 直接扩展工具类有很多,比如很多 Java 程序员耳熟能详的 JDOM,DOM4J 等等, 它们基本上属于对 DOM 接口功能的扩充,保留了很多 DOM API 的特性,许多原本的 DOM 程序员甚至都没有任何障碍就熟练掌握了另外两者的使用,直观、易于操作的方式使它深受广大 Java 程序员的喜爱。

绿色环保的 SAX

SAX 的应运而生有它特殊的需要,为什么说它绿色环保呢,这是因为 SAX 使用了最少的系统资源和最快速的解析方式对 XML 处理提供了支持。 但随之而来繁琐的查找方式也给广大程序员带来许多困扰,常常令人头痛不已,同时它对 XPath 查询功能的支持,令人们对它又爱又恨。

默默无闻的 Digester:XML 的 JavaBean 化

Digester 是 apache 基金组织下的一个开源项目,笔者对它的了解源于对 Struts 框架的研究,是否有很多程序员想要一解各大开源框架的设计甚至想要自己写一个功能强大的框架时会碰到这样一个难题: 这些形形色色的用 XML 语言标记的框架配置文件,框架底层是用什么技术来解析呢? DOM 解析耗费时间,SAX 解析又过于繁琐,况且每次解析系统开销也会过大, 于是,大家想到需要用与 XML 结构相对应的 JavaBean 来装载这些信息,由此 Digester 应运而生。它的出现为 XML 转换为 JavaBean 对象的需求带来了方便的操作接口,使得更多的类似需求得到了比较完美的解决方法, 不再需要程序员自己实现此类繁琐的解析程序了。与此同时 SUN 也推出了 XML 和 JavaBean 转换工具类 JAXB,有兴趣的读者可以自行了解。

三种解析方式比较

DOM

优缺点:实现 W3C 标准,有多种编程语言支持这种解析方式,并且这种方法本身操作上简单快捷,十分易于初学者掌握。其处理方式是将 XML 整个作为类似树结构的方式读入内存中以便操作及解析,因此支持应用程序对 XML 数据的内容和结构进行修改,但是同时由于其需要在处理开始时将整个 XML 文件读入到内存中去进行分析,因此其在解析大数据量的 XML 文件时会遇到类似于内存泄露以及程序崩溃的风险,请对这点多加注意。

适用范围:小型 XML 文件解析、需要全解析或者大部分解析 XML、需要修改 XML 树内容以生成自己的对象模型

SAX

SAX 从根本上解决了 DOM 在解析 XML 文档时产生的占用大量资源的问题。其实现是通过类似于流解析的技术,通读整个 XML 文档树,通过事件处理器来响应程序员对于 XML 数据解析的需求。由于其不需要将整个 XML 文档读入内存当中,它对系统资源的节省是十分显而易见的,它在一些需要处理大型 XML 文档以及性能要求较高的场合有起了十分重要的作用。支持 XPath 查询的 SAX 使得开发人员更加灵活,处理起 XML 来更加的得心应手。但是同时,其仍然有一些不足之处也困扰广大的开发人员:首先是它十分复杂的 API 接口令人望而生畏,其次由于其是属于类似流解析的文件扫描方式,因此不支持应用程序对于 XML 树内容结构等的修改,可能会有不便之处。

适用范围:大型 XML 文件解析、只需要部分解析或者只想取得部分 XML 树内容、有 XPath 查询需求、有自己生成特定 XML 树对象模型的需求

Digester/JAXB

优缺点 : 由于其是在上述两者的基础上衍生出来的工具类,为的是满足将 XML 转换为 JavaBean 的特殊需求,故而没有什么特别明显的优缺点。作为大名鼎鼎的开源框架 Struts 的 XML 解析工具 Digester,为我们带来了将 XML 转换为 JavaBean 的可靠方法。

适用范围 : 有将 XML 文档直接转换为 JavaBean 需求。

——此段摘自:Java 处理 XML 的三种主流技术及介绍


简单来说,比较常用的XML解析主要有DOM解析和SAX解析,DOM解析优点突出可以对DOM文档树的内容和结构进行修改,但是需要加载全部xml文件用以构建文档树,故速度较慢,内存占用较高。SAX解析则相反,速度较快但是不支持修改。

Java中经常用dom4j来解析xml文件。dom4j顾名思义是利用DOM解析原理进行解析的。

本文代码用的是:dom4j-1.6.1.jar,实现创建和读取一个简单xml文件的效果。

代码主要包括:createXML()和readXML()两个方法。

1.createXML()创建了一个简单的xml文件(school.xml):

image
public static void createXML(String path){
        try {
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");// 设置XML文件的编码格式
            File file = new File(path);
            //创建DOM文档树根节点doc
            Document doc = DocumentHelper.createDocument();
            //创建第一个节点school1
            Element school1 = doc.addElement("加里敦大学");
            //给school1添加子节点stu1
            Element child1 = school1.addElement("学生");
            //给stu1节点增加属性及子节点
            child1.addAttribute("学号","001");
            Element name1 = child1.addElement("姓名");
            name1.setText("莱纳德");
            Element high1 = child1.addElement("身高");
            high1.setText("165");
            //给school1添加子节点child2
            Element child2 = school1.addElement("教师");
            child2.addAttribute("职工号","001");
            Element name2 = child2.addElement("姓名");
            name2.setText("谢尔顿");
            Element high2 = child2.addElement("身高");
            high2.setText("185");

            //创建XMLWriter对象,并将doc文档写入
            XMLWriter writer = new XMLWriter(new FileWriter(file), format);
            writer.write(doc);
            writer.close();
            System.out.println("XML文件创建成功!路径是:" + path);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.用readXML()方法遍历xml文档树中的节点和属性

public static void readXML(Element root){
        System.out.println(root.getName()+":"+root.getText().trim()
        );
        List<Attribute> attrList = root.attributes();
        for(Attribute attr : attrList){
            System.out.println(attr.getName()+ ":" + attr.getValue());
        }
        List<Element> eleList = root.elements();
        for(Element ele : eleList){
            readXML(ele);
        }
    }

完整代码及运行结果如下:

image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容