Java SE 6.0新特性体验
副标题#e#
Mustang(也称作Java SE 6),如今刚进入其第二个测试阶段。本文作者将同你进一步探讨这个新的刊行版本中所提供的很多新的特征(从节制台I/O和存取权限节制要领到系统托盘API和表格排序和过滤等)。
一、引言
Mustang(也称作Java SE 6),如今刚进入其第二个测试阶段。本文中让我们一起进一步探讨这个新的刊行版本中所提供的很多新的特征(从节制台I/O和存取权限节制要领到系统托盘API和表格排序和过滤等)。
在阐明节制文件和目次存取许可的若干新的文件要领后,本文将向你展示新的桌面集成API。然后,本文还要阐明Mustang的新的编程存取网络参数的本领。最后,本文将接头表格组件的新的排序与过滤本领。
【留意】我利用Java SE 6的第二个测试版本(build 86)开拓并测试了本文的Java示例应用措施,OS平台是Windows 98 SE。
二、存取权限节制要领
从某种角度看,File类的一个实例其实是一个标识文件系统中文件或目次工具的抽象路径名。文件系统可以限制在这个工具上实现的读、写以及执行等操纵。
读、写和执行限制统称为“存取权限”。文件系统可以把多个存取权限荟萃关联到单个工具。譬喻,一个荟萃可以用于工具的所有者而另一个荟萃可以用于所有的其他用户。
前一个版本中提供的存取权限在直接用于存取工具时,有大概会导致File类的一些要领失败。由于这个原因,Mustang为File类引入了六种新的要领以便让你修改路径名的存取权限:
①“public boolean setExecutable(boolean executable, boolean ownerOnly)”:配置所有者或每小我私家对付指定抽象路径名的执行许可权。当executable为true时,答允执行操纵;而通报给它的值为false时,则不答允执行。把true通报给参数ownerOnly仅答允该抽象路径名的所有者拥有该许可权;当ownerOnly为false,则把该许可权授予每小我私家。假如底层文件系统无法区分所有者的执行许可与每小我私家的执行许可,那么,该许可应用于每小我私家,而不管ownerOnly取值如何。
该要领在乐成时返回true;不然,返回false。假如用户无权改变抽象路径名的存取权限或假如底层文件系统没有实现一种执行许可而且executable为false,则要领挪用失败。
②“public boolean setExecutable(boolean executable)”:这个要领便于配置所有者对付给定抽象路径名的执行权限。
③public oolean setReadable( oolean readable, oolean ownerOnly)”:配置所有者或每小我私家对付这个抽象路径名的读取许可权。参数readable为true时答允读取操纵;不然,不答允读取。参数ownerOnly为true时仅答允该抽象路径名的所有者拥有该许可权;当ownerOnly为false,则把该许可权授予每小我私家。假如底层文件系统无法区分所有者的读取许可与每小我私家的读取许可,那么,该许可应用于每小我私家,而不管ownerOnly取值如何。
该要领在乐成时返回true;不然,返回false。假如用户无权改变抽象路径名的存取权限或假如底层文件系统没有实现一种读取许可而且readable为false,则要领挪用会失败。
④“public boolean setReadable(boolean readable)”:这个要领便于配置所有者对付给定抽象路径名的读取权限。
⑤“public boolean setWritable(boolean writable,boolean ownerOnly)”:配置所有者或每小我私家对付这个抽象路径名的写许可权。参数writable为true时答允写操纵;不然,不答允写操纵。参数ownerOnly为true时仅答允该抽象路径名的所有者拥有该许可权;当ownerOnly为false,则把该许可权授予每小我私家。假如底层文件系统无法区分所有者的写许可与每小我私家的写许可,那么,该许可应用于每小我私家,而不管ownerOnly取值如何。
该要领在乐成时这个要领返回true;不然,返回false。假如用户无权改变抽象路径名的存取权限,则要领挪用会失败。
⑥“public boolean setWritable(boolean writable)”:这个要领便于配置所有者对付给定抽象路径名的写权限。
【留意】假如存在一个安详打点器而且它的“public void checkWrite(String file)”要领不答允对文件举办写操纵的话,则上面列出的每一个要领城市抛出一个SecurityException异常。
File类还提供了如下对应的要领以辅佐你得到一个工具当前配置的读、写和执行权限:
①public boolean canRead();
②public boolean canWrite();
③public boolean canExecute()(在Mustang中新引入的)。
我建设了一个简朴的展示setWritable()和canWrite()要领用法的名为WritableDemo的应用措施。在这个应用措施中,你可以或许使一个文件系统工具可写或仅能读取,并且还能查察这一许可的当前配置。本文示例源码中的列表1完整地展示了这个文件WritableDemo.java(略)。
#p#副标题#e#
三、桌面集成
#p#分页标题#e#
Sun的Java桌面开拓小组引入了若干新的特征以进一步提高Java在桌面开拓规模的影响。个中三个著名的特征是:Splash屏幕支持(它让应用措施在启动进程中显示Splash屏幕),系统托盘支持(它让应用措施把图标,提示窗信息和弹出菜单添加到系统托盘),和一组新的桌面API。
此刻,我们来接头桌面API,它有助于无缝地把Java应用措施与桌面集成到一起。该API支持Java应用措施利用一个特定的统一资源标识符(URI)启动操纵系统的缺省的欣赏器;启动OS的缺省的电子邮件客户端;以及启动应用措施以打开、编辑或打印与该应用措施相关联的文件。
桌面API利用OS的文件关联机制来启动关联到特定的文件范例的应用措施。譬喻,.doc文件扩展常常与微软的Word关联。经过桌面API,一个Java应用措施可以或许启动Word以打开、打印或编辑与这个扩展名相关联的文件。
在启动欣赏器电子邮件客户端或任何应用措施之前,你的Java应用措施必需抉择你的OS是否支持该API。这一抉择是通过挪用java.awt.Desktop类的“public static boolean isDesktopSupported()”要领实现的。假如OS支持该API,这个要领返回true;不然,它返回false。
在挪用isDesktopSupported()之后,该应用措施通过挪用Desktop的“public static Desktop getDesktop()”要领继承检索Desktop工具。假如OS不支持键盘输入、显示器或鼠标,这个要领将抛出一个java.awt.Headless异常。假如OS不支持该桌面API,则抛出一个UnsupportedOperationException异常。
此刻,既然该Java应用措施已经拥有了一个桌面实例,那么,按下来,它就可以或许挪用各类要领以欣赏、发送邮件、打开、编辑或打印。在执行任何这些操纵之前,该措施可以挪用Desktop的“public boolean isSupported(Desktop.Action action)”要领,假如桌面支持该行为(被描写为适合的Desktop.Action列举实例),则这个要领返回true。这些Desktop.Action列举如下:
· BROWSE:这个列举实例描写OS的缺省欣赏器的欣赏行为。
· MAIL:这个列举实例描写OS的缺省电子邮件客户端的邮件行为。
· OPEN:这个列举实例描写与打开一个特定的文件范例相关联的一个应用措施执行的打开行为。
· EDIT:这个列举实例描写与编辑一个特定的文件范例相关联的一个应用措施执行的编辑行为。
· PRINT:这个列举实例描写与打印一个特定的文件范例相关联的一个应用措施执行的打印行为。
【留意】在挪用相应行为的Desktop要领前,你不必挪用“isSupported(Desktop.Action action)”来抉择是否支持该行为:你可以直接挪用相应的要领,可是之后,你必需处理惩罚该要领潜在地抛出的一个UnsupportedOperationException异常。可以从Desktop存取下列行为要领:
①“public void browse(URI uri)”:启动用户缺省的欣赏器以显示一个URI—假如欣赏器可以或许处理惩罚这个URI的话;不然,它启动该URI缺省的处理惩罚器应用措施(这详细要依赖于在java.net.URI类中界说的协议和路径)。
假如uri为null,则抛出一个NullPointerException异常。假如用户的缺省欣赏器没有找到或它没能启动或缺省的处理惩罚器应用措施没能启动,则抛出一个java.io.IOException异常。
②“public void edit(File file)”:启动相关联的编辑器应用措施而且打开一个文件举办编辑。
假如file为null,则抛出一个NullPointerException异常。假如指定的文件不存在,则抛出一个IllegalArgumentException异常。最后,假如指定的文件相关联的应用措施没能启动,或这个文件没有相关联的编辑器,则抛出一个IOException异常。
③“public void mail()”:启动用户缺省的电子邮件客户端的邮件编辑窗口。
假如用户缺省的电子邮件客户端没有发明或启动失败,则抛出一个IOException异常。
④“public void mail(URI mailtoURI)”:启动用户缺省的电子邮件客户端的邮件编辑窗口,填充由一个“mailto:”URI指定的动静域。这个URI可以或许指定包罗“cc”,“subject”和“body”在内的各类动静域。
假如mailtoURI为null,则抛出一个NullPointerException异常。假如URI的模式不是mailto,则抛出一个IllegalArgumentException异常。假如用户缺省的电子邮件客户端没有发明或启动失败,则抛出一个IOException异常。
⑤“public void open(File file)”:启动相关联的应用措施以打开该文件。假如指定的文件是一个目次,则启动OS的文件打点器以打开它。
#p#分页标题#e#
假如file为 null,则抛出一个NullPointerException异常。假如指定的文件不存在,则抛出一个IllegalArgumentException异常。最后,假如该指定的文件没有相关联的应用措施,或假如这个应用措施没能启动,则抛出一个IOException异常。
⑥“public void print(File file)”:利用相关联的应用措施的打印呼吁并利用当地桌面打印设备打印一个文件。
假如file为null,则抛出一个NullPointerException异常。假如指定的文件不存在,则抛出一个IllegalArgumentException异常。假如指定的文件没有相关联的可以或许用于打印其内容的应用措施,则抛出一个IOException异常。
【留意】假如一个安详打点器存在而且不答允执行要求的行为的话,上面列出的每一个要领城市抛出一个SecurityException异常。
为此,我建设了一个展示桌面API用法的DesktopDemo应用措施。这个应用措施建设了一个包括一系列欣赏,邮件,打开,编辑,和打印等单选按钮的GUI界面;尚有一个文本域用于输入一个URI或文件名。在输入一个URI或文件名之后,点击适当的按钮便可以从桌面上启动一个应用措施。本文示例源码中的列表2展示了这个文件DesktopDemo.java(略)。
在编译和运行DesktopDemo后,在文本域输入一个文件名并点击Open,Edit或Print中的一个按钮以启动该文件相应的应用措施。或输入一个URI并点击“Browse”或“Mail”。图1展示了我已经在文本域中输入了一个邮件URI的屏幕快照。
图1.在此,当输入一个邮件URI时,我没有指定“mailto:”前缀,因为我的电子邮件客户端把这个前缀自动地插手到邮件编辑窗口中的吸收者的电子邮件地点的前面。
这个邮件URI仅包括吸收者的电子邮件地点和一个主题。虽然,我也可以包罗正文文本,这可以通过添加“&BODY=”,其后头再随着一些文本的要领实现。在点击“Mail”单选按钮后,我的电子邮件客户端的邮件编辑窗口中将在正确位置显示吸收者的电子邮件地点和主题,如图2所示。
图2.这里所提供的邮件URI还可以或许指定除主要吸收者的电子邮件地点外的其它邮件地点。
四、以编程方法存取网络参数
Mustang提供了以编程方法存取网络参数的要领—这是通过在java.net.NetworkInterface类和新的java.net.InterfaceAddress类中提供的10个新的要领实现的。这些新引入的网络接口要领罗列如下:
①“public byte[] getHardwareAddress()”:以一个字节数组形式返回这个网络接口的硬件地点(凡是是呆板地点代码,或MAC—也称作以太网地点)。假如这个接口没有一个硬件地点,或假如不能存取这个地点(因为该用户没有足够的权限),则返回null。假如产生一个I/O错误,则抛出一个java.net.SocketException异常。
②“public List<InterfaceAddress> getInterfaceAddresses()”:返回一个java.util.List,它包括这个网络接口的所有接口地点(作为InterfaceAddress实例)或个中一个子集。假如存在一个安详打点器,那么将利用相应于每一个接口地点的java.net.InetAddress来挪用它的一个checkConnect要领。留意,这个要领仅在列表中返回InterfaceAddresses;并且此时,checkConnect并不抛出一个SecurityException异常。
③“public int getMTU()”:返回这个网络接口的最大传输单元(MTU)。该MTU指的是一个通讯协议层可以或许通报到另一个层的最大包的巨细(以字节为单元)。譬喻,以太网答允的最大MTU是1500字节。按照某一尺度(譬喻以太网)或毗连时间(在端到端串行毗连时,常常有这种环境),该MTU可以或许被配置为一个牢靠长度。假如产生一个I/O错误,则抛出一个SocketException异常。
④“public NetworkInterface getParent()”:假如这个网络接口是一个子接口,则返回这个网络接口的父网络接口(作为一个NetworkInterface实例)。然而,假如这个网络接口是一个物理(非虚拟的)接口或假如这个网络接口是虚拟的而且没有父接口,则返回null。
⑤“public Enumeration<NetworkInterface> getSubInterfaces()”:返回一个包括所有的子接口(也称为虚拟接口)的java.util.Enumeration(作为NetworkInterface的实例)。譬喻,eth0:1是一个eth0的子接口(一个以太网网络接口名)。
⑥“public boolean isLoopback()”:返回true,假如这个网络接口是一个loopback接口(一种网络接口,在该接口中,外发数据作为输入数据被当即反射回该接口)。假如存在一个I/O问题,则抛出一个SocketException异常。
#p#分页标题#e#
⑦“public boolean isPointToPoint()”:返回true,假如这个网络接口是一个端到端的接口(譬喻一个通过调制解调器成立的PPP毗连)。假如存在一个I/O问题,则抛出一个SocketException异常。
⑧“public boolean isUp()”:返回true,假如这个网络接口是“up”而且已经“running”。“up”指示已经为这个接口成立起了路由进口。“running”指示要求的系统资源已经分派。假如存在一个I/O问题,则抛出一个SocketException异常。
⑨“public boolean isVirtual()”:返回true,假如这个网络接口是一个虚拟接口(也称作“子接口”)。假如存在一个I/O问题,则抛出一个SocketException异常。
⑩“public boolean supportsMulticast()”:返回true,假如这个网络接口支持多点传送(指一个处事器措施把一个动静的一个副本发送给多个客户端措施的本领)。假如存在一个I/O问题,则抛出一个SocketException异常。
InterfaceAddress类描写了一个网络接口地点。除了凡是的实现得到一个哈希代码和得到一个字符串描写等要领之外,这个类还提供了下列三个要领:
· “public InetAddress getAddress()”:返回给定接口地点:一个IP地点,一个子网掩码和一个广播地点(当该地点是IPv4时);或是一个IP地点和一个网络前缀长度(针对一个IPv6地点)。
· “public InetAddress getBroadcast()”:返回给定接口地点的广播地点(在IPv4网络中作为一个InetAddress);在IPv6网络中则返回null(此时它没有广播地点)。
· “public short getNetworkPrefixLength()”:返回给定接口地点的针对IPv6网络的网络前缀长度(或针对IPv4网络的子网掩码)。这个要领的返回值为一个短整型。
【留意】 典范的IPv6值是128(::1/128)或10(fe80::203:baff:fe27:1243/10)。针对IPv4的典范的值是8(255.0.0.0),16(255.255.0.0),或24(255.255.255.0)。
我建设了一个简朴的NetParmsDemo应用措施,它展示了NetworkInterface和InterfaceAddress类中提供的很多新的要领。列表3描写了这个应用措施的源代码(见源码文件中的NetParmsDemo.java)。
五、表格排序与过滤
Swing的表格组件在若干方面获得了加强。个中的一个改造是,支持对一个表格中的行数据举办按升/降序排序而且可以或许过滤掉个中某些行(所有数据来自于表格模子),并最终显示在组件的视图中。
【请记着】排序和过滤仅对视图有影响,而对模子无影响。
排序和过滤基于一个新观念—行排序器工具,它可以或许对行数据举办排序(和过滤)。把一个行排序器插手到一个表格组件中的最简朴的要领是挪用javax.swing.JTable中新引入的“public void setAutoCreateRowSorter(boolean autoCreateRowSorter)”要领,下面的代码片段演示了它的用法:
TableModel model = createTableModel ();
JTable table = new JTable (model);
table.setAutoCreateRowSorter (true);
在每次改变模子时,把true通报给setAutoCreateRowSorter()可以或许使JTable安装一个新的javax.swing.Table.TableRowSorter<M>实例作为行排序器。为了防备在今后改变模子时再建设新的行排序器,可以把false传给一个随后挪用的要领。
留意,当你不想定制行排序器时,你也有大概挪用setAutoCreateRowSorter()。可是,在挪用这个要领后,你仍然可以或许定制行排序器,这是通过首先挪用JTable的新的“public RowSorter<? extends TableModel> getRowSorter()”要领以返回当前行排序器来实现的。
因为当你试图把返回的行排序器的引用存储到一个TableRowSorter时编译器会显示一个未查抄的告诫动静,所以,你大概更喜欢由你本身建设表格行排序器并利用JTable的新的“public void setRowSorter(RowSorter<? extends TableModel> sorter)”要领来安装它:
TableRowSorter<TableModel> sorter;
sorter = new TableRowSorter<TableModel> (model);
table.setRowSorter (sorter);
对TableRowSorter的定制还包罗可以或许利用它的“public void setRowFilter(RowFilter<? super M,? super I> filter)”要领安装一个行过滤工具(它基于某个尺度吸收行数据)。这个要领吸收一个javax.swing.RowFilter<M,I>参数,其相应的要领可以或许返回差异种类的行过滤器。
有些行过滤器可以利用正规表达式。为了得到这种行过滤器,可以挪用“RowFilter public static <M,I> RowFilter<M,I> regexFilter(String regex, int… indices)”要领。譬喻,“sorter.setRowFilter (RowFilter.regexFilter ("^A"));”语句可以或许建设一个行过滤器,它的“^A”正规表达式仅接管以A开始的行。
#p#分页标题#e#
JTable还提供了其它一些与排序和行过滤有关的新要领。这个中的两个是:“public int convertRowIndexToModel(int viewRowIndex)”和“public int convertRowIndexToView(int modelRowIndex)”,它们别离认真把一个行的索引(按照模子)映射到视图和把一个行的索引(按照视图)映射到模子。
为了向你说明仅是视图为排序和过滤所影响,我利用了前面的TableSortFilterDemo演示应用措施中的一个“convert”要领。在改变行过滤器今后,除了把null通报给TableRowSorter的“public void setSortKeys(List<? extends RowSorter.SortKey> sortKeys)”要领以打乱视图的排序外,列表4(见本文示例源措施)中其它的内容我们都已经接头过。
在编译和运行这个应用措施后,通过点击某一列的列头部初始化一个排序。作为响应,所有的行按被点击的列值从头升序或降序分列(每次点击使之在升序与降序之间切换)。选择的列和排序顺序以相应列头部的一个向上/向下的箭头指示,如图3所示。
图3.一个向上箭头暗示此刻是按升序排序。
除了排序之外,你还可以或许安装一个过滤器以抉择在视图中显示哪些行。为此,只要在文本域中输入一个正规表达式(譬喻^J或J),而且点击“Set Filter”按钮即可。作为响应,所有的匹配该正规表达式的行都被以非排序方法显示(见图4)。然后,你可以再对这些行举办排序。
图4.点击“Set Filter”对过滤的行成立一个未排序的视图。
六、结论
除了上面所接头的新特征之外,Mustang还提供一个编译器API,一个剧本库,一个Java数据库,在JDBC方面也作了新的改造,XML数字签名,更好的国际化,等成果。其它特征尚有待于读者本身去探讨。