将压缩文件复制到目标目录并解压缩的最佳实践

时间:2014-07-16 08:32:59

标签: java gzip file-transfer

我正在编写一个java程序,用于将.gz文件从一个位置传输到同一服务器中的不同位置。有多个目录,每个目录都有.gz文件。结构是这样的 -

-- dir1

  -- 1.gz

  -- 2.gz 
-- dir1

  -- 1.gz

  -- 2.gz 

大约有100个目录,每个目录都包含一些.gz文件。每个目录中的.gz文件数量在某个时间段内会增加。我的方法是将源文件复制到临时目录,解压缩临时目录中的文件,然后将这些文件移动到目标。这种方法合理吗?对于这种类型的文件传输,我可以遵循哪种最佳做法?

1 个答案:

答案 0 :(得分:0)

我了解您要解压缩目标目标位置的文件。您是否希望尽可能更新目标("在线操作"),或者这是一次性任务,一旦完成操作,您不需要继续重复操作?如果您将此作为在线操作使用,那么您应该使用WatchService来查找更改。在类似unix的环境下(非常可能,因为.gz主要在unix下使用),这使用inotify系统调用,效率很高。

如果状态不一致会有问题吗?也就是说,如果文件dir1/3.gzdir2/3.gz同时更新,如果dir1/3.gz被复制而dir2/3.gz没有复制,是否会出现问题?您可以通过

防范这些数据争用
  • 在完成操作之前检查副本的一致性。这将涉及拒绝访问,直到dir2/3.gz被复制并且一切都是一致的;例如,您可以使用WatchService来侦听复制时发生的更改。然后,您将处理这些更改,并且只有在一切稳定后才能完成操作:处理所有更改并且不更改X秒。
  • 仅复制完全一致的状态(即,除非dir1/3.gz被复制,否则不会复制dir2/3.gz。您可以通过查看时间戳来执行此操作,而不是在程序启动前的最后X秒内复制任何已修改的内容。

我理解在移动到最终目标之前解压缩到临时目录的原因是为了避免不一致的状态。否则,如果不需要移动,程序将运行得更快(即:直接解压缩到目标目录)。

相关问题