是否有一些简单的库, 帮助我保存,加载,删除 等文件?这不是那个棘手的 来实现它自己,但我想知道如果有现有的解决方案 ?只需 一个简单的库,已经提供 方便地访问文件系统(最好在不同的操作系统上的 )。
的Java API
好吧,如果你需要做的是非常简单的,你应该能够java.io.File来实现自己的目标(删除,检查存在,读,写等)用FileInputStream和FileOutputStream进行一些流操作。
您还可以投入Apache commons-io及其方便的FileUtils以获得更多实用功能。
Java独立于操作系统。你只需要确保你使用File.pathSeparator
,或者使用构造函数File(File parent, String child)
,这样你就不需要明确地提到分隔符。
Java文件API相对较高级别来抽象多个OS的差异。大多数时间就足够了。只有当你需要一些不属于API的相对OS特有的功能时,它才有一些缺点,例如检查磁盘上文件的物理大小(不是逻辑大小),* nix上的安全权限,硬盘的可用空间/配额等。
大多数操作系统都有用于文件写入/读取的内部缓冲区。使用FileOutputStream.write
和FileOutputStream.flush
确保数据已发送到操作系统,但不必写入磁盘。 Java API还支持这种低级集成,以管理系统(如数据库)的这些缓冲问题(示例here)。
同时文件和目录都被抽象为File
,您需要检查isDirectory
。这可能会令人困惑,例如,如果您有一个文件x
和一个目录/x
(我不记得具体如何处理此问题,但有一种方法)。
Web服务
Web服务可以使用xs:base64Binary
来传递数据,或使用MTOM(消息传输优化机制),如果文件比较大。
交易
注意,数据库事务和文件系统没有。因此,如果操作失败并重新尝试,您可能需要添加一些检查。
您可以使用涉及某种形式的分布式事务的复杂设计(请参阅此answer),或尝试使用更简单的设计,以提供所需的稳健性级别。可能的设计可能是:
- 更新。如果用户想要覆盖文件,则实际上会创建一个新文件。逻辑文件名和物理文件之间的间接级别存储在数据库中。这样一来写入就不会覆盖物理文件,确保回滚一致。
- 创建。用户想创建文件时的同样故事
- 删除。如果用户想要删除文件,则只能在数据库中进行。定期作业轮询文件系统以识别未在数据库中列出的文件,并将其删除。这两个阶段的删除确保删除操作可以回滚。
这不像在实际事务数据库中写入BLOB那样健壮,但提供了一些稳健性。你可以看看commons-transaction,但我觉得项目已经死了(2007年)。
一个确凿的答案,谢谢。我应该猜到Apache Commons也会为这个问题做出贡献!我必须承认,我对高级文件处理Java API感到有点惊讶 - 我期待着更低层次的东西。我认为你的指针足以让我开始和完成这个。但是,您对交易的观点非常重要。是否有可能将文件系统操作绑定到同一事务(并回滚)? – 2010-06-11 22:31:52
@Tukka Mustonen我添加了更多的细节。另外,不幸的是,不可能轻松地绑定文件系统和数据库,afaik。然而,我已经描述了一种可能的方式,在不引入复杂的分布式事务的情况下具有更强壮的性能 – ewernli 2010-06-12 07:17:12
感谢您阐述您的答案。我认为你提出的用数据库事务来绑定文件系统操作的方法很简单,但是非常可行。由于还没有其他答案,我选择这个作为接受的答案,并将走这条路。我仍然很想知道任何将所有这些东西绑定到单个甚至更高级别的API之后的项目,它提供了事务和版本控制支持,敏感的文件/目录结构,对文件元数据的支持,异常转换/处理以及通常需要的照顾我无法预见的事情:)任何人? – 2010-06-12 11:52:02