YON Blog

IntelliJ Plugin - VirtualFile 为 null

IntelliJ Plugin SDK 将外部所有的“文件”都做了封装,不管是本地文件、网络文件等等都统一封装成了 VirtualFile 对象。开发时如果要从本地文件获取 VirtualFile 我们使用 LocalFileSystem 类:

// 使用 Path 对象获取
LocalFileSystem.getInstance().findFileByNioFile(path)
// 使用 File 对象获取
LocalFileSystem.getInstance().findFileByIoFile(file)
// 使用文件路径字符串获取
LocalFileSystem.getInstance().findFileByPath(strPath)

最近开发插件时,发现一个问题。本地新建了文件之后再使用 LocalFileSystem 来获取,有时候能获取到,有时候获取的是 null。翻了翻官方文档,原来 VirtualFile 不是实时去本地文件系统里获取的,后台会异步对本地文件系统做索引创建快照,使用 LocalFileSystem 获取文件时是从快照里获取的,所以就会出现有时候能获取有时候无法获取的情况出现。
我们可以在代码里手动触发索引的刷新:

// 同步刷新
VirtualFileManager.getInstance().syncRefresh();
// 异步刷新
VirtualFileManager.getInstance().asyncRefresh(() -> {
    // Runnable
});

也可以在获取文件时先刷新再获取,这个刷新只会刷新和这次查找相关的部分:

// 使用 Path 对象获取
LocalFileSystem.getInstance().refreshAndFindFileByNioFile(path);
// 类似的也支持 File 和 文件路径字符串 获取

最开始搞插件开发的时候其实官方文档这块内容是看过的,只是对这块没太关注看过就忘了。我们经常会觉得一个东西的文档写的烂,但是如果仔细看他的文档,会发现想要知道的东西其实在文档里是有体现的,所以很多时候不是文档写的烂,而是自己没仔细去看。我们觉得一个东西方便上手,只是因为用的人多,在互联网上写了很多相关的内容,借助搜索引擎可以方便的查找到而已,想想,平时写 Java 遇到问题是看的官方文档多还是 StackOverflow 多?
[1] https://plugins.jetbrains.com/docs/intellij/virtual-file-system.html