一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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表達式進行軟件的設計。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产成人久久综合一区 | 国产精品亚洲综合久久 | 18videossex性欧美69 | a级毛片毛片免费很很综合 a级黄色视屏 | 欧美男男gaysgays | 色老板影视 | jazz欧美人免费xxxxxx | 亚洲上最大成网人站4438 | 婷婷麻豆| 亚洲福利 影院 | 四虎在线最新永久免费 | 亚洲红怡院 | 欧美亚洲另类综合 | 四虎影院网址大全 | 日本男男gayxxxxx免费 | 国产成人精品视频一区二区不卡 | 男生操女生动态图 | 日本加勒比在线精品视频 | 肥胖女性大bbbbbb视频女厕 | 边摸边吃奶边做爽视频免费 | 国产私拍精品88福利视频 | 亚洲AV国产国产久青草 | 国产一卡2卡3卡4卡公司科普 | 丁香五香天堂 | 青青在线观看 | 欧美国产日产精品免费视频 | 国产精品久久久久久久久免费hd | 亚洲国产日韩成人综合天堂 | 帅小伙和警官同性3p | 国产成人精品一区二区不卡 | 青草香蕉精品视频在线观看 | 国产午夜视频在线观看网站 | 成人精品一区二区三区 | 好男人资源免费播放在线观看 | 色欧美在线 | 日韩基地1024首页 | 99久久综合 | 日韩欧美一区二区不卡 | videodesexo中国妞| 色综合图片 | www红色一片在线观看版 |