激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java函數式編程(十二):監控文件修改

Java函數式編程(十二):監控文件修改

2019-12-01 12:48有孚 JAVA教程

這篇文章主要介紹了Java函數式編程(十二):監控文件修改,本文是系列文章的第12篇,其它文章請參閱本文底部的相關文章,需要的朋友可以參考下

使用flatMap列出子目錄

前面已經看到如何列出指定目錄下的文件了。我們再來看下如何遍歷指定目錄的直接子目錄(深度為1),先實現一個簡單的版本,然后再用更方便的flatMap()方法來實現。

我們先用傳統的for循環來遍歷一個指定的目錄。如果子目錄中有文件,就添加到列表里;否則就把子目錄添加到列表里。最后,打印出所有文件的總數。代碼在下面——這個是困難模式的。

 

復制代碼代碼如下:

public static void listTheHardWay() {
     List<File> files = new ArrayList<>();
     File[] filesInCurrentDir = new File(".").listFiles();
     for(File file : filesInCurrentDir) {
          File[] filesInSubDir = file.listFiles();
               if(filesInSubDir != null) {
                     files.addAll(Arrays.asList(filesInSubDir));
               } else {
                    files.add(file);
               }
      }
     System.out.println("Count: " + files.size())
}

 

我們先獲取當前目錄下的文件列表,然后進行遍歷。對于每個文件,如果它有子文件,就把它們添加到列表中。這樣做是沒問題的,不過它有一些常見的問題:可變性,基本類型偏執,命令式,代碼冗長,等等。一個叫flatMap()的小方法就可以解決掉這些問題。

正如這個名字所說的,這個方法在映射后會進行扁平化。它會像map()一樣對集合中的元素進行映射。但是和map()方法不同的是,map()方法里面的lambda表達式只是返回一個元素,而這里返回的是一個Stream對象。于是這個方法將多個流壓平,將里面的每個元素映射到一個扁平化的流中。

我們可以用flatMap()來執行各種操作,不過現在手頭的這個問題就正好詮釋了它的價值。每個子目錄都有一個文件的列表或者說流,而我們希望獲取當前目錄下的所有子目錄中的文件列表。

有一些目錄可能是空的,或者說沒有子元素。這種情況下,我們將這個空目錄或者文件包裝成一個流對象。如果我們想忽略某個文件,JDK中的flatMap()方法也可以很好的處理空文件;它會把一個空引用作為一個空集合合并到流里。來看下flatMap()方法的使用。

 

復制代碼代碼如下:

public static void betterWay() {
     List<File> files =
          Stream.of(new File(".").listFiles())
               .flatMap(file -> file.listFiles() == null ?
                    Stream.of(file) : Stream.of(file.listFiles()))
               .collect(toList());
     System.out.println("Count: " + files.size());
}

 

我們先是獲取了當前目錄的子文件流,然后調用了它的flatMap()方法。然后將一個lambda表達式傳給這個方法,這個表達式會返回指定文件的子文件的流。flatMap()方法返回的的是當前目錄所有子目錄下的文件的集合。我們使用collect()方法以及Collectors里面的toList()(方法把它們收集到一個列表中。

我們傳給flatMap()的這個lambda表達式,它返回的是一個文件的子文件。 如果沒有的話,則返回這個文件的流。flatMap()方法優雅地將這個流映射到一個流的集合中,然后將這個集合扁平化,最終合并到一個流中。

flatMap()方法減少了許多開發的工作——它將兩個連續的操作很好的結合到了一起,這通常稱為元組 ——用一個優雅的操作就完成了。

我們已經知道如何使用flatMap()方法來將直接子目錄中的所有文件列出來。下面我們來監控一下文件的修改操作。

監控文件修改

我們已經知道如何查找文件及目錄,不過如果我們希望在文件創建,修改或刪除的時候,能夠接收到提示消息的話,這個也非常簡單。這樣的機制對于監視一些特殊文件比如配置文件,系統資源的改動非常有用。下面我們來探索下Java 7中引入的這個工具,WatchService,它可以用來監控文件的修改。下面我們看到的許多特性都來自JDK 7,而這里最大的改進就是內部迭代器帶來的便利性。

我們先來寫個監控當前目錄中的文件修改的例子。JDK中的Path類會對應文件系統中的一個實例,它是一個觀察者服務的工廠。我們可以給這個服務注冊通知事件,就像這樣:

 

復制代碼代碼如下:


inal Path path = Paths.get(".");

 

final WatchService watchService =
       path.getFileSystem()
           .newWatchService();
       path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY);

System.out.println("Report any file changed within next 1 minute...");

 

我們注冊了一個WatchService來觀察當前目錄的修改。你可以輪詢這個WatchService來獲取目錄下文件的修改操作,它會通過一個WatchKey將這些改動返回給我們。一旦我們拿到了這個key,可以遍歷它的所有事件來獲取文件更新的詳細信息。因為可能會有多個文件被同時修改,poll操作可能會返回多個事件。來看下輪詢以及遍歷的代碼。

 

復制代碼代碼如下:


final WatchKey watchKey = watchService.poll(1, TimeUnit.MINUTES);

 

if(watchKey != null) {
     watchKey.pollEvents()
          .stream()
          .forEach(event ->
               System.out.println(event.context()));
}

 

這里可以看到,Java 7和Java 8的特性同時出場了。我們把pollEvents()返回的集合轉化成了一個Java 8的Stream,然后使用它的內部迭代器來打印出每個文件的詳細的更新信息。

我們來運行下這段代碼,然后將當前目錄下的sample.txt文件修改一下,看下這個程序是否能察覺這個更新。

 

復制代碼代碼如下:


Report any file changed within next 1 minute...

 

sample.txt

 

當我們修改了這個文件的時候,程序會提示說文件被修改了。我們可以用這個功能來監視不同文件的更新,然后執行相應的任務。當然我們也可以只注冊文件新建或者刪除的操作。

總結

有了lambda表達式和方法引用后,像字符串及文件的操作,創建自定義比較器這些常見的任務都變得更簡單也更簡潔了。匿名內部類也變得優雅起來了,而可變性就像日出后的晨霧一樣,也消失得無影無蹤了。使用這種新風格進行編碼還有一個福利,就是你可以使用JDK的新設施來高效地遍歷龐大的目錄。

現在你已經知道如何創建lambda表達式并把它傳遞給方法了。下一章我們會介紹如何使用函數式接口及lambda表達式進行軟件的設計。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 一级做a爰性色毛片免费1 | 成人免费一区二区三区在线观看 | 色妞色视频一区二区三区四区 | 久久综合网址 | wwwxxx免费视频 | 蜜桃网站在线观看 | 福利免费在线 | 国产在线看一区 | 精品久久久久久亚洲精品 | 成年人在线视频 | 污片视频在线观看 | 久久国产精品99久久人人澡 | 国产在线观看91精品 | 九九热在线视频观看 | 久久久国产一区二区三区 | 龙的两根好大拔不出去h | 狠狠操人人干 | 久久国产精品久久久久 | 性大片免费看 | 黄色免费高清网站 | 久久96国产精品久久久 | 国产精品三级a三级三级午夜 | 中文字幕在线免费播放 | www视频免费观看 | av色哟哟| 日本在线免费观看视频 | 一区二区久久精品66国产精品 | 精品国产精品久久 | 久久综合入口 | 欧美爱爱小视频 | av不卡免费在线 | 久久99精品国产 | 亚洲影院在线播放 | 国产一区二区免费在线观看 | 久久久在线免费观看 | 国产91久久久久久 | 2级毛片| 色女人在线 | av影片在线观看 | 91社影院在线观看 | 国产精品hd免费观看 |