SAX 解析到文件,缓存到内存

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 目的<br>     通过一个小的SAX例子,我们更清晰的理解SAX的工作原理。<br><br>     本文例子主要实现:<br>     1. 将每个Employee信息输出到自己的文件中,文件名是以Employee ID和Employee Name来命名的,注意,观察代码中是如何得到Employee ID和Employee Name;<br>     2. 将每个Employ
目的
    通过一个小的SAX例子,我们更清晰的理解SAX的工作原理。

    本文例子主要实现:
    1. 将每个Employee信息输出到自己的文件中,文件名是以Employee ID和Employee Name来命名的,注意,观察代码中是如何得到Employee ID和Employee Name;
    2. 将每个Employee信息存入到Map中,其中,Map中的每个Value对应一个Employee的Collection,Map中的每个Key对应该Employee的ID。


    package shuai.study.sax.demo;  
      
    import java.io.File;  
    import java.io.IOException;  
    import java.util.Collection;  
    import java.util.HashMap;  
    import java.util.LinkedList;  
    import java.util.Map;  
      
    import javax.xml.parsers.ParserConfigurationException;  
    import javax.xml.parsers.SAXParser;  
    import javax.xml.parsers.SAXParserFactory;  
      
    import org.apache.commons.io.FileUtils;  
    import org.apache.commons.lang3.StringUtils;  
    import org.xml.sax.Attributes;  
    import org.xml.sax.SAXException;  
    import org.xml.sax.helpers.DefaultHandler;  
      
    /** 
     * @author shengshu 
     *  
     */  
    public class SaxHandler extends DefaultHandler {  
        private final static String leafNodeText = "|firstname|;|lastname|;|sex|;|country|;|province|;|city|;|village|;|mobile|;|mail|;|qq|;|postcode|;|profession|";  
      
        private Map<String, Collection<String>> companyMap = null;  
        private Collection<String> employeeCollection = null;  
      
        private String currentValue = null;  
        private String currentCharacters = null;  
      
        private StringBuffer idAndNameStringBuffer = null;  
      
        public SaxHandler(File inputFile) {  
            this.parseDocument(inputFile);  
        }  
      
        private void parseDocument(File inputFile) {  
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();  
      
            try {  
                SAXParser saxParser = saxParserFactory.newSAXParser();  
                saxParser.parse(inputFile, this);  
            } catch (ParserConfigurationException pce) {  
                pce.printStackTrace();  
            } catch (SAXException saxe) {  
                saxe.printStackTrace();  
            } catch (IOException ioe) {  
                ioe.printStackTrace();  
            }  
        }  
      
        @Override  
        public void startDocument() throws SAXException {  
            super.startDocument();  
            this.companyMap = new HashMap<String, Collection<String>>();  
        }  
      
        @Override  
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {  
            if (qName.equalsIgnoreCase("Employee")) {  
                this.employeeCollection = new LinkedList<String>();  
                this.idAndNameStringBuffer = new StringBuffer();  
      
                this.currentValue = attributes.getValue("ID");  
            }  
        }  
      
        @Override  
        public void characters(char[] buffer, int start, int length) {  
            this.currentCharacters = new String(buffer, start, length);  
        }  
      
        @Override  
        public void endElement(String uri, String localName, String qName) throws SAXException {  
            if (StringUtils.containsIgnoreCase(leafNodeText, "|" + qName + "|")) {  
                this.employeeCollection.add(qName + ": " + this.currentCharacters);  
      
                if (qName.equalsIgnoreCase("FirstName")) {  
                    this.idAndNameStringBuffer.append(this.currentCharacters);  
                }  
      
                if (qName.equalsIgnoreCase("LastName")) {  
                    this.idAndNameStringBuffer.append(this.currentCharacters);  
                }  
            }  
      
            if (qName.equalsIgnoreCase("Employee")) {  
                this.companyMap.put(this.currentValue, this.employeeCollection);  
      
                this.idAndNameStringBuffer.append("-").append(this.currentValue);  
      
                this.writeEmployee(employeeCollection, idAndNameStringBuffer.toString());  
            }  
        }  
      
        private void writeEmployee(Collection<String> employeeCollection, String fileName) {  
            String outputFileDirectory = SaxHandler.class.getResource("/file/output/").getPath();  
            String outputFilePath = outputFileDirectory + fileName + ".xml";  
            File outputFile = new File(outputFilePath);  
      
            try {  
                FileUtils.writeLines(outputFile, employeeCollection, false);  
            } catch (IOException ioe) {  
                ioe.printStackTrace();  
            }  
        }  
      
        @Override  
        public void endDocument() throws SAXException {  
            super.endDocument();  
        }  
      
        public Map<String, Collection<String>> getCompanyMap() {  
            return this.companyMap;  
        }  
      
    }  

    package shuai.study.sax.demo;  
      
    import java.io.File;  
    import java.util.Collection;  
    import java.util.Iterator;  
    import java.util.Map;  
    import java.util.Map.Entry;  
      
    /** 
     * @author shengshu 
     *  
     */  
    public class SaxDemo {  
        public static void displayCompany(Map<String, Collection<String>> companyMap) {  
            Iterator<Entry<String, Collection<String>>> companyIterator = companyMap.entrySet().iterator();  
      
            while (companyIterator.hasNext()) {  
                Entry<String, Collection<String>> companyEntry = companyIterator.next();  
      
                String id = companyEntry.getKey();  
                System.out.println("============== Employee ID " + id + " Start ==============");  
      
                Collection<String> employeeCollection = companyEntry.getValue();  
                Iterator<String> employeeIterator = employeeCollection.iterator();  
      
                while (employeeIterator.hasNext()) {  
                    String leafNodeAndValue = employeeIterator.next();  
                    System.out.println(leafNodeAndValue);  
                }  
      
                System.out.println("============== Employee ID " + id + " End ==============");  
            }  
        }  
      
        public static void main(String[] args) {  
            String inputFilePath = SaxDemo.class.getResource("/file/input/company.xml").getPath();  
            File inputFile = new File(inputFilePath);  
      
            SaxHandler saxHandler = new SaxHandler(inputFile);  
      
            Map<String, Collection<String>> companyMap = saxHandler.getCompanyMap();  
      
            SaxDemo.displayCompany(companyMap);  
        }  
    }  

    <?xml version = "1.0" encoding="UTF-8"?>  
      
    <Company>  
        <Employee ID="37">  
            <Name>  
                <FirstName>Zhou</FirstName>  
                <LastName>Shengshuai</LastName>  
            </Name>  
      
            <Sex>Male</Sex>  
      
            <Address>  
                <Country>China</Country>  
                <Province>ShanDong</Province>  
                <City>LinYi</City>  
                <Village>FengHuangYu</Village>  
      
                <Contact>  
                    <Mobile>18108***778</Mobile>  
                    <Mail>zhoushengshuai2007@163.com</Mail>  
                    <QQ>254392398</QQ>  
                    <Postcode>276422</Postcode>  
                </Contact>  
            </Address>  
      
            <Profession>Software</Profession>  
        </Employee>  
      
        <Employee ID="66">  
            <Name>  
                <FirstName>Wang</FirstName>  
                <LastName>Eric</LastName>  
            </Name>  
      
            <Sex>Male</Sex>  
      
            <Address>  
                <Country>China</Country>  
                <Province>HeBei</Province>  
                <City>QinHuangDao</City>  
                <Village>hhh</Village>  
      
                <Contact>  
                    <Mobile>150*****955</Mobile>  
                    <Mail>eric@163.com</Mail>  
                    <QQ>666666666</QQ>  
                    <Postcode>111666</Postcode>  
                </Contact>  
            </Address>  
      
            <Profession>Software</Profession>  
        </Employee>  
      
        <Employee ID="99">  
            <Name>  
                <FirstName>Shi</FirstName>  
                <LastName>Stone</LastName>  
            </Name>  
      
            <Sex>Male</Sex>  
      
            <Address>  
                <Country>China</Country>  
                <Province>HeNan</Province>  
                <City>PingDingShan</City>  
                <Village>nnn</Village>  
      
                <Contact>  
                    <Mobile>186*****015</Mobile>  
                    <Mail>stone@163.com</Mail>  
                    <QQ>999999999</QQ>  
                    <Postcode>111999</Postcode>  
                </Contact>  
            </Address>  
      
            <Profession>Software</Profession>  
        </Employee>  
    </Company>  

相关文章
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
124 2
|
2月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
172 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
1月前
|
Serverless 对象存储 人工智能
智能文件解析:体验阿里云多模态信息提取解决方案
在当今数据驱动的时代,信息的获取和处理效率直接影响着企业决策的速度和质量。然而,面对日益多样化的文件格式(文本、图像、音频、视频),传统的处理方法显然已经无法满足需求。
84 4
智能文件解析:体验阿里云多模态信息提取解决方案
|
3月前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
3月前
|
存储 缓存 网络协议
如何防止DNS缓存中毒攻击(一)
DNS缓存中毒也称为DNS欺骗
71 10
|
3月前
|
缓存 网络协议 安全
如何防止DNS缓存中毒(Ⅱ)
服务器应该配置为尽可能少地依赖与其他DNS服务器的信任关系
63 10
|
3月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
69 3
|
3月前
|
存储
文件太大不能拷贝到U盘怎么办?实用解决方案全解析
当我们试图将一个大文件拷贝到U盘时,却突然跳出提示“对于目标文件系统目标文件过大”。这种情况让人感到迷茫,尤其是在急需备份或传输数据的时候。那么,文件太大为什么会无法拷贝到U盘?又该如何解决?本文将详细分析这背后的原因,并提供几个实用的方法,帮助你顺利将文件传输到U盘。
|
2天前
|
缓存 NoSQL 中间件
Redis,分布式缓存演化之路
本文介绍了基于Redis的分布式缓存演化,探讨了分布式锁和缓存一致性问题及其解决方案。首先分析了本地缓存和分布式缓存的区别与优劣,接着深入讲解了分布式远程缓存带来的并发、缓存失效(穿透、雪崩、击穿)等问题及应对策略。文章还详细描述了如何使用Redis实现分布式锁,确保高并发场景下的数据一致性和系统稳定性。最后,通过双写模式和失效模式讨论了缓存一致性问题,并提出了多种解决方案,如引入Canal中间件等。希望这些内容能为读者在设计分布式缓存系统时提供有价值的参考。感谢您的阅读!
Redis,分布式缓存演化之路
|
2月前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
184 85

推荐镜像

更多