使用 JAXB 将内嵌的JAVA对象转换为 xml文件

使用 JAXB 将内嵌的JAVA对象转换为 xml文件

1. 需求

获取一个目录下所有文件的元数据信息(文件名、大小、后缀等),并生成对应的xml文件;

思路

创建一个 FileDesc 类用来存储文件的元数据信息;

创建一个 MetaFileXml 类,将 List<FileDesc> metaFile 的List作为属性,用来存储多个文件的元数据信息;

2. 实现

(1)FileDesc类

用来保存文件的元数据信息;
注意 :类上面要加 @XmlRootElement 注解!

java 复制代码
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class FileDesc {
        private String file;
        private String parentPath;
        private String suffix;
        private String size;


        public FileDesc() {
        }

    public FileDesc(String file, String size) {
        this.file = file;
        this.size = size;
    }

        public FileDesc(String file, String parentPath, String suffix, String size) {
            this.file = file;
            this.parentPath = parentPath;
            this.suffix = suffix;
            this.size = size;
        }

        public String getFile() {
            return file;
        }

        public void setFile(String file) {
            this.file = file;
        }

        public String getParentPath() {
            return parentPath;
        }

        public void setParentPath(String parentPath) {
            this.parentPath = parentPath;
        }

        public String getSize() {
            return size;
        }

        public void setSize(String size) {
            this.size = size;
        }

        public String getSuffix() {
            return suffix;
        }

        public void setSuffix(String suffix) {
            this.suffix = suffix;
        }

    }

(2)MetaFileXml类

用来保存多个文件的元数据信息;
注意 :类上面要加 @XmlRootElement 注解!

java 复制代码
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement
public class MetaFileXml {
    private List<FileDesc> metaFile;

    public List<FileDesc> getMetaFile() {
        return metaFile;
    }

    public void setMetaFile(List<FileDesc> metaFile) {
        this.metaFile = metaFile;
    }
}

(3)生成对应的xml文件

注意 :建立 JAXBContext 时是以 MetaFileXml 类来创建;

java 复制代码
    @Test
    public void testXml() throws Exception {
        // 1. 准备文件目录
        String filePath = "C:\\Users\\liziq\\Desktop\\zipTest02";
        File sourceFile = new File(filePath);

        // 2. 获取目录下所有文件
        List<File> files = (List<File>) FileUtils.listFiles(sourceFile, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
        List<FileDesc> descList = new ArrayList<>();

        // 3. 将所有文件的元数据放入 List中
        for (File file : files) {
            long size = Files.size(Paths.get(file.getAbsolutePath()));
            String sizeString = String.valueOf(size);
            String suffix = FilenameUtils.getExtension(file.getName()).toLowerCase();
            descList.add(new FileDesc(file.getName(), file.getParent(), suffix, sizeString));
        }

        // 4. 将List<FileDesc> 添加到 fileDescXml
        MetaFileXml fileDescXml = new MetaFileXml();
        fileDescXml.setMetaFile(descList);

        // 5. 生成xml格式信息
        try {
            // 创建JAXBContext对象
            JAXBContext jaxbContext = JAXBContext.newInstance(MetaFileXml.class);
            // 创建Marshaller对象
            Marshaller marshaller = jaxbContext.createMarshaller();
            // 设置Marshaller的属性,格式化输出
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            StringWriter writer = new StringWriter();
            writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
            marshaller.marshal(fileDescXml, writer);

        // 6. 写入xml文件
            File fileDesc = new File("C:\\Users\\liziq\\Desktop\\meta.xml");
            FileWriter fw = new FileWriter(fileDesc);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(writer.toString());
            bw.flush();
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

成功生成xml文件:

相关推荐
田里的水稻20 分钟前
EP_XML\JSON配置文件和YAML
xml·运维·人工智能·机器人·自动驾驶·json
淘源码d1 小时前
医学影像云PACS系统——PACS诊断工作站
java·源码·影像处理·医院管理系统·影像工作站·云pacs系统·dicom 标准通信
NiceCloud喜云2 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
SamDeepThinking2 小时前
组合还是继承?我在项目里主要看这两个判断
java·后端·面试
momo2 小时前
JAVA基础知识
java·开发语言
就叫_这个吧3 小时前
Activiti7工作流入门+案例应用
java·activiti7·工作流
Z_W_H_3 小时前
minikube start --driver=docker --memory=4000mb出现PROVIDER_DOCKER_NEWGRP
java·docker·minikube
折哥的程序人生 · 物流技术专研3 小时前
第3篇:手写促销策略引擎(满减、打折、立减)
java·设计模式·策略模式·开闭原则·编程实战·扩充系列·促销引擎
郑州光合科技余经理3 小时前
海外外卖平台源码改造实战——多语言核心代码实现
java·开发语言·前端·后端·mysql·架构·php
耀耀_很无聊3 小时前
12_Redis Lua 脚本踩坑:为什么 tonumber(ARGV[x]) 会得到 nil?
java·redis·lua