问题描述
我正在尝试使用 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()
后,问题解决。