






















import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.concurrent.ConcurrentHashMap; import java.util.Map; /** * 基于文件路径的XML转JavaBean工具类 * 支持缓存机制和完整的异常处理 */ public class FilePathJaxbUtil { private static final Map<Class<?>, JAXBContext> CONTEXT_CACHE = new ConcurrentHashMap<>(); /** * 从XML文件路径直接转换为JavaBean对象 */ public static <T> T xmlFileToObject(String filePath, Class<T> clazz) { try { // 读取XML文件内容 String xmlContent = readXmlFile(filePath); // 使用JAXB进行反序列化 JAXBContext context = getJAXBContext(clazz); Unmarshaller unmarshaller = context.createUnmarshaller(); return clazz.cast(unmarshaller.unmarshal(new StringReader(xmlContent))); } catch (JAXBException e) { throw new RuntimeException("XML文件转换JavaBean失败,文件路径:" + filePath, e); } } /** * 读取XML文件内容 */ private static String readXmlFile(String filePath) { StringBuilder content = new StringBuilder(); try ( // BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8))) { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "GB2312"))) { String line; while ((line = reader.readLine()) != null) { content.append(line).append("\n"); } return content.toString(); } catch (IOException e) { throw new RuntimeException("读取XML文件失败,文件路径:" + filePath, e); } } /** * 将JavaBean对象保存为XML文件 */ public static void objectToXmlFile(Object object, String filePath) { try { JAXBContext context = getJAXBContext(object.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); try (FileWriter writer = new FileWriter(filePath)) { marshaller.marshal(object, writer); } } catch (JAXBException | IOException e) { throw new RuntimeException("JavaBean保存为XML文件失败,文件路径:" + filePath, e); } } /** * 获取或创建JAXBContext实例(带缓存) */ private static JAXBContext getJAXBContext(Class<?> clazz) throws JAXBException { return CONTEXT_CACHE.computeIfAbsent(clazz, key -> { try { return JAXBContext.newInstance(key); } catch (JAXBException e) { throw new RuntimeException("创建JAXBContext失败,类:" + clazz.getName(), e); } }); } /** * 清空缓存(用于热部署等场景) */ public static void clearCache() { CONTEXT_CACHE.clear(); } }
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。