JDK16新特性.docx
- 文档编号:6005163
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:20
- 大小:27.67KB
JDK16新特性.docx
《JDK16新特性.docx》由会员分享,可在线阅读,更多相关《JDK16新特性.docx(20页珍藏版)》请在冰豆网上搜索。
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"?
>
49:
27.203+00:
00
控制台会输出
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"?
>
运行上面程序后,控制台输出如下:
运行上面程序后,产生的output.xml文件如下:
xmlversion="1.0"?
>
--testingcomment-->
myNS="owner="Chinajash"> catalogid="007">Apparel catalog> JDK6的新特性之五: 轻量级HttpServer JDK6提供了一个简单的HttpServerAPI,据此我们可以构建自己的嵌入式HttpServer,它支持Http和Ht
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JDK16 特性