@snail-lb
2017-02-28T15:22:24.000000Z
字数 22929
阅读 949
java进阶
package com.cn;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.List;public class BinaryTree<E> {/** 根节点 **/Node<E> rootNode;/** 树深度 **/int depth;class Node<E> {/** 节点数据 **/E date;/** 左子树 **/Node<E> left;/** 右子树 **/Node<E> right;Node(E date) {this.date = date;this.left = null;this.right = null;}Node(E date, Node<E> left, Node<E> right) {this.date = date;this.left = left;this.right = right;}}public BinaryTree() {}/*** 使用数组构造一个完全二叉树** @param o*/public BinaryTree(E[] o) {this();Node<E> root = null;this.rootNode = createFullBinaryTree(root, o, 0);}/*** 创建满二叉树函数** @param root* @param o* @param index* @return*/private Node<E> createFullBinaryTree(Node<E> root, E[] o, int index) {if (index >= o.length) {return null;}root = new Node<E>(o[index]);// 数组是从0开始的,所以左节点的序号为父节点的两倍多一个,右节点为父节点的两倍多两个root.left = createFullBinaryTree(root.left, o, 2 * index + 1);root.right = createFullBinaryTree(root.right, o, 2 * index + 2);return root;}/*** 前序遍历输出数组** @return E[]*/public E[] preorderTraversal(Node<E> node) {List<E> list = new ArrayList<E>();preorderTraversalRealize(node,list);@SuppressWarnings("unchecked")E[] e = (E[])Array.newInstance(node.date.getClass(), 0);//使用泛型数组进行记录return list.toArray(e);}/*** 前序遍历输出实现** @param node*/private void preorderTraversalRealize(Node<E> node,List<E> list) {if (node != null) {list.add(node.date);preorderTraversalRealize(node.left,list);preorderTraversalRealize(node.right,list);}}/*** 前序遍历输出数组(非递归实现)** @return E[]*/public E[] preorderTraversalNoRecursion(Node<E> node) {if(node == null)return null;@SuppressWarnings("unchecked")E[] e = (E[])Array.newInstance(node.date.getClass(), 0);//使用泛型数组进行记录Stack<Node<E>> stack = new Stack<Node<E>>();List<E> list = new ArrayList<E>();stack.push(node);while(!stack.empty()){node = stack.pop();list.add(node.date);if(node.right != null){stack.push(node.right);}if(node.left != null){stack.push(node.left);}}return list.toArray(e);}/*** 中序遍历输出数组** @return E[]*/public E[] inorderTraversal(Node<E> node) {List<E> list = new ArrayList<E>();inorderTraversalRealize(node,list);@SuppressWarnings("unchecked")E[] e = (E[])Array.newInstance(node.date.getClass(), 0);//使用泛型数组进行记录return list.toArray(e);}/*** 中序遍历输出实现** @param node*/private void inorderTraversalRealize(Node<E> node,List<E> list) {if (node != null) {inorderTraversalRealize(node.left,list);list.add(node.date);inorderTraversalRealize(node.right,list);}}/*** 中序遍历输出,非递归实现* @return*/public E[] inorderTraversalNoRecursion(Node<E> node){if(node == null)return null;@SuppressWarnings("unchecked")E[] e = (E[])Array.newInstance(node.date.getClass(), 0);//使用泛型数组进行记录Stack<Node<E>> stack = new Stack<Node<E>>();List<E> list = new ArrayList<E>();while(node != null || !stack.empty()){//存在左子树时while(node != null){stack.push(node);node = node.left;}//栈非空时if(!stack.empty()){node = stack.pop();list.add(node.date);node = node.right;}}return list.toArray(e);}/*** 后序遍历输出数组** @return E[]*/public E[] postorderTraversal(Node<E> node) {List<E> list = new ArrayList<E>();postorderTraversalRealize(node,list);@SuppressWarnings("unchecked")E[] e = (E[])Array.newInstance(node.date.getClass(), 0);//使用泛型数组进行记录return list.toArray(e);}/*** 后序遍历输出实现** @param node*/private void postorderTraversalRealize(Node<E> node,List<E> list) {if (node != null) {postorderTraversalRealize(node.left,list);postorderTraversalRealize(node.right,list);list.add(node.date);}}/*** 后续遍历(非递归输出)* @param node* @return*/public E[] postorderTraversalNoRecursion(Node<E> node){if(node == null)return null;@SuppressWarnings("unchecked")E[] e = (E[])Array.newInstance(node.date.getClass(), 0);//使用泛型数组进行记录Stack<Node<E>> stack = new Stack<Node<E>>();List<E> list = new ArrayList<E>();Node<E> prv = node; //记录之前遍历的右结点while(node != null || !stack.empty()){//存在左子树时while(node != null){stack.push(node);node = node.left;}//栈非空时if(!stack.empty()){Node<E> nodeRight = stack.peek().right;/*如果右结点为空,或者右结点之前遍历过,获取根结点数据*/if(nodeRight == null || nodeRight == prv ){node = stack.pop();list.add(node.date);prv = node;node = null;}else{node = nodeRight;}}}return list.toArray(e);}/*** 广度优先搜索(分层遍历二叉树): 使用队列实现。队列初始化,将根节点压入队列。当队列不为空,* 进行如下操作:弹出一个节点,访问,若左子节点或右子节点不为空,将其压入队列。** @param node* @return*/public E[] layerTraversing(Node<E> node) {List<E> list = new ArrayList<E>();layerTraversingRealize(node, list);@SuppressWarnings("unchecked")E[] e = (E[])Array.newInstance(node.date.getClass(), 0);//使用泛型数组进行记录return list.toArray(e);}/*** 分层遍历辅助函数* @param node* @param list*/private void layerTraversingRealize(Node<E> node, List<E> list) {Queue<Node<E>> queue = new Queue<Node<E>>();queue.add(node);while (!queue.empty()) {Node<E> n = queue.poll();list.add(n.date);if (n.left != null) {queue.add(n.left);}if (n.right != null) {queue.add(n.right);}}}/*** 使用深度优先搜索遍历二叉树,这个结果和前序遍历是一样的** @param node* @return*/public E[] depthTraversing(Node<E> node) {List<E> list = new ArrayList<E>();depthTraversingRealize(node, list);@SuppressWarnings("unchecked")E[] e = (E[])Array.newInstance(node.date.getClass(), 0);//使用泛型数组进行记录return list.toArray(e);}private void depthTraversingRealize(Node<E> node, List<E> list) {if (node != null) {list.add(node.date);depthTraversingRealize(node.left, list);depthTraversingRealize(node.right, list);}}/*** 计算二叉树节点的个数** @param node* @return 二叉树节点的个数*/public int getNodeNumber(Node<E> node) {if (node == null) {return 0;}return getNodeNumber(node.left) + getNodeNumber(node.right) + 1;}/*** 求二叉树深度** @return 二叉树深度*/public int getDepth(Node<E> node) {if (node == null) {return 0;}int leftDepth = getDepth(node.left);int rightDepth = getDepth(node.right);return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;}/*** 求二叉树第K层的节点个数 递归解法: (1)如果二叉树为空或者k<1返回0 (2)如果二叉树不为空并且k==1,返回1* (3)如果二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树k-1层节点个数之和** @param k* @return 二叉树第K层的节点个数*/public int getNodeNumberInLay(Node<E> node, int k) {if (node == null || k < 1) {return 0;}if (k == 1) {return 1;}int leftNodeNum = getNodeNumberInLay(node.left, k - 1);int rightNodeNum = getNodeNumberInLay(node.right, k - 1);return leftNodeNum + rightNodeNum;}/*** 求二叉树中叶子节点的个数** @param node* @return*/public int getNodeNumberLeaf(Node<E> node) {if (node == null) {return 0;}if (node.left == null && node.right == null) {return 1;}int leftNodeNum = getNodeNumberLeaf(node.left);int rightNodeNum = getNodeNumberLeaf(node.right);return leftNodeNum + rightNodeNum;}/*** 判断两棵二叉树是否结构相同 不考虑数据内容。结构相同意味着对应的左子树和对应的右子树都结构相同。 递归解法: (1)如果两棵二叉树都为空,返回真* (2)如果两棵二叉树一棵为空,另一棵不为空,返回假 (3)如果两棵二叉树都不为空,如果对应的左子树和右子树都同构返回真,其他返回假** @param node1* @param node2* @return*/public boolean isStructureCmp(Node<E> node1, Node<E> node2) {if (node1 == null && node2 == null) {return true;} else if (node1 == null || node2 == null) {return false;} else {boolean leftCmp = isStructureCmp(node1.left, node2.left);boolean rightCmp = isStructureCmp(node1.right, node2.right);return leftCmp && rightCmp;}}/*** 判断是否是平衡二叉树** @param node* @return*/public boolean isAVL(Node<E> node) {if (node == null) {return true;}int leftHeight = getDepth(node.left);int rightHeight = getDepth(node.right);if (Math.abs(leftHeight - rightHeight) > 1) {return false;} else {return isAVL(node.left) && isAVL(node.right);}}/*** 判断是否完全二叉树 1.当发现有一个节点的左子树为空,右子树不为空时 直接返回false.* 2.当发现有一个节点的左子树不为空,右子树为空时,置标志位为1。 3.当发现有一个节点的左右子树均为空时,置标志位为1。** @param node* @return*/public boolean isCompleteBinaryTree(Node<E> node) {if (node == null) {return true;}Queue<Node<E>> queue = new Queue<Node<E>>();queue.add(node);int flag = 0;// 标记此节点以下的节点均应为叶子节点(没有左右孩子),否则此树为一棵非完全二叉树。while (!queue.empty()) {Node<E> n = queue.poll();if (n.left != null) {if (flag == 1) {return false;}queue.add(n.left);if (n.right != null) {queue.add(n.right);} else {flag = 1;}} else {if (n.right != null) {return false;}flag = 1;}}return true;}/*** 根据前序遍历结果和中序遍历结果重建二叉树** @param preorderTraversalArray* 前序遍历结果* @param inorderTraversalArray* 中序便利结果* @return 二叉树*/public BinaryTree<E> reBuildBinaryTree(E[] preorderTraversalArray, E[] inorderTraversalArray) {if (preorderTraversalArray == null || inorderTraversalArray == null) {return null;}Node<E> root = reBuildBinaryTreeRealize(preorderTraversalArray, 0, preorderTraversalArray.length - 1,inorderTraversalArray, 0, inorderTraversalArray.length - 1);BinaryTree<E> bt = new BinaryTree<E>();bt.rootNode = root;bt.depth = getDepth(root);return bt;}/*** 前序遍历的第一个节点一定是二叉树的根节点(以a记录),中序遍历以a为分界线,a左边的一定是左子树一边的(记录下左边的个数为x),且为左子树的中序遍历结果,* a右边的一定是右子树一边的(记录下右边的个数为y),且为右子树中序遍历的结果。再把前序遍历结果a后面x个数作为左子树的前序遍历,剩下的y个作为右子树的前序遍历,* 再一次进行递归建立,直到完全建立二叉树** @param preOrder 前序遍历* @param startPreIndex 前序遍历起始位置* @param endPreIndex 前序遍历结束为止* @param inOrder 后序遍历* @param startInIndex 后续遍历起始位置* @param endInIndex 后序遍历结束位置* @return*/public Node<E> reBuildBinaryTreeRealize(E[] preOrder, int startPreIndex, int endPreIndex, E[] inOrder,int startInIndex, int endInIndex) {Node<E> root = new Node<E>(preOrder[startPreIndex]);// 只有一个元素if (startPreIndex == endPreIndex) {if (startInIndex == endInIndex && preOrder[startPreIndex] == inOrder[startInIndex]) {return root;} else {throw new RuntimeException("出错");}}// 在中序遍历中找到根结点的索引int rootInIndex = startInIndex;while (rootInIndex <= endInIndex && inOrder[rootInIndex] != preOrder[startPreIndex]) {++rootInIndex;}if (rootInIndex == endInIndex && inOrder[rootInIndex] != preOrder[startPreIndex]) {throw new RuntimeException("出错");}int leftLength = rootInIndex - startInIndex;int leftPreOrderEndIndex = startPreIndex + leftLength;if (leftLength > 0) {// 构建左子树root.left = reBuildBinaryTreeRealize(preOrder, startPreIndex + 1, leftPreOrderEndIndex, inOrder, startInIndex,rootInIndex - 1);}if (leftLength < endPreIndex - startPreIndex) {// 右子树有元素,构建右子树root.right = reBuildBinaryTreeRealize(preOrder, leftPreOrderEndIndex + 1, endPreIndex, inOrder, rootInIndex + 1,endInIndex);}return root;}}
package com.cn;import java.util.Arrays;/*** 经典排序复习* @author lvbiao**/public class Sort {/*** 交换数组中两个指定位置的数据* @param array* @param i* @param j*/private void swap(int[] array, int i, int j) {int var;var = array[i];array[i] = array[j];array[j] = var;}public void display(int[] array){System.out.println(Arrays.toString(array));}/*** 冒泡排序* @param array*/public void bubbleSort(int[] array){for(int i = 0; i < array.length; i++){for(int j = array.length-1; j > i; j--){if(array[j-1] > array[j]){swap(array,j-1,j);}}}}/*** 选择排序* @param array*/public void selectSort(int[] array){int min;for(int i = 0; i < array.length; i++){min = i;for(int j = i+1; j < array.length; j++){if(array[min] > array[j]){min = j;}}if(min != i){swap(array, i, min);}}}/*** 插入排序* @param array*/public void insertSort(int[] array){int j;for(int i = 1; i < array.length; i ++){if(array[i] < array[i-1]){int var = array[i];j = i - 1;while(j >= 0 && var < array[j]){array[j+1] = array[j];j--;}array[j+1] = var;}}}/*** 希尔排序* @param array*/public void shellSort(int[] array){int length = array.length;int j;do{length = length/3 + 1;for(int i = length; i < array.length; i ++){if(array[i] < array[i-length]){int var = array[i];j = i -length;while(j >= 0 && var < array[j]){array[j+length] = array[j];j-=length;}array[j+length] = var;}}}while(length > 1);}/*** 推排序* @param array*/public void headSort(int[] array){//将整个数组构建成一个大顶堆for(int i = (array.length-1)/2; i >= 0; i--){headBig(array,i,array.length-1);}//将大顶堆树根上的数据与数组末尾的交换,再将数组除开最后一个再构成一个大顶堆,一次循环知道完成排序for(int i = array.length-1; i > 0; i--){swap(array,0,i);headBig(array,0,i-1);}}/*** 将array调整为一个大顶堆* @param array* @param i* @param j*/private void headBig(int[] array, int start, int stop) {int i;int var = array[start];for(i = 2*start; i <= stop; i*=2){if(i+1 >= array.length){if(array[i/2] < array[i]){array[i/2] = array[i];start = i;break;}else{break;}}if(array[i] < array[i+1] && i < stop){++i;}if(var >= array[i]){break;}array[start] = array[i];start = i;}array[start] = var;}/*** 归并排序* @param array*/public void mergeSort(int[] array){int[] temp = new int[array.length];mSort(array, temp, 0, array.length-1);}//msort函数是将list数组进行分割,merge函数是将分割后的list数组进行排序在组合private void mSort(int[] list, int[] temp, int left, int right){if(left == right){return;}else{int mid = (left + right) / 2;mSort(list,temp,left,mid);mSort(list,temp,mid+1,right);merge(list,temp,left,mid+1,right);}}private void merge(int[] list,int[] temp,int left,int mid,int right){int j = 0;int leftTemp = left;int midTemp = mid - 1;int n = right - left + 1; //当前temp数组中数的个数//左右数组第一个数进行比较 把较小的数如到temp数组中while(left <= midTemp && mid <= right){if(list[left] < list[mid]){temp[j++] = list[left++];}else{temp[j++] = list[mid++];}}//如果左边的数比右边的数多,就将剩下的入到temp数组中 jwhile(left <= midTemp){temp[j++] = list[left++];}//如果右边打数比左边的数多,就将右边剩下的数加入到temp数组当中去while(mid <= right){temp[j++] = list[mid++];}//将得到的temp数组加到list数组中for(j = 0; j < n; j++){list[leftTemp+j] = temp[j];}}/*** 快速排序* @param array*/public void quickSort(int[] array){qSort(array, 0, array.length-1);}private void qSort(int[] array, int left, int right) {if(left < right){int mid = partition(array, left, right);qSort(array, left, mid-1);qSort(array, mid+1, right);}}//返回一个关键字,使得这个关键字左边的数都比他小,右边的数都比它大private int partition(int[] array, int left, int right) {int result = array[left];while(left < right){while(left < right && array[right] >= result){right--;}swap(array, left, right);while(left < right && array[left] <= result){left++;}swap(array, left, right);}array[left] = result;return left;}}
package com.cn.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Modifier;/*** java反射** @author lvbiao**/public class TestReflect {public static void main(String[] args) {Class test = null;try {test = Class.forName("com.cn.reflect.Student");} catch (ClassNotFoundException e) {e.printStackTrace();}//获取完整类名System.out.println("------获取完整类名----------");System.out.println("完整类名:" + getMothodName(test));//无参构造实例化对象System.out.println("------无参构造实例化对象----------");Student stu1 = (Student) getObjectNoParameters(test);stu1.display();//通过其他构造函数实例化对象System.out.println("------通过其他构造函数实例化对象-----");Student stu2 = (Student) getObjectHaveParameters(test);stu2.display();//获取类全部属性信息System.out.println("------获取类全部属性信息----------");AttributeInfo(test);//获取全部方法信息System.out.println("------获取全部方法信息-----------");MethodInfo(test);//调用类中无参方法System.out.println("------调用类中无参方法-----------");callMethodNoParameters(test,"display");//调用类中有参方法System.out.println("------调用类中有参方法-----------");callMethodHaveParameters(test,"say","hello");//通过反射来操作属性System.out.println("------通过反射来操作属性,设置名字为Bob-----------");setAttribute(test,"name","Bob");}// 获取完整类名public static String getMothodName(Class cla) {return cla.getName();}// 通过无参构造 实例化对象public static Object getObjectNoParameters(Class cla) {try {return cla.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return null;}// 通过有参构造 实例化对象public static Object getObjectHaveParameters(Class cla) {Constructor<?> cons[] = cla.getConstructors();Object obj = null;try {obj = cons[1].newInstance("张三",23);} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return obj;}//获取类全部属性信息public static void AttributeInfo(Class cla){Field[] field = cla.getDeclaredFields();for (int i = 0; i < field.length; i++) {// 权限修饰符int mo = field[i].getModifiers();String priv = Modifier.toString(mo);// 属性类型Class<?> type = field[i].getType();System.out.println(priv + " " + type.getName() + " "+ field[i].getName() + ";");}}//获取类中方法public static void MethodInfo(Class cla){Method[] method = cla.getDeclaredMethods();for (int i = 0; i < method.length; i++) {// 权限修饰符int mo = method[i].getModifiers();String priv = Modifier.toString(mo);//获取返回类型String retu = method[i].getReturnType().getName();// 属性类型String name = method[i].getName();System.out.println(priv + " " + retu + " "+ name + "()");}}//调用无参方法public static void callMethodNoParameters(Class cla,String methodName){try {Method method1 = cla.getMethod(methodName);method1.invoke(cla.newInstance());} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}}//调用有参方法public static void callMethodHaveParameters(Class cla,String methodName,String parameter){try {Method method2=cla.getMethod(methodName, String.class);method2.invoke(cla.newInstance(),parameter);} catch (NoSuchMethodException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();}}//通过反射来操作属性public static void setAttribute(Class cla,String key,String value){try {Object obj = cla.newInstance();Field field = cla.getDeclaredField(key);field.setAccessible(true);field.set(obj,value);//调用方法来验证是否设置成功Method method = cla.getMethod("display");method.invoke(obj);} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}
xml文件
<?xml version="1.0" encoding="UTF-8"?><四大名著><西游记 id="x001"><作者><姓名>吴承恩</姓名><性别>男</性别></作者><作者>吴承恩2</作者><作者>吴承恩3</作者><朝代>明朝</朝代></西游记><红楼梦 id="x002"><作者>曹雪芹</作者></红楼梦></四大名著>
解析文件
package com.cn.dom4j;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import org.junit.Test;public class Dom4jTest{@Testpublic void test() throws Exception {// 创建saxReader对象SAXReader reader = new SAXReader();// 通过read方法读取一个文件 转换成Document对象Document document = reader.read(new File("src/com/cn/dom4j/sida.xml"));//获取根节点元素对象Element node = document.getRootElement();//遍历所有的元素节点listNodes(node);//介绍Element中的element方法和elements方法的使用elementMethod(node);// 获取四大名著元素节点中,子节点名称为红楼梦元素节点。Element element = node.element("红楼梦");//获取element的id属性节点对象Attribute attr = element.attribute("id");//删除属性element.remove(attr);//添加新的属性element.addAttribute("name", "作者");// 在红楼梦元素节点中添加朝代元素的节点Element newElement = element.addElement("朝代");newElement.setText("清朝");//获取element中的作者元素节点对象Element author = element.element("作者");//删除元素节点boolean flag = element.remove(author);//返回true代码删除成功,否则失败System.out.println(flag);//添加CDATA区域element.addCDATA("红楼梦,是一部爱情小说.");// 写入到一个新的文件中writer(document);}/*** 把document对象写入新的文件** @param document* @throws Exception*/public void writer(Document document) throws Exception {// 紧凑的格式// OutputFormat format = OutputFormat.createCompactFormat();// 排版缩进的格式OutputFormat format = OutputFormat.createPrettyPrint();// 设置编码format.setEncoding("UTF-8");// 创建XMLWriter对象,指定了写出文件及编码格式// XMLWriter writer = new XMLWriter(new FileWriter(new// File("src//a.xml")),format);XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/com/cn/dom4j/newsida.xml")), "UTF-8"), format);// 写入writer.write(document);// 立即写入writer.flush();// 关闭操作writer.close();}/*** 遍历当前节点元素下面的所有(元素的)子节点** @param node*/public void listNodes(Element node) {System.out.println("当前节点的名称:" + node.getName());// 获取当前节点的所有属性节点List<Attribute> list = node.attributes();// 遍历属性节点for (Attribute attr : list) {System.out.println(attr.getText() + "-----" + attr.getName()+ "---" + attr.getValue());}if (!(node.getTextTrim().equals(""))) {System.out.println("文本内容:" + node.getText());}// 当前节点下面子节点迭代器Iterator<Element> it = node.elementIterator();// 遍历while (it.hasNext()) {// 获取某个子节点对象Element e = it.next();// 对子节点进行遍历listNodes(e);}}/*** 介绍Element中的element方法和elements方法的使用** @param node*/public void elementMethod(Element node) {// 获取node节点中,子节点的元素名称为西游记的元素节点。Element e = node.element("西游记");// 获取西游记元素节点中,子节点为作者的元素节点(可以看到只能获取第一个作者元素节点)Element author = e.element("作者");System.out.println(e.getName() + "----" + author.getText());// 获取西游记这个元素节点 中,所有子节点名称为作者元素的节点 。List<Element> authors = e.elements("作者");for (Element aut : authors) {System.out.println(aut.getText());}// 获取西游记这个元素节点 所有元素的子节点。List<Element> elements = e.elements();for (Element el : elements) {System.out.println(el.getText());}}}
package com.cn.dom4j;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import org.junit.Test;public class Dom4jTest2 {@Testpublic void test() throws Exception {// 创建saxreader对象SAXReader reader = new SAXReader();// 读取一个文件,把这个文件转换成Document对象Document document = reader.read(new File("src/com/cn/dom4j/sida.xml"));// 获取根元素Element root = document.getRootElement();// 把文档转换字符串String docXmlText = document.asXML();System.out.println(docXmlText);System.out.println("---------------------------");// csdn元素标签根转换的内容String rootXmlText = root.asXML();System.out.println(rootXmlText);System.out.println("---------------------------");// 获取java元素标签 内的内容Element e = root.element("西游记");System.out.println(e.asXML());System.out.println("---------------------------");}/*** 创建一个document对象 往document对象中添加节点元素 转存为xml文件** @throws Exception*/@Testpublic void test2() throws Exception {Document document = DocumentHelper.createDocument();// 创建根节点Element root = document.addElement("csdn");Element java = root.addElement("java");java.setText("java班");Element ios = root.addElement("ios");ios.setText("ios班");writer(document);}/*** 把一个文本字符串转换Document对象** @throws Exception*/@Testpublic void test1() throws Exception {String text = "<csdn><java>Java班</java><net>Net班</net></csdn>";Document document = DocumentHelper.parseText(text);Element e = document.getRootElement();System.out.println(e.getName());writer(document);}/*** 把document对象写入新的文件** @param document* @throws Exception*/public void writer(Document document) throws Exception {// 紧凑的格式// OutputFormat format = OutputFormat.createCompactFormat();// 排版缩进的格式OutputFormat format = OutputFormat.createPrettyPrint();// 设置编码format.setEncoding("UTF-8");// 创建XMLWriter对象,指定了写出文件及编码格式// XMLWriter writer = new XMLWriter(new FileWriter(new// File("src//a.xml")),format);XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/com/cn/dom4j/newsida2.xml")), "UTF-8"), format);// 写入writer.write(document);// 立即写入writer.flush();// 关闭操作writer.close();}}
package com.cn.dom4j;import java.io.File;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class MyTest {public static void main(String[] args) {try {// 创建saxReader对象SAXReader reader = new SAXReader();// 通过read方法读取一个文件转换成Document对象Document document = reader.read(new File("src/com/cn/dom4j/sida.xml"));//获取根节点元素对象Element node = document.getRootElement();listNodes(node);} catch (DocumentException e) {e.printStackTrace();}}private static void listNodes(Element node) {//遍历所有元素节点System.out.println("++++++当前节点名称:" + node.getName() + "+++++++++++");//获取当前节点所有属性节点List<Attribute> list = node.attributes();//遍历属性节点for(Attribute attr : list){System.out.println(attr.getText() + " " + attr.getName() +":" + attr.getValue() + " " + attr.getPath() +" " + attr.getStringValue());}if(!(node.getTextTrim().equals(""))) {System.out.println("文本内容:" + node.getText());}//当前节点下面子节点迭代器Iterator<Element> it = node.elementIterator();//遍历while (it.hasNext()) {//获取某个子节点对象Element e = it.next();//对子节点进行遍历listNodes(e);}}}
package com.cn.nio;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class WriteFileNio {public static void main(String[] args){try {//写入文件String str = "I am a boy.";FileChannel fc = new FileOutputStream("E:/1.txt").getChannel();fc.write(ByteBuffer.wrap(str.getBytes()));fc.close();//读取文件FileChannel fcin = new FileInputStream("E:/1.txt").getChannel();ByteBuffer bb = ByteBuffer.allocate(1024);fcin.read(bb);bb.flip();while(bb.hasRemaining()){System.out.print((char)bb.get());}} catch (IOException e) {e.printStackTrace();}}}