有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

web服务如何在Java中高效地管理文件系统上的文件?

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

我正在考虑将元数据(仅几个字段)放入数据库表中,但XML文件内容本身放入文件系统中的文件中,以避免用内容数据(很少读取)填充数据库

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

或者我甚至需要它,我应该只使用原始/自定义Java吗


共 (2) 个答案

  1. # 1 楼答案

    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流操作来实现您的目标

    您还可以加入Apachecommons-io及其方便的FileUtils以获得更多的实用函数

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

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

    大多数操作系统都有用于文件写入/读取的内部缓冲区。使用FileOutputStream.writeFileOutputStream.flush确保数据已发送到操作系统,但无需写入磁盘。JavaAPI还支持这种低级集成,以管理数据库等系统的缓冲问题(例如here

    此外,文件和目录都是用File抽象的,您需要用isDirectory进行检查。这可能会令人困惑,例如,如果您有一个文件x,和一个目录/x(我不记得具体如何处理这个问题,但有一种方法)

    网络服务

    web服务可以使用xs:base64Binary来传递数据,如果文件很大,则可以使用MTOM(消息传输优化机制)

    交易

    请注意,数据库是事务性的,文件系统不是。因此,如果操作失败并重新尝试,您可能必须添加一些检查

    您可以使用涉及某种形式的分布式事务的复杂设计(参见此answer),或者尝试使用提供所需健壮性级别的简单设计。一种可能的设计可以是:

    • 更新。如果用户想要覆盖一个文件,实际上是创建一个新文件。逻辑文件名和物理文件之间的间接级别存储在数据库中。这样,一旦写入物理文件,就不会覆盖它,以确保回滚是一致的
    • 创建。当用户想要创建一个文件时,情况也是如此
    • 删除。如果用户想要删除一个文件,您只能先在数据库中删除。定期作业轮询文件系统以识别数据库中未列出的文件,并将其删除。此两阶段删除确保可以回滚删除操作

    这不像在真实的事务数据库中写入BLOB那样健壮,但提供了一些健壮性。你可以看看commons-transaction,但我觉得这个项目已经死了(2007年)

  2. # 2 楼答案

    DataNucleus,一个Java持久性提供者。对于这种情况来说,它有点太重,但它支持具有不同数据存储(RDBMS、对象存储、XML、JSON、Excel等)的JPA和JDO java标准。如果产品已经在使用JPA或JDO,那么可能值得考虑使用NataNucleus,因为将数据保存到不同的数据存储中应该是透明的。我想DataNucleus支持将数据拆分成几个文件,创建我想要的合理的目录/文件结构(在我的问题中),但这只是一个猜测

    对XML和JSON的支持似乎是实验性的