如题,最近在学Java 7,看到一段内容如下://APath currentPath = Paths.get(System.getProperty(“user.dir”));
DirectoryStream<Path> paths = null;
try {
  paths = Files.newDirectoryStream(currentPath);
  for(Path path : paths) {
    System.out.println(path.getFileName());
  }
} catch(NotDirectoryException e) {
  System.err.println(currentPath + “ is not a directory.” + e);
} catch(IOException e) {
  System.err.println(“I/O error.” + e);
}以上的代码并没有为DirectoryStream<Path>对象提供调用close()函数的机制,但现实中往往需要这样做。一般来说,如果try语句块里面还有其它的一些会抛出异常的流处理代码时,程序员就不应该在try语句块里面调用close()函数,因为如果这样做,被调用的close()函数很可能被绕开。由于close()函数本身会抛出一个IOException类的异常,这样就存在一种和其它try语句块函数抛出的异常混淆的可能。为解决这个问题,在Java 7引入了一种新的称为“try block-with-resources”的异常处理语法,这个新的语法能保证在代码执行结束后流被关闭。新版本的try语句块提供了在代码执行完毕之后自动关闭流的功能,无论块的执行是否正常结束。实现这个功能的一个前提是,在try语句块中的所有类对象必须实现AutoCloseable接口。为了自动调用close()函数,程序员需要在紧跟try关键字后面的括号中创建流对象。如果需要创建多个流对象,只需要在括号中用分号把这些流对象分隔开。在括号中所创建的对象将被隐式地添加final,也就是说这些对象在try语句块中将无法被修改。以下是用新版本try语句块重新写的代码://B
Path currentPath = Paths.get(System.getProperty(“user.dir”));
try (DirectoryStream<Path> paths = Files.newDirectoryStream(currentPath)){
  for(Path path : paths) {
    System.out.println(path.getFileName());
  }
} catch(NotDirectoryException e) {
  System.err.println(currentPath + “ is not a directory.” + e);
} catch(IOException e) {
  System.err.println(“I/O error: “ + e);
}我想问的一个问题就是:B的代码块和下面的代码块有什么区别吗?Path currentPath = Paths.get(System.getProperty(“user.dir”));
DirectoryStream<Path> paths = null;
try {
  paths = Files.newDirectoryStream(currentPath);
  for(Path path : paths) {
    System.out.println(path.getFileName());
  }
} catch(NotDirectoryException e) {
  System.err.println(currentPath + “ is not a directory.” + e);
} catch(IOException e) {
  System.err.println(“I/O error.” + e);
}finally{
  paths.close();   //这里我不确定是不是这样的一个语法
}问题的关键就是finally块里面(先不要管语法是否正确)的流关闭执行和新版本的try括号里面的自动关系功能有什么区别?谢谢!