Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache commons VFS无法解析具有字符串URI的文件_Java_Spring_Docker_Vfs_Apache Commons Vfs - Fatal编程技术网

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

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

我正在尝试使用ApacheCommonsVFSV2.6.0通过SpringBootWeb应用程序访问和读取文件。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.
我已经确保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()
,问题就解决了