Apache commons VFS 无法解析带有字符串 URI

问题描述

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

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) 中也可用。这里奇怪的是我可以在同一位置使用 Java File IO 读取/写入文件而没有任何问题。

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

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

一旦第一次调用传递了基本文件,之后它就会完美地工作。

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

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

解决方法

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

简短回答:删除任何出现的 ggplot(df,aes(Age,Frequency)) + geom_col() + theme_classic()

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

VFS.getManager()

在一个地方,为了释放资源,我关闭了通过 if (fileSystemManager == null) { fileSystemManager = VFS.getManager(); } 从上述方法获得的 FileSystemManager 单例。但是在另一个完全独立于第一个方法的方法中,它使用并关闭了 fileSystemManager 实例,再次尝试使用相同的 fileSystemManager。

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

即使在 documentation 中也清楚地说明了这一点,并在我发现问题后注意到。

关闭给定的文件系统。

如果你使用 VFS 作为单例,调用这个方法是非常危险的。

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