专注于Jsp开发,为Jsp开发提供源动力 VM主机| 海外空间| 郑州网站建设| 郑州网络公司| 洛阳网站建设
jsp空间

探秘JDK 7:下一代I/O(NIO.2)

添加时间:[2010-7-1 17:59:35] 

  早在2000年的时候,Sun公司就启动了JSR 51:为Java平台开发新的I/O API,直接访问操作系统底层输入/输出操作以提高应用程序的性能,首次引入这套API是在J2SE 1.4中,根据维基百科的新I/O词条显示,新I/O(NIO)由下列API组成:

  ◆ 原始类型数据缓冲

  ◆ 字符集编码和解码

  ◆ 通道,新的原始I/O抽象

  ◆ 支持上锁和内存映射的文件接口,文件最大支持Integer.MAX_VALUE字节(2GB)

  ◆ 为可扩展服务器提供的多路复用,无阻塞I/O设施(基于选择器和键)

  JSR 203(NIO.2)除了解决JSR 51遗留下来的问题外,还为Java平台提供了更多新的I/O API,NIO.2解决了java.awt.File文件系统接口存在的重大问题,引入了异步I/O,并完成了未包括在JSR 51中的功能,下面列出了包含在JSR 203中的主要组件:

  ◆ 新的文件系统接口,支持大块访问文件属性,更改通知,绕开文件系统指定的API,也是可插拔文件系统实现的服务提供者接口。

  ◆ 对套接字和文件同时提供了异步I/O操作的API。

  ◆ JSR 51中定义的完整的套接字通道功能,此外还包括绑定,选项配置和多播数据报的支持。

  新的文件系统接口

  Java的File类存在重大问题,例如,操作出错时,delete()和mkdir()方法返回一个状态码而不是一个异常,没有办法获知失败的原因,此外还包括以下问题:

  ◆ File没有提供方法来检测符号链接,要知道为什么检测符号链接很重要,以及如何解决这个问题的办法,请参考Patrick的文章“在Java中如何处理文件系统软链接/符号链接”和“Java中的链接/别名/快捷方式”。

  ◆ File提供的方法只能访问部分文件属性,不能访问文件权限和访问控制列表。

  ◆ File没有提供方法一次访问文件的所有属性(如文件的修改时间和它的类型),因为文件系统需要为每个属性执行查询请求,可能存在性能问题。

  ◆ File的list()和listFiles()方法返回文件名和目录名的数组,但不支持大目录,通过网络展示大目录清单时,调用list()/listFiles()方法可能会使当前的线程阻塞相当长一段时间,而在服务器端,虚拟机可能会耗尽内存。

  ◆ File没有提供复制和移动文件的方法,虽然File提供了一个renameTo()方法在某些时候可以用来移动文件,但它的行为与平台关系紧密,即在不同平台上的行为是不一致的,根据renameTo()的文档说明,这个方法不能在文件系统之间移动文件,它可能不是原子的,如果目标路径下已存在同名文件,这个操作可能不会成功。

  ◆ File也没有提供改变通知方法,需要应用程序自己实现,因此导致应用程序的性能下降,例如,服务器需要确定什么时候往目录中添加了一个新的JAR文件,它需要实时监视这个目录,因为服务器后台线程需要频繁读取文件系统,因此性能会有所下降。

  ◆ File也不允许开发人员引入他们自己的文件系统访问功能,例如,开发人员可能想将文件系统存储到一个zip文件中,或创建一个内存文件系统。

  NIO.2引入了新的文件系统接口,除了解决上述存在的问题外,还引入了更多的功能,这个接口由位于java.nio.file,java.nio.file.attribute和java.nio.file.spi包中的类和其它类型组成。

  这些包提供了多个切入点,其中一个切入点就是java.nio.file.Paths类,它提供了两个方法返回一个java.nio.file.Path实例:

  ◆ public static Path get(String path) - 它通过转换给定路径字符串返回给这个实例构造一个Path实例。

  ◆ public static Path get(URI uri) -它通过转换给定路径的URI(统一资源定位符)返回给这个实例构造一个Path实例。

  与传统的基于File的代码互操作:

  File类提供了一个public Path toPath()方法,它可以将一个File实例转换成一个Path实例。

  当你创建了一个Path实例后,你就可以使用这个实例执行许多路径操作(如返回路径的一部分,连接两个路径)和许多文件操作(如删除,移动和复制文件)。

  为了不将问题复杂化,我就不深入讲解Path了,这里我用一段代码简单地演示一下以前的get()方法和Path的delete()方法。

  清单1. InformedDelete.java

  1.// InformedDelete.java

  2.import java.io.IOException;

  3.import java.nio.file.DirectoryNotEmptyException;

  4.import java.nio.file.NoSuchFileException;

  5.import java.nio.file.Path;

  6.import java.nio.file.Paths;

  7.public class InformedDelete

  8.{

  9.   public static void main (String [] args)

  10.   {

  11.      if (args.length != 1)

  12.      {

  13.          System.err.println ("usage: java InformedDelete path");

  14.          return;

  15.      }

  16.      // Attempt to construct a Path instance by converting the path argument

  17.      // string. If unsuccessful (you passed an empty string as the

  18.      // command-line argument), the get() method throws an instance of the

  19.      // unchecked java.nio.file.InvalidPathException class.

  20.      Path path = Paths.get (args [0]);

  21.      try

  22.      {

  23.          path.delete (); // Attempt to delete the path.

  24.      }

  25.      catch (NoSuchFileException e)

  26.      {

  27.          System.err.format ("%s: no such file or directory%n", path);

  28.      }

  29.      catch (DirectoryNotEmptyException e)

  30.      {

  31.          System.err.format ("%s: directory not empty%n", path);

  32.      }

  33.      catch (IOException e)

  34.      {

  35.          System.err.format ("%s: %s%n", path, e);

  36.      }

  37.   }

  38.}

  39.

  InformedDelete调用Path的delete()方法解决了File的delete()方法不能确定失败原因的问题,当Path的delete()当的检测到操作失败时,它会根据情况抛出适当的异常,如:

  ◆ 如果文件不存在,抛出java.nio.file.NoSuchFileException异常。

  ◆ 如果文件是一个目录不能删除,抛出java.nio.file.DirectoryNotEmptyException异常,因为这个目录下可能还包括一个空目录。

  ◆ 如果遇到其他I/O问题,则抛出java.io.IOException的子类异常,例如,如果文件是只读的,抛出java.nio.file.AccessDeniedException异常。

关于我们 | 付款方式 | 客户管理 | 网站导航 | 友情连接


版权所有 2008 三易网络(洛阳)科技开发有限公司 京ICP备06012028号

服务热线:0371-63653120 63658758(郑州) 0379-63921200   63265368(洛阳)

QQ在线客服: JSP空间咨询   JSP空间咨询    Email:web@suneasy.cn

郑州网络公司 郑州网站建设 洛阳网站建设

总部地址:纱厂南路41号中泰新城泰福苑803室 郑州分公司地址:金水区圣菲城