JAVA如何监听XML文件?并处理数据

简介: 本文主要的内容,就是讲述,第三方客户端,在指定的文件夹生成了对应的xml文件,java程序需要监听对应的文件夹,并解析xml文件内容,转成javaBean,主要使用到了xjc生成对应的实体类,在经过监听文件变化,加载xml数据,转换成对应的bean实例,采用的技术有Spring boot、XJC、commons-io

前言

    本文主要的内容,就是讲述,第三方客户端,在指定的文件夹生成了对应的xml文件,java程序需要监听对应的文件夹,并解析xml文件内容,转成javaBean,主要使用到了xjc生成对应的实体类,在经过监听文件变化,加载xml数据,转换成对应的bean实例,采用的技术有Spring boot、XJC、commons-io

一、通过xjc,将xml转成javaBean

通过java工具jar包中的xjc,将xml生成对应的实体类,使用cmd,运行下面指令,参数要参考参数列表说明

java -Dfile.encoding=UTF-8 -cp D:\java\jdk1.6.0_03\lib\tools.jar com.sun.tools.internal.xjc.Driver  -p com.geostar.csw.domain.layer -d c:\test
参数 参数说明
tools.jar 是jdk路径下的一个工具包,路径在jdk路径下面的lib中
-Dfile.encoding=UTF-8 是指定生成java实体类的文件编码
-p 生成的包路径
-d 生成的路径

把生成的实体类放到对应的项目中,对应的实体类中有对应的xml注解

二、编写FileAlterationListenerAdaptor文件监听的实现类

package com.example.sub_demo.service;

import com.example.sub_demo.entity.DecMessage;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;

@Slf4j
public class DirectoryWatchService extends FileAlterationListenerAdaptor {



    @Override
    public void onStart(FileAlterationObserver observer) {

        log.debug("开始对目录:{}进行监听", observer.getDirectory().getPath());


    }

    @Override
    public void onDirectoryCreate(File directory) {
        log.info("目录:{}创建", directory.getPath());

    }

    @Override
    public void onDirectoryChange(File directory) {
        log.info("目录:{}改变", directory.getPath());
    }

    @Override
    public void onDirectoryDelete(File directory) {
        log.info("目录:{}被删除", directory.getPath());
    }

    @Override
    public void onFileCreate(File file) {
        log.info("文件:{}创建", file.getPath());
        JAXBContext context;
        try {
            //创建JAXB上下文
            context = JAXBContext.newInstance(DecMessage.class);
            //Unmarshaller可以将xml内容,转换成javabean
            Unmarshaller unmarshaller = context.createUnmarshaller();
            //重指定xml文件,解析dom树,并绑定对应的java bean
            DecMessage decMessage=(DecMessage)unmarshaller.unmarshal(ResourceUtils.getFile(file.getPath()));
            //处理完业务逻辑,删除文件
            FileUtils.deleteQuietly(file);
        } catch (Exception e) {

        }

    }

    @Override
    public void onFileChange(File file) {
        log.info("文件:{}改变", file.getPath());
    }

    @Override
    public void onFileDelete(File file) {
        log.info("文件:{}删除", file.getPath());
    }

    @Override
    public void onStop(FileAlterationObserver observer) {
        log.debug("停止目录{}监听", observer.getDirectory().getPath());
        super.onStop(observer);
    }
}

三、 创建file的配置类,作用是实例化其他的bean

package com.example.sub_demo.config;

import com.example.sub_demo.service.DirectoryWatchService;
import com.example.sub_demo.service.FileWatchPathService;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.FileFilter;
import java.util.List;

@Configuration
public class FileConfig {
    //创建文件过滤器,过滤哪些文件需要被监听
    @Bean
    public FileFilter bchtFileFilter(){
        return pathname -> {
            if(pathname.getPath().endsWith(".xml") || pathname.getPath().endsWith(".XML")){
                return true;
            }
            return false;
        };
    }
    //创建对应的文件监听实现类
    @Bean
    public DirectoryWatchService directoryWatchService(){
        return new DirectoryWatchService();
    }
    /**
     * 目录监听器
     *
     * @return
     */
    @Bean
    public FileAlterationMonitor fileAlterationMonitor(FileWatchPathService fileWatchPathService,DirectoryWatchService directoryWatchService, FileFilter bchtFileFilter) {
        Logger log=LoggerFactory.getLogger(FileConfig.class);
        //监控器 100 监控刷新时间
        FileAlterationMonitor monitor = new FileAlterationMonitor(100);
        //从service数据库中,获取需要监听的文件夹
        List<String> directoryPath=fileWatchPathService.getWatchFilePath();
            // 多个文件夹监控,需要add多个观察者
        for (String path : directoryPath) {
            log.info("监听目录:{}", path);

            //对某个路径的观察者
            FileAlterationObserver observer = new FileAlterationObserver(path, bchtFileFilter);
            // 增加文件过滤,符合文件后缀的文件才进行处理,防止操作系统中生成的临时文件无法处理
            //添加监听事件响应,与path无关,rsync同步需要
            observer.addListener(directoryWatchService);
            //将观察者添加到监控器
            monitor.addObserver(observer);
        }
        return monitor;
    }
}

四、启动FileAlterationMonitor

实现spring boot的CommandLineRunner接口,在应用启动后,进行启动FileAlterationMonitor

package com.example.sub_demo.listener;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class RunnerEvent implements  CommandLineRunner {
    @Autowired
    private FileAlterationMonitor fileAlterationMonitor;
    @Override
    public void run(String... args) throws Exception {
        fileAlterationMonitor.start();
    }
}

五、番外

如果实体类中加有javax.xml包下的注解,例如XmlRootElement,我们就可以直接通过restful,去接收对于的参数,记得选择参数类型为xml

在这里插入图片描述
后端定义请求方法,会自动把xml数据,解析到实体类
在这里插入图片描述
2:FileAlterationMonitor类可以动态开启监听、关闭监听,同时也可以动态添加监听路径,和动态删除监听路径

FileAlterationMonitor fileAlterationMonitor=new FileAlterationMonitor();
方法 说明
fileAlterationMonitor.stop(10) 在多少毫秒后,停止监听,参数可不传
fileAlterationMonitor.removeObserver(observer) 删除监听
fileAlterationMonitor.addObserver(observer) 添加监听
fileAlterationMonitor.start() 启动监听
//observer是监听对象,第一个参数就是监听路径,第二个参数就是文件过滤器
FileAlterationObserver observer = new FileAlterationObserver(path, bchtFileFilter);
相关文章
|
1月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
2月前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
2月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
2月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
59 4
|
3月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
101 21
|
3月前
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
113 33
|
4月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
515 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3月前
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
118 13
|
3月前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
106 7
|
3月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
191 1