日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

java8 监控文件变化_[Java 8] (4) 列举目录下的所有文件和监视文件变化

發(fā)布時(shí)間:2025/3/20 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java8 监控文件变化_[Java 8] (4) 列举目录下的所有文件和监视文件变化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

列舉目錄中的所有文件

首先給出代碼:

Files.list(Paths.get(".")).forEach(System.out::println);

Files.list方法得到的是一個(gè)Stream類型的對(duì)象,它代表了目標(biāo)路徑下所有的文件。如果只想獲取目標(biāo)路徑下的所有目錄文件:

Files.list(Paths.get("."))

.filter(Files::isDirectory)

.forEach(System.out::println);

在以前的Java版本中,如果需要實(shí)現(xiàn)一個(gè)自定義的過(guò)濾器,那么通常會(huì)選擇使用FilenameFilter結(jié)合匿名類的方式:

final String[] files =

new File("target_dir").list(new java.io.FilenameFilter() {

public boolean accept(final File dir, final String name) {

return name.endsWith(".java");

}

});

System.out.println(files);

我們說(shuō)過(guò),當(dāng)遇見(jiàn)了匿名內(nèi)部類的時(shí)候,如果被實(shí)現(xiàn)的接口是一個(gè)函數(shù)式接口,那么可以考慮將該匿名內(nèi)部類以Lambda表達(dá)式的形式重新實(shí)現(xiàn),再結(jié)合Java 8中新添加的DirectoryStream,可以將上述代碼重新實(shí)現(xiàn)為:

Files.newDirectoryStream(

Paths.get("target_dir"),

path -> path.toString().endsWith(".java"))

.forEach(System.out::println);

當(dāng)目標(biāo)目錄下含有大量的文件或者子目錄時(shí),使用DirectoryStream往往會(huì)具有更好的性能。因?yàn)樗鼘?shí)際上是一個(gè)Iterator用來(lái)遍歷目標(biāo)目錄,而直接使用listFiles方法時(shí),得到的是一個(gè)代表了所有文件和目錄的數(shù)組,意味著內(nèi)存的開(kāi)銷(xiāo)會(huì)更大。

使用flatMap列舉所有直接子目錄

所謂的直接子目錄(Immediate Subdirectory),指的就是目標(biāo)目錄下一級(jí)的所有目錄。對(duì)于這樣一個(gè)任務(wù),最直觀的實(shí)現(xiàn)方式恐怕是這樣的:

public static void listTheHardWay() {

List files = new ArrayList<>();

File[] filesInCurerentDir = new File(".").listFiles();

for(File file : filesInCurerentDir) {

File[] filesInSubDir = file.listFiles();

if(filesInSubDir != null) {

files.addAll(Arrays.asList(filesInSubDir));

} else {

files.add(file);

}

}

System.out.println("Count: " + files.size());

}

很顯然,此段代碼噪聲太多,沒(méi)有清晰地反映出代碼的整體目標(biāo)。下面就用flatMap方法來(lái)簡(jiǎn)化它:

public static void betterWay() {

List 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

Stream flatMap(Function super T, ? extends Stream extends R>> mapper);

從flatMap方法的簽名來(lái)看,它接受了一個(gè)Function接口作為參數(shù),將一種類型轉(zhuǎn)換為另一種類型的Stream類型。而從flatMap方法的命令來(lái)看,它的執(zhí)行過(guò)程主要包含兩個(gè)步驟:

首先是會(huì)對(duì)當(dāng)前Stream的每個(gè)元素執(zhí)行一次map操作,根據(jù)傳入的mapper對(duì)象將一個(gè)元素轉(zhuǎn)換為對(duì)應(yīng)的Stream對(duì)象將第一步中得到的若干個(gè)Stream對(duì)象匯集成一個(gè)Stream對(duì)象

從上面的代碼來(lái)看,簽名中的T類型就是File類型,而R類型同樣也是File類型。當(dāng)一個(gè)File對(duì)象不含有任何的子目錄或者子文件時(shí),那么通過(guò)Stream.of(file)來(lái)僅僅包含它自身,否則使用Stream.of(file.listFiles())來(lái)包含其下的所有子目錄和子文件。

監(jiān)視文件變化

WatchService是Java 7中新添加的一個(gè)特性,用來(lái)監(jiān)視一某個(gè)路徑下的文件或者目錄是否發(fā)生了變化。

final 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 minutes...");

注冊(cè)了需要監(jiān)視的目錄后,需要使用WatchKey來(lái)得到一段時(shí)間內(nèi)的,該目錄的變化情況:

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

if(watchKey != null) {

watchKey.pollEvents().stream().forEach(event ->

System.out.println(event.context()));

}

這里使用了Java 8中的內(nèi)部遍歷器forEach來(lái)完成對(duì)于事件的遍歷。這也算是一個(gè)Java 7和Java 8特性的聯(lián)合使用吧。

總結(jié)

以上是生活随笔為你收集整理的java8 监控文件变化_[Java 8] (4) 列举目录下的所有文件和监视文件变化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。