Java基础知识陷阱(十)

上个星期由于时间比较紧所以未能继续写下去,今天再接再厉,专心 + 坚持这样离目标就越来越近了!废话少说说正题,今天我们还是来说说java中比较基础的知识,大家知道编写java程序中很多时候都用到了xml文件,有 些是框架本身支持配置的,有些是自定义配置的,这样就要求我们要对这个xml原理要比较了解,其中加载xml文件转换节点元素时有个核心:递归调用转换。 我们可以通过下面方法来查查这个实现类有关的源码:


1

2

3

4

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder build = factory.newDocumentBuilder();

Document doc = build.parse(new File("mapred-default.xml"));

System.out.println(build.getDOMImplementation().toString());

输出其中有:


1

com.sun.org.apache.xerces.internal.dom.DOMImplementationImpl

说明这是由DOMImplementationImpl类来加载xml文件并转化的。现在我就来自己实现递归输出元素,先看下mapred-default.xml这个文件的内容:

lspacing="0">


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?xml version="1.0"?>

<configuration isok="true">

<property>

<name>hadoop.job.history.location</name>

<value></value>

<description> If job tracker is static the history files are stored

in this single well known place. If No value is set here, by default,

it is in the local file system at ${hadoop.log.dir}/history.

</description>

</property>

<property>

<name>hadoop.job.history.user.location</name>

<value></value>

<description> User can specify a location to store the history files of

a particular job. If nothing is specified, the logs are stored in

output directory. The files are stored in "_logs/history/" in the directory.

User can stop logging by giving the value "none".

</description>

</property>

</configuration>

从上面的这个文件我们可以分析出:configuration是一个元素,这个元素没属性代码应该要判断;下面这个要特别注意很多人忽视掉的,其子元素究竟是有几个?在 xml中是严格区别空格的,即使就是空格也是一个元素,那现在我们应该知道答案了吧:5个,那么在代码中应该可以判断是空白,这个最怕在面试时候跌倒了。 那现在过了这个空格的元素后,接着就是<property>元素了,这个又跟之前一样哦,那么就应该使用递归来实现,说到递归方法那么就要注 意必须有个条件退出;那着个我知道其他的比如获取子元素之类的应该会有专门的方法获取得到,下面看代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

* 解析XML文件

* @param element 节点元素

*/

public static void parseXMLFile(Element element){

System.out.print("<" + element.getTagName());

NamedNodeMap attributes = element.getAttributes();

if(attributes != null){

for(int i=0;i<attributes.getLength();i++){

System.out.print(" " + attributes.item(i).getNodeName() + "=\"" + attributes.item(i).getNodeValue() + "\"");

}

}

System.out.print(">");

NodeList childNodes = element.getChildNodes();

for (int i = 0; i < childNodes.getLength(); i++) {

if(childNodes.item(i).getNodeType() == Element.ELEMENT_NODE  ){

parseXMLFile((Element)childNodes.item(i));

}

else{

System.out.print(childNodes.item(i).getTextContent());

}

}

System.out.print("</" + element.getTagName());

}

main方法:


1

2

3

4

5

6

7

8

9

10

11

12

13

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder build = factory.newDocumentBuilder();

Document doc = build.parse(new File("mapred-default.xml"));

//        System.out.println(build.getDOMImplementation().toString());

Element root = doc.getDocumentElement();

parseXMLFile(root);

}

运行结果如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<configuration isok="true">

<property>

<name>hadoop.job.history.location</name

<value></value

<description> If job tracker is static the history files are stored

in this single well known place. If No value is set here, by default,

it is in the local file system at ${hadoop.log.dir}/history.

</description

</property

<property>

<name>hadoop.job.history.user.location</name

<value></value

<description> User can specify a location to store the history files of

a particular job. If nothing is specified, the logs are stored in

output directory. The files are stored in "_logs/history/" in the directory.

User can stop logging by giving the value "none".

</description

</property

</configuration

结果一看好,那么这个例子实现了。

这次先到这里。坚持记录点点滴滴!

时间: 2024-10-20 18:33:07

Java基础知识陷阱(十)的相关文章

Java基础知识陷阱系列

Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四) Java基础知识陷阱(五) Java基础知识陷阱(六) Java基础知识陷阱(七) Java基础知识陷阱(八)

Java基础知识陷阱(九)

本文发表于本人博客. 今天我来说说关于JAVA多线程知识,有错误请指出.大家都知道JAVA在服务端上处理也有很大优势,很多公司也有在服务器跑JAVA进程,这说明JAVA在处理这个多线程以及并发下也有一定有优点的(这说法有点坑了).下面来看看 那java中,不具备直接操作像操作系统一样的PV信号,然而它提供了synchronized来实现同步机制,可能这样说不够严谨.JAVA的基类Object中有以下几个方法: public final native void notify(); public f

Java基础知识陷阱(三)

本文发表于本人博客. 之前都讲了有关字符串的陷阱,那今天来说下关于静态这个东西,这分为静态变量.静态方法,先看下面的代码请问结果输出是什么?: class Person01{ private static Person01 person = new Person01(); public static int age; public static int hight = 0; private Person01(){ age++; hight++; } public static Person01

Java基础知识陷阱(七)

本文发表于本人博客. 上次说了下HashSet和HashMap之间的关系,其中HashMap这个内部有这么一句: static final float DEFAULT_LOAD_FACTOR = 0.75f; 这一句表示一个常量,作用是当容器数量大小达到0.75%的时候就进行重新在构建一个2倍大小的数组.竟然这2个是集合,那我们今天看看其他的集合类,比如:ArrayList.Vector.LinkedList,开始咯. 首先查看下ArrayList的源码,这几个集合类都是在java.util包下

Java基础知识陷阱(四)

本文发表于本人博客. 今天我们来说说关于java继承以及反射有关的问题,大家先看下下面代码,试问可以编译通过不,为什么具体说说原因? public class Test{ public static void main(String[] args){ Person p = new Man(); p.talk(); } } class Person{ public void talk() throw NullPointerException{ System.out.println("Person

Java基础知识陷阱(六)

本文发表于本人博客. 上次说了下equals跟==的问题,今天再来认识一下这个equals()跟hasCode().上次的代码如下: class Person{ public String name; public Person(String name){ this.name = name; } public String getName(){ return this.name; } @Override public boolean equals(Object anObject) { if (t

Java基础知识陷阱(一)

本文发表于本人博客. 事隔好多年了,重新拿起来Java这门语言,看似熟悉其实还很陌生,想想应该梳理下顺便提高下自己.这次先来看看Java里面的String这个对象. 经典的先看下面一段代码,请问最终创建几个对象,分别在哪里? String s0 = new String("luoliang.me"); String s1 = "luoliang.me"; String s2 = new String("luoliang.me"); 想要回答这个问

Java基础知识陷阱(五)

本文发表于本人博客. 今天我来说说关于静态变量初始化.数组.==与equals的问题,看下面代码: public class Test{ private final int age; private String name; public Test(){ age = 30; } public Test(String name){ this.name = name; } } 我想上面的代码好多人都知道了会编译报错的,原因是在代餐构造函数中未对age进行复制操作. 对于终态变量final程序中是可以

Java基础知识陷阱(八)

本文发表于本人博客. 这次我来说说关于&跟&&的区别,大家都知道&是位运算符,而&&是逻辑运算符,看下面代码: public static void main(String[] args) throws Exception { int a = 1; int b = 2; int c = a & b; if(a >= 1 && b >= 1){ System.out.println("&&条件1&q