前往顾页
以后地位: 主页 > 收集编程 > Jsp实例教程 >

利用NIO2检察及过滤目次的内容

时候:2015-05-05 21:30来源:知行网www.zhixing123.cn 编辑:麦田守望者

在Java 7之前若何查询目次内容并没有太年夜的转变。不过NIO.2今后增加了一种新的体例,这个很有需求介绍一下。NIO.2的一个很年夜的改进是它可以在一次体例调用中完成检察及过滤的操纵。这为年夜多数文件体系相关的检察及过滤操纵供应了一种文雅的处理计划。

检察根目次

除非你是利用相对途径,不然你需求晓得利用法度在环境中的哪个地位,如许才气定义绝对途径。因为文件体系利用的是分层布局,是以会有多个根目次。为了能精确地定位文件及目次你需求可以或许列出所有的根目次。我们得乞助于FileSystem实例,利用它的getRootDirectories体例,这是Java 6的File.listroots()的一个替代计划。

Iterable<Path> it = FileSystems.getDefault().getRootDirectories();
 
System.out.println("Root file system locations: " + Sets.newHashSet(it));

重视,类sets是来自Google的Guava库的,而不是JDK中的。这里用到它是因为希望能便利地获得到格局化好的根目次的字符串。

输入以下:

Root file system locations: C:\, D:\, E:\, F:\, G:\, H:\, I:\,

检察及过滤目次内容:

利用文件体系的常见任务是检察或过滤指定目次下的文件。我们可能需求点窜,阐发或只是去检察下它们——非论是甚么,类java.nio.file.Files总能满足我们的需求。它供应了三种情势的newDirectoryStream体例,并前往DirectoryStream 的工具,我们可以用它来遍历目次的所有条目。这里我们可以看到在避免空指针异常方面,以后版本的IO库和上一版本的有很较着的辨别。从下面这个例子可以看呈现在列出某个目次下的子文件有多简朴:

Path directoryPath = Paths.get("C:", "Program Files/Java/jdk1.7.0_40/src/java/nio/file");
 
if (Files.isDirectory(directoryPath)) {
    try (DirectoryStream<Path> 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又是Closable的(这意味着它可能需求在某个时候封闭失落),是以利用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

为了能同一利用DirectoryStream ,可利用下面两种机制来进行过滤操纵:

  • newDirectoryStream(Path dir, String glob) 利用GLOB过滤

  • newDirectoryStream (Path dir, DirectoryStream.Filterfilter)

    利用 DirectoryStream.Filterfilter过滤

利用GLOB形式过滤

起首我们需求晓得甚么是GLOB。GLOB形式是遵守特定语法规则的用于婚配的字符串表达式。可以参考这篇文章体味下关于GLOB的更多信息。Files类供应了一个简朴的体例来进行GLOB体例的过滤。来看一下下面这个例子。

Path directoryPath = Paths.get("C:", "Program Files/Java/jdk1.7.0_40/src/java/nio/file");
 
if (Files.isDirectory(directoryPath)) {
    try (DirectoryStream<Path> 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.Filter 接口。这是我们目前可用的最强年夜的过滤选项了,因为有了它我们可以拜候到法度的别的部分,同时还可利用第三方库。下面的例子揭示了这么一种场景,它需求利用到两个过滤选项:

  • 文件年夜小是一个偶数值
  • 履行时候的毫秒值也是偶数
Path directoryPath = Paths.get("C:", "Program Files/Java/jdk1.7.0_40/src/java/nio/file");
DirectoryStream.Filter<Path> filter = new Filter<Path>() {
 
    @Override
    public 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 (DirectoryStream<Path> 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
------分开线----------------------------
标签(Tag):Java JAVA实例教程 JAVA根本教程 Java源代码 Java技能
------分开线----------------------------
保举内容
猜你感兴趣