Java Apache commons VFS无法解析具有字符串URI的文件
我正在尝试使用ApacheCommonsVFSV2.6.0通过SpringBootWeb应用程序访问和读取文件。web应用程序在托管docker容器中运行,通过定位Java Apache commons VFS无法解析具有字符串URI的文件,java,spring,docker,vfs,apache-commons-vfs,Java,Spring,Docker,Vfs,Apache Commons Vfs,我正在尝试使用ApacheCommonsVFSV2.6.0通过SpringBootWeb应用程序访问和读取文件。web应用程序在托管docker容器中运行,通过定位/mnt,在同一docker中安装了单独的AWS存储。当我尝试使用以下代码访问/mnt(例如:/mnt/abc/def/ghi.csv)中的文件/文件夹时 fileSystemManager = VFS.getManager(); fileSystemManager.resolveFile("/mnt/abc/def/ghi
/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.
我已经确保JSCHJAR文件在类路径(JSCHV0.1.54)中也可用。奇怪的是,我可以在同一位置使用Java文件IO读/写文件,而不会出现任何问题
因为它说没有提供基本URI,所以我尝试以Java文件IO格式提供基本文件,然后它能够解析文件对象
fileSystemManager.resolveFile(new File("/mnt/abc/def"),"ghi.csv")
在第一次调用中传递基础文件之后,它就可以正常工作了
我正在使用VFS解析文件:
和sftp:
方案中的文件
有没有更好的办法解决这个问题?如果我们可以在
fileSystemManager
第一次初始化时设置一个基本文件,然后仅通过提供字符串路径来解析文件,这将是一个理想的解决方案。经过多次尝试后,我自己发现了这个问题,并想在这里提及它,以便对其他人有所帮助
简短回答:删除出现的fileSystemManager.close()
详细答案:我在代码中就是这样处理的。
我总是使用VFS.getManager()
来获取FileSystemManager实例,其他任何地方的自定义FileSystemManager都不是我自己创建的
if (fileSystemManager == null) {
fileSystemManager = VFS.getManager();
}
在一个地方,我关闭了FileSystemManager
singleton,这是我通过FileSystemManager.close()
从上述方法获得的,以便释放资源。但是在另一个完全独立于它使用并关闭fileSystemManager实例的第一个方法的方法中,它再次尝试使用相同的fileSystemManager
因此,一旦关闭fileSystemManager,大多数组件,如提供程序、文件缓存等。。。fileSystemManager中的设置为null,但fileSystemManager单例仍然不是null。所以,程序将跳过If条件,并尝试使用其中没有组件的fileSystemManager解析文件路径
甚至在我发现这个问题后,这一点在文章中也有明确的表述和注意
关闭给定的文件系统
如果使用VFS作为单例,那么调用此方法是非常危险的
一旦删除fileSystemManager.close()
,问题就解决了