JDK16新特性.docx

上传人:b****6 文档编号:6005163 上传时间:2023-01-02 格式:DOCX 页数:20 大小:27.67KB
下载 相关 举报
JDK16新特性.docx_第1页
第1页 / 共20页
JDK16新特性.docx_第2页
第2页 / 共20页
JDK16新特性.docx_第3页
第3页 / 共20页
JDK16新特性.docx_第4页
第4页 / 共20页
JDK16新特性.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

JDK16新特性.docx

《JDK16新特性.docx》由会员分享,可在线阅读,更多相关《JDK16新特性.docx(20页珍藏版)》请在冰豆网上搜索。

JDK16新特性.docx

JDK16新特性

JDK6的新特性之一:

Desktop类和SystemTray类

在JDK6中,AWT新增加了两个类:

Desktop和SystemTray,前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序.下面代码演示了Desktop和SystemTray的用法.

/**

*

*@authorchinajash

*/

importjava.awt.Desktop;

importjava.awt.SystemTray;

importjava.awt.TrayIcon;

importjava.awt.Toolkit;

importjava.awt.Image;

importjava.awt.PopupMenu;

importjava.awt.Menu;

importjava.awt.MenuItem;

importjava.awt.AWTException;

importjava.io.File;

importjava.io.IOException;

import.URI;

import.URISyntaxException;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

publicclassDesktopTray{

privatestaticDesktopdesktop;

privatestaticSystemTrayst;

privatestaticPopupMenupm;

publicstaticvoidmain(String[]args){

if(Desktop.isDesktopSupported()){//判断当前平台是否支持Desktop类

desktop=Desktop.getDesktop();

}

if(SystemTray.isSupported()){//判断当前平台是否支持系统托盘

st=SystemTray.getSystemTray();

Imageimage=Toolkit.getDefaultToolkit().getImage("netbeans.png");//定义托盘图标的图片

createPopupMenu();

TrayIconti=newTrayIcon(image,"DesktopDemoTray",pm);

try{

st.add(ti);

}catch(AWTExceptionex){

ex.printStackTrace();

}

}

}

publicstaticvoidsendMail(Stringmail){

if(desktop!

=null&&desktop.isSupported(Desktop.Action.MAIL)){

try{

desktop.mail(newURI(mail));

}catch(IOExceptionex){

ex.printStackTrace();

}catch(URISyntaxExceptionex){

ex.printStackTrace();

}

}

}

publicstaticvoidopenBrowser(Stringurl){

if(desktop!

=null&&desktop.isSupported(Desktop.Action.BROWSE)){

try{

desktop.browse(newURI(url));

}catch(IOExceptionex){

ex.printStackTrace();

}catch(URISyntaxExceptionex){

ex.printStackTrace();

}

}

}

publicstaticvoidedit(){

if(desktop!

=null&&desktop.isSupported(Desktop.Action.EDIT)){

try{

FiletxtFile=newFile("test.txt");

if(!

txtFile.exists()){

txtFile.createNewFile();

}

desktop.edit(txtFile);

}catch(IOExceptionex){

ex.printStackTrace();

}

}

}

publicstaticvoidcreatePopupMenu(){

pm=newPopupMenu();

MenuItemopenBrowser=newMenuItem("OpenMyBlog");

openBrowser.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

openBrowser("

}

});

MenuItemsendMail=newMenuItem("SendMailtome");

sendMail.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

sendMail("mailto:

chinajash@");

}

});

MenuItemedit=newMenuItem("EditTextFile");

sendMail.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

edit();

}

});

MenuItemexitMenu=newMenuItem("&Exit");

exitMenu.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

System.exit(0);

}

});

pm.add(openBrowser);

pm.add(sendMail);

pm.add(edit);

pm.addSeparator();

pm.add(exitMenu);

}

}

如果在Windows中运行该程序,可以看到在系统托盘区有一个图标,右击该图标会弹出一个菜单,点击OpenMyBlog会打开IE,并浏览"Mailtome会打开OutlookExpress给我发邮件;点击EditTextFile会打开记事本编辑在程序中创建的文件test.txt

JDK6的新特性之二:

使用JAXB2来实现对象与XML之间的映射

JAXB是JavaArchitectureforXMLBinding的缩写,可以将一个Java对象转变成为XML格式,反之亦然。

我们把对象与关系数据库之间的映射称为ORM,其实也可以把对象与XML之间的映射称为OXM(ObjectXMLMapping).原来JAXB是JavaEE的一部分,在JDK6中,SUN将其放到了JavaSE中,这也是SUN的一贯做法。

JDK6中自带的这个JAXB版本是2.0,比起1.0(JSR31)来,JAXB2(JSR222)用JDK5的新特性Annotation来标识要作绑定的类和属性等,这就极大简化了开发的工作量。

实际上,在JavaEE5.0中,EJB和WebServices也通过Annotation来简化开发工作。

另外,JAXB2在底层是用StAX(JSR173)来处理XML文档。

闲话不多说了,下面用代码演示在JDK6中如何来用JAXB2

publicclassJAXB2Tester{

publicstaticvoidmain(String[]args)throwsJAXBException,IOException{

JAXBContextcontext=JAXBContext.newInstance(Person.class);

//下面代码演示将对象转变为xml

Marshallerm=context.createMarshaller();

Addressaddress=newAddress("China","Beijing","Beijing","ShangDiWest","100080");

Personp=newPerson(Calendar.getInstance(),"JAXB2",address,Gender.MALE,"SW");

FileWriterfw=newFileWriter("person.xml");

m.marshal(p,fw);

//下面代码演示将上面生成的xml转换为对象

FileReaderfr=newFileReader("person.xml");

Unmarshallerum=context.createUnmarshaller();

Personp2=(Person)um.unmarshal(fr);

System.out.println("Country:

"+p2.getAddress().getCountry());

}

}

@XmlRootElement//表示person是一个根元素

classPerson{

@XmlElement

CalendarbirthDay;//birthday将作为person的子元素

@XmlAttribute

Stringname;//name将作为person的的一个属性

publicAddressgetAddress(){

returnaddress;

}

@XmlElement

Addressaddress;//address将作为person的子元素

@XmlElement

Gendergender;//gender将作为person的子元素

@XmlElement

Stringjob;//job将作为person的子元素

publicPerson(){

}

publicPerson(CalendarbirthDay,Stringname,Addressaddress,Gendergender,Stringjob){

this.birthDay=birthDay;

this.name=name;

this.address=address;

this.gender=gender;

this.job=job;

}

}

enumGender{

MALE(true),

FEMALE(false);

privatebooleanvalue;

Gender(boolean_value){

value=_value;

}

}

classAddress{

@XmlAttribute

Stringcountry;

@XmlElement

Stringstate;

@XmlElement

Stringcity;

@XmlElement

Stringstreet;

Stringzipcode;//由于没有添加@XmlElement,所以该元素不会出现在输出的xml中

publicAddress(){

}

publicAddress(Stringcountry,Stringstate,Stringcity,Stringstreet,Stringzipcode){

this.country=country;

this.state=state;

this.city=city;

this.street=street;

this.zipcode=zipcode;

}

publicStringgetCountry(){

returncountry;

}

}

运行该程序,我们会得到一个person.xml的文件,如下:

xmlversion="1.0"encoding="UTF-8"standalone="yes"?

>

2006-12-28T08:

49:

27.203+00:

00

Beijing

Beijing

ShangDiWest

MALE

SW

控制台会输出

Country:

China

最后,想说一点,除了JAXB之外,我们还可以通过XMLBeans和Castor等来实现同样的功能。

JDK6的新特性之三:

理解StAX

StAX(JSR173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API

StAX的来历

在JAXP1.3(JSR206)有两种处理XML文档的方法:

DOM(DocumentObjectModel)和SAX(SimpleAPIforXML).由于JDK6.0中的JAXB2(JSR222)和JAX-WS2.0(JSR224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本).JDK6里面JAXP的版本就是1.4.

StAX简介

StAX是TheStreamingAPIforXML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。

下面是这几种API的比较(转载自

XMLParserAPIFeatureSummaryFeatureStAXSAXDOMTrAX

APITypePull,streamingPush,streamingInmemorytreeXSLTRule

EaseofUseHighMediumHighMedium

XPathCapabilityNoNoYesYes

CPUandMemoryEfficiencyGoodGoodVariesVaries

ForwardOnlyYesYesNoNo

ReadXMLYesYesYesYes

WriteXMLYesNoYesYes

Create,Read,Update,DeleteNoNoYesNo

StAX代码演示

下面代码演示了如何通过StAX读取xml文档和生成xml文档

publicclassStaxTester{

publicstaticvoidmain(String[]args)throwsXMLStreamException,FileNotFoundException{

readXMLByStAX();//用XMLEventReader解析xml文档

writeXMLByStAX();//用XMLStreamWriter写xml文档

}

privatestaticvoidreadXMLByStAX()throwsXMLStreamException,FileNotFoundException{

XMLInputFactoryxmlif=XMLInputFactory.newInstance();

XMLEventReaderxmler=xmlif.createXMLEventReader(StaxTester.class.getResourceAsStream("test.xml"));

XMLEventevent;

StringBufferparsingResult=newStringBuffer();

while(xmler.hasNext()){

event=xmler.nextEvent();

if(event.isStartElement()){//如果解析的是起始标记

StartElementse=event.asStartElement();

parsingResult.append("<");

parsingResult.append(se.getName());

if(se.getName().getLocalPart().equals("catalog")){

parsingResult.append("id=\"");

parsingResult.append(se.getAttributeByName(newQName("id")).getValue());

parsingResult.append("\"");

}

parsingResult.append(">");

}elseif(event.isCharacters()){//如果解析的是文本内容

parsingResult.append(event.asCharacters().getData());

}elseif(event.isEndElement()){//如果解析的是结束标记

parsingResult.append("

parsingResult.append(event.asEndElement().getName());

parsingResult.append(">");

}

}

System.out.println(parsingResult);

}

privatestaticvoidwriteXMLByStAX()throwsXMLStreamException,FileNotFoundException{

XMLOutputFactoryxmlof=XMLOutputFactory.newInstance();

XMLStreamWriterxmlw=xmlof.createXMLStreamWriter(newFileOutputStream("output.xml"));

xmlw.writeStartDocument();//写入默认的XML声明到xml文档

xmlw.writeCharacters("\n");

xmlw.writeComment("testingcomment");//写入注释到xml文档

xmlw.writeCharacters("\n");

xmlw.writeStartElement("catalogs");//写入一个catalogs根元素

xmlw.writeNamespace("myNS","

xmlw.writeAttribute("owner","Chinajash");

xmlw.writeCharacters("\n");

xmlw.writeStartElement(""catalog");//写入子元素catalog

xmlw.writeAttribute("id","007");

xmlw.writeCharacters("Apparel");

xmlw.writeEndElement();//写入catalog元素的结束标签

xmlw.writeEndElement();//写入catalogs元素的结束标签

xmlw.writeEndDocument();//结束XML文档

xmlw.close();

}

}

test.xml文件内容如下:

xmlversion="1.0"encoding="UTF-8"?

>

Book

Video

运行上面程序后,控制台输出如下:

Book

Video

运行上面程序后,产生的output.xml文件如下:

xmlversion="1.0"?

>

--testingcomment-->

myNS="owner="Chinajash">

catalogid="007">Apparel

catalog>

JDK6的新特性之五:

轻量级HttpServer

JDK6提供了一个简单的HttpServerAPI,据此我们可以构建自己的嵌入式HttpServer,它支持Http和Ht

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1