Java 语言中xml和bean之间的相互转换(Try-with-resources)

       XML 指可扩展标记语言,XML 被设计用来传输和存储数据,常用的场景是数据交换和信息配置。虽然后期随着信息技术的发展在数据交换场景的地位远不如从前,但是作为信息配置工具,特别是配置信息多和配置信息复杂的场景,依然有着比较广泛的应用。
       然后闲话不多说,先上一段Java版本的xml和对象相互转换的代码。

/**
     * java对象转换为xml文件
     * @param xmlPath  xml文件路径
     * @param load    java对象.Class
     * @return    xml文件的String
     * @throws JAXBException    
     */
    public static <T> String beanToXml(Object obj,Class<T> load) throws JAXBException{
    	try {
    		JAXBContext context = JAXBContext.newInstance(load);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj,writer);
            return writer.toString();
       } catch (JAXBException e) {
           logger.trace(e);
           throw e;
       }
    }
    /**
     * xml文件配置转换为对象
     * @param xmlPath  xml文件路径
     * @param load    java对象.Class
     * @return    java对象
     * @throws JAXBException    
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
	public static <T> T  xmlToBean(String xmlPath,Class<T>  load, Object... arguments) throws JAXBException, IOException{
       
        try (FileInputStream  xmlFile = new FileInputStream (xmlPath)){
        	 if (arguments.length > 0) {
        		xmlPath = MessageFormat.format(xmlPath, arguments);
             }
        	 logger.trace("read xmlPath=" + xmlPath);
        	 JAXBContext context = JAXBContext.newInstance(load);  
             Unmarshaller unmarshaller = context.createUnmarshaller(); 
             return (T)unmarshaller.unmarshal(xmlFile);
        } catch (JAXBException e) {
            logger.trace(e);
            throw e;
        }
    }

      XML和Java对象的转换,网络上源码案例很多,这个地方贴出来主要还是想记录一下Try-with-resources的使用。


JDK7之后,Java多了个新的语法:try-with-resources语句,可以理解为是一个声明一个或多个资源的 try语句(用分号隔开),一个资源作为一个对象,并且这个资源必须要在执行完关闭的,try-with-resources语句确保在语句执行完毕后,每个资源都被自动关闭 。任何实现了** java.lang.AutoCloseable**的对象, 包括所有实现了 java.io.Closeable 的对象, 都可以用作一个资源。

        在Java7以前,程序中使用的资源需要被明确地关闭,这个体验有点繁琐。而且这里有一个问题 ,如果文件流打开后,程序出现异常,然后finally里面关闭资源也出现了异常,那么哪个异常会根据调用栈往外传播?


         try-with-resources使用方法很简单try (FileInputStream  xmlFile = new FileInputStream (xmlPath)){}。在try关键字后面的括号中声明FileInputStream 类型变量并赋值,无需额外捕获IO异常以及关闭流。另外,对于上面提出的问题,如果try-with-resources结构中抛出一个异常,同时FileInputStreami被关闭时(调用了其close方法)也抛出一个异常,try-with-resources结构中抛出的异常会向外传播,而FileInputStreami被关闭时抛出的异常被抑制了。这样开发人员也就能更多的精力关注应用需求上了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值