zoukankan      html  css  js  c++  java
  • 2018.4.13 用java配置/生成Xml文件 结合IO流知识点

    自己创建本地文件Hello.txt 里面有数据

    小明/23/增城/广东
    小花/12/浦东/上海
    

    StudentManager.java

    package com.lanqiao.dmeo7;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.Reader;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;
    
    public class StudentManager {
    	// 创建集合
    	List<Student> list = new ArrayList<Student>();
    
    	// 加载数据方法
    	public void load(String file) throws Exception {
    		// 创建文件
    		File files = new File("D:/Hello.txt");
    
    		// 字节流转字符流
    		Reader re = new FileReader(files);
    		BufferedReader br = new BufferedReader(re);
    
    		String str = null;
    		while ((str = br.readLine()) != null) {
    			System.out.println("读取文件:
    " + str);
    			// 拆分每一行数据存进去数组
    			String[] date = str.split("/");
    
    			// 创建对象 将每一行的数据存进对象里面
    			Student stu = new Student();
    			stu.setName(date[0]);
    			// 注意:在这里需要转型 字符串转整形
    			stu.setAge(Integer.parseInt(date[1]));
    			stu.setCity(date[2]);
    			stu.setProvince(date[3]);
    
    			// 将对象保存在集合中
    			list.add(stu);
    
    		}
    
    		// 遍历输出集合中的数据 第一种
    		for (int i = 0; i < list.size(); i++) {
    			Student s = (Student) list.get(i);
    			System.out.println(s.getName() + "	" + s.getAge() + "	" + s.getCity() + "	" + s.getProvince() + " ");
    		}
    
    		// 第二种 foreach
    		/*
    		 * for(Student stu : list) { System.out.println(stu.getName()+" "+stu.getAge());
    		 * }
    		 */
    
    	}
    
    	// 创建xml文件
    	public void creatXml() throws FileNotFoundException, IOException {
    		// 1.创建文档
    		Document doc = new Document();
    		// 2.创建根结点   在这里的根结点是通过new  出来的  因为是从没有到有的
    		Element rootElement = new Element("Students");
    		//通过集合循环添加对象里面的属性   用setTest 方法
    		for (int i = 0; i < list.size(); i++) {
    			// 3.往根结点中添加下面的子节点
    			rootElement.addContent(new Element("Student").addContent(new Element("name").setText(list.get(i).getName())) // 集合里面不指定范型是用不了Student
    																															// 对象里面的方法的
    					// 这里要将整形转化为字符串 只要在后面加一个双引号就行了
    					.addContent(new Element("age").setText(list.get(i).getAge() + ""))
    					.addContent(new Element("city").setText(list.get(i).getCity()))
    					.addContent(new Element("province").setText(list.get(i).getProvince())));
    		}
    		// 4.把根结点绑定在文档上
    		doc.addContent(rootElement);
    		// 5.保存生成的Xml文档IO流 这里是指定输出格式 还有编码格式
    		XMLOutputter output = new XMLOutputter(Format.getPrettyFormat().setEncoding("UTF-8").setIndent("    "));
    		// 指定输出xml的名字 用的是文件输出流 OutputStream out = new FileOutputStream();
    		// 让子类去实现
    		output.output(doc, new FileOutputStream("config.xml"));
    		System.out.println("操作完成,请刷新");
    	}
    
    	// 增 追加xml文件内容
    	public void addXml(Student stu) throws Exception {
    		// 创建工厂
    		SAXBuilder builder = new SAXBuilder();
    		// 创建文档
    		Document doc = builder.build(new File("config.xml"));//在这里记得是new File  出来先
    		// 获取根结点
    		Element rootEle = new Element("Students");
    		// 往根结点下面的子节点中添加节点
    		rootEle.addContent(new Element("Student").addContent(new Element("name").setText(stu.getName()))
    				.addContent(new Element("age").setText(stu.getAge() + ""))
    				.addContent(new Element("city").setText(stu.getCity()))
    				.addContent(new Element("province").setText(stu.getProvince())));
    
    		// 将文档绑定到根结点中
    		doc.addContent(rootEle);
    
    		XMLOutputter output = new XMLOutputter(Format.getPrettyFormat().setEncoding("UTF-8").setIndent("    "));
    		output.output(doc, new FileOutputStream("config.xml"));
    	}
    
    	// 删 根据名字来删除
    	public void delXml(String delName) throws JDOMException, IOException {
    		//创建工厂
    		SAXBuilder builder = new SAXBuilder();
    		//创建文档
    		Document doc = builder.build(new File("config.xml"));
    		//获取根结点
    		Element ele = doc.getRootElement();
    		//获取Element 总根结点下面的所有子节点 
    		List<Element> lis = ele.getChildren();
    		//遍历查找
    		for (int i = 0; i < lis.size(); i++) {
    			//获取每一个具体的子节点 例如说 student   student  student 
    			Element e = lis.get(i);
    			if(e.getName().equals(delName)) {
    				//删除子节点的时候要根据根结点来删除
    				ele.removeContent(e);
    				System.out.println("Delete Name Successful");
    			}
    		}
    	}
    
    	// 改 根据名字来修改
    	public void updateXml(String oldName, String newName) throws JDOMException, IOException {
    		// 创建工厂
    		SAXBuilder builder = new SAXBuilder();
    		// 创建文档
    		Document doc = builder.build(new File("config.xml"));
    		// 获取根结点
    		Element ele = doc.getRootElement();
    		//获取根结点下面的子节点   返回的是一个集合
    		List<Element> li = ele.getChildren();  //记得指定集合的类型  不然下面需要转类型
    		
    		//遍历查找
    		for(int i = 0; i<li.size();i++) {
    			Element e = li.get(i);
    			if(e.getChildText("name").equals(oldName)) {
    				//getChile 和  getChileText  的区别是  前者获取的是节点   后者是获取节点里面的值
    				e.getChild("name").setText(newName);//这句话的意思是 第二个根结点下获取的name这个子节点 并且赋值成newName
    				System.out.println("Update Info Successfully!!");
    			}
    		}
    		//将根结点绑定在文档上面
    		doc.addContent(ele);
    		
    		XMLOutputter output = new XMLOutputter(Format.getPrettyFormat().setEncoding("UTF-8").setIndent("    "));
    		output.output(doc, new FileOutputStream("config.xml"));
    		
    	}
    	
    	
    	
    	// 查 根据名字来查询
    	public void findByName(String findByName) throws JDOMException, IOException {
    		//创建工厂
    		SAXBuilder builder = new SAXBuilder();
    		//创建文档
    		Document doc = builder.build(new File("config.xml"));
    		//获取根结点
    		Element ele = doc.getRootElement();
    		//将根结点下面的所有节点找出来  返回element 集合  而不是Student
    		List<Element> list = ele.getChildren();
    		//遍历查找
    		for (int i = 0; i < list.size(); i++) {
    			Element e = list.get(i);
    			if(e.getName().equals(findByName)) {
    				System.out.println("查询结果如下:
    "+e.getChildText("age")+"	"+e.getChildText("city"));
    			}
    		}
    		
    		
    	}
    
    	
    
    }
    
    

    Test.java

    package com.lanqiao.dmeo7;
    
    /**
     * 对XMl的增、删、改、查的综合运用
     * 
     * 结合集合的运用
     * @author qichunlin
     *
     */
    public class Test {
    	public static void main(String[] args) throws Exception {
    		StudentManager sm = new StudentManager();
    		sm.load("D:/Hello.txt");
    		
    		//增
    		sm.addXml(new Student("小花",23,"武汉","湖南"));
    		
    		//删
    		sm.delXml("小齐");
    		
    		//改
    		sm.updateXml("小齐","小qi");
    		
    		//查
    		sm.findByName("小七");
    	}
    }
    
    

    Student.java

    package com.lanqiao.dmeo7;
    
    /**
     * 学生类  
     * 属性: 名字   年龄  城市  省份
     * 
     * @author qichunlin
     *
     */
    public class Student {
    	private String name;
    	private int age;
    	private String city;
    	private String province;
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public String getCity() {
    		return city;
    	}
    	public void setCity(String city) {
    		this.city = city;
    	}
    	public String getProvince() {
    		return province;
    	}
    	public void setProvince(String province) {
    		this.province = province;
    	}
    	public String toString() {
    		return "Student [name=" + name + ", age=" + age + ", city=" + city + ", province=" + province + "]";
    	}
    	public Student(String name, int age, String city, String province) {
    		super();
    		this.name = name;
    		this.age = age;
    		this.city = city;
    		this.province = province;
    	}
    	public Student() {
    		super();
    		// TODO Auto-generated constructor stub
    	}
    	
    	
    }
    
  • 相关阅读:
    Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?
    MyBatis 实现一对多有几种方式,怎么操作的?
    利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进 程的信息?
    哪个命令专门用来查看后台任务?
    什么是 MyBatis 的接口绑定?有哪些实现方式?
    什么是端到端微服务测试?
    我们如何在测试中消除非决定论?
    什么是持续监测?
    怎么使一个命令在后台运行?
    博客园样式美化(兼容为知笔记)
  • 原文地址:https://www.cnblogs.com/qichunlin/p/8819612.html
Copyright © 2011-2022 走看看