溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java中怎么實(shí)時(shí)監(jiān)控文件目錄

發(fā)布時(shí)間:2021-07-15 13:57:32 來(lái)源:億速云 閱讀:488 作者:Leah 欄目:編程語(yǔ)言

Java中怎么實(shí)時(shí)監(jiān)控文件目錄,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

一、代碼實(shí)現(xiàn)1、簡(jiǎn)單案例

這個(gè)代碼很簡(jiǎn)單,只需要四步:

public static void main(String[] args) throws Exception {    //第一步:取得WatchService    WatchService watchService = FileSystems.getDefault().newWatchService();    //第二步:確定要監(jiān)控的路徑    Path path = Paths.get("G:\\");    //第三步:為本路徑綁定WatchService,并確定監(jiān)控的事件    path.register(        watchService,        StandardWatchEventKinds.ENTRY_CREATE,        StandardWatchEventKinds.ENTRY_DELETE,        StandardWatchEventKinds.ENTRY_MODIFY);    WatchKey key;    //第四步:當(dāng)有事件時(shí),開(kāi)始觸發(fā)    while ((key = watchService.take()) != null) {        for (WatchEvent<?> event : key.pollEvents()) {           System.out.println("事件" + event.kind() + "發(fā)生了,文件是:" + event.context());        }        key.reset();    } }

這里我們監(jiān)控G盤(pán),然后我們?cè)贕盤(pán)新建文件,然后刪除修改,就會(huì)在后臺(tái)打印相關(guān)信息。

Java中怎么實(shí)時(shí)監(jiān)控文件目錄

現(xiàn)在就可以監(jiān)控了,很簡(jiǎn)單。

2、代碼分析

第一步和第二步,新建一個(gè)取得WatchService和取得要監(jiān)控的路徑,這個(gè)很容易理解。

第三步綁定,這里只需要注意兩件重要的事情:首先,path將watchService作為第一個(gè)參數(shù),然后是StandardWatchEventKinds的變量參數(shù)。一共有四種。

  • StandardWatchEventKinds.ENTRY_CREATE&mdash;當(dāng)有新文件時(shí)觸發(fā)??赡苁莿?chuàng)建了一個(gè)新文件。

  • StandardWatchEventKinds.ENTRY_MODIFY&mdash;當(dāng)文件被修改時(shí)觸發(fā)。所有的文件編輯都會(huì)觸發(fā)這個(gè)事件。在一些平臺(tái)上,甚至改變文件屬性也會(huì)觸發(fā)它。

  • StandardWatchEventKinds.ENTRY_DELETE&mdash;當(dāng)文件被刪除、移動(dòng)或重命名時(shí)觸發(fā)。

  • StandardWatchEventKinds.OVERFLOW&mdash;觸發(fā)表示丟失或丟棄的事件。

第四步不斷監(jiān)控,當(dāng)watchService里面不為空時(shí),開(kāi)始獲取相應(yīng)的事件,并poll彈出。最后還有一個(gè)reset  表示回退到相應(yīng)的句柄,繼續(xù)處理下一次事件。

3、源碼分析

由于watchService是一個(gè)接口,所以分析起來(lái)也比較簡(jiǎn)單。里面一共包含了三個(gè)方法

//方法1:關(guān)閉watchService @Override void close() throws IOException; //方法2:彈出事件 WatchKey poll(); //方法3:帶有參數(shù)的彈出 WatchKey poll(long timeout, TimeUnit unit)         throws InterruptedException; //方法4:獲取事件。 WatchKey take() throws InterruptedException;

由于方法比較簡(jiǎn)單,所以我們可以直接看方法上的注釋就可以了。

結(jié)論

WatchService接口是在java7的版本中引入的。主要是處理NIO的文件相關(guān)問(wèn)題。但是WatchService其實(shí)是有很多缺點(diǎn)的。

WatchService是采用掃描式的,效率低。

WatchService代碼寫(xiě)起來(lái)費(fèi)勁。雖然上面看起來(lái)很簡(jiǎn)潔了,但是實(shí)際開(kāi)發(fā)時(shí)麻煩。

WatchService不能監(jiān)聽(tīng)到多級(jí)目錄,事先父文件夾需要存在。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI