FileSystem.openFile()
/FileContext.openFile()
這是 FileSystem 和 FileContext 提供的一種方法,用於進階檔案開啟選項,並且在實作時,以非同步/延遲的方式開啟檔案。
建立一個建構器來開啟檔案,支援標準和特定於檔案系統的選項。build()
呼叫的傳回值是 Future<FSDataInputStream>
,必須等候。檔案開啟可能是非同步的,並且實際上可能會延後(包括權限/存在檢查),直到實際執行讀取為止。
此 API 呼叫已新增至 Hadoop 3.3.0 中的 FileSystem
和 FileContext
;已在 Hadoop 3.3.1 中調整如下。
opt(key, long)
和 must(key, long)
。withFileStatus(null)
。withFileStatus(status)
只會檢查路徑的檔名,而不是完整路徑。這是支援直通/掛載檔案系統所必需的。FutureDataInputStreamBuilder openFile(Path path)
建立一個 FutureDataInputStreamBuilder
來建構一個作業,以開啟 path
中的檔案進行讀取。
當在傳回的 FutureDataInputStreamBuilder
執行個體上呼叫 build()
時,會驗證建構函數參數,並呼叫 FileSystem.openFileWithOptions(Path, OpenFileParameters)
或 AbstractFileSystem.openFileWithOptions(Path, OpenFileParameters)
。
這些受保護的方法會傳回 CompletableFuture<FSDataInputStream>
,當呼叫其 get()
方法時,會傳回已開啟檔案內容的輸入串流,或引發例外狀況。
FileSystem.openFileWithOptions(PathHandle, OpenFileParameters)
的基本實作最終會呼叫 FileSystem.open(Path, int)
。
因此,鏈 FileSystem.openFile(path).build().get()
的前置條件和後置條件與 FileSystem.open(Path p, int bufferSize)
相同
不過,有一個差異,實作可以自由利用
傳回的串流可能會實作延遲開啟,其中檔案不存在或存取權限失敗可能直到實際資料的第一個 read()
才會浮現。
這會在物件儲存上節省網路 I/O。
openFile()
作業可能會在其呼叫期間檢查檔案系統的狀態,但由於檔案系統的狀態可能在這個呼叫與實際的 build()
和 get()
作業之間改變,因此此檔案特定的前置條件(檔案存在、檔案可讀取等)不應在此處檢查。
未實作 open(Path, int)
的檔案系統實作可能會延後引發 UnsupportedOperationException
,直到 FutureDataInputStreamBuilder.build()
或後續的 get()
呼叫,否則它們可能會在 openFile()
呼叫中快速失敗。
請參閱 FutureDataInputStreamBuilder
,了解如何使用建構函數,以及可以傳入的標準選項。
FutureDataInputStreamBuilder openFile(PathHandle)
建立 FutureDataInputStreamBuilder
,以建構一個作業,用於開啟由給定的 PathHandle
識別的檔案以進行讀取。
如果由檔案系統實作,openFile(Path)
的語意因此,鏈 openFile(pathhandle).build().get()
的前置條件和後置條件與 open(Pathhandle, int)
相同
未實作 open(PathHandle handle, int bufferSize)
的檔案系統實作可能會延後引發 UnsupportedOperationException
,直到 FutureDataInputStreamBuilder.build()
或後續的 get()
呼叫,否則它們可能會在 openFile(PathHandle)
呼叫中快速失敗。
基本實作會在 build()
作業中引發這個例外狀況;其他實作應複製此行為。
openFileWithOptions()
的基本實作實際上會同步執行 open(path)
作業,但仍會在 CompletableFuture<>
中傳回結果或任何失敗,以便在所有檔案系統中提供一致的生命週期。
任何開啟檔案時間可能很重要的檔案系統用戶端都應透過在某些執行緒/執行緒池中提交作業來非同步執行。這特別建議用於物件儲存和其他可能透過長途連線存取的檔案系統。
MAY 支援任意檔案系統特定選項;這些選項必須以檔案系統架構為前綴,例如 hdfs.
或以 fs.SCHEMA
格式作為一般組態設定 fs.hdfs
。後者樣式允許相同的組態選項同時用於檔案系統組態和檔案特定組態。
SHOULD 能夠隨時開啟檔案,而無需指定任何選項,以便向使用者呈現一致的模型。不過,實作 MAY 選擇要求設定一個或多個強制選項。
傳回的串流可能會執行檔案存取的「延遲」評估。這與物件儲存體有關,其中存在探測非常昂貴,而且即使非同步開啟,也可能被視為不必要。