我正在创建一些 JAX-WS 端点,我想为其保存接收和发送的消息以供以后检查。为此,我计划将消息(XML 文件)以某种合理的层次结构保存到文件系统中。每天会有成百上千个文件。我还需要为每个文件存储元数据。
我正在考虑将元数据(只是几个字段)放入数据库表中,但将 XML 文件内容本身放入文件系统中的文件中,以免因内容数据(很少读取)而使数据库膨胀。
是否有一些简单的库可以帮助我保存、加载、删除等文件?自己实现并没有那么棘手,但不知道是否有现成的解决方案?只是一个简单的库,已经提供了对文件系统的轻松访问(最好在不同的操作系统上)。
或者我什至需要它,我应该只使用原始/自定义 Java 吗?
最佳答案
Is there some simple library that helps me in saving, loading, deleting etc. the files? It's not that tricky to implement it myself, but I wonder if there are existing solutions? Just a simple library that already provides easy access to filesystem (preferrably over different operating systems).
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 还支持这种低级集成,以管理数据库等系统的这些缓冲问题(例如 here)。
另外,文件和目录都是用File
抽象出来的,你需要用isDirectory
来检查。这可能会造成混淆,例如,如果您有一个文件 x
和一个目录 /x
(我不记得具体如何处理这个问题,但有一个方式)。
网络服务
Web 服务可以使用xs:base64Binary
来传递数据,或者使用MTOM。 (消息传输优化机制)如果文件很大。
交易
请注意,数据库是事务性的,而文件系统不是。因此,如果操作失败并重试,您可能必须添加一些检查。
您可以采用涉及某种形式的分布式事务的复杂设计(请参阅 answer ),或者尝试采用提供您需要的稳健性级别的更简单的设计。一个可能的设计可能是:
- 更新。如果用户想要覆盖一个文件,你实际上创建了一个新文件。逻辑文件名和物理文件之间的间接级别存储在数据库中。这样一来,您就永远不会覆盖物理文件,以确保回滚是一致的。
- 创建。用户想要创建文件时也是如此
- 删除。如果用户想删除一个文件,你只能先在数据库中进行。定期作业轮询文件系统以识别未在数据库中列出的文件,并将其删除。这种两阶段删除确保可以回滚删除操作。
这不如在真实事务数据库中写入 BLOB 那样健壮,但提供了一些健壮性。否则你可以看看 commons-transaction ,但我觉得这个项目已经死了(2007 年)。
关于java - 如何在 Java 中有效地管理文件系统上的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3022205/