web服务如何在Java中高效地管理文件系统上的文件?
我正在创建几个JAX-WS端点,我希望为其保存接收和发送的消息以供以后检查。为此,我计划以某种合理的层次结构将消息(XML文件)保存到文件系统中。每天将有数百甚至数千个文件。我还需要为每个文件存储元数据
我正在考虑将元数据(仅几个字段)放入数据库表中,但XML文件内容本身放入文件系统中的文件中,以避免用内容数据(很少读取)填充数据库
是否有一些简单的库可以帮助我保存、加载、删除文件等?我自己实现它并不难,但我想知道是否有现有的解决方案?只是一个简单的库,它已经提供了对文件系统的轻松访问(最好是通过不同的操作系统)
或者我甚至需要它,我应该只使用原始/自定义Java吗
# 1 楼答案
Java API
好的,如果您需要做的事情非常简单,那么您应该能够通过java.io.File(删除、检查存在性、读取、写入等)和一些FileInputStream和FileOutputStream流操作来实现您的目标
您还可以加入Apachecommons-io及其方便的FileUtils以获得更多的实用函数
Java独立于操作系统。您只需要确保使用
File.pathSeparator
,或者使用构造函数File(File parent, String child)
,这样就不需要显式地提到分隔符Java文件API是相对高级的,用于抽象许多操作系统的差异。大多数时候这已经足够了。只有当您需要一些API中没有的相对特定于操作系统的功能时,它才会有一些缺点,例如检查磁盘上文件的物理大小(而不是逻辑大小)、对*nix的安全权限、硬盘的可用空间/配额等
大多数操作系统都有用于文件写入/读取的内部缓冲区。使用
FileOutputStream.write
和FileOutputStream.flush
确保数据已发送到操作系统,但无需写入磁盘。JavaAPI还支持这种低级集成,以管理数据库等系统的缓冲问题(例如here)此外,文件和目录都是用
File
抽象的,您需要用isDirectory
进行检查。这可能会令人困惑,例如,如果您有一个文件x
,和一个目录/x
(我不记得具体如何处理这个问题,但有一种方法)网络服务
web服务可以使用
xs:base64Binary
来传递数据,如果文件很大,则可以使用MTOM(消息传输优化机制)交易
请注意,数据库是事务性的,文件系统不是。因此,如果操作失败并重新尝试,您可能必须添加一些检查
您可以使用涉及某种形式的分布式事务的复杂设计(参见此answer),或者尝试使用提供所需健壮性级别的简单设计。一种可能的设计可以是:
这不像在真实的事务数据库中写入BLOB那样健壮,但提供了一些健壮性。你可以看看commons-transaction,但我觉得这个项目已经死了(2007年)
# 2 楼答案
有DataNucleus,一个Java持久性提供者。对于这种情况来说,它有点太重,但它支持具有不同数据存储(RDBMS、对象存储、XML、JSON、Excel等)的JPA和JDO java标准。如果产品已经在使用JPA或JDO,那么可能值得考虑使用NataNucleus,因为将数据保存到不同的数据存储中应该是透明的。我想DataNucleus支持将数据拆分成几个文件,创建我想要的合理的目录/文件结构(在我的问题中),但这只是一个猜测
对XML和JSON的支持似乎是实验性的