原文: Virtual Files
虛擬文件 com.intellij.openapi.vfs.VirtualFile 指 IntelliJ 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é)。