IntelliJ Platform 插件開發(fā)文檔翻譯 - 虛擬文件 Virtual Files

原文: Virtual Files

虛擬文件 com.intellij.openapi.vfs.VirtualFileIntelliJ Platform’s 虛擬文件系統(tǒng)的文件. 大多數(shù)情況赤炒,我們說一個文件是指本地文件系統(tǒng)的文件. 在IntelliJ Platform中,由于平臺靈活地支持多類文件系統(tǒng),所以虛擬文件同時也可以指代JAR包里的類文件畜伐、版本控制系統(tǒng)中歷史版本的文件等等锌唾。

VFS級別的文件只支持二進制內(nèi)容寝殴。你可以通過流(stream)的方式讀寫VirtualFile的二進制數(shù)據(jù)动遭,編碼仰猖、行分隔符這類概念只被更高的系統(tǒng)級別支持捏肢。

如何獲取一個虛擬文件

  • 從action獲得: e.getData(PlatformDataKeys.VIRTUAL_FILE).
    如果你選擇了多個文件,使用: e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY).
  • 使用本地文件系統(tǒng)上的路徑: LocalFileSystem.getInstance().findFileByIoFile()
  • 從PSI文件 : psiFile.getVirtualFile() (如果PSI文件只存在于內(nèi)存中饥侵,返回null)
  • 從Document中: FileDocumentManager.getInstance().getFile()

我可以用它做什么?

支持所有的傳統(tǒng)文件操作鸵赫,比如 遍歷整個文件系統(tǒng)、獲取文件內(nèi)容躏升、重命名辩棒、移動、刪除膨疏。遍歷操作應該使用VfsUtilCore.iterateChildrenRecursively來避免符號鏈接造成的無限循環(huán)一睁。

虛擬文件系統(tǒng)如何建立?

VFS由系統(tǒng)在項目根目錄自上而下地掃描并建立。新文件由VFS的refreshes操作檢測佃却。這一操作由VirtualFileManager.getInstance().refresh()VirtualFile.refresh()方法觸發(fā)者吁。也會在文件系統(tǒng)watchers接收到文件系統(tǒng)變化的通知時觸發(fā)(Windows和Mac操作系統(tǒng)上存在)。

作為一個插件開發(fā)者饲帅,當你需要訪問由外部工具通過IntelliJ Platform 的API新創(chuàng)建的文件時复凳,你需要先執(zhí)行VFS的refresh操作瘤泪。

一個虛擬文件的生命周期?

硬盤上的一個文件對應的VirtualFile實例有著喝IDEA進程相同的生命周期。同一個文件可能有多個實例染坯,這些實例都可被回收均芽。這個文件本體是用戶數(shù)據(jù)的載體,用戶數(shù)據(jù)同個這個文件在多個實例間共享數(shù)據(jù)单鹿。如果文件本體刪除,它對應的多個VirtualFile都會失效(isValid()方法反悔false深纲,對它的操作會拋出異常)仲锄。

如何創(chuàng)建一個虛擬文件?

通常你不需要這么做。按照規(guī)則湃鹊,文件通常使用PSI API或常規(guī)的java.io.File API創(chuàng)建儒喊。

如果你想通過VFS創(chuàng)建文件,你可以使用VirtualFile.createChildData()方法創(chuàng)建一個VirtualFile實例币呵,然后使用VirtualFile.setBinaryContent()方法往文件里寫數(shù)據(jù)怀愧。

如何獲取VFS改變的通知?

VirtualFileManager.addVirtualFileListener() 方法可以接收到VFS的所有改變行為。

如何擴展VFS?

實現(xiàn)一個第三方的文件系統(tǒng)(比如FTP文件系統(tǒng))余赢,需要實現(xiàn) VirtualFileSystem 接口(大多數(shù)時候也要提供 VirtualFile的實現(xiàn))芯义,并且把你的實現(xiàn)注冊成一個application component.。

若要把這些這些文件操作應用到本地文件系統(tǒng)上(比如妻柒,你再開發(fā)一個版本控制系統(tǒng)扛拨,需要自定義重命名/移動操作),你應該實現(xiàn)LocalFileOperationsHandler接口举塔,并通過LocalFileSystem.registerAuxiliaryFileOperationsHandler方法注冊它绑警。

VFS的工作細則?

IntelliJ Platform Virtual File System 查看VFS架構(gòu)和使用指引的更多細節(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末央渣,一起剝皮案震驚了整個濱河市计盒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芽丹,老刑警劉巖北启,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異志衍,居然都是意外死亡暖庄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門楼肪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來培廓,“玉大人,你說我怎么就攤上這事春叫〖缒疲” “怎么了泣港?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長价匠。 經(jīng)常有香客問我当纱,道長,這世上最難降的妖魔是什么踩窖? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任坡氯,我火速辦了婚禮,結(jié)果婚禮上洋腮,老公的妹妹穿的比我還像新娘箫柳。我一直安慰自己,他們只是感情好啥供,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布悯恍。 她就那樣靜靜地躺著,像睡著了一般伙狐。 火紅的嫁衣襯著肌膚如雪涮毫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天贷屎,我揣著相機與錄音罢防,去河邊找鬼。 笑死豫尽,一個胖子當著我的面吹牛篙梢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播美旧,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渤滞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了榴嗅?” 一聲冷哼從身側(cè)響起妄呕,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗽测,沒想到半個月后绪励,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡唠粥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年疏魏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晤愧。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡大莫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出官份,到底是詐尸還是另有隱情只厘,我是刑警寧澤烙丛,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站羔味,受9級特大地震影響河咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赋元,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一忘蟹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧们陆,春花似錦寒瓦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垃你。三九已至椅文,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惜颇,已是汗流浹背皆刺。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凌摄,地道東北人羡蛾。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像锨亏,于是被迫代替她去往敵國和親痴怨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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