[英]How to efficiently manage files on a filesystem in Java?
我正在创建一些JAX-WS端点,为此我想保存收到和发送的消息以供以后检查。 为此,我计划将消息(XML文件)保存到文件系统中,在一些合理的层次结构中。 每天将有数百甚至数千个文件。 我还需要存储每个文件的元数据。
我正在考虑将元数据(只是几个字段)放入数据库表中,但XML文件将自身内容放入文件系统中的文件中,以免使内容数据(很少读取)膨胀数据库。
是否有一些简单的库可以帮助我保存,加载,删除等文件? 自己实现它并不是那么棘手,但我想知道是否有现有的解决方案? 只是一个简单的库,已经提供了对文件系统的轻松访问(最好是通过不同的操作系统)。
或者我是否需要它,我应该使用原始/自定义Java?
是否有一些简单的库可以帮助我保存,加载,删除等文件? 自己实现它并不是那么棘手,但我想知道是否有现有的解决方案? 只是一个简单的库,已经提供了对文件系统的轻松访问(最好是通过不同的操作系统)。
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还支持这种低级集成,以管理系统(如数据库)的这些缓冲问题(例如此处 )。
文件和目录都使用File
抽象,您需要使用isDirectory
进行检查。 这可能会令人困惑,例如,如果你有一个文件x
和一个目录/x
(我不记得究竟如何处理这个问题,但有一种方法)。
网络服务
Web服务可以使用xs:base64Binary
来传递数据,或者如果文件很大则使用MTOM (消息传输优化机制)。
交易
请注意,数据库是事务性的,而文件系统则不是。 因此,如果操作失败并重新尝试,您可能需要添加一些检查。
您可以使用涉及某种形式的分布式事务的复杂设计(请参阅此答案 ),或尝试使用更简单的设计来提供所需的稳健性级别。 可能的设计可能是:
这不像在实际事务数据库中写入BLOB那样健壮,但提供了一些健壮性。 你可以看看commons-transaction ,但我觉得这个项目已经死了(2007)。
DataNucleus是一个Java持久性提供程序。 这种情况有点太重,但它支持具有不同数据存储(RDBMS,对象存储,XML,JSON,Excel等)的JPA和JDO java标准。 如果产品已经在使用JPA或JDO,则可能值得考虑使用NataNucleus,因为将数据保存到不同的数据存储区应该是透明的。 我想DataNucleus支持将数据拆分成几个文件,创建我想要的合理目录/文件结构(在我的问题中),但这只是猜测。
对XML和JSON的支持似乎是实验性的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.