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被关闭时抛出的异常被抑制了。这样开发人员也就能更多的精力关注应用需求上了。