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

标签 java web-services file save filesystems

我正在创建一些 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 来实现您的目标。 (删除、检查存在、读、写等)和一些流操作 FileInputStreamFileOutputStream .

你也可以在 Apache 中抛出 commons-io及其方便 FileUtils用于更多实用功能。

Java 独立于操作系统。您只需要确保使用 File.pathSeparator,或使用构造函数 File(File parent, String child) 这样您就不需要明确提及分隔符.

Java 文件 API 是相对高级的,可以抽象出许多操作系统之间的差异。大多数时候就足够了。仅当您需要一些 API 中没有的相对特定于操作系统的功能时,它才有一些缺点,例如检查磁盘上文件的物理大小(不是逻辑大小)、*nix 上的安全权限、硬盘驱动器的可用空间/配额等。

大多数操作系统都有一个用于文件写入/读取的内部缓冲区。使用 FileOutputStream.writeFileOutputStream.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/

相关文章:

java - 我如何/在哪里可以通过示例代码和解释了解真实世界 Java Web 应用程序的结构

java - 通过类树冒泡数据还是解包以获取字段?

java - 调用 com.sun.tools.ws.wscompile.WsimportTool 失败

java - 如何从托管在 Azure VM 上的 MYSQL 数据库中检索数据?

php - 如何将变量名添加到文件末尾?

java - 我需要一些有关在 Java 中使用 2 个 jar 文件的帮助

java - 关闭InputStream是否会关闭与其关联的Channel?

php - PayPal 交易可以包括第三方吗?

python : Sum of numbers in different files

c - 在C中执行以下操作的方法是什么?