虛擬文件系統(tǒng)

原文鏈接:
http://www.jetbrains.org/intellij/sdk/docs/basics/virtual_file_system.html

虛擬文件系統(tǒng)(VFS)是IntelliJ平臺(tái) 的一個(gè)組件蕾域,它封裝了處理文件的大部分操作算利。它主要有以下幾個(gè)目的:

  • 提供一個(gè)處理文件的通用API诗越,而不用管文件的真實(shí)位置(磁盤上、歸檔中或HTTP服務(wù)器上);
  • 跟蹤文件修改,并在檢測(cè)到修改時(shí)提供文件內(nèi)容的舊版本和新版本;
  • 提供將其它持久性數(shù)據(jù)與VFS中的文件關(guān)聯(lián)的可能性见秤。

為了提供后兩個(gè)特性砂竖,VFS管理用戶硬盤的某些內(nèi)容的持久性快照。 快照僅存儲(chǔ)那些至少被VFS API請(qǐng)求一次的文件鹃答,并且異步更新匹配磁盤上發(fā)生的更改乎澄。

快照是應(yīng)用級(jí),而不是項(xiàng)目級(jí)的测摔。因此置济,即使多個(gè)項(xiàng)目引用了某些文件(例如,JDK中的類)避咆,VFS也只會(huì)存儲(chǔ)一個(gè)副本舟肉。

所有VFS的訪問操作都通過快照。

如果通過VFS API請(qǐng)求的某些信息的快照不可用查库,則將從磁盤加載它并將其存儲(chǔ)到快照中。 如果信息在快照中可用黄琼,則返回快照數(shù)據(jù)樊销。 只有訪問了特定信息,目錄中的文件內(nèi)容和文件列表才會(huì)存儲(chǔ)在快照中 - 否則只會(huì)存儲(chǔ)名稱脏款,長(zhǎng)度围苫,時(shí)間戳等屬性的文件元數(shù)據(jù)。

注意 這意味著文件系統(tǒng)的狀態(tài)和IntelliJ Platform UI中顯示的來自快照的文件內(nèi)容并不總是匹配磁盤的實(shí)際內(nèi)容撤师。

例如在某些情況下剂府,IntelliJ平臺(tái)外部刪除的文件在UI中仍然可以顯示一段時(shí)間。

快照在刷新操作 期間從磁盤更新剃盾,這通常是異步的腺占。 所有通過VFS進(jìn)行的寫操作都是同步的——即內(nèi)容立即保存到磁盤。

刷新操作使VFS的一部分狀態(tài)與實(shí)際磁盤的內(nèi)容同步痒谴。 刷新操作由* IntelliJ平臺(tái) *或插件代碼顯式調(diào)用衰伯,即當(dāng)IDE運(yùn)行時(shí)在磁盤上的文件更改時(shí),VFS不會(huì)立即更新积蔚。 VFS將在下一次刷新操作后更新文件意鲸。

IntelliJ平臺(tái) 會(huì)在啟動(dòng)時(shí)異步刷新整個(gè)項(xiàng)目?jī)?nèi)容。默認(rèn)情況下尽爆,用戶從其它應(yīng)用切換到IDE時(shí)會(huì)執(zhí)行刷新操作怎顾,但是用戶可以通過設(shè)置|外觀和行為|系統(tǒng)設(shè)置|框架或選項(xiàng)卡激活時(shí)同步文件關(guān)閉它

在Windows,Mac和Linux系統(tǒng)中漱贱,IntelliJ平臺(tái) 會(huì)啟動(dòng)一個(gè)本地文件監(jiān)控進(jìn)程接受文件系統(tǒng)的更改通知槐雾。如果文件監(jiān)控可用,刷新操作將只更新更改的文件饱亿,否則將遍歷所有文件夾中文件蚜退。

刷新操作基于文件時(shí)間戳闰靴。 如果文件的內(nèi)容已更改,但其時(shí)間戳保持不變钻注,* IntelliJ平臺(tái) *不會(huì)接收更新的內(nèi)容蚂且。

目前沒有從快照中刪除文件的功能。 如果文件被加載一次幅恋,它將永遠(yuǎn)保留在那里杏死,除非它從磁盤中刪除,并且在其一個(gè)父目錄上調(diào)用了刷新操作捆交。

VFS本身不支持忽略設(shè)置|文件類型|文件中列出的文件和排除項(xiàng)目結(jié)構(gòu)|模塊|源代碼|排除中的文件夾淑翼。 如果應(yīng)用代碼訪問它們,VFS將加載并返回其內(nèi)容品追。 在大多數(shù)情況下玄括,忽略的文件和排除的文件夾必須從較高級(jí)別代碼的處理中跳過。

在IntelliJ平臺(tái)IDE的運(yùn)行實(shí)例的生命周期中肉瓦,多個(gè)VirtualFile實(shí)例可能對(duì)應(yīng)于同一個(gè)磁盤文件遭京。 它們是相等的,有相同的hashCode并且共享用戶數(shù)據(jù)泞莉。

同步和異步刷新

從調(diào)用者的角度來看哪雕,刷新操作可以是同步或異步的。 實(shí)際上鲫趁,刷新操作根據(jù)它們自己的線程策略來執(zhí)行斯嚎,同步意味著調(diào)用線程將被阻塞,直到刷新操作(其很可能在不同的線程上運(yùn)行)完成挨厚。

同步和異步刷新都可以從任何線程啟動(dòng)堡僻。 如果從后臺(tái)線程啟動(dòng)刷新,則調(diào)用線程必須不能保持讀取操作幽崩,否則會(huì)發(fā)生死鎖苦始。更多線程模型和讀寫操作的信息請(qǐng)查閱通用線程規(guī)則

相同的線程要求也適用于像LocalFileSystem.refreshAndFindFileByPath()這樣的函數(shù)慌申,如果在快照中找不到指定路徑的文件陌选,則執(zhí)行部分刷新。

幾乎所有情況下都強(qiáng)烈建議使用異步刷新蹄溉。 如果有一些代碼需要在刷新完成后執(zhí)行咨油,代碼應(yīng)該作為postRunnable參數(shù)傳遞給以下刷新方法:

在某些情況下,同步刷新可能會(huì)導(dǎo)致死鎖柒爵,具體取決于調(diào)用刷新操作的線程有哪些鎖役电。

虛擬文件系統(tǒng)事件

虛擬文件系統(tǒng)中發(fā)生的所有更改(由于刷新操作或由用戶操作引起)都為虛擬文件系統(tǒng)事件。 VFS事件總是在事件分派線程和寫入操作中觸發(fā)棉胀。

監(jiān)聽VFS事件的最有效的方法是實(shí)現(xiàn)BulkFileListener接口并訂閱它到VirtualFileManager法瑟。

這個(gè)API使你可以檢測(cè)到在刷新操作期間一個(gè)列表中的所有更改冀膝,并且可以批量處理它們。 你也可以實(shí)現(xiàn)VirtualFileListener接口并使用VirtualFileManager.addVirtualFileListener()注冊(cè)它霎挟,這將允許您逐個(gè)處理事件窝剖。

注意:VFS監(jiān)聽器是應(yīng)用級(jí)的,它會(huì)將接收所有用戶打開項(xiàng)目中發(fā)生的更改事件酥夭。 你可能需要過濾掉與你的任務(wù)無關(guān)的事件赐纱。

VFS事件會(huì)在每次更改前后發(fā)送,你可以在before事件之前訪問文件的舊內(nèi)容熬北。注意疙描,刷新引起的事件會(huì)在磁盤內(nèi)容更改之后發(fā)送——因此,當(dāng)你處理beforeFileDeletion事件時(shí)讶隐,例如該文件已從磁盤中刪除起胰。 但是,它仍然存在于VFS快照中巫延,你可以使用VFS API訪問其最后的內(nèi)容待错。

注意:請(qǐng)注意,刷新操作僅針對(duì)已加載進(jìn)快照中文件更改觸發(fā)事件烈评。 例如,如果你訪問一個(gè)VirtualFile的目錄犯建,但從未使用VirtualFile.getChildren()加載其內(nèi)容讲冠,當(dāng)在該目錄中創(chuàng)建文件時(shí),可能不會(huì)收到fileCreated通知适瓦。

如果使用VirtualFile.findChild()加載目錄中的一個(gè)文件竿开,你將收到該文件的更改通知,但是你可能無法收到同一目錄中其它文件的創(chuàng)建/刪除通知玻熙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末否彩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嗦随,更是在濱河造成了極大的恐慌列荔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枚尼,死亡現(xiàn)場(chǎng)離奇詭異贴浙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)署恍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門崎溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盯质,你說我怎么就攤上這事袁串「哦” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵囱修,是天一觀的道長(zhǎng)赎瑰。 經(jīng)常有香客問我,道長(zhǎng)蔚袍,這世上最難降的妖魔是什么乡范? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮啤咽,結(jié)果婚禮上晋辆,老公的妹妹穿的比我還像新娘。我一直安慰自己宇整,他們只是感情好瓶佳,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳞青,像睡著了一般霸饲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臂拓,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天厚脉,我揣著相機(jī)與錄音,去河邊找鬼胶惰。 笑死傻工,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孵滞。 我是一名探鬼主播中捆,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼坊饶!你這毒婦竟也來了泄伪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤匿级,失蹤者是張志新(化名)和其女友劉穎蟋滴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體根蟹,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脓杉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了简逮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球散。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖散庶,靈堂內(nèi)的尸體忽然破棺而出蕉堰,到底是詐尸還是另有隱情凌净,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布屋讶,位于F島的核電站冰寻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏皿渗。R本人自食惡果不足惜斩芭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乐疆。 院中可真熱鬧划乖,春花似錦、人聲如沸挤土。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仰美。三九已至迷殿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咖杂,已是汗流浹背庆寺。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诉字,地道東北人止邮。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奏窑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屈扎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 虛擬文件系統(tǒng) 虛擬文件系統(tǒng)(VFS)作為內(nèi)核子系統(tǒng)埃唯,為用戶空間程序提供了文件和文件系統(tǒng)相關(guān)的接口。系統(tǒng)中所有的文件...
    大雄good閱讀 873評(píng)論 0 4
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,175評(píng)論 2 33
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,296評(píng)論 25 707
  • 昨天去銀行辦網(wǎng)銀鹰晨,支付寶限額度要收費(fèi)墨叛,去銀行時(shí)2:10,被銀行工作人員告知不在柜臺(tái)辦理模蜡,在自助機(jī)器里辦理漠趁,但是前面...
    c1dd5a05d5c8閱讀 263評(píng)論 6 0
  • 減肥是我今年的一個(gè)大目標(biāo),也做了很多計(jì)劃忍疾,但失敗了闯传。 今年最高時(shí)瘦了10斤,但冬季來了之后卤妒,運(yùn)動(dòng)停了甥绿,吃飯沒節(jié)制了...
    陳右一閱讀 423評(píng)論 0 0