2010-06-11 83 views
3

我正在創建一些JAX-WS端點,爲此我希望保存接收和發送的消息供以後檢查。爲此,我計劃將消息(XML文件)保存到文件系統中,並且在一些明智的層次結構中。每天會有數百甚至數千個文件。我還需要爲每個文件存儲元數據。如何高效地管理Java文件系統上的文件?

我正在考慮將元數據(只是幾個字段)放入數據庫表中,但將XML文件內容本身放入文件系統中的文件中,以免使用內容數據(很少讀取)膨脹數據庫。

有一些簡單的庫,可以幫助我保存,加載,刪除等文件?自己實現它並不那麼棘手,但我想知道是否有現有的解決方案?只是一個簡單的庫,已經提供了對文件系統的簡單訪問(最好在不同的操作系統上)。

或者我甚至需要那個,我應該只使用原始/定製Java?

回答

6

是否有一些簡單的庫, 幫助我保存,加載,刪除 等文件?這不是那個棘手的 來實現它自己,但我想知道如果有現有的解決方案 ?只需 一個簡單的庫,已經提供 方便地訪問文件系統(最好在不同的操作系統上的 )。

的Java API

好吧,如果你需要做的是非常簡單的,你應該能夠java.io.File來實現自己的目標(刪除,檢查存在,讀,寫等)用FileInputStreamFileOutputStream進行一些流操作。

您還可以投入Apache commons-io及其方便的FileUtils以獲得更多實用功能。

Java獨立於操作系統。你只需要確保你使用File.pathSeparator,或者使用構造函數File(File parent, String child),這樣你就不需要明確地提到分隔符。

Java文件API相對較高級別來抽象多個OS的差異。大多數時間就足夠了。只有當你需要一些不屬於API的相對OS特有的功能時,它纔有一些缺點,例如檢查磁盤上文件的物理大小(不是邏輯大小),* nix上的安全權限,硬盤的可用空間/配額等。

大多數操作系統都有用於文件寫入/讀取的內部緩衝區。使用FileOutputStream.writeFileOutputStream.flush確保數據已發送到操作系統,但不必寫入磁盤。 Java API還支持這種低級集成,以管理系統(如數據庫)的這些緩衝問題(示例here)。

同時文件和目錄都被抽象爲File,您需要檢查isDirectory。這可能會令人困惑,例如,如果您有一個文件x和一個目錄/x(我不記得具體如何處理此問題,但有一種方法)。

Web服務

Web服務可以使用xs:base64Binary來傳遞數據,或使用MTOM(消息傳輸優化機制),如果文件比較大。

交易

注意,數據庫事務和文件系統沒有。因此,如果操作失敗並重新嘗試,您可能需要添加一些檢查。

您可以使用涉及某種形式的分佈式事務的複雜設計(請參閱此answer),或嘗試使用更簡單的設計,以提供所需的穩健性級別。可能的設計可能是:

  • 更新。如果用戶想要覆蓋文件,則實際上會創建一個新文件。邏輯文件名和物理文件之間的間接級別存儲在數據庫中。這樣一來寫入就不會覆蓋物理文件,確保回滾一致。
  • 創建。用戶想創建文件時的同樣故事
  • 刪除。如果用戶想要刪除文件,則只能在數據庫中進行。定期作業輪詢文件系統以識別未在數據庫中列出的文件,並將其刪除。這兩個階段的刪除確保刪除操作可以回滾。

這不像在實際事務數據庫中寫入BLOB那樣健壯,但提供了一些穩健性。你可以看看commons-transaction,但我覺得項目已經死了(2007年)。

+0

一個確鑿的答案,謝謝。我應該猜到Apache Commons也會爲這個問題做出貢獻!我必須承認,我對高級文件處理Java API感到有點驚訝 - 我期待着更低層次的東西。我認爲你的指針足以讓我開始和完成這個。但是,您對交易的觀點非常重要。是否有可能將文件系統操作綁定到同一事務(並回滾)? – 2010-06-11 22:31:52

+0

@Tukka Mustonen我添加了更多的細節。另外,不幸的是,不可能輕鬆地綁定文件系統和數據庫,afaik。然而,我已經描述了一種可能的方式,在不引入複雜的分佈式事務的情況下具有更強壯的性能 – ewernli 2010-06-12 07:17:12

+0

感謝您闡述您的答案。我認爲你提出的用數據庫事務來綁定文件系統操作的方法很簡單,但是非常可行。由於還沒有其他答案,我選擇這個作爲接受的答案,並將走這條路。我仍然很想知道任何將所有這些東西綁定到單個甚至更高級別的API之後的項目,它提供了事務和版本控制支持,敏感的文件/目錄結構,對文件元數據的支持,異常轉換/處理以及通常需要的照顧我無法預見的事情:)任何人? – 2010-06-12 11:52:02

0

有一個持久性提供者DataNucleus。對於這種情況來說,它太重了,但它支持具有不同數據存儲(RDBMS,對象存儲,XML,JSON,Excel等)的JPA和JDO Java標準。如果產品已經使用JPA或JDO,則可能值得考慮使用NataNucleus,因爲將數據保存到不同的數據存儲區應該是透明的。我猜想DataNucleus支持將數據分成幾個文件,創建我想要的合理的目錄/文件結構(在我的問題中),但這只是一個猜測。

對XML和JSON的支持似乎是實驗性的。

相關問題