亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

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

2019-11-26 15:24:19
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品白嫩初高中害羞小美女| 久久精品国产亚洲7777| 国产欧美日韩专区发布| 欧美激情区在线播放| 亚洲va男人天堂| 欧美在线激情视频| 国产色综合天天综合网| 国产丝袜一区二区三区免费视频| 91精品久久久久久久久久入口| 日本道色综合久久影院| 国产精品精品一区二区三区午夜版| 国产91精品最新在线播放| 国模精品一区二区三区色天香| 精品日本美女福利在线观看| 日韩小视频在线观看| 精品久久久久久中文字幕| 国产精品视频久久| 欧美中文字幕在线| 中文字幕在线国产精品| 亚洲三级黄色在线观看| 亚洲美女久久久| 欧美日韩不卡合集视频| 久久影院资源网| 亚洲美女av黄| 亚洲视频自拍偷拍| 永久免费精品影视网站| 国产欧美精品一区二区三区-老狼| 97久久久久久| 国产午夜精品一区二区三区| 精品毛片三在线观看| 一区二区三区久久精品| 亚洲大胆美女视频| 久久九九国产精品怡红院| 久久久国产一区二区三区| 91免费版网站入口| 亚洲精品久久久久久久久久久久| 日韩av在线免费观看| 国产免费观看久久黄| www国产精品com| 欧美精品久久久久久久久久| 奇米影视亚洲狠狠色| 自拍偷拍亚洲在线| 欧美人成在线视频| 国产精品电影久久久久电影网| 欧美成人精品一区二区| 日本中文字幕成人| 搡老女人一区二区三区视频tv| 久久精品99久久香蕉国产色戒| 欧美激情精品久久久久久久变态| 国产精品久久久久久av| 国产精品第三页| 一区二区三区视频观看| 精品国产乱码久久久久久虫虫漫画| 日韩亚洲综合在线| 5566成人精品视频免费| 亚洲毛片在线观看.| 亚洲欧美精品伊人久久| 国产精品扒开腿做爽爽爽的视频| 国产精品久久久久av| 久久夜色精品国产欧美乱| 国产精国产精品| 国产精品99久久久久久www| 久久久久久久影院| 亚洲男人的天堂网站| 午夜精品久久久久久久99热| 欧美限制级电影在线观看| 亚洲午夜性刺激影院| 久久久成人精品视频| 亚洲黄色av女优在线观看| 91精品中国老女人| 国产精品va在线播放| 国产精品旅馆在线| 成人免费看吃奶视频网站| 国产精品91免费在线| 欧美一区视频在线| 欧美极品少妇xxxxⅹ裸体艺术| 成人免费网站在线观看| 国产精品久久久久国产a级| 亚洲激情中文字幕| 性欧美在线看片a免费观看| 久久精品最新地址| 国产精品日韩欧美| 久久久av一区| 性欧美视频videos6一9| 欧美亚洲另类在线| 欧美成人亚洲成人| 国内精品久久久久久中文字幕| 一本久久综合亚洲鲁鲁| 欧美极品美女视频网站在线观看免费| 色偷偷偷亚洲综合网另类| 日韩成人在线视频观看| 美女少妇精品视频| 2019中文字幕全在线观看| 91国内揄拍国内精品对白| 亚洲三级黄色在线观看| 日韩小视频在线| 久久精品国产成人| 亚洲3p在线观看| 亚洲精品www久久久| 色午夜这里只有精品| 欧美老女人xx| 亚洲视频在线播放| 精品国产欧美成人夜夜嗨| 狠狠色香婷婷久久亚洲精品| 国产精品色午夜在线观看| 国产精品免费一区二区三区都可以| 亚洲视频第一页| 永久免费精品影视网站| 亚洲视频在线视频| 九九九久久久久久| 久久久久一本一区二区青青蜜月| 狠狠色香婷婷久久亚洲精品| 日韩精品在线观看视频| 精品中文字幕在线2019| 日韩精品免费在线观看| 2020久久国产精品| 日韩中文视频免费在线观看| 久久久久久国产精品久久| 亚洲精品美女在线观看播放| 亚洲日本中文字幕| 亚洲的天堂在线中文字幕| 亚洲国产中文字幕在线观看| 77777少妇光屁股久久一区| 国产精品视频免费观看www| 成人国产精品久久久久久亚洲| 福利一区视频在线观看| 自拍偷拍亚洲一区| 日本成人黄色片| 亚洲人成电影网站色…| 精品久久久久久中文字幕| 亚洲一区二区中文| 国产精品久久久久999| 川上优av一区二区线观看| 亚洲风情亚aⅴ在线发布| 亚洲一区美女视频在线观看免费| 欧美在线影院在线视频| 国产精品美女久久久久av超清| 中文日韩在线视频| 久久香蕉国产线看观看网| 日韩精品中文字幕在线观看| 黄色精品一区二区| 日韩av影院在线观看| 国产va免费精品高清在线观看| 成人在线免费观看视视频| 亚洲综合最新在线| 国产精品入口免费视频一| 国产精品福利小视频| 97在线视频免费观看| 亚洲在线免费视频| 欧美极品少妇xxxxⅹ喷水| 国产xxx69麻豆国语对白| 一本久久综合亚洲鲁鲁| 亚洲最新视频在线| 亚洲va国产va天堂va久久| 日韩高清电影好看的电视剧电影| 日韩欧美在线看| 国内精品小视频在线观看| 欧美最猛性xxxxx免费| 欧美日韩视频免费播放| 久久久久一本一区二区青青蜜月| 性欧美办公室18xxxxhd| 久久99久久99精品免观看粉嫩| 久久精品成人欧美大片古装| 麻豆国产va免费精品高清在线|