有时候,我们不一定需要用数据库来保存信息,可以直接用文件来保存,比如这里把文件夹当作表名,把文件当作记录,工具类如下:
/*** XML操作工具类,保存的时候进行类编码,查询的时候已经进行解码* @author forever**/public class XMLUtils {/*** 添加xml节点* @param parent 父节点* @param elementName 节点名称* @param elementValue 节点值* @return 返回新添加的节点*/private static Element addElement(Element parent, String elementName, String elementValue) {Element element = parent.addElement(elementName);if (!"".equals(elementValue)) {element.setText(elementValue);}return element;}// 写入XML文件/*** Dom4j通过XMLWriter将Document对象表示的XML树写入指定的文件,并使用OutputFormat格式对象指定写入的风格和编码方法。* 调用OutputFormat.createPrettyPrint()方法可以获得一个默认的pretty print风格的格式对象。* 对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。* @param document* @param filename* @return*/private static boolean saveXmlFile(Document document, String xmlPath) {boolean flag = true;try {// OutputFormat.createPrettyPrint() : 表示格式化(就是有缩进的格式)//但是这种格式化会导致换行不见了OutputFormat format = new OutputFormat();XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(xmlPath), "UTF-8"), format);writer.setEscapeText(false);writer.write(document);writer.close();System.out.print("保存XML文件成功:"+xmlPath);} catch (Exception ex) {flag = false;ex.printStackTrace();System.out.print("保存XML文件失败:"+xmlPath);}return flag;}// 读取XML文档private static Document load(String xmlPath) {Document document = null;try {SAXReader saxReader = new SAXReader();document = saxReader.read(new File(xmlPath)); // 读取XML文件,获得document对象} catch (Exception ex) {ex.printStackTrace();}return document;}/*** 保存,这里需要指定保存的对象和文件所在路径* @param object* @param xmlPath*/public static Boolean save(Object object,String xmlPath) {try {SAXReader saxReader = new SAXReader();Document document = saxReader.getDocumentFactory().createDocument();Class<?> clazz = object.getClass();String rootName = clazz.getSimpleName().toLowerCase();Element root = document.addElement(rootName+"s");Element content = addElement(root, rootName, "");for (Field declaredField : clazz.getDeclaredFields()) {declaredField.setAccessible(true);//获取属性名字String name = declaredField.getName();//获取属性值String value = (String) declaredField.get(object);if(value==null) {value="";}addElement(content, name,encode(value));}File file = new File(xmlPath);file.createNewFile();return saveXmlFile(document, xmlPath);} catch (Exception e) {e.printStackTrace();}return false;}/*** 删除xml* @param xmlPath xml路径*/public static Boolean delete(String xmlPath) {try {File file = new File(xmlPath);file.delete();System.out.print("删除xml文件成");return true;} catch (Exception e) {e.printStackTrace();}return false;}/*** xml更新 其实内部只有一条记录* @param object 要更新的对象* @param xmlPath 路径* @return*/public static boolean update(Object object, String xmlPath) {try {Class<?> clazz = object.getClass();Document document = load(xmlPath);if (document == null) {return false;}Element root = document.getRootElement();List<Element> list = root.elements();for (Element p : list) {// 获取每个p元素中的name元素// 这里就找到了要修改的元素for (Field declaredField : clazz.getDeclaredFields()) {declaredField.setAccessible(true);String name = declaredField.getName();String value = (String) declaredField.get(object);if (value == null) {value = "";}List<Element> childs = p.elements();for (Element p2 : childs) {if (p2.getName().equals(name)) {p2.setText(encode(value));break;}}}}return saveXmlFile(document, xmlPath);} catch (Exception e) {e.printStackTrace();}return false;}/*** 查询内容* @param clazz* @param xmlPath* @return*/public static <T> T select(Class<T> clazz, String xmlPath) {try {Document document = load(xmlPath);if (document == null) {return null;}Element root = document.getRootElement();T obj = clazz.newInstance();List<Element> list = root.elements();// 遍历p元素for (Element p : list) {// 获取每个p元素中的name元素for (Field declaredField : clazz.getDeclaredFields()) {declaredField.setAccessible(true);String name = declaredField.getName();List<Element> childs = p.elements();for (Element p2 : childs) {if (p2.getName().equals(name)) {Class<?> z = declaredField.getType();String value = (String) p2.getData();if(value==null) {value="";}declaredField.set(obj,decode(value));break;}}}}return obj;} catch (Exception e) {e.printStackTrace();}return null;}public static String encode(String str) {String content ="";if(StringUtils.isNotBlank(str)) {try {content =str;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}return content;}public static String decode(String str) {String content ="";if(StringUtils.isNotBlank(str)) {try {content = str;return content;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}return content;}public static void main(String[] args) throws UnsupportedEncodingException {//String xmlPath = "E:/data/table/menus/";//String id = SnowflakeIdUtil.getSnowflakeId()+"";//xmlPath = xmlPath+id+".xml";//Menu menu = new Menu();//menu.setId(id);//menu.setImgurl("");//menu.setName("菜"+id);//menu.setParent_id("0");//menu.setSort("1");//XMLUtils.save(menu, xmlPath);//XMLUtils.update(menu, xmlPath);//XMLUtils.delete(xmlPath);//Menu m = XMLUtils.select(Menu.class, xmlPath);}}
需要注意的是,再保存数据的时候可能需要对文件进行转码或者用xml规定的字符包起来。
