使用Java复制文件而无需锁定原始文件

时间:2019-01-30 10:02:24

标签: java copy locking

我有一个包含20个文件的文件夹,“ myFile1.txt”到“ myFile20.txt”。一个名为“ WRITER”的程序可能会写入这些文件。

现在,我想使用FileUtils by Apache commons,更具体地说是方法FileUtils.copyDirectoryToDirectory()在Java中复制文件夹。但是,如果使用该方法,恐怕会在复制过程中锁定文件,以使“ WRITER”程序无法再写入文件。

有人知道FileUtils中的方法是否锁定文件吗?如何防止复制时锁定原始文件(即使是这样)?

谢谢!

编辑:我正在使用Windows

2 个答案:

答案 0 :(得分:1)

我的理解是,所有基于Linux的锁本质上都是建议性的。呼叫者必须检查锁。从这个意义上讲,这不是万无一失的解决方案。由于在同一目录中重命名文件是一项原子操作,因此最好的方法可能是将文件重命名为某个随机名称,然后复制到新目录中并删除旧文件。

如果您同时控制文件的读取器和写入器,则可以使用nio.FileChannel并锁定文件提供的功能。读写者都必须在访问前检查锁。

答案 1 :(得分:0)

我有一堆 Paradox DB 文件,需要复制而不锁定它们。我今天从 https://www.baeldung.com/java-copy-file 测试了这个方法。 我使用了 256 * 1024 的缓冲区,因为我的测试产生了最佳速度。 我用于测试的文件大约有 240 MB

public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents(String original, String copied) 
  throws IOException {
    File original = new File(original);
    File copied = new File(copied);
    
    try (
      InputStream in = new BufferedInputStream(
        new FileInputStream(original));
      OutputStream out = new BufferedOutputStream(
        new FileOutputStream(copied))) {
 
        byte[] buffer = new byte[262144];
        int lengthRead;
        while ((lengthRead = in.read(buffer)) > 0) {
            out.write(buffer, 0, lengthRead);
            out.flush();
        }
    }
 
}