是否有一些简单的库可以帮助我保存、加载、删除文件等操作?虽然自己实现不是很复杂,但我想知道是否已经存在解决方案了?只需要一个简单的库,可以提供易于访问的文件系统(最好能在不同操作系统上使用)。
Java API
如果您需要做的事情确实很简单,您应该可以通过java.io.File(删除、检查文件是否存在、读取、写入等)和几个流操作FileInputStream和FileOutputStream来实现您的目标。
您还可以加入Apache commons-io及其方便的FileUtils,以获取更多实用功能。
Java独立于操作系统。您只需要确保使用File.pathSeparator
或使用构造函数File(File parent, String child)
,以便无需显式地提到分隔符。
Java文件API相对高级,可抽象出许多操作系统之间的差异。大多数情况下已经足够了。仅当您需要一些相对操作系统特定的功能而不在API中时,它才有一些缺点,例如检查磁盘上文件的物理大小(而不是逻辑大小)、*nix上的安全权限、硬盘的可用空间/配额等。
大多数操作系统都有一个用于文件读写的内部缓冲区。使用
FileOutputStream.write
和
FileOutputStream.flush
可以确保数据已经发送到操作系统,但不一定写入磁盘。Java API 也支持这种低级集成来管理这些缓冲问题(例如
此处)以用于数据库等系统。
同时,文件和目录都是用
File
抽象出来的,并且需要通过
isDirectory
进行检查。这可能会令人困惑,例如如果你有一个文件
x
和一个目录
/x
(我不记得如何处理这个问题,但有一种方法)。
Web 服务
Web 服务可以使用
xs:base64Binary
来传递数据,或者如果文件很大,则使用
MTOM(消息传输优化机制)。
事务
请注意,数据库是事务性的,文件系统不是。因此,如果操作失败并且需要重试,您可能需要添加一些检查。您可以选择一个涉及某种形式的分布式事务的复杂设计(请参见此
答案),或者尝试使用提供所需强度水平的简单设计。一个可能的设计如下:
- 更新。如果用户想要覆盖一个文件,实际上会创建一个新文件。逻辑文件名和物理文件之间的间接级别存储在数据库中。这样,一旦写入物理文件,就永远不会覆盖它,以确保回滚一致。
- 创建。当用户想要创建一个文件时,情况相同。
- 删除。如果用户想要删除一个文件,则首先只在数据库中执行此操作。定期作业轮询文件系统以识别未列在数据库中的文件,并将其删除。这两个阶段的删除确保可以回滚删除操作。
这种方式不像在真实的事务性数据库中编写BLOB那样健壮,但是还是提供了一定的鲁棒性。你也可以查看
commons-transaction,但我觉得这个项目已经死亡了(2007年)。