虚拟文件系统

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

虚拟文件系统(VFS)是IntelliJ平台 的一个组件,它封装了处理文件的大部分操作。它主要有以下几个目的:

  • 提供一个处理文件的通用API,而不用管文件的真实位置(磁盘上、归档中或HTTP服务器上);
  • 跟踪文件修改,并在检测到修改时提供文件内容的旧版本和新版本;
  • 提供将其它持久性数据与VFS中的文件关联的可能性。

为了提供后两个特性,VFS管理用户硬盘的某些内容的持久性快照。 快照仅存储那些至少被VFS API请求一次的文件,并且异步更新匹配磁盘上发生的更改。

快照是应用级,而不是项目级的。因此,即使多个项目引用了某些文件(例如,JDK中的类),VFS也只会存储一个副本。

所有VFS的访问操作都通过快照。

如果通过VFS API请求的某些信息的快照不可用,则将从磁盘加载它并将其存储到快照中。 如果信息在快照中可用,则返回快照数据。 只有访问了特定信息,目录中的文件内容和文件列表才会存储在快照中 - 否则只会存储名称,长度,时间戳等属性的文件元数据。

注意 这意味着文件系统的状态和IntelliJ Platform UI中显示的来自快照的文件内容并不总是匹配磁盘的实际内容。

例如在某些情况下,IntelliJ平台外部删除的文件在UI中仍然可以显示一段时间。

快照在刷新操作 期间从磁盘更新,这通常是异步的。 所有通过VFS进行的写操作都是同步的——即内容立即保存到磁盘。

刷新操作使VFS的一部分状态与实际磁盘的内容同步。 刷新操作由* IntelliJ平台 *或插件代码显式调用,即当IDE运行时在磁盘上的文件更改时,VFS不会立即更新。 VFS将在下一次刷新操作后更新文件。

IntelliJ平台 会在启动时异步刷新整个项目内容。默认情况下,用户从其它应用切换到IDE时会执行刷新操作,但是用户可以通过设置|外观和行为|系统设置|框架或选项卡激活时同步文件关闭它

在Windows,Mac和Linux系统中,IntelliJ平台 会启动一个本地文件监控进程接受文件系统的更改通知。如果文件监控可用,刷新操作将只更新更改的文件,否则将遍历所有文件夹中文件。

刷新操作基于文件时间戳。 如果文件的内容已更改,但其时间戳保持不变,* IntelliJ平台 *不会接收更新的内容。

目前没有从快照中删除文件的功能。 如果文件被加载一次,它将永远保留在那里,除非它从磁盘中删除,并且在其一个父目录上调用了刷新操作。

VFS本身不支持忽略设置|文件类型|文件中列出的文件和排除项目结构|模块|源代码|排除中的文件夹。 如果应用代码访问它们,VFS将加载并返回其内容。 在大多数情况下,忽略的文件和排除的文件夹必须从较高级别代码的处理中跳过。

在IntelliJ平台IDE的运行实例的生命周期中,多个VirtualFile实例可能对应于同一个磁盘文件。 它们是相等的,有相同的hashCode并且共享用户数据。

同步和异步刷新

从调用者的角度来看,刷新操作可以是同步或异步的。 实际上,刷新操作根据它们自己的线程策略来执行,同步意味着调用线程将被阻塞,直到刷新操作(其很可能在不同的线程上运行)完成。

同步和异步刷新都可以从任何线程启动。 如果从后台线程启动刷新,则调用线程必须不能保持读取操作,否则会发生死锁。更多线程模型和读写操作的信息请查阅通用线程规则

相同的线程要求也适用于像LocalFileSystem.refreshAndFindFileByPath()这样的函数,如果在快照中找不到指定路径的文件,则执行部分刷新。

几乎所有情况下都强烈建议使用异步刷新。 如果有一些代码需要在刷新完成后执行,代码应该作为postRunnable参数传递给以下刷新方法:

在某些情况下,同步刷新可能会导致死锁,具体取决于调用刷新操作的线程有哪些锁。

虚拟文件系统事件

虚拟文件系统中发生的所有更改(由于刷新操作或由用户操作引起)都为虚拟文件系统事件。 VFS事件总是在事件分派线程和写入操作中触发。

监听VFS事件的最有效的方法是实现BulkFileListener接口并订阅它到VirtualFileManager

这个API使你可以检测到在刷新操作期间一个列表中的所有更改,并且可以批量处理它们。 你也可以实现VirtualFileListener接口并使用VirtualFileManager.addVirtualFileListener()注册它,这将允许您逐个处理事件。

注意:VFS监听器是应用级的,它会将接收所有用户打开项目中发生的更改事件。 你可能需要过滤掉与你的任务无关的事件。

VFS事件会在每次更改前后发送,你可以在before事件之前访问文件的旧内容。注意,刷新引起的事件会在磁盘内容更改之后发送——因此,当你处理beforeFileDeletion事件时,例如该文件已从磁盘中删除。 但是,它仍然存在于VFS快照中,你可以使用VFS API访问其最后的内容。

注意:请注意,刷新操作仅针对已加载进快照中文件更改触发事件。 例如,如果你访问一个VirtualFile的目录,但从未使用VirtualFile.getChildren()加载其内容,当在该目录中创建文件时,可能不会收到fileCreated通知。

如果使用VirtualFile.findChild()加载目录中的一个文件,你将收到该文件的更改通知,但是你可能无法收到同一目录中其它文件的创建/删除通知。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • 虚拟文件系统 虚拟文件系统(VFS)作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。系统中所有的文件...
    大雄good阅读 871评论 0 4
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,158评论 2 33
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,066评论 25 707
  • 昨天去银行办网银,支付宝限额度要收费,去银行时2:10,被银行工作人员告知不在柜台办理,在自助机器里办理,但是前面...
    c1dd5a05d5c8阅读 261评论 6 0
  • 减肥是我今年的一个大目标,也做了很多计划,但失败了。 今年最高时瘦了10斤,但冬季来了之后,运动停了,吃饭没节制了...
    陈右一阅读 413评论 0 0