wordpress移动站点,成都发布最新消息,仙游县网站建设,中通服建设有限公司网站在Java 7发行之前#xff0c;列出目录内容的领域并没有发生太多的事情。但是#xff0c;由于NIO.2引入了一种新的方式来做到这一点#xff0c;因此涵盖这一领域可能是值得的。 NIO.2的一大优点是能够在一个方法调用中立即使用列表和过滤。 这为与文件系统相关的大多数列表/筛… 在Java 7发行之前列出目录内容的领域并没有发生太多的事情。但是由于NIO.2引入了一种新的方式来做到这一点因此涵盖这一领域可能是值得的。 NIO.2的一大优点是能够在一个方法调用中立即使用列表和过滤。 这为与文件系统相关的大多数列表/筛选需求提供了一种优雅的解决方案。 列出根目录 除非我们使用相对路径否则我们需要了解应用程序所处的环境因此我们可以定义绝对路径。 由于文件系统通常是分层结构因此至少有一个根目录。 为了正确寻址文件和目录我们需要能够列出所有这些根目录。 为此我们转向FileSystem实例本身使用其方法getRootDirectories 它是Java 6构造File.listRoots()的替代方法。 IterablePath it FileSystems.getDefault().getRootDirectories();System.out.println(Root file system locations: Sets.newHashSet(it)); *请注意 Sets类不是JDK的一部分而是来自Google的Guava库。 我在这里使用它只是为了方便获得根目录的格式正确的字符串表示形式。 具有以下输出 Root file system locations: C:\, D:\, E:\, F:\, G:\, H:\, I:\,列出和过滤目录内容 使用文件系统时标准任务是列出或过滤给定目录中的文件。 我们可能需要修改分析或简单列出它们-无论java.nio.file.Files何种原因类java.nio.file.Files都有我们的支持。 它提供了newDirectoryStream方法的三种变体它们返回DirectoryStreamPath类型的对象以允许我们遍历目录中的条目。 在这里我们看到了防止NullPointerException的IO库的当前版本与先前版本返回简单数组之间的明显差异。 以下示例说明了列出给定目录内容的简单程度 Path directoryPath Paths.get(C:, Program Files/Java/jdk1.7.0_40/src/java/nio/file);if (Files.isDirectory(directoryPath)) {try (DirectoryStreamPath stream Files.newDirectoryStream(directoryPath)) {for (Path path : stream) {System.out.println(path);}} catch (IOException e) {throw new RuntimeException(e);}
} 请注意使用isDirectory检查方法可以防止NotDirectoryException 。 还要注意try-with-resources构造的使用– DirectoryStream是AutoCloseable和Closeable 这意味着它需要在某个时间关闭因此try-with-resources派上了用场。 代码返回以下输出 ...
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\CopyOption.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryIteratorException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryNotEmptyException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryStream.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\Files.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileStore.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystem.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemAlreadyExistsException.java
... 为了确保DirectoryStreamPath通用可用性我们可以使用两种基本机制进行过滤 newDirectoryStream(Path dir, String glob) 使用GLOB过滤 newDirectoryStream (Path dir, DirectoryStream.Filterfilter) 使用DirectoryStream.Filter过滤 使用GLOB模式过滤 首先我们需要知道GLOB是什么。 GLOB模式是遵循特定语法规则的字符串表达式它们用于匹配目的。 请参阅以下文章以获取有关GLOB和GLOB语法的更多信息。 在使用GLOB进行过滤时 Files类为我们提供了一种简便的方法。 让我们看下面的例子。 Path directoryPath Paths.get(C:, Program Files/Java/jdk1.7.0_40/src/java/nio/file);if (Files.isDirectory(directoryPath)) {try (DirectoryStreamPath stream Files.newDirectoryStream(directoryPath, File*Exception*)) {for (Path path : stream) {System.out.println(path);}} catch (IOException e) {throw new RuntimeException(e);}
} 具有以下输出 C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemAlreadyExistsException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemLoopException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileSystemNotFoundException.java 使用DirectoryStream.Filter进行过滤 当手头的任务需要更复杂的过滤选项而不仅仅是简单的文件名匹配时我们需要实现DirectoryStream.FilterPath接口。 这是我们可以使用的最强大的筛选选项因为我们可以访问应用程序的其余部分并且可能使用第三方库。 下面的示例使用两种过滤条件显示了这种情况 文件大小必须为偶数 执行时间以毫秒为单位必须为偶数 Path directoryPath Paths.get(C:, Program Files/Java/jdk1.7.0_40/src/java/nio/file);
DirectoryStream.FilterPath filter new FilterPath() {Overridepublic boolean accept(Path entry) throws IOException {long size Files.readAttributes(entry, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS).size();long milis new Date().getTime();boolean isSizeEvenNumber size % 2 0;boolean isTheTimeRight milis % 2 0;return isTheTimeRight isSizeEvenNumber;}
};if (Files.isDirectory(directoryPath)) {try (DirectoryStreamPath stream Files.newDirectoryStream(directoryPath, filter)) {for (Path path : stream) {System.out.println(path);}} catch (IOException e) {throw new RuntimeException(e);}
} 具有以下输出 C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\DirectoryStream.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\FileAlreadyExistsException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\Files.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\NotDirectoryException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\NotLinkException.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\package-info.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\WatchEvent.java
C:\Program Files\Java\jdk1.7.0_40\src\java\nio\file\WatchService.java *请注意根据使用条件每次执行过滤后的文件可能会有所不同。 翻译自: https://www.javacodegeeks.com/2014/06/listing-and-filtering-directory-contents-in-nio-2.html