`
cucaracha
  • 浏览: 137684 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A8f3fa2f-18ce-3862-897a-5d2209197c90
Java NIO.2
浏览量:85823
7a076ba7-8ec8-3241-aa3c-67bb2f7856a2
Java EE 7 简明教...
浏览量:35653
社区版块
存档分类
最新评论

[NIO.2] 第二十六篇 创建目录以及列出目录内容

阅读更多
列出文件系统根目录

在 Java 6 中,获取根目录是通过 File 对象的数组。在 Java 7 中,NIO.2 提供了方法可以通过存放了 Path 对象的迭代器来获取。这个可迭代的对象通过下面的方式由 getRootDirectories() 方法获得:
Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories(); 
for (Path name : dirs) { 
     System.out.println(name); 
}


在我的机器上打印出的结果如下:

C:\ 
D:\ 
E:\


当然,你可以很容易地将这个迭代器转换为数组:

Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories(); 
ArrayList<Path> list = new ArrayList<Path>(); 
for (Path name : dirs) { 
     // System.out.println(name); 
     list.add(name); 
} 
Path[] arr = new Path[list.size()]; 
list.toArray(arr); 

for(Path path : arr) { 
    System.out.println(path); 
}


如果想要将根目录放入 File 类型的数组,可以使用 Java 6 中提供的方法:

File[] roots = File.listRoots(); 
for (File root : roots) { 
     System.out.println(root); 
}


创建新目录

调用 Files.createDirectory() 方法创建新目录应该是一个比较常用的功能。这个方法接受一个 Path 类型的参数来创建目录,并且有一个可选的 FileAttribute<?> 类型参数,用于在创建目录的时候设置属性。这个方法会返回新创建的目录。下面的代码段演示了如何在  C:\rafaelnadal\tournaments 下创建 \2010 的目录,并且为目录设置了默认属性(被创建的目录必须不存在):

Path newdir = FileSystems.getDefault().getPath("C:/rafaelnadal/tournaments/2010/"); 
… 
try { 
    Files.createDirectory(newdir); 
} catch (IOException e) { 
    System.err.println(e); 
}


当然,你也可以在创建目录的时候为目录设置属性,下面的代码演示了如何在 POSIX 文件系统上创建目录并设置访问权限属性:

Path newdir = FileSystems.getDefault().getPath("/home/rafaelnadal/tournaments/2010/"); 
… 
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---"); 
FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); 
try { 
    Files.createDirectory(newdir, attr); 
} catch (IOException e) { 
       System.err.println(e); 
}


注:如果在创建目录的时候目录已经存在,那么 createDirectory() 方法将会抛出异常。

有的时候,你可能不仅仅只要创建一个目录,你可能需要创建一组由层级关系的目录,像 \statistics\win\prizes 这样。可以级联调用 createDirectory() 来达到这个目的,但是更聪明的做法是调用 Files.createDirectories() 方法,使用这个方法将会一次性创建所有的目录。这个方法接受一个 Path 类型的参数,并且接受一个可选的属性参数,下面的例子演示了如何在  C:\rafaelnadal 目录下创建一组有层级关系的目录:

Path newdir= FileSystems.getDefault().getPath("C:/rafaelnadal/", "statistics/win/prizes"); 
… 
try { 
    Files.createDirectories(newdir); 
} catch (IOException e) { 
    System.err.println(e); 
}


注:如果创建目录的时候目录已经存在, createDirectories() 方法不会抛出异常,而是会跳过已存在的目录继续创建下一层目录。

列出目录内容

通常情况下,在编码中经常需要读取目录中的内容。NIO.2 中通过 DirectoryStream 这个可迭代的流对象来实现这个功能,它是一个实现了 Iterable 的接口。访问目录流可直接调用 Files.newDirectoryStream() 方法,它接受一个 Path 类型的对象并返回一个打开的目录流。

列出全部内容

下面的代码将会列出目录中的全部内容,包括链接、文件、目录、隐藏文件(列出的目录是 C:\rafaelnadal\tournaments\2009)。

Path path = Paths.get("C:/rafaelnadal/tournaments/2009"); 
//no filter applied 
System.out.println("\nNo filter applied:"); 
try (DirectoryStream<Path> ds = Files.newDirectoryStream(path)) { 
     for (Path file : ds) { 
          System.out.println(file.getFileName()); 
     } 
}catch(IOException e) { 
   System.err.println(e); 
}


在我的机器运行输出结果如下(将会打印 C:/rafaelnadal/tournaments/2009 目录下的所有内容):
No filter applied: 
AEGON.txt 
BNP.txt 
MutuaMadridOpen.txt 
supershot.bmp 
Tickets.zip 
TournamentsCalendar.xls 
Videos 
…


通过区块匹配列出目录内容

有的时候,你可能需要根据某个规则来列出目录中的内容。例如,你只需要列出某个后缀名的文件。NIO.2 提供了内置的过滤器来实现这个功能,你可以提供一个区块匹配,NIO.2 会通过这个区块匹配来查询文件和文件夹名称。既然是匹配,就要遵循一定的规则,下面来看看这些规则:

    * - 匹配任意多个字符,包括没有字符。
    ** - 类似 *,但是可以匹配多层目录。
    ? - 匹配精确的一个字符。
    {} - 精确地匹配一组由逗号分隔的字符,例如 {A,B,C} 匹配 A,B,和 C。
    [] - 匹配一组单独的字符或一系列连贯的字符,一些常用的例子如下:
        [0-9]:匹配任意数字。
        [A-Z]:匹配任意大写字母。
        [a-z,A-Z]:匹配任意大写或小写字母。
        [12345]:匹配 1、2、3、4、5。
    在方括号中 *、? 和 \ 匹配自身。
    所有其它的字符都匹配自身。
    要匹配 *、? 等特殊字符,可以使用反斜杠 \ 进行转义,例如 \\ 匹配 \,\? 匹配问号。

现在,已经了解了区块匹配的规则,那么我们看看如何使用  newDirectoryStream() 传入区块匹配规则来进行过滤。下面的代码将会提取  C:\rafaelnadal\tournaments\2009 目录下所有后缀名为 PNG、JPG 和 BMP 的文件:
Path path = Paths.get("C:/rafaelnadal/tournaments/2009"); 
… 
//glob pattern applied 
System.out.println("\nGlob pattern applied:"); 
try (DirectoryStream<Path> ds = Files.newDirectoryStream(path, "*.{png,jpg,bmp}")) { 
     for (Path file : ds) { 
          System.out.println(file.getFileName()); 
     } 
} catch (IOException e) { 
    System.err.println(e); 
}


运行结果:

引用
Glob pattern applied:
supershot.bmp


使用用户自定义过滤器列出目录内容

如果区块匹配不能满足你的需求,那么你还可以编写你自己的过滤器。你只需要实现  DirectoryStream.Filter<T> 接口,并实现它的  accept() 方法。Path 是否通过检验都需要你自己来实现。例如,下面的代码段将演示只有文件夹才能通过检验的例子:
Path path = Paths.get("C:/rafaelnadal/tournaments/2009"); 
… 
//user-defined filter - only directories are accepted 
DirectoryStream.Filter<Path> dir_filter = new DirectoryStream.Filter<Path>() { 
 
public boolean accept(Path path) throws IOException { 
      return (Files.isDirectory(path, NOFOLLOW_LINKS)); 
  } 
};


创建的过滤器可以直接传给  newDirectoryStream() 方法:

System.out.println("\nUser defined filter applied:"); 
try (DirectoryStream<Path> ds = Files.newDirectoryStream(path, dir_filter)) { 
for (Path file : ds) { 
      System.out.println(file.getFileName()); 
     } 
} catch (IOException e) { 
    System.err.println(e); 
}


输出结果如下:

User defined filter applied: 
videos


下面列举了一些常用的过滤器实现:

过滤器只允许文件/文件夹大于 200 KB 通过检验

DirectoryStream.Filter<Path> size_filter = new DirectoryStream.Filter<Path>() { 
 
public boolean accept(Path path) throws IOException { 
     return (Files.size(path) > 204800L); 
  } 
};


过滤器只允许当天更新过的文件通过检验

DirectoryStream.Filter<Path> time_filter = new DirectoryStream.Filter<Path>() { 
 
public boolean accept(Path path) throws IOException { 
     long currentTime = FileTime.fromMillis(System.currentTimeMillis()).to(TimeUnit.DAYS); 
     long modifiedTime = ((FileTime) Files.getAttribute(path, "basic:lastModifiedTime",  
                                                       NOFOLLOW_LINKS)).to(TimeUnit.DAYS); 
     if (currentTime == modifiedTime) { 
             return true; 
        } 
 
    return false; 
  } 
};


过滤器只允许隐藏文件/文件夹通过检验

DirectoryStream.Filter<Path> hidden_filter = new DirectoryStream.Filter<Path>() { 
 
public boolean accept(Path path) throws IOException { 
     return (Files.isHidden(path)); 
  } 
};


文章来源:http://www.aptusource.org/2014/04/nio-2-creating-and-listing-directories/

0
0
分享到:
评论

相关推荐

    Java IO, NIO and NIO.2(Apress,2015)

    Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

    Java IO, NIO and NIO.2 原版pdf by Friesen

    New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...

    Java IO, NIO and NIO.2

    这是一本介绍java io以及nio相关知识的书,书中对知识的讲解通俗易懂,是学习java nio以及复习java io相关知识的必备书籍。注意:本书为英文版!!!

    java nio.pdf

    java nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava ...

    Java NIO.pdf

    Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf

    Apress.Pro.Java.7.NIO.2.2011

    Apress.Pro.Java.7.NIO.2.2011

    java NIO.zip

    java NIO.zip

    ProJava7NIO.2PDFBooks.pdf 英文原版

    Pro Java 7 NIO.2 – PDF Books

    蔚来-NIO.US-新车上市,蔚来可期.pdf

    蔚来-NIO.US-新车上市,蔚来可期.pdf

    Pro Java 7 NIO.2

    This book covers all the important aspects involved in developing NIO.2-based applications. It provides clear instructions for getting the most out of NIO.2 and offers many exercises and case studies ...

    Java NIO 中英文版 + Pro Java 7 NIO.2

    Java NIO,Ron Hitchens 著,中文版 裴小星 译,Pro Java 7 NIO.2,Anghel Leonard 著,pdf文字版带书签,无安全限制

    Pro Java 7 NIO.2.pdf

    Pro Java 7 NIO.2.pdf,2011 by Anghel Leonard

    JavaNIO.pdf

    JavaNIO.pdf

    java org.apache.http.nio jar包

    找了好久,终于找到了,java刷新同步获取网络资源

    java nio.doc

    定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。  NIO API 的集中抽象为:  缓冲区,它们是数据容器;  字符集 及其相关解码器 和编码器,  它们在字节和 Unicode 字符之间进行转换;  各种类型的通道,...

    Pro Java 7 NIO.2 原版pdf by Leonard

    This book covers all the important aspects involved in developing NIO.2-based applications. It provides clear instructions for getting the most out of NIO.2 and offers many exercises and case studies ...

    java_nio.doc

    用java.nio.*进行网络编程

    NIO 入门.chm,NIO 入门.chm

    NIO入门.chm NIO入门.chm NIO入门.chm

    Java NIO.docx

    Java NIO.docx

Global site tag (gtag.js) - Google Analytics