簡體   English   中英

Apache commons VFS 無法解析帶有字符串 URI 的文件

[英]Apache commons VFS cannot resolve files with String URI

我正在嘗試使用 Apache Commons VFS v2.6.0 通過 Spring 啟動 web 應用程序訪問和讀取文件。 web 應用程序在托管的 docker 容器中運行,並且通過定位/mnt將單獨的 AWS 存儲安裝在同一 docker 中。 當我嘗試使用以下代碼訪問/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 文件 IO 讀取/寫入文件而沒有任何問題。

由於沒有提供基本 URI,我嘗試通過在 Java 文件 IO 格式中提供基本文件,然后它能夠解析文件 object。

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 singleton 以釋放資源。 但是在另一種完全獨立於它使用並關閉 fileSystemManager 實例的第一種方法的方法中,再次嘗試使用相同的 fileSystemManager。

因此,一旦 fileSystemManager 關閉,fileSystemManager 中的大多數組件(如提供程序、fileCache 等)都會設置為 null 但 fileSystemManager singleton 仍然不是 Z37A6259CC0C1DAE299A786648。 因此程序將跳過 If 條件並嘗試使用其中沒有組件的 fileSystemManager 解析 filePath。

甚至在文檔本身中也清楚地說明了這一點,並在我發現問題后注意到了這一點。

關閉給定的文件系統。

如果您使用 VFS 作為 singleton 調用此方法是非常危險的。

刪除fileSystemManager.close()后,問題就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM