- 浏览: 137684 次
- 性别:
- 来自: 深圳
最新评论
-
freesea:
不错,还没注意java 7已经增加了这么多类了
[NIO.2] 第十篇 NIO.2 中的文件属性 -
SpringJava:
有个问题,想请教一下楼主:在代码中经常看到try catch语 ...
[NIO.2] 第二十九篇 删除、复制、移动目录和文件 -
xiaohu7924:
高
什么是 Java ? -
jiiming:
这种方法可以借鉴
[Java EE 7] Servlet 异步支持 -
cucaracha:
jahu 写道有中文文档没有啊。请留意我的博客:http:// ...
Java EE 7 技术一览
列出文件系统根目录
在 Java 6 中,获取根目录是通过 File 对象的数组。在 Java 7 中,NIO.2 提供了方法可以通过存放了 Path 对象的迭代器来获取。这个可迭代的对象通过下面的方式由 getRootDirectories() 方法获得:
在我的机器上打印出的结果如下:
当然,你可以很容易地将这个迭代器转换为数组:
如果想要将根目录放入 File 类型的数组,可以使用 Java 6 中提供的方法:
创建新目录
调用 Files.createDirectory() 方法创建新目录应该是一个比较常用的功能。这个方法接受一个 Path 类型的参数来创建目录,并且有一个可选的 FileAttribute<?> 类型参数,用于在创建目录的时候设置属性。这个方法会返回新创建的目录。下面的代码段演示了如何在 C:\rafaelnadal\tournaments 下创建 \2010 的目录,并且为目录设置了默认属性(被创建的目录必须不存在):
当然,你也可以在创建目录的时候为目录设置属性,下面的代码演示了如何在 POSIX 文件系统上创建目录并设置访问权限属性:
注:如果在创建目录的时候目录已经存在,那么 createDirectory() 方法将会抛出异常。
有的时候,你可能不仅仅只要创建一个目录,你可能需要创建一组由层级关系的目录,像 \statistics\win\prizes 这样。可以级联调用 createDirectory() 来达到这个目的,但是更聪明的做法是调用 Files.createDirectories() 方法,使用这个方法将会一次性创建所有的目录。这个方法接受一个 Path 类型的参数,并且接受一个可选的属性参数,下面的例子演示了如何在 C:\rafaelnadal 目录下创建一组有层级关系的目录:
注:如果创建目录的时候目录已经存在, createDirectories() 方法不会抛出异常,而是会跳过已存在的目录继续创建下一层目录。
列出目录内容
通常情况下,在编码中经常需要读取目录中的内容。NIO.2 中通过 DirectoryStream 这个可迭代的流对象来实现这个功能,它是一个实现了 Iterable 的接口。访问目录流可直接调用 Files.newDirectoryStream() 方法,它接受一个 Path 类型的对象并返回一个打开的目录流。
列出全部内容
下面的代码将会列出目录中的全部内容,包括链接、文件、目录、隐藏文件(列出的目录是 C:\rafaelnadal\tournaments\2009)。
在我的机器运行输出结果如下(将会打印 C:/rafaelnadal/tournaments/2009 目录下的所有内容):
通过区块匹配列出目录内容
有的时候,你可能需要根据某个规则来列出目录中的内容。例如,你只需要列出某个后缀名的文件。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 的文件:
运行结果:
使用用户自定义过滤器列出目录内容
如果区块匹配不能满足你的需求,那么你还可以编写你自己的过滤器。你只需要实现 DirectoryStream.Filter<T> 接口,并实现它的 accept() 方法。Path 是否通过检验都需要你自己来实现。例如,下面的代码段将演示只有文件夹才能通过检验的例子:
创建的过滤器可以直接传给 newDirectoryStream() 方法:
输出结果如下:
下面列举了一些常用的过滤器实现:
过滤器只允许文件/文件夹大于 200 KB 通过检验
过滤器只允许当天更新过的文件通过检验
过滤器只允许隐藏文件/文件夹通过检验
文章来源:http://www.aptusource.org/2014/04/nio-2-creating-and-listing-directories/
在 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
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/
发表评论
-
[NIO.2] 第四十一篇 随机访问文件概述
2014-04-29 14:51 1746我们已经看过很多顺序读取文件的例子,文件除了可以被顺序读取,还 ... -
[NIO.2] 第四十篇 监控目录树
2014-04-29 14:49 1975现在,我们编写一个应用来监控 C:\rafaelnadal 目 ... -
[NIO.2] 第三十九篇 实现文件监控服务
2014-04-26 16:13 3658要实现监控服务需要有几个步骤。在本文中,你将会看到实现监控服务 ... -
[NIO.2] 第三十八篇 监控服务 API
2014-04-21 14:13 1998Java 7 NIO.2 引入了线程安全的监控服务,用于监控对 ... -
[NIO.2] 第三十七篇 编写一个文件移动应用
2014-04-18 14:20 1312移动文件分为两个步骤,先拷贝文件,再删除源文件。 下面的代码 ... -
[NIO.2] 第三十六篇 编写一个文件拷贝应用
2014-04-18 14:18 1404拷贝目录树的时候,需要为文件和目录递归调用 Files.cop ... -
[NIO.2] 第三十五篇 编写一个文件删除应用
2014-04-17 18:22 1840如果要删除单个文件,可以直接调用 delete() 或 del ... -
[NIO.2] 第三十四篇 编写一个文件搜索应用
2014-04-14 15:39 1420大多数操作系统都提供了独立的工具用于文件搜索(例如,Linux ... -
[NIO.2] 第三十三篇 遍历目录树
2014-04-14 15:35 2377一旦你创建了遍历机制(实现 FileVisitor 接口或继承 ... -
[NIO.2] 第三十二篇 SimpleFileVisitor 类
2014-04-12 15:57 2018要实现 FileVisitor 接口就要实现接口上的所有方法, ... -
[NIO.2] 第三十一篇 FileVisitor 接口
2014-04-12 15:53 3186FileVisitor 接口提供了递归遍历文件树的支持。这个接 ... -
[NIO.2] 第三十篇 递归操作简述
2014-04-12 15:46 1046你可能知道,在编程中使用递归技术一直有争议,但是它的确简化了一 ... -
[NIO.2] 第二十九篇 删除、复制、移动目录和文件
2014-04-10 16:28 5287删除、拷贝和移动操作是最常见的文件操作。NIO.2 提供了独立 ... -
[NIO.2] 第二十八篇 创建临时目录和文件
2014-04-09 13:59 4487临时目录是用于存储临时文件的目录。临时目录的位置依赖操作系统。 ... -
[NIO.2] 第二十七篇 新建、读取和写出文件
2014-04-07 20:09 4141对文件来说,可能最常用的操作就是创建、读取和写出。NIO.2 ... -
[NIO.2] 第二十五篇 文件及目录的校验
2014-04-05 16:26 1848在对文件或目录进行操 ... -
[NIO.2] 第二十四篇 定位链接所指向的目标文件位置
2014-04-03 18:30 1010调用 Files.readSymbolicLink() 方法可 ... -
[NIO.2] 第二十三篇 检验软链接
2014-04-03 12:12 1717Path 对象可能表示文件或链接。如果 Path 对象指向软链 ... -
[NIO.2] 第二十二篇 创建硬链接
2014-04-03 00:11 1882可以调用 createLink() 方法创建硬链接,它将会创建 ... -
[NIO.2] 第二十一篇 创建软链接
2014-04-02 18:35 3242在 NIO.2 中,创建软链接非常简单,只需要调用 Files ...
相关推荐
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 ...
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相关知识的书,书中对知识的讲解通俗易懂,是学习java nio以及复习java io相关知识的必备书籍。注意:本书为英文版!!!
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
Apress.Pro.Java.7.NIO.2.2011
java NIO.zip
Pro Java 7 NIO.2 – PDF Books
蔚来-NIO.US-新车上市,蔚来可期.pdf
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,Ron Hitchens 著,中文版 裴小星 译,Pro Java 7 NIO.2,Anghel Leonard 著,pdf文字版带书签,无安全限制
Pro Java 7 NIO.2.pdf,2011 by Anghel Leonard
JavaNIO.pdf
找了好久,终于找到了,java刷新同步获取网络资源
定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 NIO API 的集中抽象为: 缓冲区,它们是数据容器; 字符集 及其相关解码器 和编码器, 它们在字节和 Unicode 字符之间进行转换; 各种类型的通道,...
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.*进行网络编程
NIO入门.chm NIO入门.chm NIO入门.chm
Java NIO.docx