2010-06-11 85 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的支持似乎是实验性的。

相关问题