Java SE 6.0新特性体验(下篇)

四、 以编程方式存取网络参数

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异常。

⑦“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开始的行。

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数字签名,更好的国际化,等功能。其它特征还有待于读者自己去探讨。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值