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

Tuu*_*nen 3 java filesystems web-services file save

我正在创建一些JAX-WS端点,为此我想保存收到和发送的消息以供以后检查.为此,我计划将消息(XML文件)保存到文件系统中,在一些合理的层次结构中.每天将有数百甚至数千个文件.我还需要存储每个文件的元数据.

我正在考虑将元数据(只是几个字段)放入数据库表中,但XML文件将自身内容放入文件系统中的文件中,以免使内容数据(很少读取)膨胀数据库.

是否有一些简单的库可以帮助我保存,加载,删除等文件?自己实现它并不是那么棘手,但我想知道是否有现有的解决方案?只是一个简单的库,已经提供了对文件系统的轻松访问(最好是通过不同的操作系统).

或者我是否需要它,我应该使用原始/自定义Java?

ewe*_*nli 6

是否有一些简单的库可以帮助我保存,加载,删除等文件?自己实现它并不是那么棘手,但我想知道是否有现有的解决方案?只是一个简单的库,已经提供了对文件系统的轻松访问(最好是通过不同的操作系统).

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).