Apache commons VFS 无法解析具有字符串 URI 的文件

Apache commons VFS cannot resolve files with String URI

我正在尝试使用 Apache Commons VFS v2.6.0 通过 Spring 引导 Web 应用程序访问和读取文件。 Web 应用程序 运行 在一个托管的 docker 容器中,并且通过目标 /mnt 在同一个 docker 中安装了一个单独的 AWS 存储。当我尝试使用以下代码访问 /mnt(例如:/mnt/abc/def/ghi.csv)中的 file/folder 时,

fileSystemManager = VFS.getManager();
fileSystemManager.resolveFile("/mnt/abc/def/ghi.csv")

它抛出以下异常。

Could not find file with URI "/mnt/abc/def/ghi.csv because it is a relative path, and no base URI was provided.

我已确保 Jsch jar 文件在类路径中也可用 (Jsch v0.1.54)。这里的奇怪之处在于我可以 read/write 文件使用 Java 文件 IO 在同一位置没有任何问题。

因为它说没有提供基本 URI,所以我尝试以 Java 文件 IO 格式提供基本文件,然后它能够​​解析文件对象。

fileSystemManager.resolveFile(new File("/mnt/abc/def"),"ghi.csv")

一旦基础文件通过第一次调用传递,之后它就可以正常工作了。

我正在使用 VFS 来解析 file:sftp: 方案中的文件

有什么更好的方法来解决这个问题吗?如果我们可以在 fileSystemManager 第一次初始化时设置一个基本文件,然后仅通过提供字符串路径来解析文件,那将是理想的。

经过多次尝试,我自己找到了问题,并想在这里提及它,以便对某人有所帮助。

简答:删除所有出现的fileSystemManager.close()

详细解答 :这就是我在代码中处理 FileSystemManager 的方式。 我总是使用 VFS.getManager() 来获取 FileSystemManager 实例,而在其他任何地方我都不会创建自定义 FileSystemManager。

  if (fileSystemManager == null) {
        fileSystemManager = VFS.getManager();
  }

在一处我关闭了通过fileSystemManager.close()从上述方法中获得的FileSystemManager单例以释放资源。但是在另一个完全独立于它使用并关闭 fileSystemManager 实例的第一个方法的方法中,再次尝试使用相同的 fileSystemManager。

因此,一旦 fileSystemManager 关闭,fileSystemManager 中的大多数组件(如提供程序、fileCache 等)都将设置为 null,但 fileSystemManager 单例仍然不为 null。因此程序将跳过 If 条件并尝试使用其中没有组件的 fileSystemManager 解析 filePath。

连这个在documentation里面也说得很清楚了,我发现这个问题后才注意到。

Closes the given file system.

If you use VFS as singleton it is VERY dangerous to call this method.

删除 fileSystemManager.close() 后,问题就解决了。