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);
相关文章
|
5月前
|
Java API 开发工具
【Azure Developer】Java代码实现获取Azure 资源的指标数据却报错 "invalid time interval input"
在使用 Java 调用虚拟机 API 获取指标数据时,因本地时区设置非 UTC,导致时间格式解析错误。解决方法是在代码中手动指定时区为 UTC,使用 `ZoneOffset.ofHours(0)` 并结合 `withOffsetSameInstant` 方法进行时区转换,从而避免因时区差异引发的时间格式问题。
297 3
|
6月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
6月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
4月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
235 1
|
5月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
427 16
|
7月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
364 14
|
7月前
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
209 0
|
8月前
|
存储 Java 数据安全/隐私保护
Java技术栈揭秘:Base64加密和解密文件的实战案例
以上就是我们今天关于Java实现Base64编码和解码的实战案例介绍。希望能对你有所帮助。还有更多知识等待你去探索和学习,让我们一同努力,继续前行!
566 5
|
7月前
|
存储 人工智能 Java
java之通过Http下载文件
本文介绍了使用Java实现通过文件链接下载文件到本地的方法,主要涉及URL、HttpURLConnection及输入输出流的操作。
539 0
|
8月前
|
网络协议 安全 Java
实现Java语言的文件断点续传功能的技术方案。
像这样,我们就完成了一项看似高科技、实则亲民的小工程。这样的技术实现不仅具备实用性,也能在面对网络不稳定的挑战时,稳稳地、不失乐趣地完成工作。
470 0