簡體   English   中英

如何在Java中有效地管理文件系統上的文件?

[英]How to efficiently manage files on a filesystem in Java?

我正在創建一些JAX-WS端點,為此我想保存收到和發送的消息以供以后檢查。 為此,我計划將消息(XML文件)保存到文件系統中,在一些合理的層次結構中。 每天將有數百甚至數千個文件。 我還需要存儲每個文件的元數據。

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

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

或者我是否需要它,我應該使用原始/自定義Java?

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

Java API

好吧,如果您需要做的事情非常簡單,那么您應該能夠通過java.io.File (刪除,檢查存在,讀取,寫入等)以及使用FileInputStreamFileOutputStream進行一些流操作來實現您的目標。

您還可以使用Apache commons-io及其便捷的FileUtils來實現更多實用功能。

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

Java文件API相對較高,可以抽象出許多操作系統的差異。 大部分時間都足夠了。 只有當你需要一些不在API中的相對特定於操作系統的功能時,它才有一些缺點,例如檢查磁盤上文件的物理大小(不是邏輯大小),* nix上的安全權限,可用空間/配額的硬盤驅動器等

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

文件和目錄都使用File抽象,您需要使用isDirectory進行檢查。 這可能會令人困惑,例如,如果你有一個文件x和一個目錄/x (我不記得究竟如何處理這個問題,但有一種方法)。

網絡服務

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

交易

請注意,數據庫是事務性的,而文件系統則不是。 因此,如果操作失敗並重新嘗試,您可能需要添加一些檢查。

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

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

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

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

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

暫無
暫無

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

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